@dennisrepa/elevate 1.2.0 → 1.3.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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/app.tsx","../src/adapters/npm/npm-discovery.ts","../src/adapters/npm/npm-registry.ts","../src/adapters/npm/npm-scanner.ts","../src/adapters/npm/npm-updater.ts","../src/adapters/npm/npm-verifier.ts","../src/adapters/npm/npm-strategy.ts","../src/adapters/maven/maven-discovery.ts","../src/adapters/maven/maven-registry.ts","../src/adapters/maven/maven-scanner.ts","../src/adapters/maven/maven-updater.ts","../src/adapters/maven/maven-verifier.ts","../src/adapters/maven/maven-strategy.ts","../src/domain/ecosystem-factory.ts","../src/i18n/index.ts","../src/i18n/locales/de.ts","../src/i18n/locales/en.ts","../src/hooks/use-workspaces.ts","../src/hooks/use-packages.ts","../src/hooks/use-updater.ts","../src/components/splash-screen.tsx","../src/theme.ts","../src/components/header.tsx","../src/components/workspace-bar.tsx","../src/components/tab-bar.tsx","../src/components/package-list.tsx","../src/components/package-row.tsx","../src/components/status-bar.tsx","../src/components/mascot.tsx","../src/components/controls-bar.tsx","../src/components/workspace-modal.tsx","../src/components/version-modal.tsx","../src/components/summary-view.tsx","../src/components/updating-view.tsx","../src/cli/parser.ts","../src/cli/command-modules.ts","../src/cli/command-scan.ts","../src/cli/command-versions.ts","../src/cli/command-update.ts","../src/cli/command-init.ts","../src/mcp/mcp-server.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * 🪶 Elevate — Universal Entry Point\n *\n * Dispatches to:\n * - Interactive TUI Dashboard (default when run without arguments)\n * - Headless CLI Subcommands (modules, scan, versions, update) with JSON output\n * - Model Context Protocol (MCP) Server for AI Agents\n */\n\nimport React from 'react';\nimport { render } from 'ink';\nimport { loadConfig } from './config.js';\nimport { App } from './app.js';\nimport { parseCliArgs, printCliHelp } from './cli/parser.js';\nimport { handleModulesCommand } from './cli/command-modules.js';\nimport { handleScanCommand } from './cli/command-scan.js';\nimport { handleVersionsCommand } from './cli/command-versions.js';\nimport { handleUpdateCommand } from './cli/command-update.js';\nimport { handleInitCommand } from './cli/command-init.js';\nimport { startMcpServer } from './mcp/mcp-server.js';\n\nasync function main() {\n const config = loadConfig();\n const options = parseCliArgs(process.argv.slice(2));\n\n // 1. Help\n if (options.subcommand === 'help' || options.help) {\n printCliHelp();\n process.exit(0);\n }\n\n // 2. Model Context Protocol (MCP) Server\n if (options.subcommand === 'mcp') {\n await startMcpServer(config);\n return;\n }\n\n // 3. Headless CLI Subcommands (for CI/CD & AI Agents)\n if (options.subcommand === 'modules') {\n const exitCode = await handleModulesCommand(options, config);\n process.exit(exitCode);\n }\n\n if (options.subcommand === 'scan') {\n const exitCode = await handleScanCommand(options, config);\n process.exit(exitCode);\n }\n\n if (options.subcommand === 'versions') {\n const exitCode = await handleVersionsCommand(options);\n process.exit(exitCode);\n }\n\n if (options.subcommand === 'update') {\n const exitCode = await handleUpdateCommand(options, config);\n process.exit(exitCode);\n }\n\n if (options.subcommand === 'init') {\n const exitCode = await handleInitCommand(options);\n process.exit(exitCode);\n }\n\n // 4. Interactive Terminal Dashboard (TUI) Mode\n if (process.stdout.isTTY) {\n const minCols = 140;\n const minRows = 38;\n const cols = Math.max(process.stdout.columns || 80, minCols);\n const rows = Math.max(process.stdout.rows || 24, minRows);\n process.stdout.write(`\\x1b[8;${rows};${cols}t`);\n }\n\n render(<App config={config} />);\n}\n\nmain().catch((err) => {\n console.error('❌ Elevate fatal error:', err);\n process.exit(1);\n});\n","/**\n * 🪶 Elevate — Konfiguration\n *\n * Erkennt automatisch das Monorepo-Root und lädt optional eine\n * `elevate.config.json` für projektspezifische Anpassungen.\n *\n * Ohne Konfigurationsdatei funktioniert Elevate universell in\n * jedem npm-Workspace-Monorepo mit sinnvollen Defaults.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport type { Locale } from './i18n/types.js';\nimport type { ReleaseChannel } from './domain/models.js';\n\n/** Projektspezifische Elevate-Konfiguration */\nexport interface ElevateConfig {\n /** Automatisch erkanntes Monorepo-Wurzelverzeichnis */\n rootDir: string;\n /** Anzeigename im Header (optional) */\n author?: string;\n /** npm-Scopes, die beim Scan übersprungen werden (z. B. [\"@my-org\"]) */\n excludeScopes: string[];\n /** Optionales Skript, das nach `npm install` ausgeführt wird */\n postUpdateScript?: string;\n /** Label für das Post-Update-Skript in der UI */\n postUpdateLabel?: string;\n /** Bevorzugte Sprache ('de' | 'en' | 'auto') */\n locale?: Locale | 'auto';\n /** Release Channel ('stable' | 'all', Standard: 'stable') */\n channel: ReleaseChannel;\n}\n\n/**\n * Sucht das nächste übergeordnete Verzeichnis, das eine package.json\n * mit einem `workspaces`-Feld enthält (→ Monorepo-Root).\n */\nfunction findMonorepoRoot(startDir: string): string {\n let dir = resolve(startDir);\n\n while (true) {\n const pkgPath = join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n if (pkg.workspaces) return dir;\n } catch {\n /* ungültige JSON ignorieren */\n }\n }\n\n const parent = dirname(dir);\n if (parent === dir) break; // Dateisystem-Wurzel erreicht\n dir = parent;\n }\n\n return startDir; // Fallback: Startverzeichnis\n}\n\n/**\n * Lädt die Elevate-Konfiguration:\n * 1. Erkennt das Monorepo-Root automatisch (aufwärts suchen)\n * 2. Liest optional `elevate.config.json` aus dem Root\n * 3. Setzt sinnvolle Defaults für fehlende Werte\n */\nexport function loadConfig(): ElevateConfig {\n const rootDir = findMonorepoRoot(process.cwd());\n\n const configPath = join(rootDir, 'elevate.config.json');\n let file: Record<string, unknown> = {};\n\n if (existsSync(configPath)) {\n try {\n file = JSON.parse(readFileSync(configPath, 'utf8'));\n } catch {\n /* ungültige JSON ignorieren */\n }\n }\n\n return {\n rootDir,\n author: typeof file.author === 'string' ? file.author : undefined,\n excludeScopes: Array.isArray(file.excludeScopes)\n ? (file.excludeScopes as string[])\n : [],\n postUpdateScript:\n typeof file.postUpdateScript === 'string'\n ? file.postUpdateScript\n : undefined,\n postUpdateLabel:\n typeof file.postUpdateLabel === 'string'\n ? file.postUpdateLabel\n : typeof file.postUpdateScript === 'string'\n ? file.postUpdateScript\n : undefined,\n locale:\n file.locale === 'de' || file.locale === 'en'\n ? file.locale\n : undefined,\n channel: file.channel === 'all' ? 'all' : 'stable',\n };\n}\n","/**\n * 🪶 Elevate — Hauptkomponente (App-Shell, Polyglot & Clean Architecture)\n *\n * Orchestriert Ökosystem-Strategien (npm / Maven), Views, Hooks,\n * i18n, Theme und Keyboard-Navigation nach Domain-Driven Design Prinzipien.\n */\n\nimport React, { useState, useMemo, useCallback } from 'react';\nimport { Box, useInput, useApp } from 'ink';\nimport type { View, Ecosystem, UpdateCandidate } from './domain/models.js';\nimport type { ElevateConfig } from './config.js';\nimport { EcosystemFactory } from './domain/ecosystem-factory.js';\nimport { useI18n, resolveInitialLocale } from './i18n/index.js';\n\n// Domain-Driven Hooks\nimport { useWorkspaces } from './hooks/use-workspaces.js';\nimport { usePackages } from './hooks/use-packages.js';\nimport { useUpdater } from './hooks/use-updater.js';\n\n// Components\nimport { SplashScreen } from './components/splash-screen.js';\nimport { Header } from './components/header.js';\nimport { WorkspaceBar } from './components/workspace-bar.js';\nimport { TabBar } from './components/tab-bar.js';\nimport { PackageList } from './components/package-list.js';\nimport { StatusBar } from './components/status-bar.js';\nimport { ControlsBar } from './components/controls-bar.js';\nimport { WorkspaceModal } from './components/workspace-modal.js';\nimport { VersionModal } from './components/version-modal.js';\nimport { SummaryView } from './components/summary-view.js';\nimport { UpdatingView } from './components/updating-view.js';\n\ninterface AppProps {\n config: ElevateConfig;\n}\n\nexport const App: React.FC<AppProps> = ({ config }) => {\n const { exit } = useApp();\n const [view, setView] = useState<View>('splash');\n const [modalIndex, setModalIndex] = useState(0);\n const [versionPickerCandidate, setVersionPickerCandidate] = useState<UpdateCandidate | null>(null);\n\n // 1. Ökosystem-Auswahl (npm ⇄ Maven via Strategy Pattern)\n const [ecosystem, setEcosystem] = useState<Ecosystem>('npm');\n const strategy = useMemo(() => EcosystemFactory.getStrategy(ecosystem), [ecosystem]);\n\n const nextEcosystem: Ecosystem = ecosystem === 'npm' ? 'maven' : 'npm';\n const nextStrategy = useMemo(() => EcosystemFactory.getStrategy(nextEcosystem), [nextEcosystem]);\n\n const toggleEcosystem = useCallback(() => {\n setEcosystem((prev) => (prev === 'npm' ? 'maven' : 'npm'));\n }, []);\n\n // 2. i18n Hook\n const { locale, toggleLocale, t } = useI18n(resolveInitialLocale(config.locale));\n\n // 3. Domain Hooks (injizieren die aktuelle Strategie)\n const ws = useWorkspaces(strategy, config.rootDir);\n const pkg = usePackages(\n strategy,\n ws.active,\n ws.internalIds,\n config.excludeScopes,\n config.channel,\n );\n const updater = useUpdater(strategy, config.rootDir, setView, {\n script: config.postUpdateScript,\n label: config.postUpdateLabel,\n });\n\n // 4. Maskottchen-Zustand\n const mascotState =\n view === 'updating'\n ? 'updating'\n : pkg.loading\n ? 'scanning'\n : view === 'summary'\n ? 'success'\n : 'idle';\n\n // 5. Tastatur-Steuerung\n useInput((input, key) => {\n // Wenn das Version-Modal aktiv ist, übernimmt useInput in VersionModal die Steuerung\n if (view === 'version_modal') {\n return;\n }\n\n // Global: Beenden\n if (input === 'q' && view !== 'updating') {\n exit();\n return;\n }\n\n // Splash Screen: Beliebige Taste überspringt direkt ins Dashboard\n if (view === 'splash') {\n if (key.return || input === ' ') {\n setView('dashboard');\n pkg.scan();\n }\n return;\n }\n\n // Global: Sprache umschalten ([L])\n if ((input === 'l' || input === 'L') && view !== 'updating') {\n toggleLocale();\n return;\n }\n\n // ── Workspace-Modal ──\n if (view === 'workspace_modal') {\n if (key.upArrow || input === 'k') {\n setModalIndex((i) => Math.max(0, i - 1));\n } else if (key.downArrow || input === 'j') {\n setModalIndex((i) => Math.min(ws.modules.length - 1, i + 1));\n } else if (key.return) {\n ws.setActiveIndex(modalIndex);\n setView('dashboard');\n pkg.scan();\n } else if (key.escape || input === 'w') {\n setView('dashboard');\n }\n return;\n }\n\n // ── Summary ──\n if (view === 'summary') {\n if (key.return || input === 'd') {\n setView('dashboard');\n pkg.scan();\n }\n return;\n }\n\n // ── Dashboard ──\n if (view === 'dashboard') {\n // Ökosystem umschalten ([E])\n if (input === 'e' || input === 'E') {\n toggleEcosystem();\n return;\n }\n\n // Modul auswählen ([W])\n if (input === 'w') {\n setModalIndex(ws.activeIndex);\n setView('workspace_modal');\n } else if (input === 'v' || input === 'V') {\n // Version gezielt heraussuchen ([V])\n const focused = pkg.visible[pkg.cursor];\n if (focused) {\n setVersionPickerCandidate(focused);\n setView('version_modal');\n }\n } else if (key.tab) {\n pkg.cycleTab();\n } else if (input === '1') {\n pkg.switchTab('all');\n } else if (input === '2') {\n pkg.switchTab('prod');\n } else if (input === '3') {\n pkg.switchTab('dev');\n } else if (key.upArrow || input === 'k') {\n pkg.setCursor((i) => Math.max(0, i - 1));\n } else if (key.downArrow || input === 'j') {\n pkg.setCursor((i) => Math.min(pkg.visible.length - 1, i + 1));\n } else if (input === ' ') {\n const focused = pkg.visible[pkg.cursor];\n if (focused) pkg.togglePackage(focused.coordinate.identifier);\n } else if (input === 'a') {\n pkg.toggleAllVisible();\n } else if (input === 'r') {\n pkg.scan();\n } else if (input === 'u' && pkg.counts.selectedCount > 0 && !pkg.loading) {\n const selected = pkg.packages.filter((p) => p.selected);\n updater.run(ws.active, selected, t);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* 1. Initialer Splash Screen (fest auf Englisch) */}\n {view === 'splash' && (\n <SplashScreen\n onComplete={() => {\n setView('dashboard');\n pkg.scan();\n }}\n author={config.author}\n />\n )}\n\n {/* 2. Dashboard-Ansichten */}\n {view !== 'splash' && (\n <>\n <Header\n author={config.author}\n t={t}\n currentLocale={locale}\n strategy={strategy}\n nextStrategyName={`${nextStrategy.icon} ${nextStrategy.displayName}`}\n channel={config.channel}\n />\n\n {view === 'workspace_modal' && (\n <WorkspaceModal\n modules={ws.modules}\n focusedIndex={modalIndex}\n strategy={strategy}\n t={t}\n />\n )}\n\n {view === 'version_modal' && versionPickerCandidate && (\n <VersionModal\n candidate={versionPickerCandidate}\n strategy={strategy}\n t={t}\n onSelect={(chosenVersion) => {\n pkg.setCustomVersion(versionPickerCandidate.coordinate.identifier, chosenVersion);\n setView('dashboard');\n setVersionPickerCandidate(null);\n }}\n onCancel={() => {\n setView('dashboard');\n setVersionPickerCandidate(null);\n }}\n />\n )}\n\n {view === 'updating' && (\n <UpdatingView step={updater.step} t={t} ecosystem={strategy.ecosystem} />\n )}\n\n {view === 'summary' && updater.summary && (\n <SummaryView\n summary={updater.summary}\n module={ws.active}\n strategy={strategy}\n t={t}\n />\n )}\n\n {view === 'dashboard' && (\n <>\n <WorkspaceBar\n module={ws.active}\n excludeScopes={config.excludeScopes}\n strategy={strategy}\n t={t}\n />\n <TabBar\n activeTab={pkg.activeTab}\n counts={pkg.counts}\n strategy={strategy}\n t={t}\n />\n <PackageList\n items={pkg.visible}\n cursor={pkg.cursor}\n loading={pkg.loading}\n t={t}\n />\n <StatusBar\n counts={pkg.counts}\n visibleCount={pkg.visible.length}\n t={t}\n mascotState={mascotState}\n ecosystem={strategy.ecosystem}\n />\n <ControlsBar t={t} />\n </>\n )}\n </>\n )}\n </Box>\n );\n};\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ModuleDiscoveryPort } from '../../domain/ports.js';\nimport type { ProjectModule } from '../../domain/models.js';\n\nfunction readJson(filePath: string): any {\n try {\n return JSON.parse(readFileSync(filePath, 'utf8'));\n } catch {\n return null;\n }\n}\n\n/** Adapter zur Erkennung von npm Workspaces anhand der Root package.json */\nexport class NpmModuleDiscoveryAdapter implements ModuleDiscoveryPort {\n async discover(rootDir: string): Promise<ProjectModule[]> {\n const rootPkg = readJson(join(rootDir, 'package.json'));\n\n const modules: ProjectModule[] = [\n {\n id: rootPkg?.name ?? 'root',\n name: rootPkg?.name ?? 'Root Workspace (npm)',\n path: rootDir,\n relPath: 'Root',\n ecosystem: 'npm',\n isRoot: true,\n },\n ];\n\n if (!rootPkg?.workspaces) return modules;\n\n const patterns: string[] = Array.isArray(rootPkg.workspaces)\n ? rootPkg.workspaces\n : [];\n\n for (const pattern of patterns) {\n if (pattern.endsWith('/*')) {\n const parentDir = join(rootDir, pattern.slice(0, -2));\n if (!existsSync(parentDir)) continue;\n\n for (const entry of readdirSync(parentDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const pkgPath = join(parentDir, entry.name, 'package.json');\n if (!existsSync(pkgPath)) continue;\n\n const pkg = readJson(pkgPath);\n modules.push({\n id: pkg?.name ?? `${pattern.slice(0, -2)}/${entry.name}`,\n name: pkg?.name ?? `${pattern.slice(0, -2)}/${entry.name}`,\n path: join(parentDir, entry.name),\n relPath: `${pattern.slice(0, -2)}/${entry.name}`,\n ecosystem: 'npm',\n isRoot: false,\n });\n }\n } else {\n const explicitPath = join(rootDir, pattern);\n const pkgPath = join(explicitPath, 'package.json');\n if (!existsSync(pkgPath)) continue;\n\n const pkg = readJson(pkgPath);\n modules.push({\n id: pkg?.name ?? pattern,\n name: pkg?.name ?? pattern,\n path: explicitPath,\n relPath: pattern,\n ecosystem: 'npm',\n isRoot: false,\n });\n }\n }\n\n return modules;\n }\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport semver from 'semver';\nimport type { RegistryPort } from '../../domain/ports.js';\nimport type { DependencyCoordinate, ReleaseChannel } from '../../domain/models.js';\n\nconst execAsync = promisify(exec);\n\nexport class NpmRegistryAdapter implements RegistryPort {\n async getLatestVersion(\n coordinate: DependencyCoordinate,\n channel: ReleaseChannel = 'stable',\n ): Promise<string | null> {\n try {\n if (channel === 'stable') {\n // Fragt explizit das \"latest\" dist-tag ab (das standardmäßig für stabile Releases steht)\n const { stdout } = await execAsync(\n `npm view ${coordinate.identifier} \"dist-tags.latest\" --json`,\n { timeout: 15_000 },\n );\n const v = stdout.trim().replace(/^\"|\"$/g, '');\n if (v && semver.valid(v) && semver.prerelease(v) === null) {\n return v;\n }\n }\n\n // Fallback oder channel === 'all'\n const { stdout } = await execAsync(\n `npm view ${coordinate.identifier} version --json`,\n { timeout: 15_000 },\n );\n return stdout.trim().replace(/^\"|\"$/g, '');\n } catch {\n return null;\n }\n }\n\n /** Liefert alle veröffentlichten Versionen (neueste zuerst) */\n async getAllVersions(coordinate: DependencyCoordinate): Promise<string[]> {\n try {\n const { stdout } = await execAsync(\n `npm view ${coordinate.identifier} versions --json`,\n { timeout: 15_000 },\n );\n const parsed = JSON.parse(stdout.trim());\n const list: string[] = Array.isArray(parsed) ? parsed : [parsed];\n return list.map(String).reverse();\n } catch {\n return [];\n }\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport semver from 'semver';\nimport type { DependencyReaderPort, RegistryPort } from '../../domain/ports.js';\nimport type { ProjectModule, UpdateCandidate, ReleaseChannel } from '../../domain/models.js';\n\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\nconst CONCURRENCY = 6;\n\nasync function pooled<T, R>(items: T[], concurrency: number, fn: (item: T) => Promise<R>): Promise<R[]> {\n const results: Promise<R>[] = [];\n const executing: Promise<void>[] = [];\n\n for (const item of items) {\n const p = Promise.resolve().then(() => fn(item));\n results.push(p);\n\n if (concurrency <= items.length) {\n const slot: Promise<void> = p\n .then(() => void executing.splice(executing.indexOf(slot), 1))\n .catch(() => void executing.splice(executing.indexOf(slot), 1));\n executing.push(slot);\n if (executing.length >= concurrency) await Promise.race(executing);\n }\n }\n\n return Promise.all(results);\n}\n\nfunction matchesExcludedScope(name: string, excludeScopes: string[]): boolean {\n return excludeScopes.some((scope) => {\n const normalized = scope.endsWith('/') ? scope : `${scope}/`;\n return name.startsWith(normalized);\n });\n}\n\nexport class NpmDependencyAdapter implements DependencyReaderPort {\n constructor(private readonly registry: RegistryPort) {}\n\n async scan(\n module: ProjectModule,\n excludedScopes: string[],\n internalIds: Set<string>,\n channel: ReleaseChannel = 'stable',\n ): Promise<UpdateCandidate[]> {\n const pkgPath = join(module.path, 'package.json');\n let pkg: any;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n } catch {\n return [];\n }\n\n const allDeps: Record<string, string> = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.devDependencies ?? {}),\n };\n\n const entries = Object.entries(allDeps).filter(\n ([name]) => !internalIds.has(name) && !matchesExcludedScope(name, excludedScopes),\n );\n\n const candidates: UpdateCandidate[] = [];\n\n await pooled(entries, CONCURRENCY, async ([name, currentRange]) => {\n const latest = await this.registry.getLatestVersion(\n {\n identifier: name,\n artifact: name,\n ecosystem: 'npm',\n },\n channel,\n );\n if (!latest) return;\n\n const currentClean = semver.minVersion(currentRange)?.version;\n if (!currentClean || !semver.gt(latest, currentClean)) return;\n\n const diff = semver.diff(currentClean, latest) as 'patch' | 'minor' | 'major';\n const prefix = currentRange.startsWith('~')\n ? '~'\n : currentRange.startsWith('^')\n ? '^'\n : '';\n\n const prereleaseComponents = semver.prerelease(latest);\n const isPre = prereleaseComponents !== null;\n const preTag = isPre ? String(prereleaseComponents[0]).toUpperCase() : undefined;\n\n candidates.push({\n coordinate: {\n identifier: name,\n artifact: name,\n ecosystem: 'npm',\n },\n currentRange,\n currentClean,\n latest,\n newRange: `${prefix}${latest}`,\n diff,\n scope: pkg.devDependencies?.[name] ? 'dev' : 'prod',\n selected: diff !== 'major',\n isPreRelease: isPre,\n preReleaseTag: preTag,\n });\n });\n\n candidates.sort((a, b) => (DIFF_ORDER[a.diff] ?? 3) - (DIFF_ORDER[b.diff] ?? 3));\n return candidates;\n }\n}\n","import { writeFileSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { DependencyUpdaterPort } from '../../domain/ports.js';\nimport type { ProjectModule, UpdateCandidate, UpdateSummary } from '../../domain/models.js';\n\nconst execAsync = promisify(exec);\n\nexport class NpmUpdaterAdapter implements DependencyUpdaterPort {\n async applyUpdates(\n module: ProjectModule,\n rootDir: string,\n updates: UpdateCandidate[],\n onProgress: (stepMessage: string) => void,\n ): Promise<Pick<UpdateSummary, 'updatedCount' | 'auditMessage' | 'auditSeverity' | 'fundingMessage'>> {\n const pkgPath = join(module.path, 'package.json');\n let pkg: any;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n } catch {\n throw new Error(`Konnte package.json in ${module.path} nicht lesen.`);\n }\n\n onProgress('Schreibe neue Versionen in package.json…');\n for (const item of updates) {\n const name = item.coordinate.artifact;\n if (pkg.dependencies?.[name]) {\n pkg.dependencies[name] = item.newRange;\n }\n if (pkg.devDependencies?.[name]) {\n pkg.devDependencies[name] = item.newRange;\n }\n }\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf8');\n\n onProgress('Führe npm install aus (bitte kurz warten)…');\n let stdout = '';\n let stderr = '';\n try {\n const res = await execAsync('npm install', { cwd: rootDir });\n stdout = res.stdout;\n stderr = res.stderr;\n } catch (err: any) {\n stdout = err.stdout ?? '';\n stderr = err.stderr ?? err.message;\n }\n\n onProgress('Analysiere Sicherheitsaudit & Output…');\n const combined = stdout + '\\n' + stderr;\n const auditMatch = combined.match(/found (\\d+ vulnerabilit(?:y|ies).*)/i);\n const fundingMatch = combined.match(/(\\d+ packages? (?:is|are) looking for funding)/i);\n\n return {\n updatedCount: updates.length,\n auditMessage: auditMatch ? auditMatch[0] : 'Keine bekannten Schwachstellen gefunden.',\n auditSeverity: auditMatch ? 'warn' : 'clean',\n fundingMessage: fundingMatch ? fundingMatch[0] : undefined,\n };\n }\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { VerificationPort } from '../../domain/ports.js';\nimport type { ProjectModule } from '../../domain/models.js';\n\nconst execAsync = promisify(exec);\n\nexport class NpmVerificationAdapter implements VerificationPort {\n async verify(\n module: ProjectModule,\n rootDir: string,\n customScript?: string,\n customLabel?: string,\n ): Promise<{ status: 'clean' | 'warn'; details: string; label: string }> {\n const script = customScript || 'npm run check:versions';\n const label = customLabel || 'Workspace-Konsistenz (npm run check:versions)';\n\n try {\n const { stdout } = await execAsync(script, { cwd: rootDir });\n return {\n status: 'clean',\n details: stdout.trim() || 'Alle Workspace-Versionen sind konsistent.',\n label,\n };\n } catch (err: any) {\n return {\n status: 'warn',\n details: err.stdout || err.message,\n label,\n };\n }\n }\n}\n","import type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\nimport type { Ecosystem } from '../../domain/models.js';\nimport { NpmModuleDiscoveryAdapter } from './npm-discovery.js';\nimport { NpmRegistryAdapter } from './npm-registry.js';\nimport { NpmDependencyAdapter } from './npm-scanner.js';\nimport { NpmUpdaterAdapter } from './npm-updater.js';\nimport { NpmVerificationAdapter } from './npm-verifier.js';\n\nexport class NpmEcosystemStrategy implements EcosystemStrategy {\n readonly ecosystem: Ecosystem = 'npm';\n readonly displayName = 'Node / npm';\n readonly icon = '📦';\n readonly manifestFile = 'package.json';\n\n readonly discovery = new NpmModuleDiscoveryAdapter();\n readonly registry = new NpmRegistryAdapter();\n readonly reader = new NpmDependencyAdapter(this.registry);\n readonly updater = new NpmUpdaterAdapter();\n readonly verifier = new NpmVerificationAdapter();\n\n getTabLabels(\n counts: { total: number; prodCount: number; devCount: number },\n t: any,\n ): TabLabels {\n return {\n all: t.tabs.all(counts.total),\n prod: t.tabs.dependencies(counts.prodCount),\n dev: t.tabs.devDependencies(counts.devCount),\n };\n }\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { ModuleDiscoveryPort } from '../../domain/ports.js';\nimport type { ProjectModule } from '../../domain/models.js';\n\nfunction extractPomInfo(pomPath: string): { name: string; id: string } | null {\n try {\n const xml = readFileSync(pomPath, 'utf8');\n\n // Extract parent groupId as fallback\n const parentMatch = xml.match(/<parent>([\\s\\S]*?)<\\/parent>/);\n let parentGroup = '';\n if (parentMatch) {\n const pg = parentMatch[1]!.match(/<groupId>([^<]+)<\\/groupId>/);\n if (pg) parentGroup = pg[1]!.trim();\n }\n\n // Strip <parent>, <dependencies>, <build> to get project-level tags\n const strippedXml = xml\n .replace(/<parent>[\\s\\S]*?<\\/parent>/, '')\n .replace(/<dependencies>[\\s\\S]*?<\\/dependencies>/, '')\n .replace(/<build>[\\s\\S]*?<\\/build>/, '');\n\n const artifactMatch = strippedXml.match(/<artifactId>([^<]+)<\\/artifactId>/);\n const groupMatch = strippedXml.match(/<groupId>([^<]+)<\\/groupId>/);\n const nameMatch = strippedXml.match(/<name>([^<]+)<\\/name>/);\n\n const artifact = artifactMatch ? artifactMatch[1]!.trim() : 'unbekannt';\n const group = groupMatch ? groupMatch[1]!.trim() : parentGroup;\n const name = nameMatch ? nameMatch[1]!.trim() : artifact;\n\n return {\n name: name || artifact,\n id: group ? `${group}:${artifact}` : artifact,\n };\n } catch {\n return null;\n }\n}\n\n/** Rekursives Suchen nach pom.xml Dateien */\nfunction findPomFiles(dir: string, depth: number = 0, maxDepth: number = 4): string[] {\n if (depth > maxDepth || !existsSync(dir)) return [];\n const results: string[] = [];\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'target') {\n continue;\n }\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n const pomPath = join(fullPath, 'pom.xml');\n if (existsSync(pomPath)) {\n results.push(pomPath);\n }\n results.push(...findPomFiles(fullPath, depth + 1, maxDepth));\n }\n }\n } catch {\n /* ignorieren bei Lesefehlern */\n }\n\n return results;\n}\n\n/** Adapter zur Entdeckung aller Maven-Projekte im Monorepo */\nexport class MavenModuleDiscoveryAdapter implements ModuleDiscoveryPort {\n async discover(rootDir: string): Promise<ProjectModule[]> {\n const pomFiles = findPomFiles(rootDir);\n const modules: ProjectModule[] = [];\n const seenPaths = new Set<string>();\n\n for (const pomPath of pomFiles) {\n const moduleDir = pomPath.slice(0, -'/pom.xml'.length);\n if (seenPaths.has(moduleDir)) continue;\n seenPaths.add(moduleDir);\n\n const info = extractPomInfo(pomPath);\n if (!info) continue;\n\n const relPath = relative(rootDir, moduleDir).replace(/\\\\/g, '/');\n\n modules.push({\n id: info.id,\n name: info.name,\n path: moduleDir,\n relPath: relPath || 'Root',\n ecosystem: 'maven',\n isRoot: moduleDir === rootDir,\n });\n }\n\n // Nach relativem Pfad sortieren\n modules.sort((a, b) => a.relPath.localeCompare(b.relPath));\n return modules;\n }\n}\n","import type { RegistryPort } from '../../domain/ports.js';\nimport type { DependencyCoordinate, ReleaseChannel } from '../../domain/models.js';\n\n/** Prüft, ob eine Versionsbezeichnung ein Pre-Release (Alpha, Beta, RC, Milestone, Snapshot etc.) ist */\nexport function isPreReleaseVersion(version: string): boolean {\n return /[.-]?(alpha|beta|rc|cr|m\\d*|preview|milestone|snapshot|ea|dev|b\\d+)/i.test(version);\n}\n\n/** Extrahiert ein kurzes Tag für Vorabversionen (z. B. \"BETA\", \"RC\", \"MILESTONE\") */\nexport function extractPreReleaseTag(version: string): string | undefined {\n const match = version.match(/[.-]?(alpha|beta|rc|cr|m\\d*|preview|milestone|snapshot|ea|dev)/i);\n if (!match) return undefined;\n const tag = match[1]!.toUpperCase();\n if (tag.startsWith('M') && tag.length <= 3) return `M${tag.slice(1)}`;\n return tag;\n}\n\nexport class MavenRegistryAdapter implements RegistryPort {\n async getLatestVersion(\n coordinate: DependencyCoordinate,\n channel: ReleaseChannel = 'stable',\n ): Promise<string | null> {\n if (!coordinate.group || !coordinate.artifact) return null;\n\n const groupPath = coordinate.group.replace(/\\./g, '/');\n const url = `https://repo1.maven.org/maven2/${groupPath}/${coordinate.artifact}/maven-metadata.xml`;\n\n try {\n const response = await fetch(url, {\n headers: { 'User-Agent': 'Elevate-Dependency-Updater' },\n signal: AbortSignal.timeout(8000),\n });\n\n if (!response.ok) {\n return await this.fallbackSearch(coordinate.group, coordinate.artifact, channel);\n }\n\n const xml = await response.text();\n const allVersions = [...xml.matchAll(/<version>([^<]+)<\\/version>/g)].map((m) => m[1]!.trim());\n\n // 1. Channel = 'stable' -> Nur stabile Versionen berücksichtigen\n if (channel === 'stable') {\n const releaseMatch = xml.match(/<release>([^<]+)<\\/release>/);\n if (releaseMatch?.[1] && !isPreReleaseVersion(releaseMatch[1].trim())) {\n return releaseMatch[1].trim();\n }\n\n // Rückwärts durch alle Versionen suchen, um die neueste stabile zu finden\n for (let i = allVersions.length - 1; i >= 0; i--) {\n const v = allVersions[i]!;\n if (!isPreReleaseVersion(v)) {\n return v;\n }\n }\n }\n\n // 2. Channel = 'all' (oder kein stabiles Release gefunden)\n const releaseMatch = xml.match(/<release>([^<]+)<\\/release>/);\n if (releaseMatch?.[1]) return releaseMatch[1].trim();\n\n const latestMatch = xml.match(/<latest>([^<]+)<\\/latest>/);\n if (latestMatch?.[1]) return latestMatch[1].trim();\n\n if (allVersions.length > 0) {\n return allVersions[allVersions.length - 1]!;\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n private async fallbackSearch(\n group: string,\n artifact: string,\n channel: ReleaseChannel,\n ): Promise<string | null> {\n try {\n const query = `g:${encodeURIComponent(group)}+AND+a:${encodeURIComponent(artifact)}`;\n const url = `https://search.maven.org/solrsearch/select?q=${query}&rows=20&wt=json`;\n const res = await fetch(url, { signal: AbortSignal.timeout(8000) });\n if (!res.ok) return null;\n const data: any = await res.json();\n const docs = data?.response?.docs || [];\n\n if (docs.length === 0) return null;\n\n if (channel === 'stable') {\n for (const doc of docs) {\n const v = doc.v || doc.latestVersion;\n if (v && !isPreReleaseVersion(v)) return v;\n }\n }\n\n return docs[0]?.latestVersion || docs[0]?.v || null;\n } catch {\n return null;\n }\n }\n\n /** Liefert alle verfügbaren Versionen aus dem Maven-Repository (neueste zuerst) */\n async getAllVersions(coordinate: DependencyCoordinate): Promise<string[]> {\n if (!coordinate.group || !coordinate.artifact) return [];\n\n const groupPath = coordinate.group.replace(/\\./g, '/');\n const url = `https://repo1.maven.org/maven2/${groupPath}/${coordinate.artifact}/maven-metadata.xml`;\n\n try {\n const response = await fetch(url, {\n headers: { 'User-Agent': 'Elevate-Dependency-Updater' },\n signal: AbortSignal.timeout(8000),\n });\n\n if (!response.ok) {\n return await this.fallbackAllVersions(coordinate.group, coordinate.artifact);\n }\n\n const xml = await response.text();\n const allVersions = [...xml.matchAll(/<version>([^<]+)<\\/version>/g)].map(\n (m) => m[1]!.trim(),\n );\n\n if (allVersions.length > 0) {\n return allVersions.reverse();\n }\n\n return await this.fallbackAllVersions(coordinate.group, coordinate.artifact);\n } catch {\n return await this.fallbackAllVersions(coordinate.group, coordinate.artifact);\n }\n }\n\n private async fallbackAllVersions(\n group: string,\n artifact: string,\n ): Promise<string[]> {\n try {\n const query = `g:${encodeURIComponent(group)}+AND+a:${encodeURIComponent(artifact)}`;\n const url = `https://search.maven.org/solrsearch/select?q=${query}&rows=100&core=gav&wt=json`;\n const res = await fetch(url, { signal: AbortSignal.timeout(8000) });\n if (!res.ok) return [];\n const data: any = await res.json();\n const docs = data?.response?.docs || [];\n return docs.map((d: any) => d.v).filter(Boolean);\n } catch {\n return [];\n }\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport semver from 'semver';\nimport type { DependencyReaderPort, RegistryPort } from '../../domain/ports.js';\nimport type { ProjectModule, UpdateCandidate, ReleaseChannel } from '../../domain/models.js';\nimport { isPreReleaseVersion, extractPreReleaseTag } from './maven-registry.js';\n\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\nconst CONCURRENCY = 6;\n\nasync function pooled<T, R>(items: T[], concurrency: number, fn: (item: T) => Promise<R>): Promise<R[]> {\n const results: Promise<R>[] = [];\n const executing: Promise<void>[] = [];\n\n for (const item of items) {\n const p = Promise.resolve().then(() => fn(item));\n results.push(p);\n\n if (concurrency <= items.length) {\n const slot: Promise<void> = p\n .then(() => void executing.splice(executing.indexOf(slot), 1))\n .catch(() => void executing.splice(executing.indexOf(slot), 1));\n executing.push(slot);\n if (executing.length >= concurrency) await Promise.race(executing);\n }\n }\n\n return Promise.all(results);\n}\n\n/** Bereinigt Java-Versionen (z. B. \"5.10.2\", \"1.71.0.Final\" -> \"5.10.2\") für semver */\nfunction cleanJavaVersion(v: string): string | null {\n const match = v.match(/^v?(\\d+\\.\\d+(?:\\.\\d+)?)/);\n if (!match) return null;\n return semver.coerce(match[1])?.version ?? null;\n}\n\ninterface RawMavenDep {\n group: string;\n artifact: string;\n rawVersion: string;\n scope: 'prod' | 'test';\n}\n\nexport class MavenDependencyAdapter implements DependencyReaderPort {\n constructor(private readonly registry: RegistryPort) {}\n\n async scan(\n module: ProjectModule,\n excludedScopes: string[],\n internalIds: Set<string>,\n channel: ReleaseChannel = 'stable',\n ): Promise<UpdateCandidate[]> {\n const pomPath = join(module.path, 'pom.xml');\n let xml = '';\n try {\n xml = readFileSync(pomPath, 'utf8');\n } catch {\n return [];\n }\n\n // 1. Properties extrahieren\n const properties = new Map<string, string>();\n const propBlockMatch = xml.match(/<properties>([\\s\\S]*?)<\\/properties>/);\n if (propBlockMatch?.[1]) {\n const propMatches = propBlockMatch[1].matchAll(/<([a-zA-Z0-9_.-]+)>([^<]+)<\\/\\1>/g);\n for (const m of propMatches) {\n properties.set(m[1]!.trim(), m[2]!.trim());\n }\n }\n\n // 2. Dependencies extrahieren (mit Deduplizierung nach identifier)\n const rawDeps: RawMavenDep[] = [];\n const seenCoordinates = new Set<string>();\n const depBlockMatches = xml.matchAll(/<dependency>([\\s\\S]*?)<\\/dependency>/g);\n\n for (const match of depBlockMatches) {\n const block = match[1]!;\n const groupMatch = block.match(/<groupId>([^<]+)<\\/groupId>/);\n const artifactMatch = block.match(/<artifactId>([^<]+)<\\/artifactId>/);\n const versionMatch = block.match(/<version>([^<]+)<\\/version>/);\n const scopeMatch = block.match(/<scope>([^<]+)<\\/scope>/);\n\n if (!groupMatch?.[1] || !artifactMatch?.[1]) continue;\n\n const group = groupMatch[1].trim();\n const artifact = artifactMatch[1].trim();\n const identifier = `${group}:${artifact}`;\n\n if (seenCoordinates.has(identifier)) continue;\n seenCoordinates.add(identifier);\n let rawVersion = versionMatch?.[1]?.trim() || '';\n\n // Property auflösen falls vorhanden: ${property.name}\n if (rawVersion.startsWith('${') && rawVersion.endsWith('}')) {\n const propKey = rawVersion.slice(2, -1);\n rawVersion = properties.get(propKey) || rawVersion;\n }\n\n if (!rawVersion || rawVersion.startsWith('${')) {\n continue; // Version von Parent/BOM gesteuert oder unaufgelöst\n }\n\n const scope = scopeMatch?.[1]?.trim() === 'test' ? 'test' : 'prod';\n\n // Internal modules or configured scopes filter\n const isInternal =\n internalIds.has(identifier) ||\n internalIds.has(artifact) ||\n excludedScopes.some((s) => group.startsWith(s.replace(/^@/, '')));\n\n if (isInternal) continue;\n\n rawDeps.push({ group, artifact, rawVersion, scope });\n }\n\n // 3. Neueste Versionen abfragen (unter Berücksichtigung des Release-Channels)\n const candidates: UpdateCandidate[] = [];\n\n await pooled(rawDeps, CONCURRENCY, async (dep) => {\n const latest = await this.registry.getLatestVersion(\n {\n identifier: `${dep.group}:${dep.artifact}`,\n group: dep.group,\n artifact: dep.artifact,\n ecosystem: 'maven',\n },\n channel,\n );\n\n if (!latest) return;\n\n const currentClean = cleanJavaVersion(dep.rawVersion);\n const latestClean = cleanJavaVersion(latest);\n\n if (!currentClean || !latestClean) return;\n\n if (semver.gt(latestClean, currentClean)) {\n const diff = (semver.diff(currentClean, latestClean) as 'patch' | 'minor' | 'major') || 'minor';\n const isPre = isPreReleaseVersion(latest);\n const preTag = isPre ? extractPreReleaseTag(latest) : undefined;\n\n candidates.push({\n coordinate: {\n identifier: `${dep.group}:${dep.artifact}`,\n group: dep.group,\n artifact: dep.artifact,\n ecosystem: 'maven',\n },\n currentRange: dep.rawVersion,\n currentClean,\n latest,\n newRange: latest,\n diff,\n scope: dep.scope,\n selected: diff !== 'major',\n isPreRelease: isPre,\n preReleaseTag: preTag,\n });\n }\n });\n\n candidates.sort((a, b) => (DIFF_ORDER[a.diff] ?? 3) - (DIFF_ORDER[b.diff] ?? 3));\n return candidates;\n }\n}\n","import { writeFileSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { DependencyUpdaterPort } from '../../domain/ports.js';\nimport type { ProjectModule, UpdateCandidate, UpdateSummary } from '../../domain/models.js';\n\nconst execAsync = promisify(exec);\n\nexport class MavenUpdaterAdapter implements DependencyUpdaterPort {\n async applyUpdates(\n module: ProjectModule,\n _rootDir: string,\n updates: UpdateCandidate[],\n onProgress: (stepMessage: string) => void,\n ): Promise<Pick<UpdateSummary, 'updatedCount' | 'auditMessage' | 'auditSeverity' | 'fundingMessage'>> {\n const pomPath = join(module.path, 'pom.xml');\n let xml = '';\n try {\n xml = readFileSync(pomPath, 'utf8');\n } catch {\n throw new Error(`Konnte pom.xml in ${module.path} nicht lesen.`);\n }\n\n onProgress('Schreibe neue Versionen in pom.xml…');\n\n for (const item of updates) {\n const group = item.coordinate.group;\n const artifact = item.coordinate.artifact;\n const newVersion = item.newRange;\n\n if (!group || !artifact) continue;\n\n // Ersetze <version> im passenden <dependency>-Block\n const depRegex = new RegExp(\n `(<dependency>[\\\\s\\\\S]*?<groupId>${group}<\\\\/groupId>[\\\\s\\\\S]*?<artifactId>${artifact}<\\\\/artifactId>[\\\\s\\\\S]*?<version>)([^<]+)(<\\\\/version>[\\\\s\\\\S]*?<\\\\/dependency>)`,\n 'g'\n );\n\n xml = xml.replace(depRegex, `$1${newVersion}$3`);\n }\n\n writeFileSync(pomPath, xml, 'utf8');\n\n onProgress('Löse neue Maven-Abhängigkeiten auf (mvn dependency:resolve)…');\n let stdout = '';\n let stderr = '';\n try {\n const res = await execAsync('mvn dependency:resolve -q -DskipTests', {\n cwd: module.path,\n timeout: 60_000,\n });\n stdout = res.stdout;\n stderr = res.stderr;\n } catch (err: any) {\n stdout = err.stdout ?? '';\n stderr = err.stderr ?? err.message;\n }\n\n onProgress('Analysiere Maven-Status…');\n const hasError = stdout.includes('BUILD FAILURE') || stderr.includes('BUILD FAILURE');\n\n return {\n updatedCount: updates.length,\n auditMessage: hasError\n ? 'Achtung: Einige Abhängigkeiten konnten nicht sofort aufgelöst werden.'\n : 'Alle Maven-Abhängigkeiten erfolgreich aufgelöst.',\n auditSeverity: hasError ? 'warn' : 'clean',\n fundingMessage: undefined,\n };\n }\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { VerificationPort } from '../../domain/ports.js';\nimport type { ProjectModule } from '../../domain/models.js';\n\nconst execAsync = promisify(exec);\n\nexport class MavenVerificationAdapter implements VerificationPort {\n async verify(\n module: ProjectModule,\n _rootDir: string,\n customScript?: string,\n customLabel?: string,\n ): Promise<{ status: 'clean' | 'warn'; details: string; label: string }> {\n const script = customScript || 'mvn test-compile -q';\n const label = customLabel || 'Java-Kompilierungstest (mvn test-compile)';\n\n try {\n const { stdout } = await execAsync(script, {\n cwd: module.path,\n timeout: 90_000,\n });\n\n return {\n status: 'clean',\n details: stdout.trim() || 'Java-Quellcode kompiliert fehlerfrei.',\n label,\n };\n } catch (err: any) {\n return {\n status: 'warn',\n details: (err.stdout || err.stderr || err.message).slice(0, 300),\n label,\n };\n }\n }\n}\n","import type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\nimport type { Ecosystem } from '../../domain/models.js';\nimport { MavenModuleDiscoveryAdapter } from './maven-discovery.js';\nimport { MavenRegistryAdapter } from './maven-registry.js';\nimport { MavenDependencyAdapter } from './maven-scanner.js';\nimport { MavenUpdaterAdapter } from './maven-updater.js';\nimport { MavenVerificationAdapter } from './maven-verifier.js';\n\nexport class MavenEcosystemStrategy implements EcosystemStrategy {\n readonly ecosystem: Ecosystem = 'maven';\n readonly displayName = 'Java / Maven';\n readonly icon = '☕';\n readonly manifestFile = 'pom.xml';\n\n readonly discovery = new MavenModuleDiscoveryAdapter();\n readonly registry = new MavenRegistryAdapter();\n readonly reader = new MavenDependencyAdapter(this.registry);\n readonly updater = new MavenUpdaterAdapter();\n readonly verifier = new MavenVerificationAdapter();\n\n getTabLabels(\n counts: { total: number; prodCount: number; devCount: number },\n _t: any,\n ): TabLabels {\n return {\n all: `[1] Alle (${counts.total})`,\n prod: `[2] Compile (${counts.prodCount})`,\n dev: `[3] Test (${counts.devCount})`,\n };\n }\n}\n","/**\n * 🪶 Elevate — Ecosystem Factory (Factory Pattern)\n *\n * Verwaltet und instanziiert die passenden Ökosystem-Strategien\n * für Node/npm und Java/Maven.\n */\n\nimport type { Ecosystem } from './models.js';\nimport type { EcosystemStrategy } from './ecosystem-strategy.js';\nimport { NpmEcosystemStrategy } from '../adapters/npm/npm-strategy.js';\nimport { MavenEcosystemStrategy } from '../adapters/maven/maven-strategy.js';\n\nexport class EcosystemFactory {\n private static instances = new Map<Ecosystem, EcosystemStrategy>();\n\n /** Liefert die Strategie für das gewünschte Ökosystem (Lazy Singleton) */\n static getStrategy(ecosystem: Ecosystem): EcosystemStrategy {\n let strategy = this.instances.get(ecosystem);\n if (!strategy) {\n if (ecosystem === 'maven') {\n strategy = new MavenEcosystemStrategy();\n } else {\n strategy = new NpmEcosystemStrategy();\n }\n this.instances.set(ecosystem, strategy);\n }\n return strategy;\n }\n\n /** Liefert alle verfügbaren Ökosysteme */\n static getAvailableEcosystems(): Ecosystem[] {\n return ['npm', 'maven'];\n }\n}\n","/**\n * 🪶 Elevate — i18n System\n *\n * Verwaltet Übersetzungstabellen, Spracheinstellungen und den useI18n Hook.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { Locale, Translations } from './types.js';\nimport { de } from './locales/de.js';\nimport { en } from './locales/en.js';\n\nexport * from './types.js';\n\nconst dictionaries: Record<Locale, Translations> = { de, en };\n\n/** Ermittelt die Standardsprache aus Umgebung oder Config */\nexport function resolveInitialLocale(configured?: string): Locale {\n if (configured === 'de' || configured === 'en') return configured;\n\n const envLang = (process.env.LANG || process.env.LC_ALL || process.env.LANGUAGE || '').toLowerCase();\n if (envLang.startsWith('en')) return 'en';\n return 'de'; // Standard: Deutsch\n}\n\n/** Liefert das passende Wörterbuch */\nexport function getTranslations(locale: Locale): Translations {\n return dictionaries[locale] ?? dictionaries.de;\n}\n\n/** Hook zur Sprachverwaltung */\nexport function useI18n(initialLocale: Locale = 'de') {\n const [locale, setLocale] = useState<Locale>(initialLocale);\n\n const toggleLocale = useCallback(() => {\n setLocale((prev) => (prev === 'de' ? 'en' : 'de'));\n }, []);\n\n const t = useMemo(() => getTranslations(locale), [locale]);\n\n return {\n locale,\n setLocale,\n toggleLocale,\n t,\n } as const;\n}\n","import type { Translations } from '../types.js';\n\nexport const de: Translations = {\n header: {\n title: 'Elevate',\n developedBy: (name) => `Entwickelt & gepflegt von ${name}`,\n langToggleHint: '[L] DE / EN',\n ecosystemToggleHint: (nextName) => `[E] ${nextName}`,\n },\n workspace: {\n label: 'Workspace / Modul',\n switchHint: 'Drücke [W] zum Wechseln',\n modalTitle: '📁 Modul auswählen (↑/↓ Navigieren, Enter Auswählen, Esc Abbrechen):',\n },\n tabs: {\n all: (count) => `[1] Alle (${count})`,\n dependencies: (count) => `[2] Dependencies (${count})`,\n devDependencies: (count) => `[3] DevDependencies (${count})`,\n },\n list: {\n scanning: '⏳ Prüfe Registry auf verfügbare Updates…',\n allUpToDate: '🎉 Alle Abhängigkeiten in diesem Tab sind auf dem neuesten Stand!',\n moreAbove: '▲ … weitere oben',\n moreBelow: (remaining) => `▼ … weitere unten (${remaining} übrig)`,\n },\n badges: {\n patch: '[Patch]',\n minor: '[Minor]',\n major: '[MAJOR]',\n dev: '(dev/test)',\n prod: '(prod/compile)',\n },\n status: {\n selectedOf: (selected, total) => `${selected} von ${total}`,\n breakdown: (patch, minor, major) => `(${patch} Patch, ${minor} Minor, ${major} Major)`,\n symlinksProtected: (scopes) => `🛡️ Interne ${scopes.map((s) => `${s}/*`).join(', ')} geschützt`,\n defaultProtected: '🛡️ Interne Monorepo-Module geschützt',\n },\n controls: {\n navigate: 'Navigieren',\n toggle: 'Toggle',\n all: 'Alle',\n tabs: 'Tabs',\n workspace: 'Modul',\n ecosystem: 'Ökosystem',\n version: 'Version',\n language: 'Sprache',\n update: 'Update starten',\n quit: 'Beenden',\n },\n versionModal: {\n title: (pkgName) => `Version heraussuchen: ${pkgName}`,\n current: (version) => `Aktuell installiert: ${version}`,\n filterPlaceholder: 'Tippe zum Filtern (z. B. 3.2 oder 18)…',\n loading: 'Lade alle Versionen aus der Registry…',\n noVersions: 'Keine passenden Versionen gefunden.',\n hint: '[↑/↓/j/k] Navigieren │ [Enter] Auswählen │ [Esc] Abbrechen │ [Backspace] Filter löschen',\n latestBadge: 'LATEST',\n currentBadge: 'AKTUELL',\n customBadge: 'MANUELL',\n },\n updating: {\n title: '⚡ Aktualisierung läuft…',\n stepWriting: (step, total) => `${step}/${total} — Schreibe neue Versionen ins Manifest…`,\n stepInstalling: (step, total) => `${step}/${total} — Löse Abhängigkeiten auf (bitte kurz warten)…`,\n stepAnalyzing: (step, total) => `${step}/${total} — Analysiere Build & Output…`,\n stepCustom: (step, total, label) => `${step}/${total} — ${label}…`,\n doNotClose: 'Bitte das Terminal nicht schließen.',\n },\n summary: {\n title: '✨ Aktualisierung abgeschlossen!',\n successCount: (count, path) => `📦 ${count} Abhängigkeiten erfolgreich in ${path} aktualisiert.`,\n securityAudit: '🛡️ Status & Audit:',\n cleanAudit: 'Keine bekannten Probleme gefunden.',\n funding: (msg) => `💡 Funding: ${msg}`,\n postScript: (label) => `🔍 ${label}:`,\n backHint: '[Enter] Zurück zum Dashboard │ [Q] Beenden',\n },\n mascot: {\n name: 'Pip',\n idleChirps: ['*piep*', '*flausch*', '*pick pick*', 'alles frisch! 🪶', '*blinzel*'],\n scanningChirps: ['*such*', 'prüfe...', 'oh, Updates?', 'einen Moment!'],\n updatingChirps: ['*schuft*', 'baue Code...', 'gleich fertig!', 'arbeite emsig...'],\n successChirps: ['hurra! 🎉', 'alles aktuell!', 'top gepflegt! 🪶', 'super gemacht!'],\n mavenChirps: ['*kaffee schlürf* ☕', 'Spring Boot läuft!', 'Java 25 rockt!', 'sauber gebaut!'],\n },\n splash: {\n tagline: 'Modernes Polyglot Dependency Dashboard',\n loading: 'Initialisiere Module & bereite Dashboard vor…',\n skipHint: '[Leertaste / Enter] zum Überspringen',\n },\n};\n","import type { Translations } from '../types.js';\n\nexport const en: Translations = {\n header: {\n title: 'Elevate',\n developedBy: (name) => `Developed & maintained by ${name}`,\n langToggleHint: '[L] EN / DE',\n ecosystemToggleHint: (nextName) => `[E] ${nextName}`,\n },\n workspace: {\n label: 'Workspace / Module',\n switchHint: 'Press [W] to switch',\n modalTitle: '📁 Select Module (↑/↓ Navigate, Enter Select, Esc Cancel):',\n },\n tabs: {\n all: (count) => `[1] All (${count})`,\n dependencies: (count) => `[2] Dependencies (${count})`,\n devDependencies: (count) => `[3] DevDependencies (${count})`,\n },\n list: {\n scanning: '⏳ Checking registry for available updates…',\n allUpToDate: '🎉 All dependencies in this tab are up to date!',\n moreAbove: '▲ … more above',\n moreBelow: (remaining) => `▼ … more below (${remaining} remaining)`,\n },\n badges: {\n patch: '[Patch]',\n minor: '[Minor]',\n major: '[MAJOR]',\n dev: '(dev/test)',\n prod: '(prod/compile)',\n },\n status: {\n selectedOf: (selected, total) => `${selected} of ${total}`,\n breakdown: (patch, minor, major) => `(${patch} Patch, ${minor} Minor, ${major} Major)`,\n symlinksProtected: (scopes) => `🛡️ Internal ${scopes.map((s) => `${s}/*`).join(', ')} protected`,\n defaultProtected: '🛡️ Internal monorepo modules protected',\n },\n controls: {\n navigate: 'Navigate',\n toggle: 'Toggle',\n all: 'All',\n tabs: 'Tabs',\n workspace: 'Module',\n ecosystem: 'Ecosystem',\n version: 'Version',\n language: 'Language',\n update: 'Start update',\n quit: 'Quit',\n },\n versionModal: {\n title: (pkgName) => `Pick version for: ${pkgName}`,\n current: (version) => `Currently installed: ${version}`,\n filterPlaceholder: 'Type to filter (e.g. 3.2 or 18)…',\n loading: 'Loading all versions from registry…',\n noVersions: 'No matching versions found.',\n hint: '[↑/↓/j/k] Navigate │ [Enter] Select │ [Esc] Cancel │ [Backspace] Clear filter',\n latestBadge: 'LATEST',\n currentBadge: 'CURRENT',\n customBadge: 'MANUAL',\n },\n updating: {\n title: '⚡ Update in progress…',\n stepWriting: (step, total) => `${step}/${total} — Writing new versions to manifest…`,\n stepInstalling: (step, total) => `${step}/${total} — Resolving dependencies (please wait)…`,\n stepAnalyzing: (step, total) => `${step}/${total} — Analyzing build & output…`,\n stepCustom: (step, total, label) => `${step}/${total} — ${label}…`,\n doNotClose: 'Please do not close the terminal.',\n },\n summary: {\n title: '✨ Update completed successfully!',\n successCount: (count, path) => `📦 ${count} dependencies updated successfully in ${path}.`,\n securityAudit: '🛡️ Status & Audit:',\n cleanAudit: 'No known issues found.',\n funding: (msg) => `💡 Funding: ${msg}`,\n postScript: (label) => `🔍 ${label}:`,\n backHint: '[Enter] Back to Dashboard │ [Q] Quit',\n },\n mascot: {\n name: 'Pip',\n idleChirps: ['*chirp*', '*fluff*', '*peck peck*', 'all fresh! 🪶', '*blink*'],\n scanningChirps: ['*peeking*', 'checking...', 'ooh, updates?', 'just a sec!'],\n updatingChirps: ['*working hard*', 'building...', 'almost there!', 'packing modules...'],\n successChirps: ['hooray! 🎉', 'all updated!', 'looking sharp! 🪶', 'great job!'],\n mavenChirps: ['*sipping coffee* ☕', 'Spring Boot rocks!', 'Java 25 is fly!', 'clean build!'],\n },\n splash: {\n tagline: 'Modern Polyglot Dependency Dashboard',\n loading: 'Initializing modules & preparing dashboard…',\n skipHint: '[Space / Enter] to skip',\n },\n};\n","/**\n * 🪶 Elevate — useWorkspaces Hook (Domain-Driven)\n *\n * Verwaltet Module des aktuell aktiven Ökosystems über die\n * ModuleDiscoveryPort-Schnittstelle.\n */\n\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport type { ProjectModule } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\n\nexport function useWorkspaces(strategy: EcosystemStrategy, rootDir: string) {\n const [modules, setModules] = useState<ProjectModule[]>([]);\n const [loading, setLoading] = useState(true);\n const [activeIndex, setActiveIndex] = useState(0);\n\n // Module anhand der aktuellen Ökosystem-Strategie laden\n const reload = useCallback(async () => {\n setLoading(true);\n setModules([]);\n setActiveIndex(0);\n try {\n const found = await strategy.discovery.discover(rootDir);\n setModules(found);\n setActiveIndex(0);\n } catch {\n setModules([]);\n } finally {\n setLoading(false);\n }\n }, [strategy, rootDir]);\n\n useEffect(() => {\n reload();\n }, [reload]);\n\n // Interne IDs sammeln (für Symlink-/Monorepo-Schutz)\n const internalIds = useMemo(() => {\n const ids = new Set<string>();\n for (const m of modules) {\n if (m.id) ids.add(m.id);\n if (m.name) ids.add(m.name);\n }\n return ids;\n }, [modules]);\n\n const active: ProjectModule = modules[activeIndex] || {\n id: 'empty',\n name: 'Kein Modul gefunden',\n path: rootDir,\n relPath: 'Root',\n ecosystem: strategy.ecosystem,\n isRoot: true,\n };\n\n return {\n modules,\n active,\n activeIndex,\n setActiveIndex,\n internalIds,\n loading,\n reload,\n } as const;\n}\n","/**\n * 🪶 Elevate — usePackages Hook (Domain-Driven)\n *\n * Scannt Abhängigkeiten eines Moduls über den DependencyReaderPort\n * der aktuellen Ökosystem-Strategie und verwaltet Auswahl, Filterung und Tabs.\n */\n\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport semver from 'semver';\nimport type {\n UpdateCandidate,\n Tab,\n SelectionCounts,\n ProjectModule,\n ReleaseChannel,\n VersionDiff,\n} from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../adapters/maven/maven-registry.js';\n\nexport function usePackages(\n strategy: EcosystemStrategy,\n module: ProjectModule,\n internalIds: Set<string>,\n excludeScopes: string[] = [],\n channel: ReleaseChannel = 'stable',\n) {\n const [candidates, setCandidates] = useState<UpdateCandidate[]>([]);\n const [loading, setLoading] = useState(false);\n const [activeTab, setActiveTab] = useState<Tab>('all');\n const [cursor, setCursor] = useState(0);\n\n // Scan beim Modul- oder Strategiewechsel\n const scan = useCallback(async () => {\n if (!module || module.id === 'empty') {\n setCandidates([]);\n return;\n }\n setLoading(true);\n setCursor(0);\n setCandidates([]);\n\n try {\n const updates = await strategy.reader.scan(module, excludeScopes, internalIds, channel);\n setCandidates(updates);\n } catch {\n setCandidates([]);\n } finally {\n setLoading(false);\n }\n }, [strategy, module.path, module.id, internalIds, excludeScopes, channel]);\n\n useEffect(() => {\n if (module && module.id !== 'empty') {\n scan();\n }\n }, [module.path, module.id, strategy.ecosystem, channel]);\n\n // Sichtbare Pakete je nach Tab\n const visible = useMemo(() => {\n if (activeTab === 'prod') return candidates.filter((c) => c.scope === 'prod');\n if (activeTab === 'dev') return candidates.filter((c) => c.scope !== 'prod');\n return candidates;\n }, [candidates, activeTab]);\n\n // Zählerstände\n const counts: SelectionCounts = useMemo(() => {\n const selected = candidates.filter((c) => c.selected);\n return {\n total: candidates.length,\n prodCount: candidates.filter((c) => c.scope === 'prod').length,\n devCount: candidates.filter((c) => c.scope !== 'prod').length,\n selectedCount: selected.length,\n patchCount: selected.filter((c) => c.diff === 'patch').length,\n minorCount: selected.filter((c) => c.diff === 'minor').length,\n majorCount: selected.filter((c) => c.diff === 'major').length,\n };\n }, [candidates]);\n\n // Einzelnes Paket togglen\n const togglePackage = useCallback((identifier: string) => {\n setCandidates((prev) =>\n prev.map((c) =>\n c.coordinate.identifier === identifier ? { ...c, selected: !c.selected } : c,\n ),\n );\n }, []);\n\n // Alle sichtbaren togglen\n const toggleAllVisible = useCallback(() => {\n const allSelected = visible.every((c) => c.selected);\n const visibleIds = new Set(visible.map((c) => c.coordinate.identifier));\n setCandidates((prev) =>\n prev.map((c) =>\n visibleIds.has(c.coordinate.identifier) ? { ...c, selected: !allSelected } : c,\n ),\n );\n }, [visible]);\n\n // Benutzerdefinierte Version für eine Abhängigkeit setzen\n const setCustomVersion = useCallback((identifier: string, chosenVersion: string) => {\n setCandidates((prev) =>\n prev.map((c) => {\n if (c.coordinate.identifier !== identifier) return c;\n\n const prefix = c.currentRange.startsWith('~')\n ? '~'\n : c.currentRange.startsWith('^')\n ? '^'\n : '';\n\n let diff: VersionDiff = 'minor';\n const cleanChosen = semver.valid(chosenVersion);\n if (c.currentClean && cleanChosen) {\n const semDiff = semver.diff(c.currentClean, chosenVersion);\n if (semDiff === 'major' || semDiff === 'minor' || semDiff === 'patch') {\n diff = semDiff;\n }\n }\n\n const isPre = isPreReleaseVersion(chosenVersion);\n const preTag = isPre ? extractPreReleaseTag(chosenVersion) : undefined;\n\n return {\n ...c,\n newRange: `${prefix}${chosenVersion}`,\n diff,\n selected: true,\n isPreRelease: isPre,\n preReleaseTag: preTag,\n isCustomVersion: true,\n };\n }),\n );\n }, []);\n\n const switchTab = useCallback((tab: Tab) => {\n setActiveTab(tab);\n setCursor(0);\n }, []);\n\n const cycleTab = useCallback(() => {\n setActiveTab((t) => (t === 'all' ? 'prod' : t === 'prod' ? 'dev' : 'all'));\n setCursor(0);\n }, []);\n\n return {\n packages: candidates,\n loading,\n visible,\n counts,\n activeTab,\n cursor,\n setCursor,\n scan,\n switchTab,\n cycleTab,\n togglePackage,\n toggleAllVisible,\n setCustomVersion,\n } as const;\n}\n","/**\n * 🪶 Elevate — useUpdater Hook (Domain-Driven)\n *\n * Führt den Update-Workflow über DependencyUpdaterPort und\n * VerificationPort der aktuellen Ökosystem-Strategie aus.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { UpdateCandidate, UpdateSummary, View, ProjectModule } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\n\nexport interface PostUpdateOptions {\n script?: string;\n label?: string;\n}\n\nexport function useUpdater(\n strategy: EcosystemStrategy,\n rootDir: string,\n setView: (view: View) => void,\n postUpdate?: PostUpdateOptions,\n) {\n const [step, setStep] = useState('');\n const [summary, setSummary] = useState<UpdateSummary | null>(null);\n\n const run = useCallback(\n async (module: ProjectModule, selected: UpdateCandidate[], _t: Translations) => {\n if (selected.length === 0) return;\n\n setView('updating');\n\n // 1. & 2. & 3. Update & Build via Updater Adapter\n const updaterResult = await strategy.updater.applyUpdates(\n module,\n rootDir,\n selected,\n (progressMessage) => setStep(progressMessage),\n );\n\n // 4. Verifikation via Verifier Adapter\n setStep('Führe Verifikation und Konsistenzchecks durch…');\n const verifierResult = await strategy.verifier.verify(\n module,\n rootDir,\n postUpdate?.script,\n postUpdate?.label,\n );\n\n setSummary({\n ...updaterResult,\n verificationStatus: verifierResult.status,\n verificationDetails: verifierResult.details,\n verificationLabel: verifierResult.label,\n });\n\n setView('summary');\n },\n [strategy, rootDir, setView, postUpdate],\n );\n\n return { step, summary, run } as const;\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport { en } from '../i18n/locales/en.js';\n\ninterface Props {\n onComplete: () => void;\n author?: string;\n}\n\n/**\n * 🪶 Elevate — Initialer Splash Screen\n *\n * Zeigt beim Start ein ansprechendes Intro mit Maskottchen Pip,\n * Ladebalken und Autoren-Info. Der Splash Screen ist bewusst IMMER\n * auf Englisch gehalten. Schaltet nach ~3,2 Sekunden oder per\n * Tastendruck automatisch auf das Dashboard um.\n */\nexport const SplashScreen: React.FC<Props> = ({ onComplete, author }) => {\n const t = en;\n\n const [progress, setProgress] = useState(0);\n const [frame, setFrame] = useState(0);\n\n // Animations- und Fortschritts-Timer\n useEffect(() => {\n const progressTimer = setInterval(() => {\n setProgress((prev) => {\n if (prev >= 100) {\n clearInterval(progressTimer);\n setTimeout(onComplete, 250);\n return 100;\n }\n return prev + 5;\n });\n }, 150);\n\n const mascotTimer = setInterval(() => {\n setFrame((prev) => (prev + 1) % 4);\n }, 400);\n\n return () => {\n clearInterval(progressTimer);\n clearInterval(mascotTimer);\n };\n }, [onComplete]);\n\n // Mascot-Animations-Frames für den Splash Screen (immer englische Chirps)\n const mascotFrames = [\n { face: '( •ө• )', arms: '/ >🪶', chirp: '*chirp!*' },\n { face: '( ᵔөᵔ )', arms: '/ >🪶', chirp: '*hello!*' },\n { face: '( -ө- )', arms: '/ >🪶', chirp: '*blink*' },\n { face: '( •ө• )', arms: '\\\\(•ө•)/', chirp: 'ready! ✨' },\n ];\n const curMascot = mascotFrames[frame % mascotFrames.length]!;\n\n // 24-Segment-Fortschrittsbalken\n const barLength = 24;\n const filledLength = Math.round((progress / 100) * barLength);\n const emptyLength = Math.max(0, barLength - filledLength);\n const progressBar = '█'.repeat(filledLength) + '░'.repeat(emptyLength);\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderStyle=\"round\"\n borderColor={theme.colors.brand}\n paddingY={2}\n paddingX={4}\n marginY={1}\n >\n {/* 1. Titel & Icon */}\n <Box marginBottom={1}>\n <Text bold color={theme.colors.brand}>\n {theme.icon} E L E V A T E\n </Text>\n </Box>\n\n <Text color={theme.colors.muted}>{t.splash.tagline}</Text>\n\n {/* 2. Großes zentriertes Hühnchen */}\n <Box flexDirection=\"column\" alignItems=\"center\" marginY={1}>\n <Text color={theme.colors.mascotComb} bold>\n (\\_/)\n </Text>\n <Box>\n <Text color={theme.colors.mascotBody} bold>\n {curMascot.face}{' '}\n </Text>\n <Text color={theme.colors.brandLight} italic>\n {curMascot.chirp}\n </Text>\n </Box>\n <Text color={theme.colors.brandLight} bold>\n {curMascot.arms}\n </Text>\n </Box>\n\n {/* 3. Autor-Hinweis */}\n {author && (\n <Box marginBottom={1}>\n <Text color={theme.colors.muted}>{t.header.developedBy(author)}</Text>\n </Box>\n )}\n\n {/* 4. Ladebalken */}\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Box>\n <Text color={theme.colors.brandLight} bold>\n [{progressBar}] {Math.min(100, progress)}%\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.colors.muted}>{t.splash.loading}</Text>\n </Box>\n </Box>\n\n {/* 5. Skip-Hinweis */}\n <Box marginTop={1}>\n <Text color={theme.colors.muted} dimColor>\n {t.splash.skipHint}\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * 🪶 Elevate — Theme & Brand Tokens\n *\n * Brand-Farbe: Orange\n * Symbol: Feder (🪶)\n */\n\nexport const theme = {\n icon: '🪶',\n colors: {\n // Brand & Akzente (Orange-Palette)\n brand: '#FF8800',\n brandLight: '#FFA726',\n brandDark: '#E65100',\n brandSoft: '#FFE0B2',\n accent: '#FF9800',\n\n // Süßes Hühnchen (Mascot)\n mascotBody: '#FFD54F',\n mascotComb: '#FF7043',\n mascotBeak: '#FF9800',\n mascotBlush: '#FF8A80',\n mascotFeet: '#FFA726',\n\n // Statusfarben\n success: 'green',\n warning: 'yellow',\n danger: 'red',\n muted: 'gray',\n white: 'white',\n\n // UI-Elemente\n border: '#FF8800',\n borderMuted: 'gray',\n focus: '#FFA726',\n },\n} as const;\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { Translations } from '../i18n/types.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { ReleaseChannel } from '../domain/models.js';\n\ninterface Props {\n author?: string;\n t: Translations;\n currentLocale: string;\n strategy: EcosystemStrategy;\n nextStrategyName: string;\n channel: ReleaseChannel;\n}\n\n/** Kopfzeile mit Polyglot-Ecosystem-Anzeige, Release Channel, Sprache und Autor */\nexport const Header: React.FC<Props> = ({\n author,\n t,\n currentLocale,\n strategy,\n nextStrategyName,\n channel,\n}) => (\n <Box\n borderStyle=\"round\"\n borderColor={theme.colors.brand}\n paddingX={1}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n {/* Links: Logo, Ökosystem & Channel */}\n <Box alignItems=\"center\">\n <Text bold color={theme.colors.brand}>\n {theme.icon} {t.header.title}\n </Text>\n\n {/* Aktives Ökosystem & Channel */}\n <Box marginLeft={2}>\n <Text color={theme.colors.muted}>│ </Text>\n <Text color={theme.colors.brandLight} bold>\n {strategy.icon} {strategy.displayName}\n </Text>\n <Text color={theme.colors.muted}> [{channel}] </Text>\n <Text color={theme.colors.muted}>\n ({t.header.ecosystemToggleHint(nextStrategyName)})\n </Text>\n </Box>\n\n {/* Sprache */}\n <Box marginLeft={2}>\n <Text color={theme.colors.muted}>│ </Text>\n <Text color={theme.colors.brandLight} bold>\n [{currentLocale.toUpperCase()}]\n </Text>\n <Text color={theme.colors.muted}> {t.header.langToggleHint}</Text>\n </Box>\n </Box>\n\n {/* Rechts: Maintainer */}\n {author && (\n <Text color={theme.colors.muted}>\n {t.header.developedBy(author)}\n </Text>\n )}\n </Box>\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { ProjectModule } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\n\ninterface Props {\n module: ProjectModule;\n excludeScopes: string[];\n strategy: EcosystemStrategy;\n t: Translations;\n}\n\n/** Zeigt das aktuell aktive Modul und den Schutzhinweis statisch an */\nexport const WorkspaceBar: React.FC<Props> = ({ module, excludeScopes, strategy, t }) => {\n const scopeHint =\n excludeScopes.length > 0\n ? t.status.symlinksProtected(excludeScopes)\n : t.status.defaultProtected;\n\n return (\n <Box marginY={1} justifyContent=\"space-between\" alignItems=\"center\">\n <Box alignItems=\"center\" flexShrink={1}>\n <Text bold>📍 {strategy.icon} {t.workspace.label}: </Text>\n <Text bold color={theme.colors.brandLight}>\n {module.name}\n </Text>\n <Text color={theme.colors.muted}> ({module.relPath})</Text>\n </Box>\n <Box alignItems=\"center\" marginLeft={2}>\n <Text color={theme.colors.muted}>{scopeHint}</Text>\n <Text color={theme.colors.muted}> │ </Text>\n <Text color={theme.colors.brandLight} bold>[W]</Text>\n <Text color={theme.colors.muted}> {t.workspace.switchHint.replace('[W]', '').trim()}</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { Tab, SelectionCounts } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\n\ninterface Props {\n activeTab: Tab;\n counts: SelectionCounts;\n strategy: EcosystemStrategy;\n t: Translations;\n}\n\n/** Tab-Leiste: Fragt die Bezeichnungen vom jeweiligen Ökosystem ab */\nexport const TabBar: React.FC<Props> = ({ activeTab, counts, strategy, t }) => {\n const labels = strategy.getTabLabels(counts, t);\n\n return (\n <Box borderStyle=\"single\" borderColor={theme.colors.borderMuted} paddingX={1}>\n <Text\n bold\n color={activeTab === 'all' ? theme.colors.brand : theme.colors.white}\n underline={activeTab === 'all'}\n >\n {labels.all}\n </Text>\n <Text color={theme.colors.muted}> │ </Text>\n <Text\n bold\n color={activeTab === 'prod' ? theme.colors.brand : theme.colors.white}\n underline={activeTab === 'prod'}\n >\n {labels.prod}\n </Text>\n <Text color={theme.colors.muted}> │ </Text>\n <Text\n bold\n color={activeTab === 'dev' ? theme.colors.brand : theme.colors.white}\n underline={activeTab === 'dev'}\n >\n {labels.dev}\n </Text>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { UpdateCandidate } from '../domain/models.js';\nimport type { Translations } from '../i18n/types.js';\nimport { PackageRow } from './package-row.js';\n\ninterface Props {\n items: UpdateCandidate[];\n cursor: number;\n loading: boolean;\n t: Translations;\n}\n\nconst WINDOW_SIZE = 7;\n\n/** Scrollbare Liste mit Fenster-Ausschnitt */\nexport const PackageList: React.FC<Props> = ({ items, cursor, loading, t }) => {\n const startIdx = Math.max(\n 0,\n Math.min(\n cursor - Math.floor(WINDOW_SIZE / 2),\n Math.max(0, items.length - WINDOW_SIZE),\n ),\n );\n const window = items.slice(startIdx, startIdx + WINDOW_SIZE);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={theme.colors.border}\n padding={1}\n marginY={1}\n minHeight={10}\n >\n {loading ? (\n <Box marginY={2} justifyContent=\"center\">\n <Text color={theme.colors.warning}>{t.list.scanning}</Text>\n </Box>\n ) : items.length === 0 ? (\n <Box marginY={2} justifyContent=\"center\">\n <Text color={theme.colors.success}>{t.list.allUpToDate}</Text>\n </Box>\n ) : (\n <>\n {startIdx > 0 && (\n <Text color={theme.colors.muted}>{t.list.moreAbove}</Text>\n )}\n {window.map((item, idx) => (\n <PackageRow\n key={`${item.coordinate?.identifier || (item as any).name}_${startIdx + idx}`}\n item={item}\n isFocused={startIdx + idx === cursor}\n t={t}\n />\n ))}\n {startIdx + WINDOW_SIZE < items.length && (\n <Text color={theme.colors.muted}>\n {t.list.moreBelow(items.length - (startIdx + WINDOW_SIZE))}\n </Text>\n )}\n </>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { UpdateCandidate } from '../domain/models.js';\nimport type { Translations } from '../i18n/types.js';\n\ninterface Props {\n item: UpdateCandidate;\n isFocused: boolean;\n t: Translations;\n}\n\n/** Einzelne Zeile in der Liste mit Badges und Checkbox */\nexport const PackageRow: React.FC<Props> = ({ item, isFocused, t }) => {\n const badge =\n item.diff === 'major' ? (\n <Text bold color={theme.colors.danger}>{t.badges.major}</Text>\n ) : item.diff === 'minor' ? (\n <Text color={theme.colors.warning}>{t.badges.minor}</Text>\n ) : (\n <Text color={theme.colors.success}>{t.badges.patch}</Text>\n );\n\n const displayName = item.coordinate?.identifier || (item as any).name || '';\n const isDevOrTest = item.scope === 'dev' || item.scope === 'test';\n\n return (\n <Box justifyContent=\"space-between\">\n <Box>\n <Text color={theme.colors.brandLight} bold>\n {isFocused ? '➔ ' : ' '}\n </Text>\n <Text color={item.selected ? theme.colors.success : theme.colors.muted} bold>\n {item.selected ? '[✔] ' : '[ ] '}\n </Text>\n <Text bold={isFocused} color={isFocused ? theme.colors.brandLight : theme.colors.white}>\n {displayName.slice(0, 42).padEnd(42)}{' '}\n </Text>\n <Text color={theme.colors.muted}>{item.currentRange.padEnd(12)} </Text>\n <Text color={theme.colors.muted}>➔ </Text>\n <Text bold color={theme.colors.white}>\n {item.newRange.padEnd(12)}{' '}\n </Text>\n </Box>\n <Box>\n {item.isCustomVersion && (\n <Text bold color={theme.colors.brandLight}>\n [{t.versionModal.customBadge}]{' '}\n </Text>\n )}\n {item.isPreRelease && (\n <Text bold color=\"#E040FB\">\n [{item.preReleaseTag || 'PRE'}]{' '}\n </Text>\n )}\n {badge}\n <Text color={theme.colors.muted}> {isDevOrTest ? t.badges.dev : t.badges.prod}</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { SelectionCounts, Ecosystem } from '../domain/models.js';\nimport type { Translations } from '../i18n/types.js';\nimport { ChickenMascot, type MascotState } from './mascot.js';\n\ninterface Props {\n counts: SelectionCounts;\n visibleCount: number;\n t: Translations;\n mascotState?: MascotState;\n ecosystem?: Ecosystem;\n}\n\n/** Statusleiste: Zähler links, Hühnchen-Mascot rechts */\nexport const StatusBar: React.FC<Props> = ({\n counts,\n visibleCount,\n t,\n mascotState = 'idle',\n ecosystem = 'npm',\n}) => {\n return (\n <Box\n borderStyle=\"single\"\n borderColor={theme.colors.borderMuted}\n paddingX={1}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n {/* Linke Seite: Zähler (fest am linken Rand) */}\n <Box>\n <Text bold>{t.status.selectedOf(counts.selectedCount, visibleCount)} </Text>\n <Text color={theme.colors.muted}>\n {t.status.breakdown(counts.patchCount, counts.minorCount, counts.majorCount)}\n </Text>\n </Box>\n\n {/* Rechte Seite: Süßes animiertes Hühnchen */}\n <ChickenMascot state={mascotState} t={t} ecosystem={ecosystem} />\n </Box>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { Translations } from '../i18n/types.js';\nimport type { Ecosystem } from '../domain/models.js';\n\nexport type MascotState = 'idle' | 'scanning' | 'updating' | 'success';\n\ninterface Props {\n state?: MascotState;\n t: Translations;\n ecosystem?: Ecosystem;\n}\n\n/**\n * 🐣 Süßes animiertes Hühnchen (\"Pip\")\n *\n * Inspiriert vom kleinen animierten Begleiter in Claude Code CLI.\n * Polyglot: Blinzelt, wechselt Mimik und zwitschert passend zum\n * aktuellen Zustand und zum gewählten Ökosystem (Node vs. Java).\n */\nexport const ChickenMascot: React.FC<Props> = ({ state = 'idle', t, ecosystem = 'npm' }) => {\n const [frame, setFrame] = useState(0);\n const [chirpIndex, setChirpIndex] = useState(0);\n\n // Animations-Timer (alle 1,4 Sekunden ein neuer Frame)\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((prev) => (prev + 1) % 6);\n }, 1400);\n\n return () => clearInterval(timer);\n }, []);\n\n // Sprechblasen-Timer (wechselt alle 4,2 Sekunden den Text)\n useEffect(() => {\n const chirpTimer = setInterval(() => {\n setChirpIndex((prev) => prev + 1);\n }, 4200);\n\n return () => clearInterval(chirpTimer);\n }, []);\n\n // Mimik je nach Zustand & Frame\n let chickFace = '( •ө• )';\n let wingLeft = ' ';\n let wingRight = ' ';\n let currentChirp = '';\n\n if (state === 'scanning') {\n const scanningFaces = ['( •ө• )?', '( ˘ө˘ )🔍', '( •ө• )🔎', '( ᵔөᵔ )?'];\n chickFace = scanningFaces[frame % scanningFaces.length]!;\n currentChirp = t.mascot.scanningChirps[chirpIndex % t.mascot.scanningChirps.length]!;\n } else if (state === 'updating') {\n const updatingFrames = [\n { face: '( •ө• )', l: 'ง', r: 'ง' },\n { face: '( ˘ө˘ )', l: '~', r: '~' },\n { face: '( •ө• )', l: 'ᕙ', r: 'ᕗ' },\n { face: '( ᵔөᵔ )', l: 'ง', r: 'ง' },\n ];\n const cur = updatingFrames[frame % updatingFrames.length]!;\n chickFace = cur.face;\n wingLeft = cur.l;\n wingRight = cur.r;\n currentChirp = t.mascot.updatingChirps[chirpIndex % t.mascot.updatingChirps.length]!;\n } else if (state === 'success') {\n const successFaces = ['\\\\( ᵔөᵔ )/', '\\\\( •ө• )/ 🎉', '*( ᵔөᵔ )* 🪶', '\\\\( ᵔөᵔ )/ ✨'];\n chickFace = successFaces[frame % successFaces.length]!;\n currentChirp = t.mascot.successChirps[chirpIndex % t.mascot.successChirps.length]!;\n } else {\n // Idle state: dezentes Blinzeln & Wippen\n const idleFaces = [\n { face: '( •ө• )', l: ' ', r: ' ' },\n { face: '( •ө• )', l: ' ', r: ' ' },\n { face: '( -ө- )', l: ' ', r: ' ' }, // Blinzeln\n { face: '( ᵔөᵔ )', l: ' ', r: ' ' }, // Lächeln\n { face: '( •ө- )', l: ' ', r: ' ' }, // Zwinkern\n { face: '( ˘ө˘ )', l: ' ', r: '~🪶' }, // Flausch-Feder\n ];\n const cur = idleFaces[frame % idleFaces.length]!;\n chickFace = cur.face;\n wingLeft = cur.l;\n wingRight = cur.r;\n\n const chirpsPool =\n ecosystem === 'maven'\n ? [...t.mascot.idleChirps, ...t.mascot.mavenChirps]\n : t.mascot.idleChirps;\n\n currentChirp = chirpsPool[chirpIndex % chirpsPool.length]!;\n }\n\n return (\n <Box alignItems=\"center\">\n {/* Kämmchen */}\n <Text color={theme.colors.mascotComb} bold>\n {wingLeft === ' ' ? ' ' : wingLeft}\n </Text>\n\n {/* Körper & Schnabel */}\n <Text color={theme.colors.mascotBody} bold>\n {chickFace}\n </Text>\n\n {/* Rechter Flügel / Feder */}\n <Text color={theme.colors.brandLight} bold>\n {wingRight}\n </Text>\n\n {/* Kleine Sprechblase / Piepser */}\n {currentChirp ? (\n <Box marginLeft={1}>\n <Text color={theme.colors.brandLight} italic>\n {currentChirp}\n </Text>\n </Box>\n ) : null}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { Translations } from '../i18n/types.js';\n\ninterface Props {\n t: Translations;\n}\n\n/** Tastenkürzel-Leiste inkl. [E] Ökosystem-Wechsel */\nexport const ControlsBar: React.FC<Props> = ({ t }) => (\n <Box marginTop={1} flexWrap=\"wrap\">\n <Text color={theme.colors.brandLight} bold>[↑/↓]</Text>\n <Text color={theme.colors.muted}> {t.controls.navigate} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[Space]</Text>\n <Text color={theme.colors.muted}> {t.controls.toggle} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[A]</Text>\n <Text color={theme.colors.muted}> {t.controls.all} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[Tab/1/2/3]</Text>\n <Text color={theme.colors.muted}> {t.controls.tabs} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[W]</Text>\n <Text color={theme.colors.muted}> {t.controls.workspace} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[V]</Text>\n <Text color={theme.colors.muted}> {t.controls.version} │ </Text>\n\n <Text color={theme.colors.brand} bold>[E]</Text>\n <Text color={theme.colors.muted}> {t.controls.ecosystem} │ </Text>\n\n <Text color={theme.colors.brandLight} bold>[L]</Text>\n <Text color={theme.colors.muted}> {t.controls.language} │ </Text>\n\n <Text color={theme.colors.success} bold>[U]</Text>\n <Text color={theme.colors.muted}> {t.controls.update} │ </Text>\n\n <Text color={theme.colors.danger} bold>[Q]</Text>\n <Text color={theme.colors.muted}> {t.controls.quit}</Text>\n </Box>\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { ProjectModule } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\n\ninterface Props {\n modules: ProjectModule[];\n focusedIndex: number;\n strategy: EcosystemStrategy;\n t: Translations;\n}\n\n/** Modaler Modul-Auswähler für das aktuelle Ökosystem */\nexport const WorkspaceModal: React.FC<Props> = ({ modules, focusedIndex, strategy, t }) => (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={theme.colors.brand}\n padding={1}\n marginY={1}\n >\n <Text bold color={theme.colors.brandLight}>\n {strategy.icon} {t.workspace.modalTitle}\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {modules.map((m, idx) => (\n <Box key={m.path}>\n <Text\n color={idx === focusedIndex ? theme.colors.brandLight : theme.colors.white}\n bold={idx === focusedIndex}\n >\n {idx === focusedIndex ? ' ➔ ' : ' '}\n {m.name.slice(0, 48).padEnd(48)}\n </Text>\n <Text color={theme.colors.muted}>({m.relPath})</Text>\n </Box>\n ))}\n </Box>\n </Box>\n);\n","/**\n * 🪶 Elevate — Version Picker Modal (Version heraussuchen)\n *\n * Ermöglicht das interaktive Durchsuchen und Auswählen einer\n * beliebigen Zielversion aus der npm- bzw. Maven-Registry.\n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { theme } from '../theme.js';\nimport type { UpdateCandidate } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../adapters/maven/maven-registry.js';\n\ninterface Props {\n candidate: UpdateCandidate;\n strategy: EcosystemStrategy;\n t: Translations;\n onSelect: (version: string) => void;\n onCancel: () => void;\n}\n\nconst WINDOW_SIZE = 8;\n\nexport const VersionModal: React.FC<Props> = ({\n candidate,\n strategy,\n t,\n onSelect,\n onCancel,\n}) => {\n const [allVersions, setAllVersions] = useState<string[]>([]);\n const [loading, setLoading] = useState(true);\n const [filterText, setFilterText] = useState('');\n const [cursor, setCursor] = useState(0);\n\n // Alle verfügbaren Versionen aus der Registry laden\n useEffect(() => {\n let active = true;\n setLoading(true);\n\n strategy.registry\n .getAllVersions(candidate.coordinate)\n .then((versions) => {\n if (!active) return;\n setAllVersions(versions);\n // Falls die aktuelle Neueste vorhanden ist, Cursor darauf ausrichten\n setCursor(0);\n })\n .catch(() => {\n if (!active) return;\n setAllVersions([]);\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [strategy, candidate.coordinate]);\n\n // Gefilterte Versionen nach Suchtext\n const filtered = useMemo(() => {\n if (!filterText.trim()) return allVersions;\n const lower = filterText.toLowerCase();\n return allVersions.filter((v) => v.toLowerCase().includes(lower));\n }, [allVersions, filterText]);\n\n // Tastatureingaben für Suche und Navigation\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.return) {\n if (filtered.length > 0 && cursor >= 0 && cursor < filtered.length) {\n onSelect(filtered[cursor]!);\n }\n return;\n }\n\n if (key.upArrow || (input === 'k' && filterText === '')) {\n setCursor((prev) => Math.max(0, prev - 1));\n return;\n }\n\n if (key.downArrow || (input === 'j' && filterText === '')) {\n setCursor((prev) => Math.min(filtered.length - 1, prev + 1));\n return;\n }\n\n if (key.pageUp) {\n setCursor((prev) => Math.max(0, prev - 5));\n return;\n }\n\n if (key.pageDown) {\n setCursor((prev) => Math.min(filtered.length - 1, prev + 5));\n return;\n }\n\n if (key.backspace || key.delete) {\n setFilterText((prev) => prev.slice(0, -1));\n setCursor(0);\n return;\n }\n\n // Bei leerem Filter beendet 'q' das Modal\n if (input === 'q' && filterText === '') {\n onCancel();\n return;\n }\n\n // Zeichen zur Filterung hinzufügen (Zahlen, Buchstaben, Punkte, Bindestriche)\n if (input && !key.ctrl && !key.meta && /^[\\w.\\-+~]$/.test(input)) {\n setFilterText((prev) => prev + input);\n setCursor(0);\n }\n });\n\n // Fenster-Ausschnitt für scrollbare Darstellung\n const startIdx = Math.max(\n 0,\n Math.min(\n cursor - Math.floor(WINDOW_SIZE / 2),\n Math.max(0, filtered.length - WINDOW_SIZE),\n ),\n );\n const windowed = filtered.slice(startIdx, startIdx + WINDOW_SIZE);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.colors.brand}\n padding={1}\n marginY={1}\n >\n {/* 1. Header & Paketname */}\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text bold color={theme.colors.brandLight}>\n {theme.icon} {t.versionModal.title(candidate.coordinate.identifier)}\n </Text>\n <Text color={theme.colors.muted}>\n {t.versionModal.current(candidate.currentRange)}\n </Text>\n </Box>\n\n {/* 2. Such- und Filterfeld */}\n <Box\n borderStyle=\"single\"\n borderColor={theme.colors.border}\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color={theme.colors.white}>\n Filter:{' '}\n </Text>\n <Text color={filterText ? theme.colors.brandLight : theme.colors.muted}>\n {filterText || t.versionModal.filterPlaceholder}\n </Text>\n {filterText ? (\n <Text color={theme.colors.brandLight} bold>\n _\n </Text>\n ) : null}\n {filterText ? (\n <Box marginLeft={2}>\n <Text color={theme.colors.muted}>\n ({filtered.length} Treffer)\n </Text>\n </Box>\n ) : null}\n </Box>\n\n {/* 3. Versions-Liste */}\n {loading ? (\n <Box marginY={2} justifyContent=\"center\">\n <Text color={theme.colors.warning}>⏳ {t.versionModal.loading}</Text>\n </Box>\n ) : filtered.length === 0 ? (\n <Box marginY={2} justifyContent=\"center\">\n <Text color={theme.colors.danger}>\n ❌ {t.versionModal.noVersions}\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n {startIdx > 0 && (\n <Text color={theme.colors.muted}>\n ▲ … {startIdx} weitere oben\n </Text>\n )}\n\n {windowed.map((ver, idx) => {\n const actualIdx = startIdx + idx;\n const isFocused = actualIdx === cursor;\n const isLatest = ver === candidate.latest;\n const isCurrent = ver === candidate.currentClean;\n const isPre = isPreReleaseVersion(ver);\n const preTag = isPre ? extractPreReleaseTag(ver) : undefined;\n\n return (\n <Box key={ver} justifyContent=\"space-between\">\n <Box>\n <Text\n color={\n isFocused ? theme.colors.brandLight : theme.colors.muted\n }\n bold={isFocused}\n >\n {isFocused ? ' ➔ ' : ' '}\n </Text>\n <Text\n bold={isFocused}\n color={\n isFocused\n ? theme.colors.brandLight\n : isCurrent\n ? theme.colors.muted\n : theme.colors.white\n }\n >\n {ver.padEnd(28)}\n </Text>\n </Box>\n\n <Box>\n {isCurrent && (\n <Text color={theme.colors.muted}>\n [{t.versionModal.currentBadge}]{' '}\n </Text>\n )}\n {isLatest && (\n <Text bold color={theme.colors.brand}>\n [{t.versionModal.latestBadge}]{' '}\n </Text>\n )}\n {isPre && (\n <Text bold color=\"#E040FB\">\n [{preTag || 'PRE'}]{' '}\n </Text>\n )}\n </Box>\n </Box>\n );\n })}\n\n {startIdx + WINDOW_SIZE < filtered.length && (\n <Text color={theme.colors.muted}>\n ▼ … {filtered.length - (startIdx + WINDOW_SIZE)} weitere unten\n </Text>\n )}\n </Box>\n )}\n\n {/* 4. Tastaturhinweise */}\n <Box\n borderStyle=\"single\"\n borderColor={theme.colors.border}\n paddingX={1}\n marginTop={1}\n >\n <Text color={theme.colors.muted}>{t.versionModal.hint}</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { UpdateSummary, ProjectModule } from '../domain/models.js';\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\nimport type { Translations } from '../i18n/types.js';\nimport { ChickenMascot } from './mascot.js';\n\ninterface Props {\n summary: UpdateSummary;\n module: ProjectModule;\n strategy: EcosystemStrategy;\n t: Translations;\n}\n\n/** Zusammenfassung nach Abschluss des Update-Workflows mit feierndem Hühnchen */\nexport const SummaryView: React.FC<Props> = ({ summary, module, strategy, t }) => {\n const vStatus = summary.verificationStatus || (summary as any).postScriptStatus;\n const vLabel = summary.verificationLabel || (summary as any).postScriptLabel || 'Verifikation';\n const vDetails = summary.verificationDetails || (summary as any).postScriptDetails;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.colors.success}\n padding={1}\n marginY={1}\n >\n <Box justifyContent=\"space-between\" alignItems=\"center\">\n <Text bold color={theme.colors.success}>\n {strategy.icon} {t.summary.title}\n </Text>\n <ChickenMascot state=\"success\" t={t} ecosystem={strategy.ecosystem} />\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text color={theme.colors.white}>\n {t.summary.successCount(summary.updatedCount, module.relPath)}\n </Text>\n\n <Box marginTop={1}>\n <Text\n color={summary.auditSeverity === 'clean' ? theme.colors.success : theme.colors.warning}\n bold\n >\n {t.summary.securityAudit}{' '}\n </Text>\n <Text>{summary.auditMessage}</Text>\n </Box>\n\n {summary.fundingMessage && (\n <Box marginTop={1}>\n <Text color={theme.colors.muted}>{t.summary.funding(summary.fundingMessage)}</Text>\n </Box>\n )}\n\n {/* Verifikations-Ergebnis */}\n {vStatus && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text\n color={vStatus === 'clean' ? theme.colors.success : theme.colors.warning}\n bold\n >\n {t.summary.postScript(vLabel)}\n </Text>\n <Text color={theme.colors.muted}>{vDetails}</Text>\n </Box>\n )}\n </Box>\n\n <Box borderStyle=\"single\" borderColor={theme.colors.borderMuted} paddingX={1} marginTop={1}>\n <Text bold color={theme.colors.brandLight}>\n {t.summary.backHint}\n </Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\nimport type { Translations } from '../i18n/types.js';\nimport type { Ecosystem } from '../domain/models.js';\nimport { ChickenMascot } from './mascot.js';\n\ninterface Props {\n step: string;\n t: Translations;\n ecosystem?: Ecosystem;\n}\n\n/** Fortschrittsanzeige während des Update-Workflows mit arbeitendem Hühnchen */\nexport const UpdatingView: React.FC<Props> = ({ step, t, ecosystem = 'npm' }) => (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.colors.brand}\n padding={1}\n marginY={1}\n >\n <Box justifyContent=\"space-between\" alignItems=\"center\">\n <Text bold color={theme.colors.brandLight}>\n {t.updating.title}\n </Text>\n <ChickenMascot state=\"updating\" t={t} ecosystem={ecosystem} />\n </Box>\n\n <Box marginY={1}>\n <Text bold color={theme.colors.brandLight}>\n {step}\n </Text>\n </Box>\n\n <Text color={theme.colors.muted}>{t.updating.doNotClose}</Text>\n </Box>\n);\n","/**\n * 🪶 Elevate — CLI Argument Parser\n *\n * Provides typed, zero-dependency command line argument parsing\n * using Node.js native `node:util.parseArgs` conventions.\n */\n\nexport interface CliOptions {\n subcommand?: 'modules' | 'scan' | 'versions' | 'update' | 'init' | 'mcp' | 'help';\n ecosystem?: 'npm' | 'maven';\n module?: string;\n channel?: 'stable' | 'all';\n packages?: string[];\n all?: boolean;\n allModules?: boolean;\n allowMajor?: boolean;\n dryRun?: boolean;\n skipVerify?: boolean;\n json?: boolean;\n positional?: string;\n help?: boolean;\n}\n\nexport function parseCliArgs(args: string[]): CliOptions {\n const [first, ...rest] = args;\n\n if (!first || first === '--help' || first === '-h' || first === 'help') {\n if (first === '--help' || first === '-h' || first === 'help') {\n return { subcommand: 'help' };\n }\n // No arguments provided -> launch interactive TUI\n return {};\n }\n\n // Direct MCP Server invocation\n if (first === 'mcp' || first === 'serve') {\n return { subcommand: 'mcp' };\n }\n\n const validCommands = ['modules', 'scan', 'versions', 'update', 'init'] as const;\n const isSubcommand = validCommands.includes(first as any);\n\n const subcommand = isSubcommand ? (first as 'modules' | 'scan' | 'versions' | 'update' | 'init') : undefined;\n const remaining = isSubcommand ? rest : args;\n\n const result: CliOptions = { subcommand };\n const positionals: string[] = [];\n\n for (let i = 0; i < remaining.length; i++) {\n const arg = remaining[i]!;\n\n if (arg === '--json') {\n result.json = true;\n } else if (arg === '--all') {\n result.all = true;\n } else if (arg === '--all-modules') {\n result.allModules = true;\n } else if (arg === '--allow-major') {\n result.allowMajor = true;\n } else if (arg === '--dry-run') {\n result.dryRun = true;\n } else if (arg === '--skip-verify') {\n result.skipVerify = true;\n } else if (arg === '--help' || arg === '-h') {\n result.help = true;\n } else if (arg.startsWith('--ecosystem=')) {\n const val = arg.split('=')[1];\n if (val === 'npm' || val === 'maven') result.ecosystem = val;\n } else if (arg === '-e' || arg === '--ecosystem') {\n const val = remaining[++i];\n if (val === 'npm' || val === 'maven') result.ecosystem = val;\n } else if (arg.startsWith('--module=')) {\n result.module = arg.split('=')[1];\n } else if (arg === '-m' || arg === '--module') {\n result.module = remaining[++i];\n } else if (arg.startsWith('--channel=')) {\n const val = arg.split('=')[1];\n if (val === 'stable' || val === 'all') result.channel = val;\n } else if (arg === '-c' || arg === '--channel') {\n const val = remaining[++i];\n if (val === 'stable' || val === 'all') result.channel = val;\n } else if (arg.startsWith('--packages=')) {\n result.packages = arg.split('=')[1]?.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (arg === '-p' || arg === '--packages') {\n result.packages = remaining[++i]?.split(',').map((s) => s.trim()).filter(Boolean);\n } else if (!arg.startsWith('-')) {\n positionals.push(arg);\n }\n }\n\n if (positionals.length > 0) {\n result.positional = positionals[0];\n }\n\n return result;\n}\n\nexport function printCliHelp(): void {\n console.log(`\n🪶 Elevate — Modern Polyglot Dependency Manager & Updater\n\nUSAGE:\n elevate Launch interactive terminal dashboard (TUI)\n elevate <subcommand> [flags] Execute headless command (for CI/CD & AI agents)\n elevate mcp Start Model Context Protocol (MCP) server\n\nSUBCOMMANDS:\n modules List all detected repository modules\n scan Scan dependencies for available updates\n versions <package> List all published versions of a package\n update Apply updates to specified or all packages\n init Configure AI coding tools (MCP + agent skills)\n mcp Start stdio-based MCP server\n\nFLAGS:\n -e, --ecosystem <npm|maven> Target ecosystem (default: npm)\n -m, --module <name|path> Target module ID or relative path (default: root)\n -c, --channel <stable|all> Release channel (default: stable)\n -p, --packages <pkg1,pkg2@1.2.3> Comma-separated list of packages to update\n --all Update all eligible dependencies\n --all-modules Scan across all discovered monorepo modules\n --allow-major Allow breaking major version upgrades\n --dry-run Simulate updates without modifying any files\n --skip-verify Skip post-update build & test verification\n --json Format output as machine-readable JSON\n -h, --help Display this help message\n\nEXAMPLES:\n elevate scan --json\n elevate scan --ecosystem=maven --channel=stable --all-modules --json\n elevate versions chalk --ecosystem=npm --json\n elevate update --module=apps/e2e-cockpit --packages=chalk@5.6.2 --json\n elevate update --ecosystem=npm --all --allow-major --dry-run\n elevate init\n elevate init --json\n`);\n}\n","/**\n * 🪶 Elevate — CLI Command: `modules`\n *\n * Lists all discovered modules in the monorepo for the specified ecosystem.\n */\n\nimport type { CliOptions } from './parser.js';\nimport type { ElevateConfig } from '../config.js';\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\n\nexport async function handleModulesCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\n const ecosystem = options.ecosystem ?? 'npm';\n const strategy = EcosystemFactory.getStrategy(ecosystem);\n\n const modules = await strategy.discovery.discover(config.rootDir);\n\n if (options.json) {\n console.log(JSON.stringify({ ecosystem, count: modules.length, modules }, null, 2));\n return 0;\n }\n\n console.log(`\\n🪶 Discovered ${strategy.icon} ${strategy.displayName} Modules (${modules.length}):\\n`);\n for (const m of modules) {\n const isRootBadge = m.isRoot ? ' [ROOT]' : '';\n console.log(` • ${m.name.padEnd(45)} (${m.relPath})${isRootBadge}`);\n }\n console.log('');\n return 0;\n}\n","/**\n * 🪶 Elevate — CLI Command: `scan`\n *\n * Scans dependencies of one or all modules for available registry updates.\n */\n\nimport type { CliOptions } from './parser.js';\nimport type { ElevateConfig } from '../config.js';\nimport type { ProjectModule, UpdateCandidate } from '../domain/models.js';\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\n\nexport async function handleScanCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\n const ecosystem = options.ecosystem ?? 'npm';\n const channel = options.channel ?? config.channel ?? 'stable';\n const strategy = EcosystemFactory.getStrategy(ecosystem);\n\n const modules = await strategy.discovery.discover(config.rootDir);\n if (modules.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ error: `No ${strategy.displayName} modules found.`, ecosystem }, null, 2));\n } else {\n console.error(`❌ No ${strategy.displayName} modules found.`);\n }\n return 1;\n }\n\n // Collect internal IDs to protect internal monorepo packages\n const internalIds = new Set<string>();\n for (const m of modules) {\n if (m.id) internalIds.add(m.id);\n if (m.name) internalIds.add(m.name);\n }\n\n const targetModules: ProjectModule[] = [];\n\n if (options.allModules) {\n targetModules.push(...modules);\n } else if (options.module) {\n const match = modules.find(\n (m) =>\n m.id.toLowerCase() === options.module!.toLowerCase() ||\n m.relPath.toLowerCase() === options.module!.toLowerCase() ||\n m.path.toLowerCase().endsWith(options.module!.toLowerCase()),\n );\n if (!match) {\n if (options.json) {\n console.log(\n JSON.stringify(\n { error: `Module '${options.module}' not found.`, available: modules.map((m) => m.relPath) },\n null,\n 2,\n ),\n );\n } else {\n console.error(`❌ Module '${options.module}' not found.`);\n }\n return 1;\n }\n targetModules.push(match);\n } else {\n // Default: Root or first module\n targetModules.push(modules[0]!);\n }\n\n const allResults: { module: ProjectModule; updates: UpdateCandidate[] }[] = [];\n let totalUpdatesCount = 0;\n\n for (const mod of targetModules) {\n try {\n const updates = await strategy.reader.scan(mod, config.excludeScopes, internalIds, channel);\n allResults.push({ module: mod, updates });\n totalUpdatesCount += updates.length;\n } catch {\n allResults.push({ module: mod, updates: [] });\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ecosystem,\n channel,\n scannedModules: targetModules.length,\n totalUpdatesCount,\n results: allResults.map((r) => ({\n moduleId: r.module.id,\n modulePath: r.module.relPath,\n updateCount: r.updates.length,\n updates: r.updates.map((u) => ({\n identifier: u.coordinate.identifier,\n currentRange: u.currentRange,\n currentClean: u.currentClean,\n latest: u.latest,\n newRange: u.newRange,\n diff: u.diff,\n scope: u.scope,\n isPreRelease: u.isPreRelease ?? false,\n preReleaseTag: u.preReleaseTag,\n })),\n })),\n },\n null,\n 2,\n ),\n );\n return totalUpdatesCount > 0 ? 1 : 0;\n }\n\n console.log(`\\n🪶 Elevate Scan Results (${strategy.icon} ${strategy.displayName}, Channel: ${channel}):\\n`);\n\n for (const r of allResults) {\n console.log(`📦 Module: ${r.module.name} (${r.module.relPath}) — ${r.updates.length} update(s) available`);\n if (r.updates.length === 0) {\n console.log(' ✨ All dependencies are up to date.\\n');\n continue;\n }\n\n for (const u of r.updates) {\n const diffTag = `[${u.diff.toUpperCase()}]`.padEnd(9);\n const preBadge = u.isPreRelease ? `[${u.preReleaseTag || 'PRE'}] ` : '';\n console.log(\n ` • ${diffTag} ${preBadge}${u.coordinate.identifier.padEnd(36)} ${u.currentRange.padEnd(12)} ➔ ${u.latest}`,\n );\n }\n console.log('');\n }\n\n console.log(`Summary: ${totalUpdatesCount} pending update(s) across ${targetModules.length} module(s).\\n`);\n return totalUpdatesCount > 0 ? 1 : 0;\n}\n","/**\n * 🪶 Elevate — CLI Command: `versions`\n *\n * Retrieves the full version release history of a package from the registry.\n */\n\nimport type { CliOptions } from './parser.js';\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../adapters/maven/maven-registry.js';\n\nexport async function handleVersionsCommand(options: CliOptions): Promise<number> {\n const pkgIdentifier = options.positional;\n if (!pkgIdentifier) {\n console.error('❌ Error: Please specify a package name (e.g. `elevate versions chalk`).');\n return 1;\n }\n\n // Determine ecosystem: if contains ':' -> default to Maven, otherwise npm\n const ecosystem = options.ecosystem ?? (pkgIdentifier.includes(':') ? 'maven' : 'npm');\n const strategy = EcosystemFactory.getStrategy(ecosystem);\n\n let coordinate;\n if (ecosystem === 'maven') {\n const parts = pkgIdentifier.split(':');\n coordinate = {\n identifier: pkgIdentifier,\n group: parts[0],\n artifact: parts[1] || parts[0]!,\n ecosystem: 'maven' as const,\n };\n } else {\n coordinate = {\n identifier: pkgIdentifier,\n artifact: pkgIdentifier,\n ecosystem: 'npm' as const,\n };\n }\n\n const versions = await strategy.registry.getAllVersions(coordinate);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ecosystem,\n package: pkgIdentifier,\n totalCount: versions.length,\n latest: versions[0] || null,\n versions: versions.map((v) => ({\n version: v,\n isPreRelease: isPreReleaseVersion(v),\n tag: extractPreReleaseTag(v),\n })),\n },\n null,\n 2,\n ),\n );\n return 0;\n }\n\n console.log(`\\n🪶 Published versions for '${pkgIdentifier}' (${strategy.icon} ${strategy.displayName}, ${versions.length} total):\\n`);\n for (const v of versions.slice(0, 30)) {\n const isPre = isPreReleaseVersion(v);\n const tag = isPre ? `[${extractPreReleaseTag(v) || 'PRE'}]` : '[STABLE]';\n console.log(` • ${v.padEnd(25)} ${tag}`);\n }\n if (versions.length > 30) {\n console.log(` … and ${versions.length - 30} older versions.\\n`);\n } else {\n console.log('');\n }\n\n return 0;\n}\n","/**\n * 🪶 Elevate — CLI Command: `update`\n *\n * Applies dependency updates to a target module with safety guardrails:\n * - Major updates require `--allow-major`\n * - Dry-run simulation via `--dry-run`\n * - Automatic post-update verification via build/test\n */\n\nimport semver from 'semver';\nimport type { CliOptions } from './parser.js';\nimport type { ElevateConfig } from '../config.js';\nimport type { UpdateCandidate, VersionDiff } from '../domain/models.js';\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\n\nexport async function handleUpdateCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\n const ecosystem = options.ecosystem ?? 'npm';\n const strategy = EcosystemFactory.getStrategy(ecosystem);\n\n const modules = await strategy.discovery.discover(config.rootDir);\n if (modules.length === 0) {\n console.error(`❌ No ${strategy.displayName} modules found.`);\n return 1;\n }\n\n // Resolve target module\n let targetModule = modules[0]!;\n if (options.module) {\n const match = modules.find(\n (m) =>\n m.id.toLowerCase() === options.module!.toLowerCase() ||\n m.relPath.toLowerCase() === options.module!.toLowerCase() ||\n m.path.toLowerCase().endsWith(options.module!.toLowerCase()),\n );\n if (!match) {\n console.error(`❌ Module '${options.module}' not found.`);\n return 1;\n }\n targetModule = match;\n }\n\n // Internal module IDs\n const internalIds = new Set<string>();\n for (const m of modules) {\n if (m.id) internalIds.add(m.id);\n if (m.name) internalIds.add(m.name);\n }\n\n // Scan current candidates\n const availableUpdates = await strategy.reader.scan(\n targetModule,\n config.excludeScopes,\n internalIds,\n options.channel ?? 'stable',\n );\n\n const updatesToApply: UpdateCandidate[] = [];\n\n if (options.all) {\n for (const c of availableUpdates) {\n if (c.diff === 'major' && !options.allowMajor) {\n if (!options.json) {\n console.warn(`⚠️ Skipping major update for '${c.coordinate.identifier}' (requires --allow-major)`);\n }\n continue;\n }\n updatesToApply.push(c);\n }\n } else if (options.packages && options.packages.length > 0) {\n for (const item of options.packages) {\n let [name, targetVer] = item.split('@');\n if (item.startsWith('@') && item.includes('@', 1)) {\n // e.g. @my-org/package@1.2.3\n const atIdx = item.lastIndexOf('@');\n name = item.slice(0, atIdx);\n targetVer = item.slice(atIdx + 1);\n }\n\n const found = availableUpdates.find((u) => u.coordinate.identifier === name);\n if (found) {\n if (targetVer) {\n const prefix = found.currentRange.startsWith('~') ? '~' : found.currentRange.startsWith('^') ? '^' : '';\n const diff: VersionDiff = semver.valid(targetVer) && found.currentClean\n ? (semver.diff(found.currentClean, targetVer) as VersionDiff) || 'minor'\n : 'minor';\n\n if (diff === 'major' && !options.allowMajor) {\n console.error(`❌ Error: '${name}' requires a major version upgrade to ${targetVer}. Please pass --allow-major.`);\n return 1;\n }\n\n updatesToApply.push({\n ...found,\n newRange: `${prefix}${targetVer}`,\n diff,\n selected: true,\n });\n } else {\n if (found.diff === 'major' && !options.allowMajor) {\n console.error(`❌ Error: '${name}' is a major update (${found.currentClean} ➔ ${found.latest}). Please pass --allow-major.`);\n return 1;\n }\n updatesToApply.push({ ...found, selected: true });\n }\n } else {\n // Manual override for specific package\n if (!targetVer) {\n console.error(`❌ Package '${name}' has no pending updates detected. Please specify a target version (e.g. ${name}@1.2.3).`);\n return 1;\n }\n updatesToApply.push({\n coordinate: {\n identifier: name!,\n artifact: name!,\n ecosystem,\n },\n currentRange: 'unknown',\n currentClean: '0.0.0',\n latest: targetVer,\n newRange: targetVer,\n diff: 'minor',\n scope: 'prod',\n selected: true,\n });\n }\n }\n } else {\n console.error('❌ Please specify packages to update via --packages=\"pkg1,pkg2\" or --all.');\n return 1;\n }\n\n if (updatesToApply.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ message: 'No updates selected to apply.', updatedCount: 0 }, null, 2));\n } else {\n console.log('ℹ️ No updates selected to apply.');\n }\n return 0;\n }\n\n // DRY-RUN Simulation\n if (options.dryRun) {\n const simulationResult = {\n dryRun: true,\n targetModule: targetModule.relPath,\n ecosystem,\n updatesCount: updatesToApply.length,\n updates: updatesToApply.map((u) => ({\n identifier: u.coordinate.identifier,\n currentRange: u.currentRange,\n newRange: u.newRange,\n diff: u.diff,\n })),\n };\n\n if (options.json) {\n console.log(JSON.stringify(simulationResult, null, 2));\n } else {\n console.log(`\\n🪶 [DRY-RUN] Planned updates for ${targetModule.name} (${updatesToApply.length}):\\n`);\n for (const u of updatesToApply) {\n console.log(` • ${u.coordinate.identifier.padEnd(36)} ${u.currentRange} ➔ ${u.newRange} (${u.diff.toUpperCase()})`);\n }\n console.log('\\n(No files were modified because --dry-run is active).\\n');\n }\n return 0;\n }\n\n // EXECUTE ACTUAL UPDATE\n if (!options.json) {\n console.log(`\\n⚡ Applying ${updatesToApply.length} update(s) to ${targetModule.name}…`);\n }\n\n const updateResult = await strategy.updater.applyUpdates(\n targetModule,\n config.rootDir,\n updatesToApply,\n (step) => {\n if (!options.json) console.log(` ${step}`);\n },\n );\n\n // AUTOMATIC VERIFICATION (BUILD / TEST)\n let verifyResult: { status: 'clean' | 'warn'; details: string; label: string } | undefined;\n if (!options.skipVerify) {\n if (!options.json) console.log(`🔍 Running build & test verification…`);\n verifyResult = await strategy.verifier.verify(\n targetModule,\n config.rootDir,\n config.postUpdateScript,\n config.postUpdateLabel,\n );\n }\n\n const finalSummary = {\n success: verifyResult?.status !== 'warn',\n module: targetModule.relPath,\n ecosystem,\n ...updateResult,\n verification: verifyResult\n ? {\n status: verifyResult.status,\n label: verifyResult.label,\n details: verifyResult.details,\n }\n : undefined,\n };\n\n if (options.json) {\n console.log(JSON.stringify(finalSummary, null, 2));\n return finalSummary.success ? 0 : 2;\n }\n\n console.log(`\\n✨ Update completed successfully!\\n`);\n console.log(` • Updated: ${updateResult.updatedCount} package(s)`);\n console.log(` • Audit Status: ${updateResult.auditSeverity.toUpperCase()} — ${updateResult.auditMessage}`);\n if (verifyResult) {\n console.log(` • Verification: ${verifyResult.status.toUpperCase()} (${verifyResult.label})`);\n if (verifyResult.status === 'warn') {\n console.warn(` Details: ${verifyResult.details}`);\n }\n }\n console.log('');\n\n return finalSummary.success ? 0 : 2;\n}\n","/**\n * 🪶 Elevate — CLI Command: `init`\n *\n * Auto-detects AI coding environments (Cursor, Claude, Antigravity, VS Code,\n * Windsurf) and configures Elevate's MCP server + agent skill files so that\n * AI agents automatically discover and prefer Elevate for dependency management.\n *\n * Usage:\n * elevate init Interactive auto-detection\n * elevate init --all Configure all detected environments without prompts\n * elevate init --json Machine-readable output\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { homedir, platform } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport type { CliOptions } from './parser.js';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface DetectedEnvironment {\n id: string;\n name: string;\n icon: string;\n detected: boolean;\n reason: string;\n mcpConfigured: boolean;\n skillConfigured: boolean;\n}\n\ninterface InitResult {\n cwd: string;\n environments: DetectedEnvironment[];\n actions: string[];\n errors: string[];\n}\n\n// ── MCP Server Entry (identical across all environments) ─────────────────────\n\nfunction mcpServerEntry(): Record<string, unknown> {\n return {\n command: 'npx',\n args: ['-y', '@dennisrepa/elevate', 'mcp'],\n };\n}\n\n// ── Skill / Instruction Content ──────────────────────────────────────────────\n\nconst ELEVATE_SKILL_CONTENT = `# Elevate — Dependency Management Agent Skill\n\n## When to Use\nUse the Elevate MCP tools whenever the task involves:\n- Scanning or auditing dependencies for available updates\n- Updating one or more packages to specific or latest versions\n- Listing available versions of a package from npm or Maven registries\n- Discovering monorepo modules and their dependency structure\n- Any dependency-related operation in a monorepo\n\n## Important\n**Never** run raw \\`npm update\\`, \\`npm install <pkg>@latest\\`, or manually edit\n\\`package.json\\` / \\`pom.xml\\` version fields. Always use Elevate's MCP tools\ninstead — they handle monorepo-aware scanning, safety guardrails (major version\nprotection), and post-update verification automatically.\n\n## Available MCP Tools\n| Tool | Purpose |\n|-------------------------|--------------------------------------------------------------|\n| \\`elevate_scan\\` | Scan dependencies for available updates with diff analysis |\n| \\`elevate_update\\` | Apply updates with safety guardrails and verification |\n| \\`elevate_get_versions\\` | List all published versions of a specific package |\n| \\`elevate_list_modules\\` | Discover all modules in a monorepo |\n| \\`elevate_health_check\\` | Run build & audit verification after updates |\n\n## Typical Workflow\n1. \\`elevate_list_modules\\` — Discover project structure\n2. \\`elevate_scan\\` — Identify outdated dependencies\n3. \\`elevate_update\\` — Apply selected updates (use \\`--allow-major\\` only when explicitly requested)\n4. \\`elevate_health_check\\` — Verify build integrity\n`;\n\n// ── Path Helpers ─────────────────────────────────────────────────────────────\n\nconst home = homedir();\nconst isWin = platform() === 'win32';\n\nfunction appData(): string {\n return process.env.APPDATA || join(home, 'AppData', 'Roaming');\n}\n\n// ── Environment Detectors ────────────────────────────────────────────────────\n\nfunction detectCursor(cwd: string): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'cursor',\n name: 'Cursor',\n icon: '🖱️',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n // Check workspace-level .cursor/ dir\n const workspaceCursorDir = join(cwd, '.cursor');\n const globalCursorDir = join(home, '.cursor');\n\n if (existsSync(workspaceCursorDir) || existsSync(globalCursorDir)) {\n env.detected = true;\n env.reason = existsSync(workspaceCursorDir)\n ? `Found .cursor/ in workspace`\n : `Found ~/.cursor/ global config`;\n }\n\n // Check if MCP already configured\n const mcpPath = join(cwd, '.cursor', 'mcp.json');\n if (existsSync(mcpPath)) {\n try {\n const content = JSON.parse(readFileSync(mcpPath, 'utf8'));\n if (content?.mcpServers?.elevate) {\n env.mcpConfigured = true;\n }\n } catch { /* ignore */ }\n }\n\n // Check if rules already exist\n const rulesPath = join(cwd, '.cursorrules');\n if (existsSync(rulesPath)) {\n const content = readFileSync(rulesPath, 'utf8');\n if (content.includes('elevate') || content.includes('Elevate')) {\n env.skillConfigured = true;\n }\n }\n\n return env;\n}\n\nfunction detectClaudeDesktop(): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'claude-desktop',\n name: 'Claude Desktop',\n icon: '🤖',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n const configPath = isWin\n ? join(appData(), 'Claude', 'claude_desktop_config.json')\n : join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n\n if (existsSync(configPath)) {\n env.detected = true;\n env.reason = `Found ${configPath}`;\n\n try {\n const content = JSON.parse(readFileSync(configPath, 'utf8'));\n if (content?.mcpServers?.elevate) {\n env.mcpConfigured = true;\n }\n } catch { /* ignore */ }\n }\n\n return env;\n}\n\nfunction detectClaudeCode(cwd: string): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'claude-code',\n name: 'Claude Code',\n icon: '⌨️',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n // Check for .mcp.json (project scope) or CLAUDE.md\n const mcpJsonPath = join(cwd, '.mcp.json');\n const claudeMdPath = join(cwd, 'CLAUDE.md');\n\n if (existsSync(mcpJsonPath) || existsSync(claudeMdPath)) {\n env.detected = true;\n env.reason = existsSync(mcpJsonPath)\n ? `Found .mcp.json in workspace`\n : `Found CLAUDE.md in workspace`;\n }\n\n // Check if MCP already configured\n if (existsSync(mcpJsonPath)) {\n try {\n const content = JSON.parse(readFileSync(mcpJsonPath, 'utf8'));\n if (content?.mcpServers?.elevate) {\n env.mcpConfigured = true;\n }\n } catch { /* ignore */ }\n }\n\n // Check if skill already in CLAUDE.md\n if (existsSync(claudeMdPath)) {\n const content = readFileSync(claudeMdPath, 'utf8');\n if (content.includes('elevate') || content.includes('Elevate')) {\n env.skillConfigured = true;\n }\n }\n\n return env;\n}\n\nfunction detectAntigravity(cwd: string): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'antigravity',\n name: 'Google Antigravity',\n icon: '🚀',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n // Check global ~/.gemini/ or workspace .agents/\n const globalGeminiDir = join(home, '.gemini');\n const workspaceAgentsDir = join(cwd, '.agents');\n\n if (existsSync(globalGeminiDir) || existsSync(workspaceAgentsDir)) {\n env.detected = true;\n env.reason = existsSync(workspaceAgentsDir)\n ? `Found .agents/ in workspace`\n : `Found ~/.gemini/ global config`;\n }\n\n // Check if MCP already configured\n const mcpPaths = [\n join(cwd, '.agents', 'mcp_config.json'),\n join(home, '.gemini', 'config', 'mcp_config.json'),\n ];\n for (const p of mcpPaths) {\n if (existsSync(p)) {\n try {\n const content = JSON.parse(readFileSync(p, 'utf8'));\n if (content?.mcpServers?.elevate) {\n env.mcpConfigured = true;\n break;\n }\n } catch { /* ignore */ }\n }\n }\n\n return env;\n}\n\nfunction detectVSCode(cwd: string): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'vscode',\n name: 'VS Code / Copilot',\n icon: '💎',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n const vscodeDir = join(cwd, '.vscode');\n if (existsSync(vscodeDir)) {\n env.detected = true;\n env.reason = `Found .vscode/ in workspace`;\n }\n\n // Check if MCP already configured\n const mcpPath = join(cwd, '.vscode', 'mcp.json');\n if (existsSync(mcpPath)) {\n try {\n const content = JSON.parse(readFileSync(mcpPath, 'utf8'));\n if (content?.servers?.elevate) {\n env.mcpConfigured = true;\n }\n } catch { /* ignore */ }\n }\n\n // Check copilot instructions\n const copilotInstructions = join(cwd, '.github', 'copilot-instructions.md');\n if (existsSync(copilotInstructions)) {\n const content = readFileSync(copilotInstructions, 'utf8');\n if (content.includes('elevate') || content.includes('Elevate')) {\n env.skillConfigured = true;\n }\n }\n\n return env;\n}\n\nfunction detectWindsurf(): DetectedEnvironment {\n const env: DetectedEnvironment = {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n detected: false,\n reason: '',\n mcpConfigured: false,\n skillConfigured: false,\n };\n\n const configPath = isWin\n ? join(appData(), 'Codeium', 'Windsurf', 'mcp_config.json')\n : join(home, '.codeium', 'windsurf', 'mcp_config.json');\n\n // Also check the alternate location\n const altPath = join(home, '.codeium', 'windsurf', 'mcp_config.json');\n\n if (existsSync(configPath) || existsSync(altPath)) {\n env.detected = true;\n env.reason = `Found Windsurf config`;\n\n const path = existsSync(configPath) ? configPath : altPath;\n try {\n const content = JSON.parse(readFileSync(path, 'utf8'));\n if (content?.mcpServers?.elevate) {\n env.mcpConfigured = true;\n }\n } catch { /* ignore */ }\n }\n\n return env;\n}\n\n// ── Configuration Writers ────────────────────────────────────────────────────\n\nfunction mergeJsonMcpServer(\n filePath: string,\n serverKey: string,\n topLevelKey: string,\n): { written: boolean; message: string } {\n let existing: Record<string, unknown> = {};\n\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8'));\n } catch {\n existing = {};\n }\n }\n\n const servers = (existing[topLevelKey] as Record<string, unknown>) || {};\n if (servers[serverKey]) {\n return { written: false, message: `${filePath}: elevate already registered` };\n }\n\n servers[serverKey] = mcpServerEntry();\n existing[topLevelKey] = servers;\n\n const dir = filePath.substring(0, filePath.lastIndexOf(isWin ? '\\\\' : '/'));\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n return { written: true, message: `${filePath}: elevate MCP server registered` };\n}\n\nfunction appendSkillToFile(\n filePath: string,\n content: string,\n marker: string,\n): { written: boolean; message: string } {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf8');\n if (existing.includes(marker)) {\n return { written: false, message: `${filePath}: skill already present` };\n }\n writeFileSync(filePath, existing + '\\n\\n' + content, 'utf8');\n return { written: true, message: `${filePath}: skill appended` };\n }\n\n const dir = filePath.substring(0, filePath.lastIndexOf(isWin ? '\\\\' : '/'));\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content, 'utf8');\n return { written: true, message: `${filePath}: skill created` };\n}\n\n// ── Per-Environment Configurators ────────────────────────────────────────────\n\nfunction configureCursor(cwd: string, result: InitResult): void {\n // MCP\n const mcpPath = join(cwd, '.cursor', 'mcp.json');\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Cursor MCP: ${mcp.message}`);\n\n // Skills (.cursorrules)\n const rulesPath = join(cwd, '.cursorrules');\n const skill = appendSkillToFile(rulesPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Cursor Rules: ${skill.message}`);\n}\n\nfunction configureClaudeDesktop(result: InitResult): void {\n const configPath = isWin\n ? join(appData(), 'Claude', 'claude_desktop_config.json')\n : join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n\n const mcp = mergeJsonMcpServer(configPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Claude Desktop MCP: ${mcp.message}`);\n}\n\nfunction configureClaudeCode(cwd: string, result: InitResult): void {\n // MCP (.mcp.json in project root)\n const mcpPath = join(cwd, '.mcp.json');\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Claude Code MCP: ${mcp.message}`);\n\n // Skills (CLAUDE.md)\n const claudeMdPath = join(cwd, 'CLAUDE.md');\n const skill = appendSkillToFile(claudeMdPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Claude Code Skill: ${skill.message}`);\n}\n\nfunction configureAntigravity(cwd: string, result: InitResult): void {\n // MCP (workspace-level .agents/mcp_config.json)\n const mcpPath = join(cwd, '.agents', 'mcp_config.json');\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Antigravity MCP: ${mcp.message}`);\n}\n\nfunction configureVSCode(cwd: string, result: InitResult): void {\n // MCP (.vscode/mcp.json — note: VS Code uses \"servers\" not \"mcpServers\")\n const mcpPath = join(cwd, '.vscode', 'mcp.json');\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'servers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} VS Code MCP: ${mcp.message}`);\n\n // Copilot instructions\n const instructionsPath = join(cwd, '.github', 'copilot-instructions.md');\n const skill = appendSkillToFile(instructionsPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Copilot Instructions: ${skill.message}`);\n}\n\nfunction configureWindsurf(result: InitResult): void {\n const configPath = isWin\n ? join(appData(), 'Codeium', 'Windsurf', 'mcp_config.json')\n : join(home, '.codeium', 'windsurf', 'mcp_config.json');\n\n const mcp = mergeJsonMcpServer(configPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Windsurf MCP: ${mcp.message}`);\n}\n\n// ── Main Command Handler ─────────────────────────────────────────────────────\n\nexport async function handleInitCommand(options: CliOptions): Promise<number> {\n const cwd = resolve(process.cwd());\n\n const result: InitResult = {\n cwd,\n environments: [],\n actions: [],\n errors: [],\n };\n\n // ── Step 1: Detect all environments ────────────────────────────────────────\n\n const detectors: (() => DetectedEnvironment)[] = [\n () => detectCursor(cwd),\n () => detectClaudeDesktop(),\n () => detectClaudeCode(cwd),\n () => detectAntigravity(cwd),\n () => detectVSCode(cwd),\n () => detectWindsurf(),\n ];\n\n for (const detect of detectors) {\n result.environments.push(detect());\n }\n\n const detected = result.environments.filter((e) => e.detected);\n\n // ── Step 2: Configure detected environments ────────────────────────────────\n\n if (detected.length === 0) {\n // Nothing detected? Still offer to create foundational files\n if (!options.json) {\n console.log(`\\n🪶 Elevate Init\\n`);\n console.log(` No AI coding environments detected in this workspace.`);\n console.log(` Creating portable .mcp.json for broad compatibility.\\n`);\n }\n // Create a generic .mcp.json that works with Claude Code and most MCP clients\n const mcpPath = join(cwd, '.mcp.json');\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Generic MCP: ${mcp.message}`);\n } else {\n if (!options.json) {\n console.log(`\\n🪶 Elevate Init — Detected ${detected.length} environment(s)\\n`);\n }\n\n const configurators: Record<string, (cwd: string, result: InitResult) => void> = {\n cursor: configureCursor,\n 'claude-desktop': (_cwd, r) => configureClaudeDesktop(r),\n 'claude-code': configureClaudeCode,\n antigravity: configureAntigravity,\n vscode: configureVSCode,\n windsurf: (_cwd, r) => configureWindsurf(r),\n };\n\n for (const env of detected) {\n try {\n const configure = configurators[env.id];\n if (configure) {\n configure(cwd, result);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n result.errors.push(`${env.name}: ${msg}`);\n }\n }\n }\n\n // ── Step 3: Output ─────────────────────────────────────────────────────────\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return result.errors.length > 0 ? 1 : 0;\n }\n\n // Pretty console output\n console.log(' Environments:');\n for (const env of result.environments) {\n const status = env.detected ? '✅' : ' ';\n const mcpBadge = env.mcpConfigured ? ' [MCP ✓]' : '';\n const skillBadge = env.skillConfigured ? ' [Skill ✓]' : '';\n console.log(` ${status} ${env.icon} ${env.name.padEnd(22)}${env.detected ? env.reason : 'not detected'}${mcpBadge}${skillBadge}`);\n }\n\n if (result.actions.length > 0) {\n console.log(`\\n Actions:`);\n for (const action of result.actions) {\n console.log(` ${action}`);\n }\n }\n\n if (result.errors.length > 0) {\n console.log(`\\n ⚠️ Errors:`);\n for (const error of result.errors) {\n console.log(` ❌ ${error}`);\n }\n }\n\n console.log(`\\n Done! Restart your AI coding tools to pick up the new MCP configuration.`);\n console.log(` Agents will now automatically use Elevate for dependency management.\\n`);\n\n return result.errors.length > 0 ? 1 : 0;\n}\n","/**\n * 🪶 Elevate — Model Context Protocol (MCP) Server\n *\n * Exposes 5 modular, granular MCP tools over stdio for AI Agents\n * (Claude, Antigravity, Cursor, GitHub Copilot).\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport semver from 'semver';\nimport type { ElevateConfig } from '../config.js';\nimport type { UpdateCandidate, VersionDiff } from '../domain/models.js';\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../adapters/maven/maven-registry.js';\n\nexport async function startMcpServer(config: ElevateConfig): Promise<void> {\n const server = new Server(\n {\n name: 'elevate-mcp',\n version: '1.2.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n\n // 1. Tool definitions & schemas\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'elevate_discover_modules',\n description:\n 'Discovers all repository modules and workspaces for Node/npm (package.json) or Java/Maven (pom.xml).',\n inputSchema: {\n type: 'object',\n properties: {\n ecosystem: {\n type: 'string',\n enum: ['npm', 'maven'],\n description: 'Target ecosystem (default: npm)',\n },\n },\n },\n },\n {\n name: 'elevate_scan',\n description:\n 'Scans a module (or all modules) for available dependency updates against the registry.',\n inputSchema: {\n type: 'object',\n properties: {\n ecosystem: {\n type: 'string',\n enum: ['npm', 'maven'],\n description: 'Target ecosystem (default: npm)',\n },\n moduleId: {\n type: 'string',\n description:\n 'Module ID or relative path (e.g. \"apps/e2e-cockpit\"). If omitted, scans the root or primary module.',\n },\n channel: {\n type: 'string',\n enum: ['stable', 'all'],\n description:\n 'Release channel: \"stable\" (production-ready versions only) or \"all\" (including pre-releases/betas). Default: stable',\n },\n allModules: {\n type: 'boolean',\n description: 'If true, scans all discovered modules across the monorepo.',\n },\n },\n },\n },\n {\n name: 'elevate_get_versions',\n description:\n 'Fetches the complete published version history of a package from the registry.',\n inputSchema: {\n type: 'object',\n properties: {\n ecosystem: {\n type: 'string',\n enum: ['npm', 'maven'],\n description: 'Target ecosystem (default: npm)',\n },\n identifier: {\n type: 'string',\n description: 'Package identifier (npm: chalk, maven: org.slf4j:slf4j-api)',\n },\n },\n required: ['identifier'],\n },\n },\n {\n name: 'elevate_apply_updates',\n description:\n 'Applies targeted dependency updates to a module, installs packages, and executes automatic build & test verification.',\n inputSchema: {\n type: 'object',\n properties: {\n ecosystem: {\n type: 'string',\n enum: ['npm', 'maven'],\n description: 'Target ecosystem (default: npm)',\n },\n moduleId: {\n type: 'string',\n description: 'Module ID or relative path of the target module',\n },\n updates: {\n type: 'array',\n description: 'List of packages to update with optional target versions',\n items: {\n type: 'object',\n properties: {\n identifier: { type: 'string', description: 'Package identifier' },\n targetVersion: {\n type: 'string',\n description: 'Specific target version (e.g. \"5.6.2\" or \"^3.2.0\"). If omitted, updates to latest.',\n },\n },\n required: ['identifier'],\n },\n },\n allowMajor: {\n type: 'boolean',\n description:\n 'Safety guardrail: Must be explicitly true to permit breaking major version upgrades.',\n },\n dryRun: {\n type: 'boolean',\n description: 'If true, simulates planned changes without modifying any files.',\n },\n skipVerification: {\n type: 'boolean',\n description: 'Skips the post-update build and test verification step.',\n },\n },\n required: ['moduleId', 'updates'],\n },\n },\n {\n name: 'elevate_verify',\n description:\n 'Runs module-specific verification and build checks (e.g. npm test, mvn test-compile).',\n inputSchema: {\n type: 'object',\n properties: {\n ecosystem: {\n type: 'string',\n enum: ['npm', 'maven'],\n description: 'Target ecosystem (default: npm)',\n },\n moduleId: {\n type: 'string',\n description: 'Module ID or relative path of the module to verify',\n },\n },\n },\n },\n ],\n };\n });\n\n // 2. Tool execution handlers\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n const ecosystem = (args.ecosystem as 'npm' | 'maven') || 'npm';\n const strategy = EcosystemFactory.getStrategy(ecosystem);\n\n try {\n // ── Tool 1: elevate_discover_modules ──\n if (name === 'elevate_discover_modules') {\n const modules = await strategy.discovery.discover(config.rootDir);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n ecosystem,\n count: modules.length,\n modules: modules.map((m) => ({\n id: m.id,\n name: m.name,\n relPath: m.relPath,\n isRoot: m.isRoot,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n // ── Tool 2: elevate_scan ──\n if (name === 'elevate_scan') {\n const channel = (args.channel as 'stable' | 'all') || config.channel || 'stable';\n const modules = await strategy.discovery.discover(config.rootDir);\n\n const internalIds = new Set<string>();\n for (const m of modules) {\n if (m.id) internalIds.add(m.id);\n if (m.name) internalIds.add(m.name);\n }\n\n const targetModules = args.allModules\n ? modules\n : args.moduleId\n ? modules.filter(\n (m) =>\n m.id.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.relPath.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.path.toLowerCase().endsWith(String(args.moduleId).toLowerCase()),\n )\n : [modules[0]!];\n\n if (targetModules.length === 0) {\n throw new Error(`Module '${args.moduleId}' not found.`);\n }\n\n const results: any[] = [];\n let totalCount = 0;\n\n for (const mod of targetModules) {\n const updates = await strategy.reader.scan(mod, config.excludeScopes, internalIds, channel);\n totalCount += updates.length;\n results.push({\n moduleId: mod.id,\n modulePath: mod.relPath,\n updateCount: updates.length,\n updates: updates.map((u) => ({\n identifier: u.coordinate.identifier,\n currentRange: u.currentRange,\n currentClean: u.currentClean,\n latest: u.latest,\n newRange: u.newRange,\n diff: u.diff,\n scope: u.scope,\n isPreRelease: u.isPreRelease ?? false,\n preReleaseTag: u.preReleaseTag,\n })),\n });\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n ecosystem,\n channel,\n scannedModules: targetModules.length,\n totalUpdatesCount: totalCount,\n results,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n // ── Tool 3: elevate_get_versions ──\n if (name === 'elevate_get_versions') {\n const identifier = String(args.identifier);\n let coordinate;\n if (ecosystem === 'maven') {\n const parts = identifier.split(':');\n coordinate = {\n identifier,\n group: parts[0],\n artifact: parts[1] || parts[0]!,\n ecosystem: 'maven' as const,\n };\n } else {\n coordinate = {\n identifier,\n artifact: identifier,\n ecosystem: 'npm' as const,\n };\n }\n\n const versions = await strategy.registry.getAllVersions(coordinate);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n ecosystem,\n package: identifier,\n totalCount: versions.length,\n latest: versions[0] || null,\n versions: versions.map((v) => ({\n version: v,\n isPreRelease: isPreReleaseVersion(v),\n tag: extractPreReleaseTag(v),\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n // ── Tool 4: elevate_apply_updates ──\n if (name === 'elevate_apply_updates') {\n const modules = await strategy.discovery.discover(config.rootDir);\n const mod = modules.find(\n (m) =>\n m.id.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.relPath.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.path.toLowerCase().endsWith(String(args.moduleId).toLowerCase()),\n );\n\n if (!mod) {\n throw new Error(`Module '${args.moduleId}' not found.`);\n }\n\n const internalIds = new Set<string>();\n for (const m of modules) {\n if (m.id) internalIds.add(m.id);\n if (m.name) internalIds.add(m.name);\n }\n\n const availableUpdates = await strategy.reader.scan(mod, config.excludeScopes, internalIds, 'stable');\n const requestedUpdates = (args.updates as { identifier: string; targetVersion?: string }[]) || [];\n const updatesToApply: UpdateCandidate[] = [];\n\n for (const req of requestedUpdates) {\n const found = availableUpdates.find((u) => u.coordinate.identifier === req.identifier);\n if (found) {\n const targetVer = req.targetVersion || found.latest;\n const prefix = found.currentRange.startsWith('~') ? '~' : found.currentRange.startsWith('^') ? '^' : '';\n const diff: VersionDiff = semver.valid(targetVer) && found.currentClean\n ? (semver.diff(found.currentClean, targetVer) as VersionDiff) || 'minor'\n : found.diff;\n\n if (diff === 'major' && !args.allowMajor) {\n throw new Error(\n `Major update for '${req.identifier}' to ${targetVer} rejected. Set 'allowMajor: true' to permit breaking changes.`,\n );\n }\n\n updatesToApply.push({\n ...found,\n newRange: `${prefix}${targetVer}`,\n diff,\n selected: true,\n });\n } else if (req.targetVersion) {\n updatesToApply.push({\n coordinate: {\n identifier: req.identifier,\n artifact: req.identifier,\n ecosystem,\n },\n currentRange: 'unknown',\n currentClean: '0.0.0',\n latest: req.targetVersion,\n newRange: req.targetVersion,\n diff: 'minor',\n scope: 'prod',\n selected: true,\n });\n }\n }\n\n if (args.dryRun) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n dryRun: true,\n targetModule: mod.relPath,\n ecosystem,\n updatesCount: updatesToApply.length,\n updates: updatesToApply.map((u) => ({\n identifier: u.coordinate.identifier,\n currentRange: u.currentRange,\n newRange: u.newRange,\n diff: u.diff,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n const updateResult = await strategy.updater.applyUpdates(mod, config.rootDir, updatesToApply, () => {});\n\n let verifyResult;\n if (!args.skipVerification) {\n verifyResult = await strategy.verifier.verify(\n mod,\n config.rootDir,\n config.postUpdateScript,\n config.postUpdateLabel,\n );\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n success: verifyResult?.status !== 'warn',\n targetModule: mod.relPath,\n ecosystem,\n ...updateResult,\n verification: verifyResult,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n // ── Tool 5: elevate_verify ──\n if (name === 'elevate_verify') {\n const modules = await strategy.discovery.discover(config.rootDir);\n const mod = args.moduleId\n ? modules.find(\n (m) =>\n m.id.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.relPath.toLowerCase() === String(args.moduleId).toLowerCase() ||\n m.path.toLowerCase().endsWith(String(args.moduleId).toLowerCase()),\n )\n : modules[0];\n\n if (!mod) {\n throw new Error(`Module '${args.moduleId || 'default'}' not found.`);\n }\n\n const verifyResult = await strategy.verifier.verify(\n mod,\n config.rootDir,\n config.postUpdateScript,\n config.postUpdateLabel,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n module: mod.relPath,\n ecosystem,\n ...verifyResult,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${name}`);\n } catch (err: any) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `❌ Error executing tool '${name}': ${err.message || String(err)}`,\n },\n ],\n };\n }\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["useState","useMemo","useCallback","Box","useInput","existsSync","readFileSync","join","stdout","readFileSync","join","semver","readFileSync","join","exec","promisify","execAsync","exec","promisify","execAsync","existsSync","readFileSync","readdirSync","join","releaseMatch","readFileSync","join","semver","DIFF_ORDER","CONCURRENCY","pooled","semver","join","readFileSync","writeFileSync","readFileSync","join","exec","promisify","execAsync","exec","promisify","execAsync","useState","useMemo","useCallback","useState","useEffect","useMemo","useCallback","semver","useState","useCallback","useEffect","useMemo","semver","useState","useCallback","useState","useEffect","useState","useEffect","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","Box","Text","jsx","jsxs","Text","Box","jsx","jsxs","Box","Text","Box","Text","useState","useEffect","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","useState","useEffect","useMemo","Box","Text","jsx","jsxs","WINDOW_SIZE","useState","useEffect","useMemo","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Fragment","jsx","jsxs","useState","useMemo","useCallback","useInput","Box","semver","semver","existsSync","readFileSync","writeFileSync","join","resolve","semver","semver","jsx"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/adapters/npm/npm-discovery.ts","../src/adapters/npm/npm-registry.ts","../src/adapters/shared/process.ts","../src/domain/origin.ts","../src/adapters/npm/npm-config.ts","../src/adapters/npm/npm-scanner.ts","../src/domain/versions.ts","../src/adapters/shared/pool.ts","../src/adapters/npm/npm-package-manager.ts","../src/adapters/shared/checkout.ts","../src/adapters/npm/npm-updater.ts","../src/domain/ports.ts","../src/adapters/npm/npm-lockfile.ts","../src/adapters/npm/npm-verifier.ts","../src/adapters/npm/npm-strategy.ts","../src/adapters/maven/maven-discovery.ts","../src/adapters/maven/maven-project.ts","../src/adapters/maven/maven-pom.ts","../src/adapters/shared/xml.ts","../src/adapters/maven/maven-registry.ts","../src/adapters/maven/maven-command.ts","../src/adapters/maven/maven-resolution.ts","../src/adapters/maven/maven-scanner.ts","../src/adapters/maven/maven-locator.ts","../src/adapters/maven/maven-updater.ts","../src/adapters/maven/maven-verifier.ts","../src/adapters/maven/maven-strategy.ts","../src/domain/ecosystem-factory.ts","../src/app.tsx","../src/i18n/index.ts","../src/i18n/locales/de.ts","../src/i18n/locales/en.ts","../src/hooks/use-workspaces.ts","../src/hooks/use-packages.ts","../src/application/scan.ts","../src/hooks/use-updater.ts","../src/application/update-workflow.ts","../src/adapters/shared/file-snapshot.ts","../src/components/splash-screen.tsx","../src/theme.ts","../src/components/header.tsx","../src/components/workspace-bar.tsx","../src/components/tab-bar.tsx","../src/components/package-list.tsx","../src/components/package-row.tsx","../src/components/status-bar.tsx","../src/components/mascot.tsx","../src/components/controls-bar.tsx","../src/components/workspace-modal.tsx","../src/components/version-modal.tsx","../src/application/version-lookup.ts","../src/components/summary-view.tsx","../src/components/updating-view.tsx","../src/cli/parser.ts","../src/cli/command-modules.ts","../src/application/describe.ts","../src/cli/command-scan.ts","../src/cli/command-versions.ts","../src/application/update-selection.ts","../src/cli/command-update.ts","../src/cli/command-init.ts","../src/mcp/mcp-server.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * 🪶 Elevate — Universal Entry Point\r\n *\r\n * Dispatches to:\r\n * - Interactive TUI Dashboard (default when run without arguments)\r\n * - Headless CLI Subcommands (modules, scan, versions, update) with JSON output\r\n * - Model Context Protocol (MCP) Server for AI Agents\r\n */\r\n\r\nimport React from 'react';\r\nimport { render } from 'ink';\r\nimport { ConfigError, loadConfig } from './config.js';\r\nimport { EcosystemFactory } from './domain/ecosystem-factory.js';\r\nimport { App } from './app.js';\r\nimport { parseCliArgs, printCliHelp } from './cli/parser.js';\r\nimport { handleModulesCommand } from './cli/command-modules.js';\r\nimport { handleScanCommand } from './cli/command-scan.js';\r\nimport { handleVersionsCommand } from './cli/command-versions.js';\r\nimport { handleUpdateCommand } from './cli/command-update.js';\r\nimport { handleInitCommand } from './cli/command-init.js';\r\nimport { startMcpServer } from './mcp/mcp-server.js';\r\n\r\nasync function main() {\r\n let config;\r\n try {\r\n config = loadConfig();\r\n } catch (err) {\r\n if (!(err instanceof ConfigError)) throw err;\r\n // Nothing has been done yet; stderr keeps stdout free for machine-readable output.\r\n process.stderr.write(`❌ ${err.message}\\n`);\r\n process.exit(1);\r\n }\r\n EcosystemFactory.configure({ mavenPlugins: config.mavenPlugins });\r\n const options = parseCliArgs(process.argv.slice(2));\r\n\r\n // stderr keeps JSON output on stdout machine-readable.\r\n for (const notice of [...config.deprecations, ...config.warnings]) process.stderr.write(`⚠️ ${notice}\\n`);\r\n\r\n // 1. Help\r\n if (options.subcommand === 'help' || options.help) {\r\n printCliHelp();\r\n process.exit(0);\r\n }\r\n\r\n // 2. Model Context Protocol (MCP) Server\r\n if (options.subcommand === 'mcp') {\r\n await startMcpServer(config);\r\n return;\r\n }\r\n\r\n // 3. Headless CLI Subcommands (for CI/CD & AI Agents)\r\n if (options.subcommand === 'modules') {\r\n const exitCode = await handleModulesCommand(options, config);\r\n process.exit(exitCode);\r\n }\r\n\r\n if (options.subcommand === 'scan') {\r\n const exitCode = await handleScanCommand(options, config);\r\n process.exit(exitCode);\r\n }\r\n\r\n if (options.subcommand === 'versions') {\r\n const exitCode = await handleVersionsCommand(options, config);\r\n process.exit(exitCode);\r\n }\r\n\r\n if (options.subcommand === 'update') {\r\n const exitCode = await handleUpdateCommand(options, config);\r\n process.exit(exitCode);\r\n }\r\n\r\n if (options.subcommand === 'init') {\r\n const exitCode = await handleInitCommand(options);\r\n process.exit(exitCode);\r\n }\r\n\r\n // 4. Interactive Terminal Dashboard (TUI) Mode\r\n if (process.stdout.isTTY) {\r\n const minCols = 140;\r\n const minRows = 38;\r\n const cols = Math.max(process.stdout.columns || 80, minCols);\r\n const rows = Math.max(process.stdout.rows || 24, minRows);\r\n process.stdout.write(`\\x1b[8;${rows};${cols}t`);\r\n }\r\n\r\n render(<App config={config} />);\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error('❌ Elevate fatal error:', err);\r\n process.exit(1);\r\n});\r\n","/**\r\n * Elevate — configuration.\r\n *\r\n * Detects the repository root and loads an optional `elevate.config.json`\r\n * from it. Without a configuration file Elevate works with sensible defaults\r\n * in any npm workspace or Maven repository.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { dirname, join, resolve } from 'node:path';\r\nimport type { Locale } from './i18n/types.js';\r\nimport type { ReleaseChannel } from './domain/models.js';\r\nimport { EcosystemFactory } from './domain/ecosystem-factory.js';\r\nimport { findCheckoutBoundary } from './adapters/shared/checkout.js';\r\nimport { DEFAULT_MAVEN_PLUGINS } from './adapters/maven/maven-resolution.js';\r\nimport type { MavenPluginVersions } from './adapters/maven/maven-resolution.js';\r\n\r\nexport interface ElevateConfig {\r\n /** Detected repository root. */\r\n rootDir: string;\r\n /** Display name in the header (optional). */\r\n author?: string;\r\n /**\r\n * Internal npm scopes and Maven groupId prefixes (e.g. `@my-org`,\r\n * `com.mycompany`). Packages matching them are internal: they are looked\r\n * up only in a private registry, never on a public one.\r\n */\r\n internalScopes: string[];\r\n /** Optional command that replaces the default verification after an update. */\r\n postUpdateScript?: string;\r\n /** Label for the verification command in the UI. */\r\n postUpdateLabel?: string;\r\n /** Preferred language ('de' | 'en'); undefined means auto-detect. */\r\n locale?: Locale | 'auto';\r\n /** Release channel ('stable' | 'all', default 'stable'). */\r\n channel: ReleaseChannel;\r\n /** Human-readable notices about deprecated configuration keys. */\r\n deprecations: string[];\r\n /** Versions of the Maven plugins Elevate runs (always filled, defaults applied). */\r\n mavenPlugins: MavenPluginVersions;\r\n /** Human-readable notices about invalid configuration values that were replaced by defaults. */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Detects the repository root for a start directory, so Elevate behaves the\r\n * same wherever in the repository it is started.\r\n *\r\n * 1. The nearest `elevate.config.json` marks the root explicitly.\r\n * 2. Otherwise every ecosystem proposes a root and the outermost proposal wins.\r\n * 3. Without any marker the start directory is the root.\r\n *\r\n * The search stays inside the version-control checkout (see\r\n * `findCheckoutBoundary`) so markers of unrelated directories above it are\r\n * never picked up.\r\n */\r\nexport function findRepositoryRoot(startDir: string): string {\r\n const start = resolve(startDir);\r\n const boundary = findCheckoutBoundary(start);\r\n\r\n let dir = start;\r\n for (;;) {\r\n if (existsSync(join(dir, 'elevate.config.json'))) return dir;\r\n const parent = dirname(dir);\r\n if (dir === boundary || parent === dir) break;\r\n dir = parent;\r\n }\r\n\r\n const proposals = EcosystemFactory.getAvailableEcosystems()\r\n .map((ecosystem) => EcosystemFactory.getStrategy(ecosystem).discovery.findRoot?.(start, boundary))\r\n .filter((root): root is string => root !== undefined);\r\n // All proposals are the start directory or one of its ancestors, so the\r\n // outermost one has the shortest path.\r\n return proposals.sort((a, b) => a.length - b.length)[0] ?? start;\r\n}\r\n\r\n/** Thrown when `elevate.config.json` cannot be used; Elevate stops instead of ignoring it. */\r\nexport class ConfigError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'ConfigError';\r\n }\r\n}\r\n\r\nconst NO_CONTINUE = 'Elevate does not continue without your internalScopes.';\r\n\r\n/**\r\n * Reads a scope list. A missing key is fine; a key that is present but is not\r\n * a list of strings is an error, because ignoring it would silently switch off\r\n * the protection of internal packages.\r\n */\r\nfunction stringList(file: Record<string, unknown>, key: string, source: string): string[] | undefined {\r\n if (!Object.hasOwn(file, key)) return undefined;\r\n const value = file[key];\r\n if (Array.isArray(value) && value.every((entry) => typeof entry === 'string')) return value;\r\n throw new ConfigError(\r\n `Invalid elevate.config.json (${source}): \\`${key}\\` must be a list of strings, ` +\r\n `for example [\"@my-org\", \"com.mycompany\"]. ${NO_CONTINUE}`,\r\n );\r\n}\r\n\r\n/** A plugin version is 1 to 64 characters, starts with a digit and has only letters, digits, `.` and `-`. */\r\nconst PLUGIN_VERSION = /^[0-9][A-Za-z0-9.-]{0,63}$/;\r\n\r\n/**\r\n * Reads the optional `mavenPlugins` object. An invalid value is replaced by\r\n * the default and reported in `warnings`; unknown keys, and a `mavenPlugins`\r\n * that is not an object, are ignored silently.\r\n */\r\nfunction resolveMavenPlugins(value: unknown, warnings: string[]): MavenPluginVersions {\r\n const plugins = { ...DEFAULT_MAVEN_PLUGINS };\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return plugins;\r\n\r\n const given = value as Record<string, unknown>;\r\n for (const key of Object.keys(DEFAULT_MAVEN_PLUGINS) as (keyof MavenPluginVersions)[]) {\r\n if (!Object.hasOwn(given, key)) continue;\r\n const version = given[key];\r\n if (typeof version === 'string' && PLUGIN_VERSION.test(version)) {\r\n plugins[key] = version;\r\n } else {\r\n warnings.push(\r\n `\\`mavenPlugins.${key}\\` is not a valid version (${JSON.stringify(version)}); using the default ${DEFAULT_MAVEN_PLUGINS[key]}.`,\r\n );\r\n }\r\n }\r\n return plugins;\r\n}\r\n\r\n/**\r\n * Builds the configuration from parsed `elevate.config.json` content.\r\n *\r\n * `excludeScopes` is the former name of `internalScopes`. It is still read so\r\n * existing configurations keep working, and reported as deprecated.\r\n */\r\nexport function resolveConfig(\r\n rootDir: string,\r\n file: Record<string, unknown>,\r\n source = 'elevate.config.json',\r\n): ElevateConfig {\r\n const deprecations: string[] = [];\r\n const warnings: string[] = [];\r\n const internal = stringList(file, 'internalScopes', source);\r\n const legacy = stringList(file, 'excludeScopes', source);\r\n\r\n if (legacy) {\r\n deprecations.push(\r\n internal\r\n ? '`excludeScopes` is deprecated and ignored because `internalScopes` is set; remove it from elevate.config.json.'\r\n : '`excludeScopes` is deprecated; rename it to `internalScopes` in elevate.config.json.',\r\n );\r\n }\r\n\r\n return {\r\n rootDir,\r\n author: typeof file.author === 'string' ? file.author : undefined,\r\n internalScopes: internal ?? legacy ?? [],\r\n postUpdateScript: typeof file.postUpdateScript === 'string' ? file.postUpdateScript : undefined,\r\n postUpdateLabel:\r\n typeof file.postUpdateLabel === 'string'\r\n ? file.postUpdateLabel\r\n : typeof file.postUpdateScript === 'string'\r\n ? file.postUpdateScript\r\n : undefined,\r\n locale: file.locale === 'de' || file.locale === 'en' ? file.locale : undefined,\r\n channel: file.channel === 'all' ? 'all' : 'stable',\r\n deprecations,\r\n mavenPlugins: resolveMavenPlugins(file.mavenPlugins, warnings),\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * Loads the configuration:\r\n * 1. detects the repository root (see `findRepositoryRoot`),\r\n * 2. reads `elevate.config.json` from it, if present,\r\n * 3. applies defaults for missing values.\r\n */\r\nexport function loadConfig(startDir: string = process.cwd()): ElevateConfig {\r\n const rootDir = findRepositoryRoot(startDir);\r\n const configPath = join(rootDir, 'elevate.config.json');\r\n let file: Record<string, unknown> = {};\r\n\r\n if (existsSync(configPath)) {\r\n const unreadable = (detail: string) =>\r\n new ConfigError(\r\n `Cannot read elevate.config.json: ${detail} (${configPath}). ` +\r\n `Fix the file or remove it; ${NO_CONTINUE}`,\r\n );\r\n\r\n let parsed: unknown;\r\n try {\r\n // Windows editors often save JSON with a byte order mark, which JSON.parse rejects.\r\n parsed = JSON.parse(readFileSync(configPath, 'utf8').replace(/^/, ''));\r\n } catch (err) {\r\n throw unreadable(err instanceof Error ? err.message : String(err));\r\n }\r\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\r\n throw unreadable('the file must contain a JSON object');\r\n }\r\n file = parsed as Record<string, unknown>;\r\n }\r\n\r\n return resolveConfig(rootDir, file, configPath);\r\n}\r\n","/**\r\n * Elevate — npm workspace discovery.\r\n *\r\n * Resolves the `workspaces` patterns of the root package.json with\r\n * `@npmcli/map-workspaces`, the same library npm uses internally. Glob\r\n * patterns (`packages/**`, `apps/*-service`), negations and nested folders\r\n * therefore behave exactly as they do for `npm install`.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { dirname, join, relative, resolve } from 'node:path';\r\nimport mapWorkspaces from '@npmcli/map-workspaces';\r\nimport type { ModuleDiscoveryPort } from '../../domain/ports.js';\r\nimport type { ProjectModule } from '../../domain/models.js';\r\n\r\nfunction readJson(filePath: string): any {\r\n try {\r\n return JSON.parse(readFileSync(filePath, 'utf8'));\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport class NpmModuleDiscoveryAdapter implements ModuleDiscoveryPort {\r\n /**\r\n * The nearest directory, from `startDir` upwards to the boundary, whose\r\n * package.json is valid JSON and declares `workspaces`.\r\n */\r\n findRoot(startDir: string, boundaryDir: string | undefined): string | undefined {\r\n let dir = resolve(startDir);\r\n const boundary = boundaryDir ? resolve(boundaryDir) : undefined;\r\n for (;;) {\r\n if (readJson(join(dir, 'package.json'))?.workspaces) return dir;\r\n const parent = dirname(dir);\r\n if (dir === boundary || parent === dir) return undefined;\r\n dir = parent;\r\n }\r\n }\r\n\r\n async discover(rootDir: string): Promise<ProjectModule[]> {\r\n const rootPkg = readJson(join(rootDir, 'package.json'));\r\n\r\n const modules: ProjectModule[] = [\r\n {\r\n id: rootPkg?.name ?? 'root',\r\n name: rootPkg?.name ?? 'Root Workspace (npm)',\r\n path: rootDir,\r\n relPath: 'Root',\r\n ecosystem: 'npm',\r\n isRoot: true,\r\n version: typeof rootPkg?.version === 'string' ? rootPkg.version : undefined,\r\n },\r\n ];\r\n\r\n if (!rootPkg?.workspaces) return modules;\r\n\r\n let workspaces: Map<string, string>;\r\n try {\r\n workspaces = await mapWorkspaces({ cwd: rootDir, pkg: rootPkg });\r\n } catch {\r\n // Invalid workspace configuration (e.g. duplicate names): npm refuses it\r\n // as well, so only the root is reported.\r\n return modules;\r\n }\r\n\r\n for (const [name, path] of workspaces) {\r\n const pkg = readJson(join(path, 'package.json'));\r\n modules.push({\r\n id: name,\r\n name,\r\n path,\r\n relPath: relative(rootDir, path).replace(/\\\\/g, '/'),\r\n ecosystem: 'npm',\r\n isRoot: false,\r\n version: typeof pkg?.version === 'string' ? pkg.version : undefined,\r\n });\r\n }\r\n\r\n modules.sort((a, b) => (a.isRoot ? -1 : b.isRoot ? 1 : a.relPath.localeCompare(b.relPath)));\r\n return modules;\r\n }\r\n}\r\n","/**\r\n * Elevate — npm registry adapter.\r\n *\r\n * Queries versions through `npm view`, so the registry, authentication and\r\n * proxy settings of the user's npm configuration apply automatically.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { RegistryEndpoint, RegistryPort } from '../../domain/ports.js';\r\nimport type { DependencyCoordinate, ReleaseChannel } from '../../domain/models.js';\r\nimport { runCommand } from '../shared/process.js';\r\nimport { NpmConfigReader, isPublicNpmRegistry } from './npm-config.js';\r\n\r\nconst LOOKUP_TIMEOUT_MS = 15_000;\r\n\r\n/** Valid npm package names (lower- or mixed-case legacy names included). */\r\nconst PACKAGE_NAME = /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/i;\r\n\r\n/** Whether a string is a syntactically valid npm package name. */\r\nexport function isValidPackageName(name: string): boolean {\r\n return name.length <= 214 && PACKAGE_NAME.test(name);\r\n}\r\n\r\nexport class NpmRegistryAdapter implements RegistryPort {\r\n constructor(readonly config = new NpmConfigReader()) {}\r\n\r\n async resolveEndpoint(coordinate: DependencyCoordinate, cwd: string): Promise<RegistryEndpoint> {\r\n const url = await this.config.registryFor(coordinate.identifier, cwd);\r\n return { url, isPublic: isPublicNpmRegistry(url) };\r\n }\r\n\r\n async getLatestVersion(\r\n coordinate: DependencyCoordinate,\r\n channel: ReleaseChannel = 'stable',\r\n cwd = process.cwd(),\r\n ): Promise<string | null> {\r\n if (!isValidPackageName(coordinate.identifier)) return null;\r\n\r\n if (channel === 'stable') {\r\n // The `latest` dist-tag is the maintainers' designated stable release.\r\n const latest = await this.view(coordinate.identifier, 'dist-tags.latest', cwd);\r\n if (typeof latest === 'string' && semver.valid(latest) && semver.prerelease(latest) === null) {\r\n return latest;\r\n }\r\n // The tag points to a pre-release (or is missing): fall back to the\r\n // highest published release, never to the pre-release itself.\r\n const releases = (await this.getAllVersions(coordinate, cwd)).filter(\r\n (v) => semver.valid(v) && semver.prerelease(v) === null,\r\n );\r\n return releases.length > 0 ? semver.rsort(releases)[0]! : null;\r\n }\r\n\r\n // `version` is the version the `latest` tag points to.\r\n const version = await this.view(coordinate.identifier, 'version', cwd);\r\n return typeof version === 'string' && version ? version : null;\r\n }\r\n\r\n async getAllVersions(coordinate: DependencyCoordinate, cwd = process.cwd()): Promise<string[]> {\r\n if (!isValidPackageName(coordinate.identifier)) return [];\r\n const versions = await this.view(coordinate.identifier, 'versions', cwd);\r\n const list = Array.isArray(versions) ? versions : versions ? [versions] : [];\r\n return list.map(String).reverse();\r\n }\r\n\r\n /** Runs `npm view <name> <field> --json`; resolves null on any failure. */\r\n protected async view(name: string, field: string, cwd: string): Promise<unknown> {\r\n try {\r\n const result = await runCommand('npm', ['view', name, field, '--json'], {\r\n cwd,\r\n timeoutMs: LOOKUP_TIMEOUT_MS,\r\n });\r\n if (result.exitCode !== 0 || !result.stdout.trim()) return null;\r\n return JSON.parse(result.stdout);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * Elevate — child process helper.\r\n *\r\n * Runs external tools (npm, Maven) with an argument list instead of a\r\n * concatenated command line. On Windows, `npm`, `mvn` and `mvnw` are batch\r\n * files that can only be started through the shell; there every argument is\r\n * quoted, and arguments containing shell metacharacters are rejected outright\r\n * rather than escaped, so a crafted package name can never inject a command.\r\n * The working directory is handed to the process directly, never through the\r\n * command line, so callers name files relative to it.\r\n */\r\n\r\nimport { exec, spawn } from 'node:child_process';\r\n\r\nexport interface RunOptions {\r\n cwd: string;\r\n /** Kill the process after this many milliseconds. */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface RunResult {\r\n exitCode: number;\r\n stdout: string;\r\n stderr: string;\r\n timedOut: boolean;\r\n}\r\n\r\n/** Thrown when an argument cannot be passed safely to the shell. */\r\nexport class UnsafeArgumentError extends Error {\r\n constructor(argument: string) {\r\n super(\r\n `Cannot pass ${JSON.stringify(argument)} to the Windows command shell: it contains one of the characters ` +\r\n '\" % ! ^ & | < > or a line break, which cmd.exe would interpret. ' +\r\n 'If this is part of a directory or file name, rename it or move the project to a path without these characters.',\r\n );\r\n this.name = 'UnsafeArgumentError';\r\n }\r\n}\r\n\r\nconst IS_WINDOWS = process.platform === 'win32';\r\n\r\n/** Characters cmd.exe interprets even inside double quotes, plus quotes themselves. */\r\nconst WINDOWS_UNSAFE = /[\"%!^&|<>\\r\\n]/;\r\n\r\n/**\r\n * Runs a command and resolves with its exit code and output. Never rejects for\r\n * a non-zero exit code; callers decide what a failure means.\r\n */\r\nexport function runCommand(command: string, args: string[], options: RunOptions): Promise<RunResult> {\r\n return new Promise((resolve, reject) => {\r\n const spawnOptions = { cwd: options.cwd, windowsHide: true, env: process.env };\r\n let child;\r\n\r\n if (IS_WINDOWS) {\r\n for (const arg of [command, ...args]) {\r\n if (WINDOWS_UNSAFE.test(arg)) {\r\n reject(new UnsafeArgumentError(arg));\r\n return;\r\n }\r\n }\r\n // The shell receives one pre-quoted command line; passing an argument\r\n // array together with `shell: true` is deprecated because Node would\r\n // concatenate it unescaped.\r\n const commandLine = [command, ...args].map(quoteWindows).join(' ');\r\n child = spawn(commandLine, { ...spawnOptions, shell: true });\r\n } else {\r\n child = spawn(command, args, spawnOptions);\r\n }\r\n\r\n let stdout = '';\r\n let stderr = '';\r\n let timedOut = false;\r\n child.stdout.setEncoding('utf8').on('data', (chunk: string) => (stdout += chunk));\r\n child.stderr.setEncoding('utf8').on('data', (chunk: string) => (stderr += chunk));\r\n\r\n const timer = options.timeoutMs\r\n ? setTimeout(() => {\r\n timedOut = true;\r\n killTree(child.pid, () => child.kill());\r\n }, options.timeoutMs)\r\n : undefined;\r\n\r\n child.on('error', (err) => {\r\n if (timer) clearTimeout(timer);\r\n reject(err);\r\n });\r\n\r\n child.on('close', (code) => {\r\n if (timer) clearTimeout(timer);\r\n resolve({ exitCode: code ?? 1, stdout, stderr, timedOut });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Runs a user-defined command line (`postUpdateScript`) through the shell.\r\n * The script comes from the repository's own configuration file, not from\r\n * dependency data, so it is trusted like any other project script.\r\n */\r\nexport function runShellScript(script: string, options: RunOptions): Promise<RunResult> {\r\n return new Promise((resolve) => {\r\n exec(\r\n script,\r\n { cwd: options.cwd, timeout: options.timeoutMs, maxBuffer: 64 * 1024 * 1024, windowsHide: true },\r\n (error, stdout, stderr) => {\r\n const timedOut = Boolean(error?.killed);\r\n const exitCode = error ? (typeof error.code === 'number' ? error.code : 1) : 0;\r\n resolve({ exitCode, stdout, stderr, timedOut });\r\n },\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Kills a process together with its children. On Windows the command runs\r\n * inside cmd.exe; killing only the shell would leave npm or Java running with\r\n * the output pipes open, so the 'close' event would never fire.\r\n */\r\nfunction killTree(pid: number | undefined, fallback: () => void): void {\r\n if (!IS_WINDOWS || pid === undefined) {\r\n fallback();\r\n return;\r\n }\r\n const killer = spawn('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' });\r\n killer.on('error', fallback);\r\n}\r\n\r\n/** Returns the last lines of a tool's output for use in error messages. */\r\nexport function tail(output: string, lines = 15): string {\r\n return output.trim().split(/\\r?\\n/).slice(-lines).join('\\n');\r\n}\r\n\r\nfunction quoteWindows(arg: string): string {\r\n // `=`, `,` and `;` separate arguments for batch files, so they force quoting too.\r\n return /^[\\w.:\\\\/@+-]+$/.test(arg) ? arg : `\"${arg}\"`;\r\n}\r\n","/**\r\n * Elevate — dependency origin classification.\r\n *\r\n * Decides whether a dependency is a workspace module, an internal package from\r\n * a private registry, or a public package. The registry URL alone is not a\r\n * reliable signal: in most companies every request — public packages included\r\n * — goes through one Artifactory or Nexus proxy. The classification therefore\r\n * relies on what is explicitly known: the modules found in the repository,\r\n * the configured internal scopes, and explicit per-scope registry mappings.\r\n */\r\n\r\nimport type { DependencyOrigin, Ecosystem, ProjectModule } from './models.js';\r\n\r\n/** Index of the repository's own modules, keyed by dependency identifier. */\r\nexport type WorkspaceIndex = ReadonlyMap<string, ProjectModule>;\r\n\r\nexport interface OriginContext {\r\n workspace: WorkspaceIndex;\r\n /** Configured internal scopes / groupId prefixes (e.g. `@my-org`, `com.mycompany`). */\r\n internalScopes: readonly string[];\r\n /** npm only: explicit `@scope:registry` mappings from the npm configuration. */\r\n scopedRegistries?: ReadonlyMap<string, string>;\r\n}\r\n\r\n/** Builds the workspace index from discovered modules. */\r\nexport function buildWorkspaceIndex(modules: readonly ProjectModule[]): WorkspaceIndex {\r\n const index = new Map<string, ProjectModule>();\r\n for (const module of modules) {\r\n if (module.id && module.id !== 'empty') index.set(module.id, module);\r\n }\r\n return index;\r\n}\r\n\r\nexport function classifyOrigin(\r\n identifier: string,\r\n ecosystem: Ecosystem,\r\n context: OriginContext,\r\n): DependencyOrigin {\r\n const module = context.workspace.get(identifier);\r\n if (module) {\r\n return { kind: 'workspace', moduleId: module.id, moduleRelPath: module.relPath };\r\n }\r\n\r\n if (matchesInternalScope(identifier, ecosystem, context.internalScopes)) {\r\n return { kind: 'private', matchedBy: 'internal-scope' };\r\n }\r\n\r\n if (ecosystem === 'npm' && context.scopedRegistries) {\r\n const scope = npmScopeOf(identifier);\r\n const registry = scope ? context.scopedRegistries.get(scope) : undefined;\r\n if (registry) return { kind: 'private', matchedBy: 'scoped-registry', registry };\r\n }\r\n\r\n return { kind: 'public' };\r\n}\r\n\r\n/**\r\n * Checks an identifier against the configured internal scopes.\r\n *\r\n * npm: `@scope` (or `@scope/`) matches every package in that scope; any other\r\n * entry matches the exact package name, or a name prefix when it ends in `*`.\r\n *\r\n * Maven: an entry matches the groupId itself and every groupId below it on a\r\n * segment boundary — `com.acme` matches `com.acme` and `com.acme.billing`, but\r\n * not `com.acmecorp`. A leading `@` is ignored so one shared list can serve\r\n * both ecosystems.\r\n */\r\nexport function matchesInternalScope(\r\n identifier: string,\r\n ecosystem: Ecosystem,\r\n internalScopes: readonly string[],\r\n): boolean {\r\n if (ecosystem === 'maven') {\r\n const groupId = identifier.split(':')[0] ?? '';\r\n return internalScopes.some((entry) => {\r\n const prefix = entry.replace(/^@/, '').replace(/[.:/]+$/, '');\r\n return prefix.length > 0 && (groupId === prefix || groupId.startsWith(`${prefix}.`));\r\n });\r\n }\r\n\r\n return internalScopes.some((entry) => {\r\n if (entry.startsWith('@')) {\r\n const scope = entry.replace(/\\/+$/, '');\r\n return identifier.startsWith(`${scope}/`);\r\n }\r\n if (entry.endsWith('*')) return identifier.startsWith(entry.slice(0, -1));\r\n return identifier === entry;\r\n });\r\n}\r\n\r\n/** Returns the `@scope` part of a scoped npm package name. */\r\nexport function npmScopeOf(name: string): string | undefined {\r\n if (!name.startsWith('@')) return undefined;\r\n const slash = name.indexOf('/');\r\n return slash > 1 ? name.slice(0, slash) : undefined;\r\n}\r\n","/**\r\n * Elevate — npm configuration reader.\r\n *\r\n * Reads the effective npm configuration through `npm config list --json`, so\r\n * every source npm itself honours (project, user and global `.npmrc`,\r\n * environment variables) is taken into account without re-implementing npm's\r\n * precedence rules.\r\n */\r\n\r\nimport { runCommand } from '../shared/process.js';\r\nimport { npmScopeOf } from '../../domain/origin.js';\r\n\r\nexport interface NpmRegistryConfig {\r\n /** Default registry for unscoped packages and scopes without a mapping. */\r\n registry: string;\r\n /** Explicit `@scope:registry` mappings. */\r\n scopedRegistries: ReadonlyMap<string, string>;\r\n}\r\n\r\nconst DEFAULT_REGISTRY = 'https://registry.npmjs.org/';\r\n\r\n/** Hosts of public npm registries. */\r\nconst PUBLIC_NPM_HOSTS = new Set(['registry.npmjs.org', 'registry.npmjs.com', 'registry.yarnpkg.com']);\r\n\r\nexport class NpmConfigReader {\r\n private readonly cache = new Map<string, Promise<NpmRegistryConfig>>();\r\n\r\n /** Returns the registry configuration that applies in `cwd` (cached per directory). */\r\n read(cwd: string): Promise<NpmRegistryConfig> {\r\n let pending = this.cache.get(cwd);\r\n if (!pending) {\r\n pending = loadConfig(cwd);\r\n this.cache.set(cwd, pending);\r\n }\r\n return pending;\r\n }\r\n\r\n /** The registry npm would contact for this package. */\r\n async registryFor(packageName: string, cwd: string): Promise<string> {\r\n const config = await this.read(cwd);\r\n const scope = npmScopeOf(packageName);\r\n return (scope && config.scopedRegistries.get(scope)) || config.registry;\r\n }\r\n}\r\n\r\n/** Whether a registry URL points to a public npm registry. */\r\nexport function isPublicNpmRegistry(url: string): boolean {\r\n try {\r\n return PUBLIC_NPM_HOSTS.has(new URL(url).hostname.toLowerCase());\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Extracts registry settings from the JSON printed by `npm config list --json`. */\r\nexport function parseNpmConfig(json: Record<string, unknown>): NpmRegistryConfig {\r\n const scopedRegistries = new Map<string, string>();\r\n for (const [key, value] of Object.entries(json)) {\r\n const match = key.match(/^(@[^:]+):registry$/);\r\n if (match && typeof value === 'string' && value) scopedRegistries.set(match[1]!, value);\r\n }\r\n const registry = typeof json.registry === 'string' && json.registry ? json.registry : DEFAULT_REGISTRY;\r\n return { registry, scopedRegistries };\r\n}\r\n\r\nasync function loadConfig(cwd: string): Promise<NpmRegistryConfig> {\r\n try {\r\n const result = await runCommand('npm', ['config', 'list', '--json'], { cwd, timeoutMs: 15_000 });\r\n if (result.exitCode !== 0) return parseNpmConfig({});\r\n return parseNpmConfig(JSON.parse(result.stdout) as Record<string, unknown>);\r\n } catch {\r\n // Without a readable configuration npm falls back to the public registry,\r\n // and so do we — which keeps internal packages from being looked up.\r\n return parseNpmConfig({});\r\n }\r\n}\r\n","/**\r\n * Elevate — npm dependency scanner.\r\n *\r\n * Classifies every dependency of a module by origin and consults the matching\r\n * version source:\r\n *\r\n * - workspace: the local version of the sibling module. A dependency whose\r\n * range does not include that version is not linked by npm but installed\r\n * from a registry, so it is offered for alignment.\r\n * - private: the registry configured for the package; never a public one.\r\n * - public: the configured registry via `npm view`.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport semver from 'semver';\r\nimport type { DependencyReaderPort, RegistryPort, ScanContext } from '../../domain/ports.js';\r\nimport type {\r\n DependencyCoordinate,\r\n DependencyOrigin,\r\n ProjectModule,\r\n ScanResult,\r\n SkippedDependency,\r\n UpdateCandidate,\r\n} from '../../domain/models.js';\r\nimport { classifyOrigin } from '../../domain/origin.js';\r\nimport { diffVersions, extractPreReleaseTag, rangePrefix } from '../../domain/versions.js';\r\nimport { mapPooled } from '../shared/pool.js';\r\nimport { isPublicNpmRegistry } from './npm-config.js';\r\nimport type { NpmConfigReader } from './npm-config.js';\r\nimport { assertNpmManaged } from './npm-package-manager.js';\r\nimport { isValidPackageName } from './npm-registry.js';\r\n\r\nconst CONCURRENCY = 6;\r\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\r\n\r\ninterface DeclaredDependency {\r\n name: string;\r\n range: string;\r\n scope: 'prod' | 'dev';\r\n}\r\n\r\ntype Outcome = { candidate: UpdateCandidate } | { skipped: SkippedDependency } | null;\r\n\r\nexport class NpmDependencyAdapter implements DependencyReaderPort {\r\n constructor(\r\n private readonly registry: RegistryPort,\r\n private readonly config: NpmConfigReader,\r\n ) {}\r\n\r\n async scan(module: ProjectModule, context: ScanContext): Promise<ScanResult> {\r\n assertNpmManaged(context.rootDir);\r\n\r\n let pkg: any;\r\n try {\r\n pkg = JSON.parse(readFileSync(join(module.path, 'package.json'), 'utf8'));\r\n } catch {\r\n return { candidates: [], skipped: [] };\r\n }\r\n\r\n const npmConfig = await this.config.read(context.rootDir);\r\n const originContext = {\r\n workspace: context.workspace,\r\n internalScopes: context.internalScopes,\r\n // A scope mapped to a public registry is not internal; only private\r\n // mappings mark their scope as private.\r\n scopedRegistries: new Map(\r\n [...npmConfig.scopedRegistries].filter(([, url]) => !isPublicNpmRegistry(url)),\r\n ),\r\n };\r\n\r\n const outcomes = await mapPooled(declaredDependencies(pkg), CONCURRENCY, async (dep) => {\r\n const origin = classifyOrigin(dep.name, 'npm', originContext);\r\n if (origin.kind === 'workspace') {\r\n const target = context.workspace.get(dep.name);\r\n const candidate = target ? alignmentCandidate(dep, target, origin) : null;\r\n return candidate ? { candidate } : null;\r\n }\r\n return this.registryOutcome(dep, origin, context);\r\n });\r\n\r\n const candidates: UpdateCandidate[] = [];\r\n const skipped: SkippedDependency[] = [];\r\n for (const outcome of outcomes) {\r\n if (!outcome) continue;\r\n if ('candidate' in outcome) candidates.push(outcome.candidate);\r\n else skipped.push(outcome.skipped);\r\n }\r\n\r\n candidates.sort((a, b) => (DIFF_ORDER[a.diff] ?? 3) - (DIFF_ORDER[b.diff] ?? 3));\r\n return { candidates, skipped };\r\n }\r\n\r\n /** Looks up a private or public dependency in its registry. */\r\n private async registryOutcome(\r\n dep: DeclaredDependency,\r\n origin: DependencyOrigin,\r\n context: ScanContext,\r\n ): Promise<Outcome> {\r\n // Git URLs, file paths, aliases and dist-tags are not registry versions.\r\n if (!isUpgradableRange(dep.range)) return null;\r\n\r\n if (!isValidPackageName(dep.name)) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'invalid-name' } };\r\n }\r\n\r\n const coordinate: DependencyCoordinate = { identifier: dep.name, artifact: dep.name, ecosystem: 'npm' };\r\n\r\n let resolvedOrigin = origin;\r\n if (origin.kind === 'private') {\r\n // Asking a public registry about an internal name is exactly what a\r\n // dependency-confusion attack exploits, so the lookup is not made at all.\r\n const endpoint = await this.registry.resolveEndpoint(coordinate, context.rootDir);\r\n if (endpoint.isPublic) {\r\n return {\r\n skipped: {\r\n identifier: dep.name,\r\n origin: 'private',\r\n reason: 'private-on-public-registry',\r\n detail: endpoint.url,\r\n },\r\n };\r\n }\r\n resolvedOrigin = { ...origin, registry: endpoint.url };\r\n }\r\n\r\n const latest = await this.registry.getLatestVersion(coordinate, context.channel, context.rootDir);\r\n if (!latest) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'lookup-failed' } };\r\n }\r\n\r\n const currentClean = semver.minVersion(dep.range)?.version;\r\n if (!currentClean || !semver.valid(latest) || !semver.gt(latest, currentClean)) return null;\r\n\r\n const tag = semver.prerelease(latest) ? extractPreReleaseTag(latest) ?? 'PRE' : undefined;\r\n const diff = diffVersions(currentClean, latest);\r\n return {\r\n candidate: {\r\n coordinate,\r\n currentRange: dep.range,\r\n currentClean,\r\n latest,\r\n newRange: `${rangePrefix(dep.range)}${latest}`,\r\n diff,\r\n scope: dep.scope,\r\n selected: diff !== 'major',\r\n origin: resolvedOrigin,\r\n action: 'update',\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * The sections whose ranges say \"this is what I install\": they are scanned and\r\n * written. `peerDependencies`, `overrides` and `bundleDependencies` are\r\n * statements to others and are never offered or changed. Listed in npm's\r\n * increasing precedence for a name declared more than once.\r\n */\r\nexport const DEPENDENCY_SECTIONS = ['dependencies', 'optionalDependencies', 'devDependencies'] as const;\r\n\r\n/**\r\n * Lists the dependencies of the scanned sections once per name. A name in\r\n * several sections takes the range of the last one in `DEPENDENCY_SECTIONS`\r\n * (npm installs the optional range over the regular one); a name that is also\r\n * a devDependency counts as dev.\r\n */\r\nfunction declaredDependencies(pkg: any): DeclaredDependency[] {\r\n const deps = new Map<string, DeclaredDependency>();\r\n for (const section of DEPENDENCY_SECTIONS) {\r\n const scope = section === 'devDependencies' ? 'dev' : 'prod';\r\n for (const [name, range] of Object.entries(pkg[section] ?? {})) {\r\n if (typeof range === 'string') deps.set(name, { name, range, scope });\r\n }\r\n }\r\n return [...deps.values()];\r\n}\r\n\r\n/** Whether a range is a SemVer range pinned to something more specific than \"any\". */\r\nexport function isUpgradableRange(range: string): boolean {\r\n const trimmed = range.trim();\r\n if (trimmed === '' || trimmed === '*' || trimmed.toLowerCase() === 'x') return false;\r\n return semver.validRange(trimmed) !== null;\r\n}\r\n\r\n/**\r\n * Builds an alignment candidate when the declared range excludes the local\r\n * version of the workspace module, i.e. when npm would not link the module.\r\n * Ranges npm links regardless of the version (`*`, `file:`, `link:`,\r\n * `workspace:`) never need alignment.\r\n */\r\nexport function alignmentCandidate(\r\n dep: DeclaredDependency,\r\n target: ProjectModule,\r\n origin: DependencyOrigin,\r\n): UpdateCandidate | null {\r\n const local = target.version;\r\n if (!local || !semver.valid(local) || !isUpgradableRange(dep.range)) return null;\r\n if (semver.satisfies(local, dep.range, { includePrerelease: true })) return null;\r\n\r\n const currentClean = semver.minVersion(dep.range)?.version ?? '0.0.0';\r\n const diff = diffVersions(currentClean, local);\r\n const tag = semver.prerelease(local) ? extractPreReleaseTag(local) ?? 'PRE' : undefined;\r\n\r\n return {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'npm' },\r\n currentRange: dep.range,\r\n currentClean,\r\n latest: local,\r\n newRange: `${rangePrefix(dep.range)}${local}`,\r\n diff,\r\n scope: dep.scope,\r\n selected: diff !== 'major',\r\n origin,\r\n action: 'align',\r\n availableVersions: [local],\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n };\r\n}\r\n","/**\r\n * Elevate — version helpers shared by all ecosystems.\r\n */\r\n\r\nimport semver from 'semver';\r\n\r\n/**\r\n * Matches a pre-release qualifier as a whole token: it must start the string,\r\n * follow a separator or a digit, and end at a separator, a digit or the end.\r\n * This keeps words such as `android`, `jre` or `devtools` from being taken for\r\n * pre-releases. Single-letter forms (`a1`, `b2`, `M3`) require a number.\r\n */\r\nconst PRE_RELEASE =\r\n /(?:^|[.\\-_+]|(?<=\\d))(alpha|beta|rc|cr|milestone|preview|snapshot|ea|dev|pre|(?:a|b|m)(?=\\d))(?=$|[.\\-_+]|\\d)/i;\r\n\r\n/** Whether a version is a pre-release (alpha, beta, RC, milestone, snapshot, …). */\r\nexport function isPreReleaseVersion(version: string): boolean {\r\n return PRE_RELEASE.test(version);\r\n}\r\n\r\n/** Short label for a pre-release, e.g. \"BETA\", \"RC\", \"M2\"; undefined for releases. */\r\nexport function extractPreReleaseTag(version: string): string | undefined {\r\n const match = version.match(PRE_RELEASE);\r\n if (!match) return undefined;\r\n const token = match[1]!.toLowerCase();\r\n if (token === 'a') return 'ALPHA';\r\n if (token === 'b') return 'BETA';\r\n if (token === 'm') {\r\n const number = version.slice((match.index ?? 0) + match[0].length).match(/^\\d+/)?.[0];\r\n return `M${number ?? ''}`;\r\n }\r\n return token.toUpperCase();\r\n}\r\n\r\n/**\r\n * Normalises a Java-style version (e.g. \"5.10.2\", \"1.71.0.Final\",\r\n * \"32.0.0-jre\") to a SemVer string for diffing. Returns null when the version\r\n * has no numeric core.\r\n */\r\nexport function cleanJavaVersion(version: string): string | null {\r\n const match = version.match(/^v?(\\d+(?:\\.\\d+){0,2})/);\r\n if (!match) return null;\r\n return semver.coerce(match[1])?.version ?? null;\r\n}\r\n\r\n/** SemVer difference between two versions, collapsed to patch/minor/major. */\r\nexport function diffVersions(from: string, to: string): 'patch' | 'minor' | 'major' {\r\n const kind = semver.diff(from, to);\r\n if (kind === 'major' || kind === 'premajor') return 'major';\r\n if (kind === 'minor' || kind === 'preminor') return 'minor';\r\n return 'patch';\r\n}\r\n\r\n/** Returns the range operator (`^`, `~` or none) of an npm range. */\r\nexport function rangePrefix(range: string): '^' | '~' | '' {\r\n if (range.startsWith('^')) return '^';\r\n if (range.startsWith('~')) return '~';\r\n return '';\r\n}\r\n","/**\r\n * Elevate — bounded concurrency helper.\r\n */\r\n\r\n/**\r\n * Maps `items` through `fn` with at most `concurrency` calls in flight.\r\n * Results keep the input order. A rejected call rejects the whole pool, so\r\n * `fn` should handle expected failures itself.\r\n */\r\nexport async function mapPooled<T, R>(\r\n items: readonly T[],\r\n concurrency: number,\r\n fn: (item: T) => Promise<R>,\r\n): Promise<R[]> {\r\n const results = new Array<R>(items.length);\r\n let next = 0;\r\n\r\n async function worker(): Promise<void> {\r\n while (next < items.length) {\r\n const index = next++;\r\n results[index] = await fn(items[index]!);\r\n }\r\n }\r\n\r\n const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());\r\n await Promise.all(workers);\r\n return results;\r\n}\r\n","/**\r\n * Elevate — package manager detection.\r\n *\r\n * Elevate's Node.js support drives npm: it runs `npm install` and checks\r\n * `package-lock.json`. In a repository managed by pnpm, Yarn or Bun that would\r\n * create a second lockfile and a `node_modules` layout the project does not\r\n * use, so such repositories are recognised and refused.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { dirname, join, resolve } from 'node:path';\r\nimport { findCheckoutBoundary } from '../shared/checkout.js';\r\n\r\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun';\r\n\r\nexport interface DetectedPackageManager {\r\n name: PackageManagerName;\r\n /** What decided: the `packageManager` field, a file name, or the lack of both. */\r\n evidence: string;\r\n}\r\n\r\n/** Marker files per package manager, checked in this order; the first match decides. */\r\nconst MARKER_FILES: readonly [PackageManagerName, readonly string[]][] = [\r\n ['npm', ['package-lock.json', 'npm-shrinkwrap.json']],\r\n ['pnpm', ['pnpm-lock.yaml', 'pnpm-workspace.yaml']],\r\n ['yarn', ['yarn.lock', '.yarnrc.yml']],\r\n ['bun', ['bun.lock', 'bun.lockb']],\r\n];\r\n\r\n/** Thrown when the repository is managed by a package manager other than npm. */\r\nexport class UnsupportedPackageManagerError extends Error {\r\n constructor(detected: DetectedPackageManager) {\r\n super(\r\n `This repository is managed by ${detected.name} (${detected.evidence}). ` +\r\n `Elevate supports npm for Node.js projects; using it here would create an npm lockfile next to ` +\r\n `${detected.name}'s. Nothing was changed.`,\r\n );\r\n this.name = 'UnsupportedPackageManagerError';\r\n }\r\n}\r\n\r\n/**\r\n * Recognises the package manager that manages `dir`. Starting at `dir`, each\r\n * directory up to the checkout boundary is examined; the first one with a\r\n * decisive finding wins. This matters when Elevate is started inside a\r\n * workspace package: pnpm keeps its workspace file and lockfile at the\r\n * workspace root, not next to the package. Without a checkout boundary only\r\n * `dir` itself is examined: files of unrelated directories above it say\r\n * nothing about this project.\r\n */\r\nexport function detectPackageManager(dir: string): DetectedPackageManager {\r\n const boundary = findCheckoutBoundary(dir);\r\n let current = resolve(dir);\r\n for (;;) {\r\n const found = detectIn(current);\r\n if (found) return found;\r\n const parent = dirname(current);\r\n if (boundary === undefined || current === boundary || parent === current) break;\r\n current = parent;\r\n }\r\n return { name: 'npm', evidence: 'no other package manager detected' };\r\n}\r\n\r\n/** The decisive finding in one directory, if any. */\r\nfunction detectIn(dir: string): DetectedPackageManager | undefined {\r\n const declared = readPackageManagerField(dir);\r\n const name = declared?.match(/^(npm|pnpm|yarn|bun)@/)?.[1] as PackageManagerName | undefined;\r\n if (declared && name) return { name, evidence: `\"packageManager\": \"${declared}\" in package.json` };\r\n\r\n for (const [manager, files] of MARKER_FILES) {\r\n const found = files.find((file) => existsSync(join(dir, file)));\r\n if (found) return { name: manager, evidence: found };\r\n }\r\n return undefined;\r\n}\r\n\r\n/** Throws `UnsupportedPackageManagerError` unless the repository is managed by npm. */\r\nexport function assertNpmManaged(rootDir: string): void {\r\n const detected = detectPackageManager(rootDir);\r\n if (detected.name !== 'npm') throw new UnsupportedPackageManagerError(detected);\r\n}\r\n\r\nfunction readPackageManagerField(rootDir: string): string | undefined {\r\n try {\r\n const field = JSON.parse(readFileSync(join(rootDir, 'package.json'), 'utf8'))?.packageManager;\r\n return typeof field === 'string' ? field : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n","/**\r\n * Elevate — version-control checkout boundary.\r\n *\r\n * Searches for markers of the repository (configuration, workspace files,\r\n * lockfiles) stop at the checkout, so files of unrelated directories above it\r\n * are never picked up.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { dirname, join, resolve } from 'node:path';\r\n\r\n/**\r\n * The nearest directory, starting at `startDir` and walking upwards, that\r\n * contains an entry named `.git` (a directory, or a file in worktrees and\r\n * submodules). Undefined when there is none.\r\n */\r\nexport function findCheckoutBoundary(startDir: string): string | undefined {\r\n let dir = resolve(startDir);\r\n for (;;) {\r\n if (existsSync(join(dir, '.git'))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) return undefined;\r\n dir = parent;\r\n }\r\n}\r\n","/**\r\n * Elevate — npm updater.\r\n *\r\n * Writes new ranges to the module's package.json (keeping its indentation),\r\n * runs `npm install` at the repository root and verifies that aligned\r\n * workspace dependencies are linked rather than installed from a registry.\r\n */\r\n\r\nimport { readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\nimport { InstallError } from '../../domain/ports.js';\r\nimport type { ApplyOutcome, DependencyUpdaterPort } from '../../domain/ports.js';\r\nimport type { ProjectModule, UpdateCandidate } from '../../domain/models.js';\r\nimport { runCommand, tail } from '../shared/process.js';\r\nimport { UnsupportedPackageManagerError, assertNpmManaged, detectPackageManager } from './npm-package-manager.js';\r\nimport { DEPENDENCY_SECTIONS } from './npm-scanner.js';\r\nimport { findUnlinkedWorkspaceDependencies, readLockfile } from './npm-lockfile.js';\r\n\r\nconst INSTALL_TIMEOUT_MS = 10 * 60_000;\r\n\r\nexport class NpmUpdaterAdapter implements DependencyUpdaterPort {\r\n affectedFiles(module: ProjectModule, rootDir: string): string[] {\r\n return [\r\n join(module.path, 'package.json'),\r\n join(rootDir, 'package.json'),\r\n join(rootDir, 'package-lock.json'),\r\n join(rootDir, 'npm-shrinkwrap.json'),\r\n ];\r\n }\r\n\r\n async applyUpdates(\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n onProgress: (stepMessage: string) => void,\r\n ): Promise<ApplyOutcome> {\r\n try {\r\n assertNpmManaged(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError) throw new InstallError(err.message);\r\n throw err;\r\n }\r\n\r\n const pkgPath = join(module.path, 'package.json');\r\n let source: string;\r\n let pkg: any;\r\n try {\r\n source = readFileSync(pkgPath, 'utf8');\r\n pkg = JSON.parse(source);\r\n } catch {\r\n throw new InstallError(`Cannot read package.json in ${module.path}.`);\r\n }\r\n\r\n onProgress('Writing new versions to package.json…');\r\n for (const item of updates) {\r\n const name = item.coordinate.artifact;\r\n // Every section that declares the name receives the range.\r\n for (const section of DEPENDENCY_SECTIONS) {\r\n if (typeof pkg[section]?.[name] === 'string') pkg[section][name] = item.newRange;\r\n }\r\n }\r\n writeFileSync(pkgPath, serializeLike(source, pkg), 'utf8');\r\n\r\n onProgress('Running npm install…');\r\n const install = await runCommand('npm', ['install'], { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (install.exitCode !== 0) {\r\n const reason = install.timedOut ? 'npm install timed out' : 'npm install failed';\r\n throw new InstallError(reason, tail(install.stderr || install.stdout));\r\n }\r\n\r\n onProgress('Checking workspace links in package-lock.json…');\r\n const integrityViolations = verifyAlignedLinks(module, rootDir, updates);\r\n\r\n const combined = `${install.stdout}\\n${install.stderr}`;\r\n const audit = parseAuditSummary(combined);\r\n const fundingMatch = combined.match(/(\\d+ packages? (?:is|are) looking for funding)/i);\r\n\r\n return {\r\n updatedCount: updates.length,\r\n auditMessage: audit.message,\r\n auditSeverity: audit.severity,\r\n fundingMessage: fundingMatch ? fundingMatch[0] : undefined,\r\n integrityViolations,\r\n };\r\n }\r\n\r\n async resync(_module: ProjectModule, rootDir: string, onProgress: (stepMessage: string) => void): Promise<void> {\r\n // Nothing was installed in a repository npm does not manage, so there is nothing to restore.\r\n if (detectPackageManager(rootDir).name !== 'npm') return;\r\n\r\n onProgress('Restoring node_modules (npm install)…');\r\n const result = await runCommand('npm', ['install'], { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n throw new InstallError('npm install failed while restoring the previous state', tail(result.stderr));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A line of npm's vulnerability summary: `found 0 vulnerabilities`,\r\n * `1 high severity vulnerability`, `5 vulnerabilities (1 low, 2 moderate, 2 high)`\r\n * or npm 6's `found 3 vulnerabilities (1 low, 2 high)`. Anchored to the whole\r\n * line so other numbers in npm's output are not mistaken for a count.\r\n */\r\nconst VULNERABILITY_LINE = /^(?:found\\s+)?(\\d+)\\s+(?:(?:info|low|moderate|high|critical)\\s+severity\\s+)?vulnerabilit(?:y|ies)\\b.*$/i;\r\n\r\n/**\r\n * Reads the vulnerability summary from the output of `npm install`. Zero\r\n * vulnerabilities, or no summary at all, is clean; otherwise the result is a\r\n * warning that quotes npm's own line.\r\n */\r\nexport function parseAuditSummary(output: string): { message: string; severity: 'clean' | 'warn' } {\r\n for (const line of output.split(/\\r?\\n/)) {\r\n const match = line.trim().match(VULNERABILITY_LINE);\r\n if (match && Number(match[1]) > 0) return { message: line.trim(), severity: 'warn' };\r\n }\r\n return { message: 'No known vulnerabilities found.', severity: 'clean' };\r\n}\r\n\r\n/** Every aligned workspace dependency must now be linked to its workspace. */\r\nfunction verifyAlignedLinks(module: ProjectModule, rootDir: string, updates: UpdateCandidate[]): string[] {\r\n const aligned = updates.filter((u) => u.origin.kind === 'workspace').map((u) => u.coordinate.identifier);\r\n if (aligned.length === 0) return [];\r\n\r\n const lockfile = readLockfile(rootDir);\r\n if (!lockfile) return ['package-lock.json is missing; workspace links cannot be verified'];\r\n\r\n const moduleRelPath = relative(rootDir, module.path).replace(/\\\\/g, '/');\r\n return findUnlinkedWorkspaceDependencies(lockfile, moduleRelPath, aligned);\r\n}\r\n\r\n/** Serialises JSON with the indentation and final newline of the original file. */\r\nfunction serializeLike(original: string, value: unknown): string {\r\n const indent = original.match(/^[ \\t]+(?=\")/m)?.[0] ?? ' ';\r\n const newline = original.includes('\\r\\n') ? '\\r\\n' : '\\n';\r\n const body = JSON.stringify(value, null, indent).replace(/\\n/g, newline);\r\n return original.endsWith('\\n') ? body + newline : body;\r\n}\r\n","/**\r\n * Elevate — domain ports (hexagonal architecture).\r\n *\r\n * Interfaces that decouple the domain logic from concrete package managers,\r\n * registries and file system operations.\r\n */\r\n\r\nimport type {\r\n ProjectModule,\r\n DependencyCoordinate,\r\n UpdateCandidate,\r\n UpdateSummary,\r\n ReleaseChannel,\r\n ScanResult,\r\n} from './models.js';\r\nimport type { WorkspaceIndex } from './origin.js';\r\n\r\n/** Port: finds all modules of an ecosystem in the repository. */\r\nexport interface ModuleDiscoveryPort {\r\n discover(rootDir: string): Promise<ProjectModule[]>;\r\n /**\r\n * Proposes the repository root this ecosystem would use when started in\r\n * `startDir`: the outermost directory it can relate `startDir` to. Only\r\n * `startDir` and its ancestors up to and including `boundaryDir` are\r\n * examined (without a boundary, up to the file-system root). Returns\r\n * `undefined` when the ecosystem has no opinion.\r\n */\r\n findRoot?(startDir: string, boundaryDir: string | undefined): string | undefined;\r\n}\r\n\r\n/** The registry a lookup would contact. */\r\nexport interface RegistryEndpoint {\r\n url: string;\r\n /** Whether the endpoint is a public registry such as npmjs.org or Maven Central. */\r\n isPublic: boolean;\r\n}\r\n\r\n/** Port: queries a registry for versions. */\r\nexport interface RegistryPort {\r\n /**\r\n * Resolves which registry a lookup for this coordinate would contact, using\r\n * the package manager's own configuration.\r\n *\r\n * @param cwd directory whose configuration applies (usually the repository root)\r\n */\r\n resolveEndpoint(coordinate: DependencyCoordinate, cwd: string): Promise<RegistryEndpoint>;\r\n getLatestVersion(\r\n coordinate: DependencyCoordinate,\r\n channel?: ReleaseChannel,\r\n cwd?: string,\r\n ): Promise<string | null>;\r\n /** All published versions, newest first. */\r\n getAllVersions(coordinate: DependencyCoordinate, cwd?: string): Promise<string[]>;\r\n}\r\n\r\n/** Everything a scan needs to know beyond the module itself. */\r\nexport interface ScanContext {\r\n rootDir: string;\r\n workspace: WorkspaceIndex;\r\n internalScopes: readonly string[];\r\n channel: ReleaseChannel;\r\n}\r\n\r\n/** Port: scans a module and returns update candidates plus skipped dependencies. */\r\nexport interface DependencyReaderPort {\r\n scan(module: ProjectModule, context: ScanContext): Promise<ScanResult>;\r\n /**\r\n * Optional batch scan for adapters whose tools are expensive to start\r\n * (Maven): several modules share the same tool runs.\r\n */\r\n scanMany?(modules: readonly ProjectModule[], context: ScanContext): Promise<Map<ProjectModule, ScanResult>>;\r\n}\r\n\r\n/** Outcome of writing updates and installing them. */\r\nexport type ApplyOutcome = Pick<\r\n UpdateSummary,\r\n 'updatedCount' | 'auditMessage' | 'auditSeverity' | 'fundingMessage'\r\n> & {\r\n /**\r\n * Integrity violations detected after installation, e.g. a workspace\r\n * dependency that npm installed from a registry instead of linking it.\r\n * Any violation makes the update fail and triggers a rollback.\r\n */\r\n integrityViolations: string[];\r\n};\r\n\r\n/** Thrown when the package manager fails to install or resolve the update. */\r\nexport class InstallError extends Error {\r\n constructor(message: string, readonly output?: string) {\r\n super(message);\r\n this.name = 'InstallError';\r\n }\r\n}\r\n\r\n/** Port: writes updates to manifests and installs them. */\r\nexport interface DependencyUpdaterPort {\r\n /**\r\n * Files the update may modify: manifests, lockfiles, parent POMs. They are\r\n * captured before the update so a failure can be rolled back.\r\n */\r\n affectedFiles(module: ProjectModule, rootDir: string, updates: UpdateCandidate[]): string[];\r\n\r\n /** Writes the updates and installs them. Throws `InstallError` on failure. */\r\n applyUpdates(\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n onProgress: (stepMessage: string) => void,\r\n ): Promise<ApplyOutcome>;\r\n\r\n /**\r\n * Brings the installed state back in line with the manifests after they were\r\n * restored by a rollback (e.g. re-running `npm install`).\r\n */\r\n resync(module: ProjectModule, rootDir: string, onProgress: (stepMessage: string) => void): Promise<void>;\r\n}\r\n\r\nexport interface VerificationOptions {\r\n /** User-defined verification command from `postUpdateScript`. */\r\n customScript?: string;\r\n customLabel?: string;\r\n /** Files changed by the update; used to select the modules to rebuild. */\r\n changedFiles?: string[];\r\n}\r\n\r\nexport interface VerificationResult {\r\n status: 'clean' | 'warn';\r\n details: string;\r\n label: string;\r\n}\r\n\r\n/** Port: verifies the project after an update (build, tests, consistency). */\r\nexport interface VerificationPort {\r\n verify(module: ProjectModule, rootDir: string, options?: VerificationOptions): Promise<VerificationResult>;\r\n}\r\n","/**\r\n * Elevate — package-lock.json integrity checks.\r\n *\r\n * When a dependency's range does not include the local version of a workspace\r\n * package, npm does not link the workspace but installs a package with the\r\n * same name from the registry. That copy may come from anyone who published\r\n * the name. This module verifies from the lockfile that every workspace\r\n * dependency that should be linked actually is.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\ninterface LockEntry {\r\n link?: boolean;\r\n resolved?: string;\r\n version?: string;\r\n}\r\n\r\ninterface Lockfile {\r\n packages?: Record<string, LockEntry>;\r\n}\r\n\r\n/** Reads the root package-lock.json; undefined when absent or unreadable. */\r\nexport function readLockfile(rootDir: string): Lockfile | undefined {\r\n const file = join(rootDir, 'package-lock.json');\r\n if (!existsSync(file)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(file, 'utf8')) as Lockfile;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Returns one message per workspace dependency that is not linked.\r\n *\r\n * npm resolves a dependency of `packages/a` by looking in\r\n * `packages/a/node_modules` first and then in the hoisted root\r\n * `node_modules`, so the nearest lockfile entry decides.\r\n *\r\n * @param moduleRelPath module directory relative to the root ('' for the root)\r\n * @param names workspace packages the module is expected to link\r\n */\r\nexport function findUnlinkedWorkspaceDependencies(\r\n lockfile: Lockfile,\r\n moduleRelPath: string,\r\n names: readonly string[],\r\n): string[] {\r\n const packages = lockfile.packages ?? {};\r\n const prefix = moduleRelPath ? `${moduleRelPath}/` : '';\r\n const violations: string[] = [];\r\n\r\n for (const name of names) {\r\n const entry = packages[`${prefix}node_modules/${name}`] ?? packages[`node_modules/${name}`];\r\n if (!entry) {\r\n violations.push(`${name}: not present in package-lock.json`);\r\n } else if (!entry.link) {\r\n const source = entry.resolved ?? 'unknown source';\r\n violations.push(`${name}: installed from ${source} instead of linking the workspace package`);\r\n }\r\n }\r\n return violations;\r\n}\r\n","/**\r\n * Elevate — npm verification.\r\n *\r\n * Without a configured `postUpdateScript`, verification runs `npm ls` at the\r\n * repository root: it fails on missing, invalid or unmet dependencies across\r\n * all workspaces and needs no project-specific script.\r\n */\r\n\r\nimport type { VerificationOptions, VerificationPort, VerificationResult } from '../../domain/ports.js';\r\nimport type { ProjectModule } from '../../domain/models.js';\r\nimport { runCommand, runShellScript, tail } from '../shared/process.js';\r\nimport { UnsupportedPackageManagerError, assertNpmManaged } from './npm-package-manager.js';\r\n\r\nconst VERIFY_TIMEOUT_MS = 10 * 60_000;\r\n\r\nexport class NpmVerificationAdapter implements VerificationPort {\r\n async verify(\r\n _module: ProjectModule,\r\n rootDir: string,\r\n options: VerificationOptions = {},\r\n ): Promise<VerificationResult> {\r\n const label = options.customLabel || options.customScript || 'Dependency tree integrity (npm ls)';\r\n\r\n if (!options.customScript) {\r\n // `npm ls` would judge a tree npm did not install.\r\n try {\r\n assertNpmManaged(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError) return { status: 'warn', details: err.message, label };\r\n throw err;\r\n }\r\n }\r\n\r\n const result = options.customScript\r\n ? await runShellScript(options.customScript, { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS })\r\n : await runCommand('npm', ['ls'], { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n\r\n if (result.exitCode === 0) {\r\n return { status: 'clean', details: 'All dependencies are installed and consistent.', label };\r\n }\r\n return {\r\n status: 'warn',\r\n details: result.timedOut ? 'Verification timed out.' : tail(result.stderr || result.stdout),\r\n label,\r\n };\r\n }\r\n}\r\n","/**\r\n * Elevate — npm ecosystem strategy: wires the npm adapters together.\r\n */\r\n\r\nimport type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\r\nimport type { Ecosystem } from '../../domain/models.js';\r\nimport { NpmModuleDiscoveryAdapter } from './npm-discovery.js';\r\nimport { NpmRegistryAdapter } from './npm-registry.js';\r\nimport { NpmDependencyAdapter } from './npm-scanner.js';\r\nimport { NpmUpdaterAdapter } from './npm-updater.js';\r\nimport { NpmVerificationAdapter } from './npm-verifier.js';\r\n\r\nexport class NpmEcosystemStrategy implements EcosystemStrategy {\r\n readonly ecosystem: Ecosystem = 'npm';\r\n readonly displayName = 'Node / npm';\r\n readonly icon = '📦';\r\n readonly manifestFile = 'package.json';\r\n\r\n readonly discovery = new NpmModuleDiscoveryAdapter();\r\n readonly registry = new NpmRegistryAdapter();\r\n readonly reader = new NpmDependencyAdapter(this.registry, this.registry.config);\r\n readonly updater = new NpmUpdaterAdapter();\r\n readonly verifier = new NpmVerificationAdapter();\r\n\r\n getTabLabels(\r\n counts: { total: number; prodCount: number; devCount: number },\r\n t: any,\r\n ): TabLabels {\r\n return {\r\n all: t.tabs.all(counts.total),\r\n prod: t.tabs.dependencies(counts.prodCount),\r\n dev: t.tabs.devDependencies(counts.devCount),\r\n };\r\n }\r\n}\r\n","/**\r\n * Elevate — Maven module discovery.\r\n *\r\n * Reports every Maven project in the repository, including the root POM,\r\n * with its coordinates, its version (inherited and interpolated where\r\n * possible) and the aggregator whose reactor builds it.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { dirname, join, relative, resolve } from 'node:path';\r\nimport type { ModuleDiscoveryPort } from '../../domain/ports.js';\r\nimport type { ProjectModule } from '../../domain/models.js';\r\nimport { MavenProject } from './maven-project.js';\r\nimport { interpolate, parentPomFile, readPom } from './maven-pom.js';\r\nimport type { PomModel } from './maven-pom.js';\r\n\r\nexport class MavenModuleDiscoveryAdapter implements ModuleDiscoveryPort {\r\n /**\r\n * Proposes a root only when `startDir` holds a pom.xml, and then climbs to\r\n * the POM above until there is none: the top of the connected POM chain.\r\n */\r\n findRoot(startDir: string, boundaryDir: string | undefined): string | undefined {\r\n let dir = resolve(startDir);\r\n if (!existsSync(join(dir, 'pom.xml'))) return undefined;\r\n const boundary = boundaryDir ? resolve(boundaryDir) : undefined;\r\n for (;;) {\r\n const above = pomAbove(dir, boundary);\r\n if (!above) return dir;\r\n dir = above;\r\n }\r\n }\r\n\r\n async discover(rootDir: string): Promise<ProjectModule[]> {\r\n const project = MavenProject.load(rootDir);\r\n\r\n const modules = project.poms.map((pom): ProjectModule => {\r\n const coordinates = project.coordinatesOf(pom);\r\n const relPath = relative(rootDir, pom.dir).replace(/\\\\/g, '/');\r\n return {\r\n id: coordinates.groupId ? `${coordinates.groupId}:${coordinates.artifactId}` : coordinates.artifactId,\r\n name: pom.name ? interpolate(pom.name, project.chainOf(pom).poms) : pom.artifactId,\r\n path: pom.dir,\r\n relPath: relPath || 'Root',\r\n ecosystem: 'maven',\r\n isRoot: relPath === '',\r\n version: coordinates.version,\r\n aggregatorDir: project.aggregatorDirOf(pom),\r\n };\r\n });\r\n\r\n modules.sort((a, b) => (a.isRoot ? -1 : b.isRoot ? 1 : a.relPath.localeCompare(b.relPath)));\r\n return modules;\r\n }\r\n}\r\n\r\n/** Reads a POM, treating a missing or malformed file as absent. */\r\nfunction tryReadPom(file: string): PomModel | undefined {\r\n try {\r\n return readPom(file);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** Strict ancestors of `dir`, nearest first, up to and including the boundary. */\r\nfunction ancestorsWithin(dir: string, boundary: string | undefined): string[] {\r\n const result: string[] = [];\r\n let current = dir;\r\n while (current !== boundary) {\r\n const parent = dirname(current);\r\n if (parent === current) break;\r\n result.push(parent);\r\n current = parent;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * The directory of the POM above the project in `dir`: the outermost of its\r\n * local parent and the nearest aggregator that lists it as a module.\r\n */\r\nfunction pomAbove(dir: string, boundary: string | undefined): string | undefined {\r\n const pom = tryReadPom(join(dir, 'pom.xml'));\r\n if (!pom) return undefined;\r\n const ancestors = ancestorsWithin(dir, boundary);\r\n const found: string[] = [];\r\n\r\n const parentFile = parentPomFile(pom);\r\n if (parentFile && pom.parent && ancestors.includes(dirname(parentFile))) {\r\n const parent = tryReadPom(parentFile);\r\n const groupId = parent?.groupId ?? parent?.parent?.groupId;\r\n if (parent && parent.artifactId === pom.parent.artifactId && groupId === pom.parent.groupId) {\r\n found.push(dirname(parentFile));\r\n }\r\n }\r\n\r\n const ownFile = join(dir, 'pom.xml');\r\n const aggregator = ancestors.find((ancestor) =>\r\n tryReadPom(join(ancestor, 'pom.xml'))?.modules.some((entry) => {\r\n const target = resolve(ancestor, entry);\r\n return target === dir || target === ownFile;\r\n }),\r\n );\r\n if (aggregator) found.push(aggregator);\r\n\r\n // The outermost has the shortest path: all candidates are ancestors of `dir`.\r\n return found.sort((a, b) => a.length - b.length)[0];\r\n}\r\n","/**\r\n * Elevate — the set of POM files in a repository.\r\n *\r\n * Indexes every pom.xml below the repository root (including the root POM),\r\n * resolves parent chains between them and determines which aggregator's\r\n * reactor builds each project.\r\n */\r\n\r\nimport { existsSync, readdirSync, statSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { interpolate, parentPomFile, readPom } from './maven-pom.js';\r\nimport type { PomModel, PomParent } from './maven-pom.js';\r\n\r\nconst MAX_DEPTH = 6;\r\nconst SKIPPED_DIRS = new Set(['node_modules', 'target', 'build', 'dist', 'out']);\r\n\r\nexport interface PomCoordinates {\r\n groupId: string;\r\n artifactId: string;\r\n version?: string;\r\n}\r\n\r\nexport interface PomChain {\r\n /** The project first, followed by its parents that live in this repository. */\r\n poms: PomModel[];\r\n /** The first parent that is not part of this repository, if any. */\r\n externalParent?: PomParent;\r\n}\r\n\r\nexport class MavenProject {\r\n private readonly byFile = new Map<string, PomModel>();\r\n private readonly aggregators = new Map<string, string>();\r\n\r\n private constructor(\r\n readonly rootDir: string,\r\n readonly poms: PomModel[],\r\n ) {\r\n for (const pom of poms) this.byFile.set(pom.file, pom);\r\n this.assignAggregators();\r\n }\r\n\r\n /**\r\n * Loads every readable pom.xml below `rootDir`, plus every module listed in\r\n * a `<modules>` section, even in directories the file walk skips (such as\r\n * `build/` or `dist/`). Malformed files are skipped.\r\n */\r\n static load(rootDir: string): MavenProject {\r\n const poms: PomModel[] = [];\r\n const queue = findPomFiles(rootDir);\r\n const seen = new Set(queue);\r\n while (queue.length > 0) {\r\n const file = queue.shift()!;\r\n let pom: PomModel;\r\n try {\r\n pom = readPom(file);\r\n } catch {\r\n // A malformed or missing POM cannot be built by Maven either; it is not a module.\r\n continue;\r\n }\r\n poms.push(pom);\r\n for (const entry of pom.modules) {\r\n const target = resolve(pom.dir, entry);\r\n const moduleFile = target.endsWith('.xml') ? target : join(target, 'pom.xml');\r\n if (!seen.has(moduleFile) && existsSync(moduleFile)) {\r\n seen.add(moduleFile);\r\n queue.push(moduleFile);\r\n }\r\n }\r\n }\r\n return new MavenProject(rootDir, poms);\r\n }\r\n\r\n pomAt(file: string): PomModel | undefined {\r\n return this.byFile.get(resolve(file));\r\n }\r\n\r\n /** The project followed by its local parents, stopping at the first external parent. */\r\n chainOf(pom: PomModel): PomChain {\r\n const poms: PomModel[] = [pom];\r\n let current = pom;\r\n while (current.parent) {\r\n const parent = this.localParentOf(current);\r\n if (!parent || poms.includes(parent)) {\r\n return { poms, externalParent: parent ? undefined : current.parent };\r\n }\r\n poms.push(parent);\r\n current = parent;\r\n }\r\n return { poms };\r\n }\r\n\r\n /** Coordinates of a project with inherited groupId/version and interpolated values. */\r\n coordinatesOf(pom: PomModel): PomCoordinates {\r\n const chain = this.chainOf(pom).poms;\r\n const groupId = pom.groupId ?? pom.parent?.groupId ?? '';\r\n const rawVersion = pom.version ?? pom.parent?.version;\r\n const version = rawVersion ? interpolate(rawVersion, chain) : undefined;\r\n return {\r\n groupId: interpolate(groupId, chain),\r\n artifactId: pom.artifactId,\r\n version: version && !version.includes('${') ? version : undefined,\r\n };\r\n }\r\n\r\n /** Directory of the outermost aggregator whose reactor includes this project. */\r\n aggregatorDirOf(pom: PomModel): string | undefined {\r\n return this.aggregators.get(pom.file);\r\n }\r\n\r\n private localParentOf(pom: PomModel): PomModel | undefined {\r\n const parent = pom.parent;\r\n if (!parent) return undefined;\r\n\r\n // Compares against the candidate's own declarations only, interpolated with\r\n // its own properties. Resolving the candidate's full chain here would\r\n // recurse endlessly on (invalid) cyclic parent declarations.\r\n const matches = (candidate: PomModel | undefined) => {\r\n if (!candidate) return false;\r\n const groupId = interpolate(candidate.groupId ?? candidate.parent?.groupId ?? '', [candidate]);\r\n const version = interpolate(candidate.version ?? candidate.parent?.version ?? '', [candidate]);\r\n const expected = interpolate(parent.version, [pom]);\r\n return (\r\n groupId === parent.groupId &&\r\n candidate.artifactId === parent.artifactId &&\r\n (version.includes('${') || expected.includes('${') || version === expected)\r\n );\r\n };\r\n\r\n // Maven uses the POM at <relativePath> (default ../pom.xml) when its\r\n // coordinates match; otherwise the parent comes from a repository.\r\n const file = parentPomFile(pom);\r\n const byPath = file ? this.byFile.get(resolve(file)) : undefined;\r\n return matches(byPath) ? byPath : undefined;\r\n }\r\n\r\n /**\r\n * Walks `<modules>` from every aggregator, outermost first, and records for\r\n * each reached project the aggregator that builds it.\r\n */\r\n private assignAggregators(): void {\r\n const aggregatorPoms = this.poms\r\n .filter((pom) => pom.modules.length > 0)\r\n .sort((a, b) => a.dir.length - b.dir.length);\r\n\r\n for (const aggregator of aggregatorPoms) {\r\n if (this.aggregators.has(aggregator.file)) continue;\r\n const queue: PomModel[] = [aggregator];\r\n while (queue.length > 0) {\r\n const pom = queue.shift()!;\r\n if (this.aggregators.has(pom.file)) continue;\r\n this.aggregators.set(pom.file, aggregator.dir);\r\n for (const entry of pom.modules) {\r\n const target = resolve(pom.dir, entry);\r\n const file = target.endsWith('.xml') ? target : join(target, 'pom.xml');\r\n const modulePom = this.byFile.get(file);\r\n if (modulePom) queue.push(modulePom);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Finds pom.xml files: the root POM and every POM in subdirectories, except\r\n * below build output, dependency directories and the `src` of a project.\r\n */\r\nfunction findPomFiles(rootDir: string): string[] {\r\n const results: string[] = [];\r\n const rootPom = join(rootDir, 'pom.xml');\r\n if (existsSync(rootPom)) results.push(resolve(rootPom));\r\n\r\n const walk = (dir: string, depth: number) => {\r\n if (depth > MAX_DEPTH) return;\r\n let entries;\r\n try {\r\n entries = readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n const isProject = existsSync(join(dir, 'pom.xml'));\r\n for (const entry of entries) {\r\n if (!entry.isDirectory() || entry.name.startsWith('.') || SKIPPED_DIRS.has(entry.name)) continue;\r\n // Maven reserves `<project>/src` for sources, resources and test\r\n // projects (fixtures, invoker ITs, archetype templates), not modules.\r\n if (isProject && entry.name === 'src') continue;\r\n const subDir = join(dir, entry.name);\r\n const pom = join(subDir, 'pom.xml');\r\n if (existsSync(pom) && statSync(pom).isFile()) results.push(resolve(pom));\r\n walk(subDir, depth + 1);\r\n }\r\n };\r\n\r\n walk(rootDir, 1);\r\n return results;\r\n}\r\n","/**\r\n * Elevate — raw POM model.\r\n *\r\n * Reads a pom.xml exactly as written, without inheritance or interpolation,\r\n * and keeps references to the XML elements so versions can later be edited in\r\n * place. Elements inside `<profiles>` are deliberately ignored: whether a\r\n * profile is active depends on the build environment, and every location\r\n * found here is cross-checked against Maven's effective POM before editing.\r\n */\r\n\r\nimport { existsSync, readFileSync, statSync } from 'node:fs';\r\nimport { dirname, join, resolve } from 'node:path';\r\nimport { child, childAt, childText, children, parseXml } from '../shared/xml.js';\r\nimport type { XmlElement } from '../shared/xml.js';\r\n\r\nexport interface PomDependency {\r\n groupId: string;\r\n artifactId: string;\r\n version?: string;\r\n type?: string;\r\n classifier?: string;\r\n scope?: string;\r\n /** The `<version>` element, when present. */\r\n versionElement?: XmlElement;\r\n}\r\n\r\nexport interface PomParent {\r\n groupId: string;\r\n artifactId: string;\r\n version: string;\r\n relativePath?: string;\r\n versionElement?: XmlElement;\r\n}\r\n\r\nexport interface PomProperty {\r\n value: string;\r\n element: XmlElement;\r\n}\r\n\r\nexport interface PomModel {\r\n /** Absolute path of the pom.xml. */\r\n file: string;\r\n /** Directory containing the pom.xml. */\r\n dir: string;\r\n /** Own groupId, if declared (otherwise inherited from the parent). */\r\n groupId?: string;\r\n artifactId: string;\r\n /** Own version, if declared (otherwise inherited from the parent). */\r\n version?: string;\r\n versionElement?: XmlElement;\r\n name?: string;\r\n packaging: string;\r\n parent?: PomParent;\r\n properties: Map<string, PomProperty>;\r\n dependencies: PomDependency[];\r\n managedDependencies: PomDependency[];\r\n /** Entries of `<modules>`, as written. */\r\n modules: string[];\r\n}\r\n\r\n/** Parses a pom.xml file. Throws `XmlParseError` for malformed XML. */\r\nexport function readPom(file: string): PomModel {\r\n const source = readFileSync(file, 'utf8');\r\n return parsePom(source, file);\r\n}\r\n\r\n/** Parses POM source text. */\r\nexport function parsePom(source: string, file: string): PomModel {\r\n const project = parseXml(source, file);\r\n\r\n const parentElement = child(project, 'parent');\r\n const parent: PomParent | undefined = parentElement\r\n ? {\r\n groupId: childText(parentElement, 'groupId') ?? '',\r\n artifactId: childText(parentElement, 'artifactId') ?? '',\r\n version: childText(parentElement, 'version') ?? '',\r\n relativePath: child(parentElement, 'relativePath')?.text.trim(),\r\n versionElement: child(parentElement, 'version'),\r\n }\r\n : undefined;\r\n\r\n const properties = new Map<string, PomProperty>();\r\n for (const element of child(project, 'properties')?.children ?? []) {\r\n properties.set(element.name, { value: element.text.trim(), element });\r\n }\r\n\r\n return {\r\n file,\r\n dir: dirname(file),\r\n groupId: childText(project, 'groupId'),\r\n artifactId: childText(project, 'artifactId') ?? 'unknown',\r\n version: childText(project, 'version'),\r\n versionElement: child(project, 'version'),\r\n name: childText(project, 'name'),\r\n packaging: childText(project, 'packaging') ?? 'jar',\r\n parent,\r\n properties,\r\n dependencies: readDependencies(child(project, 'dependencies')),\r\n managedDependencies: readDependencies(childAt(project, 'dependencyManagement', 'dependencies')),\r\n modules: children(child(project, 'modules'), 'module').map((m) => m.text.trim()).filter(Boolean),\r\n };\r\n}\r\n\r\nfunction readDependencies(container: XmlElement | undefined): PomDependency[] {\r\n return children(container, 'dependency').map((element) => ({\r\n groupId: childText(element, 'groupId') ?? '',\r\n artifactId: childText(element, 'artifactId') ?? '',\r\n version: childText(element, 'version'),\r\n type: childText(element, 'type'),\r\n classifier: childText(element, 'classifier'),\r\n scope: childText(element, 'scope'),\r\n versionElement: child(element, 'version'),\r\n }));\r\n}\r\n\r\n/**\r\n * Resolves the pom.xml that `<parent><relativePath>` points to, following\r\n * Maven's default of `../pom.xml`. An empty `<relativePath/>` explicitly\r\n * disables the lookup.\r\n */\r\nexport function parentPomFile(pom: PomModel): string | undefined {\r\n if (!pom.parent) return undefined;\r\n const relativePath = pom.parent.relativePath ?? '../pom.xml';\r\n if (relativePath === '') return undefined;\r\n let candidate = resolve(pom.dir, relativePath);\r\n if (existsSync(candidate) && statSync(candidate).isDirectory()) candidate = join(candidate, 'pom.xml');\r\n return existsSync(candidate) ? candidate : undefined;\r\n}\r\n\r\n/** Built-in `project.*` expressions resolvable without running Maven. */\r\nfunction builtinProperty(name: string, module: PomModel): string | undefined {\r\n switch (name) {\r\n case 'project.groupId':\r\n case 'pom.groupId':\r\n return module.groupId ?? module.parent?.groupId;\r\n case 'project.artifactId':\r\n case 'pom.artifactId':\r\n return module.artifactId;\r\n case 'project.version':\r\n case 'pom.version':\r\n return module.version ?? module.parent?.version;\r\n case 'project.parent.groupId':\r\n return module.parent?.groupId;\r\n case 'project.parent.version':\r\n return module.parent?.version;\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\n/** Finds the nearest definition of a property, searching the module first. */\r\nexport function findProperty(\r\n name: string,\r\n chain: readonly PomModel[],\r\n): { pom: PomModel; property: PomProperty } | undefined {\r\n for (const pom of chain) {\r\n const property = pom.properties.get(name);\r\n if (property) return { pom, property };\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Interpolates `${...}` expressions with properties from the inheritance\r\n * chain (module first, as in Maven) and the built-in `project.*` values of\r\n * the module. Unresolvable expressions are left in place.\r\n */\r\nexport function interpolate(text: string, chain: readonly PomModel[], depth = 0): string {\r\n if (depth > 10 || !text.includes('${')) return text;\r\n const module = chain[0];\r\n const replaced = text.replace(/\\$\\{([^}]+)\\}/g, (expression, name: string) => {\r\n const builtin = module ? builtinProperty(name, module) : undefined;\r\n if (builtin !== undefined) return builtin;\r\n return findProperty(name, chain)?.property.value ?? expression;\r\n });\r\n return replaced === text ? text : interpolate(replaced, chain, depth + 1);\r\n}\r\n\r\n/** Matches a whole-value property reference such as `${guava.version}`. */\r\nexport function propertyReference(text: string): string | undefined {\r\n return text.match(/^\\$\\{([^}]+)\\}$/)?.[1];\r\n}\r\n","/**\r\n * Elevate — position-aware XML reader for manifest files.\r\n *\r\n * Builds a lightweight element tree on top of the `saxes` streaming parser and\r\n * records, for every element, the exact source range of its text content. The\r\n * ranges make it possible to rewrite a single value (e.g. a `<version>`) by\r\n * splicing the original string, which preserves formatting, comments and\r\n * line endings byte for byte — something a parse/serialize round trip cannot.\r\n *\r\n * Commented-out markup is never part of the tree, so it can never be matched\r\n * or edited by accident.\r\n */\r\n\r\nimport { SaxesParser } from 'saxes';\r\n\r\n/** An XML element with its children and the source range of its text. */\r\nexport interface XmlElement {\r\n /** Local element name without namespace prefix. */\r\n name: string;\r\n attributes: Record<string, string>;\r\n children: XmlElement[];\r\n /** Concatenated, entity-decoded character data directly inside this element. */\r\n text: string;\r\n /**\r\n * Source range `[start, end)` between the end of the opening tag and the\r\n * start of the closing tag. Undefined for self-closing elements.\r\n */\r\n contentRange?: { start: number; end: number };\r\n}\r\n\r\n/** Thrown when a manifest cannot be parsed as well-formed XML. */\r\nexport class XmlParseError extends Error {\r\n constructor(message: string, readonly file?: string) {\r\n super(file ? `${file}: ${message}` : message);\r\n this.name = 'XmlParseError';\r\n }\r\n}\r\n\r\n/**\r\n * Parses an XML document and returns its root element.\r\n *\r\n * @param source the complete document text\r\n * @param file optional file name used in error messages\r\n */\r\nexport function parseXml(source: string, file?: string): XmlElement {\r\n const parser = new SaxesParser({ position: true });\r\n const stack: XmlElement[] = [];\r\n const openEnds: number[] = [];\r\n let root: XmlElement | undefined;\r\n let failure: Error | undefined;\r\n\r\n parser.on('error', (err) => {\r\n failure ??= err;\r\n });\r\n\r\n parser.on('opentag', (tag) => {\r\n const attributes: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(tag.attributes)) {\r\n attributes[key] = typeof value === 'string' ? value : value.value;\r\n }\r\n const element: XmlElement = {\r\n name: localName(tag.name),\r\n attributes,\r\n children: [],\r\n text: '',\r\n };\r\n const parent = stack[stack.length - 1];\r\n if (parent) parent.children.push(element);\r\n else root ??= element;\r\n\r\n stack.push(element);\r\n // `position` points just past the `>` of the opening tag.\r\n openEnds.push(parser.position);\r\n });\r\n\r\n parser.on('closetag', (tag) => {\r\n const element = stack.pop();\r\n const openEnd = openEnds.pop();\r\n if (!element || openEnd === undefined || tag.isSelfClosing) return;\r\n\r\n // `position` points just past the `>` of the closing tag. A closing tag is\r\n // `</name>` unless it contains whitespace before `>`, which we detect by\r\n // searching backwards for its `</` instead of assuming its length.\r\n const closeEnd = parser.position;\r\n const closeStart = source.lastIndexOf('</', closeEnd - 1);\r\n if (closeStart >= openEnd) {\r\n element.contentRange = { start: openEnd, end: closeStart };\r\n }\r\n });\r\n\r\n parser.on('text', (text) => {\r\n const current = stack[stack.length - 1];\r\n if (current) current.text += text;\r\n });\r\n\r\n parser.on('cdata', (data) => {\r\n const current = stack[stack.length - 1];\r\n if (current) current.text += data;\r\n });\r\n\r\n try {\r\n parser.write(source).close();\r\n } catch (err) {\r\n failure ??= err as Error;\r\n }\r\n\r\n if (failure) throw new XmlParseError(failure.message, file);\r\n if (!root) throw new XmlParseError('document has no root element', file);\r\n return root;\r\n}\r\n\r\n/** Returns the first direct child with the given name. */\r\nexport function child(element: XmlElement | undefined, name: string): XmlElement | undefined {\r\n return element?.children.find((c) => c.name === name);\r\n}\r\n\r\n/** Returns all direct children with the given name. */\r\nexport function children(element: XmlElement | undefined, name: string): XmlElement[] {\r\n return element ? element.children.filter((c) => c.name === name) : [];\r\n}\r\n\r\n/** Follows a path of direct child names, e.g. `childAt(project, 'parent', 'version')`. */\r\nexport function childAt(element: XmlElement | undefined, ...path: string[]): XmlElement | undefined {\r\n let current = element;\r\n for (const name of path) current = child(current, name);\r\n return current;\r\n}\r\n\r\n/** Returns the trimmed text of a direct child, or undefined when absent or empty. */\r\nexport function childText(element: XmlElement | undefined, name: string): string | undefined {\r\n const value = child(element, name)?.text.trim();\r\n return value ? value : undefined;\r\n}\r\n\r\n/** A replacement of an element's text content. */\r\nexport interface TextEdit {\r\n element: XmlElement;\r\n /** The value the element is expected to contain; guards against stale edits. */\r\n expected: string;\r\n replacement: string;\r\n}\r\n\r\n/** Thrown when an edit no longer matches the file it is applied to. */\r\nexport class StaleEditError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'StaleEditError';\r\n }\r\n}\r\n\r\n/**\r\n * Applies text replacements to the original source.\r\n *\r\n * Only the trimmed value inside each element is replaced; surrounding\r\n * whitespace stays untouched. Every edit verifies that the element still holds\r\n * the expected value, so an edit computed from an outdated scan fails loudly\r\n * instead of overwriting a change made in the meantime.\r\n */\r\nexport function applyTextEdits(source: string, edits: TextEdit[]): string {\r\n const splices = edits.map((edit) => {\r\n const range = edit.element.contentRange;\r\n if (!range) {\r\n throw new StaleEditError(`<${edit.element.name}> has no editable text content.`);\r\n }\r\n const raw = source.slice(range.start, range.end);\r\n const leading = raw.length - raw.trimStart().length;\r\n const value = raw.trim();\r\n if (value !== edit.expected) {\r\n throw new StaleEditError(\r\n `<${edit.element.name}> contains '${value}', expected '${edit.expected}'. The file changed since it was scanned.`,\r\n );\r\n }\r\n const start = range.start + leading;\r\n return { start, end: start + value.length, replacement: edit.replacement };\r\n });\r\n\r\n // Apply from the end of the document so earlier offsets stay valid.\r\n splices.sort((a, b) => b.start - a.start);\r\n for (let i = 1; i < splices.length; i++) {\r\n if (splices[i]!.end > splices[i - 1]!.start) {\r\n throw new StaleEditError('Overlapping edits on the same element.');\r\n }\r\n }\r\n\r\n let result = source;\r\n for (const splice of splices) {\r\n result = result.slice(0, splice.start) + splice.replacement + result.slice(splice.end);\r\n }\r\n return result;\r\n}\r\n\r\n/** Escapes text for use as XML character data. */\r\nexport function escapeXml(value: string): string {\r\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n\r\n/**\r\n * Serialises an element subtree. Intended for generating throw-away documents\r\n * (e.g. probe POMs); it does not preserve the original formatting.\r\n */\r\nexport function serializeXml(element: XmlElement, indent = ''): string {\r\n const attrs = Object.entries(element.attributes)\r\n .map(([key, value]) => ` ${key}=\"${escapeXml(value).replace(/\"/g, '&quot;')}\"`)\r\n .join('');\r\n if (element.children.length === 0) {\r\n return `${indent}<${element.name}${attrs}>${escapeXml(element.text.trim())}</${element.name}>`;\r\n }\r\n const inner = element.children.map((c) => serializeXml(c, `${indent} `)).join('\\n');\r\n return `${indent}<${element.name}${attrs}>\\n${inner}\\n${indent}</${element.name}>`;\r\n}\r\n\r\nfunction localName(qualified: string): string {\r\n const colon = qualified.indexOf(':');\r\n return colon >= 0 ? qualified.slice(colon + 1) : qualified;\r\n}\r\n","/**\r\n * Elevate — Maven registry adapter for ad-hoc version queries\r\n * (`elevate versions`, MCP `elevate_get_versions`).\r\n *\r\n * Like the scanner, it asks Maven itself instead of a fixed repository URL:\r\n * the versions-maven-plugin lists every version newer than `0` through the\r\n * repositories, mirrors and credentials of the user's `settings.xml` and of the\r\n * repository's root POM. Any Nexus or Artifactory therefore works without\r\n * Elevate-specific configuration.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport type { RegistryEndpoint, RegistryPort } from '../../domain/ports.js';\r\nimport type { DependencyCoordinate, ReleaseChannel } from '../../domain/models.js';\r\nimport { isPreReleaseVersion } from '../../domain/versions.js';\r\nimport { MavenCommandError } from './maven-command.js';\r\nimport { DEFAULT_MAVEN_PLUGINS, ScratchDirectory, queryNewerVersions, readEffectivePoms } from './maven-resolution.js';\r\nimport type { EffectiveModel, MavenPluginVersions } from './maven-resolution.js';\r\n\r\n/** A version lower than any real one, so the report lists all versions as newer. */\r\nconst PROBE_VERSION = '0';\r\n\r\nconst NO_REPOSITORIES: EffectiveModel = { dependencies: [], managedDependencies: [] };\r\n\r\nexport class MavenRegistryAdapter implements RegistryPort {\r\n constructor(private readonly plugins: MavenPluginVersions = DEFAULT_MAVEN_PLUGINS) {}\r\n\r\n /**\r\n * The repositories come from Maven's own configuration, which Elevate does\r\n * not interpret. They are reported as non-public: the lookup goes exactly\r\n * where the project's build would go.\r\n */\r\n async resolveEndpoint(): Promise<RegistryEndpoint> {\r\n return { url: 'repositories configured for Maven (settings.xml, POM)', isPublic: false };\r\n }\r\n\r\n async getLatestVersion(\r\n coordinate: DependencyCoordinate,\r\n channel: ReleaseChannel = 'stable',\r\n cwd = process.cwd(),\r\n ): Promise<string | null> {\r\n const versions = await this.getAllVersions(coordinate, cwd);\r\n return versions.find((v) => channel === 'all' || !isPreReleaseVersion(v)) ?? null;\r\n }\r\n\r\n /**\r\n * All versions available in the configured repositories, newest first.\r\n * Throws `MavenCommandError` when Maven fails or a repository could not be\r\n * read, so an error is never mistaken for \"no versions\".\r\n */\r\n async getAllVersions(coordinate: DependencyCoordinate, cwd = process.cwd()): Promise<string[]> {\r\n if (!coordinate.group || !coordinate.artifact) return [];\r\n const key = `${coordinate.group}:${coordinate.artifact}`;\r\n\r\n const scratch = new ScratchDirectory(cwd);\r\n try {\r\n const repositories = await projectRepositories(cwd, scratch, this.plugins);\r\n const report = await queryNewerVersions(\r\n [{ groupId: coordinate.group, artifactId: coordinate.artifact, version: PROBE_VERSION }],\r\n repositories,\r\n cwd,\r\n cwd,\r\n scratch,\r\n this.plugins,\r\n );\r\n const versions = report.newerVersions.get(key) ?? [];\r\n if (versions.length === 0 && report.failedLookups.has(key)) {\r\n throw new MavenCommandError(`A Maven repository failed to deliver the versions of ${key}.`, '');\r\n }\r\n return [...versions].reverse();\r\n } finally {\r\n scratch.dispose();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Repositories declared in the root POM (including its parents), so projects\r\n * that declare their repositories in the POM rather than in settings.xml are\r\n * covered too. Without a root POM, settings.xml alone applies.\r\n */\r\nasync function projectRepositories(\r\n cwd: string,\r\n scratch: ScratchDirectory,\r\n plugins: MavenPluginVersions,\r\n): Promise<EffectiveModel> {\r\n const rootPom = join(cwd, 'pom.xml');\r\n if (!existsSync(rootPom)) return NO_REPOSITORIES;\r\n const models = await readEffectivePoms(rootPom, cwd, cwd, scratch, plugins);\r\n return [...models.values()][0] ?? NO_REPOSITORIES;\r\n}\r\n","/**\r\n * Elevate — Maven invocation.\r\n *\r\n * Prefers the project's Maven Wrapper (`mvnw` / `mvnw.cmd`), which pins the\r\n * Maven version the project is built with, and falls back to `mvn` on the\r\n * PATH. Without either, Maven features fail with `MavenUnavailableError`\r\n * instead of silently degrading: Elevate cannot verify Maven updates without\r\n * Maven, so offering them would be unsafe.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';\r\nimport { runCommand } from '../shared/process.js';\r\nimport type { RunResult } from '../shared/process.js';\r\n\r\n/** Thrown when neither a Maven Wrapper nor `mvn` is available. */\r\nexport class MavenUnavailableError extends Error {\r\n constructor() {\r\n super('Maven is not available: no Maven Wrapper (mvnw) in the project and no `mvn` on the PATH.');\r\n this.name = 'MavenUnavailableError';\r\n }\r\n}\r\n\r\n/** Thrown when a Maven invocation fails. */\r\nexport class MavenCommandError extends Error {\r\n constructor(message: string, readonly output: string) {\r\n super(message);\r\n this.name = 'MavenCommandError';\r\n }\r\n}\r\n\r\nconst IS_WINDOWS = process.platform === 'win32';\r\nconst WRAPPER = IS_WINDOWS ? 'mvnw.cmd' : 'mvnw';\r\n\r\n/** Arguments for non-interactive, log-friendly output. */\r\nconst BATCH_ARGS = ['-B', '--no-transfer-progress'];\r\n\r\nlet mvnOnPath: Promise<boolean> | undefined;\r\n\r\n/**\r\n * Finds the Maven Wrapper closest to `fromDir`, searching upwards but never\r\n * above `rootDir`.\r\n */\r\nexport function findMavenWrapper(fromDir: string, rootDir: string): string | undefined {\r\n let dir = resolve(fromDir);\r\n const root = resolve(rootDir);\r\n for (;;) {\r\n const candidate = join(dir, WRAPPER);\r\n if (existsSync(candidate)) return candidate;\r\n if (dir === root || relative(root, dir).startsWith('..')) return undefined;\r\n const parent = dirname(dir);\r\n if (parent === dir) return undefined;\r\n dir = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Names a file relative to the working directory a process runs in, with the\r\n * platform's separators. The working directory is handed to the process\r\n * directly, so the directory the repository lives in (which may contain\r\n * characters cmd.exe would interpret) never appears in an argument. A file\r\n * that cannot be expressed relative to `cwd` (another drive on Windows) is\r\n * returned unchanged.\r\n */\r\nexport function relativeToCwd(cwd: string, file: string): string {\r\n const path = relative(cwd, file);\r\n return isAbsolute(path) ? file : path || '.';\r\n}\r\n\r\nexport interface MavenRunOptions {\r\n /** Working directory; also the starting point of the wrapper lookup. */\r\n cwd: string;\r\n /** Repository root; the wrapper lookup does not go above it. */\r\n rootDir: string;\r\n timeoutMs?: number;\r\n}\r\n\r\n/** Runs Maven in batch mode. Resolves with the result even for a failed build. */\r\nexport async function runMaven(args: string[], options: MavenRunOptions): Promise<RunResult> {\r\n const wrapper = findMavenWrapper(options.cwd, options.rootDir);\r\n const run = { cwd: options.cwd, timeoutMs: options.timeoutMs };\r\n\r\n if (wrapper) {\r\n // Addressed by its relative path like every other file; a wrapper in the\r\n // working directory itself needs an explicit `.` so it is not searched on the PATH.\r\n const relativeWrapper = relativeToCwd(options.cwd, wrapper);\r\n const path = isAbsolute(relativeWrapper) || relativeWrapper.includes(sep) ? relativeWrapper : `.${sep}${relativeWrapper}`;\r\n // On POSIX the wrapper may lack the executable bit after a checkout.\r\n return IS_WINDOWS\r\n ? runCommand(path, [...BATCH_ARGS, ...args], run)\r\n : runCommand('sh', [path, ...BATCH_ARGS, ...args], run);\r\n }\r\n\r\n mvnOnPath ??= runCommand('mvn', ['-v'], { cwd: options.cwd, timeoutMs: 30_000 }).then(\r\n (result) => result.exitCode === 0,\r\n () => false,\r\n );\r\n if (!(await mvnOnPath)) throw new MavenUnavailableError();\r\n\r\n return runCommand('mvn', [...BATCH_ARGS, ...args], run);\r\n}\r\n\r\n/** Extracts Maven's error lines for a concise failure message. */\r\nexport function mavenErrors(output: string): string {\r\n const errors = output\r\n .split(/\\r?\\n/)\r\n .filter((line) => line.startsWith('[ERROR]'))\r\n .map((line) => line.replace(/^\\[ERROR\\]\\s?/, ''))\r\n .filter((line) => line.trim() && !line.startsWith('->') && !line.includes('Re-run Maven'));\r\n return (errors.length > 0 ? errors : output.trim().split(/\\r?\\n/).slice(-10)).slice(0, 12).join('\\n');\r\n}\r\n","/**\r\n * Elevate — Maven-based dependency resolution.\r\n *\r\n * Two questions are answered by Maven itself instead of by parsing POMs:\r\n *\r\n * 1. Which version of each dependency applies? — `help:effective-pom` resolves\r\n * parents, imported BOMs, properties and dependency management.\r\n * 2. Which newer versions exist? — the versions-maven-plugin queries the\r\n * repositories exactly as the build does: mirrors, private repositories\r\n * and credentials from settings.xml all apply.\r\n *\r\n * The plugin report runs against a generated probe POM rather than the real\r\n * project: the probe lists only the artifacts of interest, so inherited\r\n * management sections (often hundreds of BOM entries) are not queried, and the\r\n * report's generated site lands in Elevate's scratch directory instead of the\r\n * project's build output. The scratch directory lives below the module's\r\n * `target/` so the project's `.mvn/` configuration (maven.config, extensions)\r\n * still applies.\r\n */\r\n\r\nimport { randomUUID } from 'node:crypto';\r\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { childText, children, childAt, escapeXml, parseXml, serializeXml, child } from '../shared/xml.js';\r\nimport type { XmlElement } from '../shared/xml.js';\r\nimport { MavenCommandError, mavenErrors, relativeToCwd, runMaven } from './maven-command.js';\r\n\r\n/** Versions of the two Maven plugins Elevate runs. */\r\nexport interface MavenPluginVersions {\r\n /** maven-help-plugin: reads the effective POM. */\r\n help: string;\r\n /** versions-maven-plugin: looks up newer versions. */\r\n versions: string;\r\n}\r\n\r\n/** Pinned plugin versions for reproducible results; replaceable per repository. */\r\nexport const DEFAULT_MAVEN_PLUGINS: MavenPluginVersions = { help: '3.5.2', versions: '2.22.0' };\r\n\r\nconst HELP_PLUGIN_ID = 'org.apache.maven.plugins:maven-help-plugin';\r\nconst VERSIONS_PLUGIN_ID = 'org.codehaus.mojo:versions-maven-plugin';\r\n\r\n/** What Maven prints when it cannot download an artifact (matched case-insensitively). */\r\nconst DOWNLOAD_FAILURES = [\r\n 'could not be resolved',\r\n 'could not find artifact',\r\n 'failed to read artifact descriptor',\r\n 'could not transfer artifact',\r\n];\r\n\r\n/** Thrown when Maven could not download one of the plugins Elevate runs. */\r\nexport class MavenPluginUnavailableError extends MavenCommandError {\r\n constructor(\r\n plugin: { id: string; version: string; key: keyof MavenPluginVersions; purpose: string },\r\n output: string,\r\n ) {\r\n super(\r\n `Maven could not download ${plugin.id}:${plugin.version}, which Elevate uses to ${plugin.purpose}. ` +\r\n 'Make this plugin available in the repository or mirror your Maven is configured with, ' +\r\n `or choose a version that is available there with \"mavenPlugins\": { \"${plugin.key}\": \"<version>\" } ` +\r\n `in elevate.config.json.\\n${mavenErrors(output)}`,\r\n output,\r\n );\r\n this.name = 'MavenPluginUnavailableError';\r\n }\r\n}\r\n\r\n/** Whether a failed Maven run failed because it could not download the plugin. */\r\nfunction isPluginUnavailable(output: string, pluginId: string): boolean {\r\n return output.split(/\\r?\\n/).some((line) => {\r\n const lower = line.toLowerCase();\r\n return line.includes(pluginId) && DOWNLOAD_FAILURES.some((phrase) => lower.includes(phrase));\r\n });\r\n}\r\n\r\nconst MAVEN_TIMEOUT_MS = 5 * 60_000;\r\n\r\nexport interface EffectiveDependency {\r\n groupId: string;\r\n artifactId: string;\r\n version: string;\r\n scope: string;\r\n type: string;\r\n classifier?: string;\r\n}\r\n\r\nexport interface EffectiveModel {\r\n dependencies: EffectiveDependency[];\r\n managedDependencies: EffectiveDependency[];\r\n repositories?: XmlElement;\r\n pluginRepositories?: XmlElement;\r\n}\r\n\r\n/** An artifact whose newer versions should be looked up. */\r\nexport interface ProbeArtifact {\r\n groupId: string;\r\n artifactId: string;\r\n version: string;\r\n type?: string;\r\n classifier?: string;\r\n}\r\n\r\nexport interface VersionReport {\r\n /** Newer versions per `groupId:artifactId`, in ascending order. */\r\n newerVersions: Map<string, string[]>;\r\n /** Artifacts whose metadata could not be downloaded from some repository. */\r\n failedLookups: Set<string>;\r\n}\r\n\r\n/**\r\n * A scratch directory below the module's `target/`, unique per scan so\r\n * concurrent scans never share files. `dispose()` removes it again, together\r\n * with `target/` if the scan created that and left it empty.\r\n */\r\nexport class ScratchDirectory {\r\n readonly path: string;\r\n private readonly target: string;\r\n private readonly createdTarget: boolean;\r\n\r\n constructor(moduleDir: string) {\r\n this.target = join(moduleDir, 'target');\r\n this.createdTarget = !existsSync(this.target);\r\n this.path = join(this.target, `.elevate-${randomUUID().slice(0, 8)}`);\r\n mkdirSync(this.path, { recursive: true });\r\n }\r\n\r\n dispose(): void {\r\n rmSync(this.path, { recursive: true, force: true });\r\n try {\r\n if (this.createdTarget && readdirSync(this.target).length === 0) rmSync(this.target, { recursive: true });\r\n } catch {\r\n // Another process may be using target/ concurrently; leaving it is harmless.\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Runs `help:effective-pom` once and returns the model of every project it\r\n * covers, keyed by `groupId:artifactId`. With `recursive` the whole reactor of\r\n * an aggregator POM is resolved in a single Maven run; otherwise only the\r\n * given project (`-N`).\r\n */\r\nexport async function readEffectivePoms(\r\n pomFile: string,\r\n moduleDir: string,\r\n rootDir: string,\r\n scratch: ScratchDirectory,\r\n plugins: MavenPluginVersions,\r\n recursive = false,\r\n): Promise<Map<string, EffectiveModel>> {\r\n const output = join(scratch.path, 'effective-pom.xml');\r\n // The files are named relative to the working directory (`moduleDir`), so the\r\n // directory the project lives in never appears on the command line.\r\n const args = [\r\n '-f',\r\n relativeToCwd(moduleDir, pomFile),\r\n `${HELP_PLUGIN_ID}:${plugins.help}:effective-pom`,\r\n `-Doutput=${relativeToCwd(moduleDir, output)}`,\r\n ];\r\n const result = await runMaven(recursive ? args : ['-N', ...args], {\r\n cwd: moduleDir,\r\n rootDir,\r\n timeoutMs: MAVEN_TIMEOUT_MS,\r\n });\r\n\r\n if (result.exitCode !== 0 || !existsSync(output)) {\r\n const text = `${result.stdout}\\n${result.stderr}`;\r\n if (isPluginUnavailable(text, HELP_PLUGIN_ID)) {\r\n throw new MavenPluginUnavailableError(\r\n { id: HELP_PLUGIN_ID, version: plugins.help, key: 'help', purpose: 'read the effective POM' },\r\n text,\r\n );\r\n }\r\n throw new MavenCommandError(`Maven could not build the effective POM:\\n${mavenErrors(text)}`, text);\r\n }\r\n return parseEffectivePoms(readFileSync(output, 'utf8'));\r\n}\r\n\r\n/** Parses `help:effective-pom` output: one `<project>` or a reactor's `<projects>`. */\r\nexport function parseEffectivePoms(source: string): Map<string, EffectiveModel> {\r\n const root = parseXml(source);\r\n const projects = root.name === 'projects' ? children(root, 'project') : [root];\r\n const models = new Map<string, EffectiveModel>();\r\n for (const project of projects) {\r\n models.set(`${childText(project, 'groupId')}:${childText(project, 'artifactId')}`, toEffectiveModel(project));\r\n }\r\n return models;\r\n}\r\n\r\n/** Parses the output of `help:effective-pom` for a single project. */\r\nexport function parseEffectivePom(source: string): EffectiveModel {\r\n let project = parseXml(source);\r\n if (project.name === 'projects') project = child(project, 'project') ?? project;\r\n return toEffectiveModel(project);\r\n}\r\n\r\n/** Combines the repository declarations of several models; the first declaration per id wins. */\r\nexport function mergeRepositories(models: readonly EffectiveModel[]): EffectiveModel {\r\n const merge = (name: string, pick: (m: EffectiveModel) => XmlElement | undefined): XmlElement | undefined => {\r\n const byId = new Map<string, XmlElement>();\r\n for (const element of models.map(pick)) {\r\n for (const repository of element?.children ?? []) {\r\n const id = childText(repository, 'id') ?? childText(repository, 'url') ?? '';\r\n if (!byId.has(id)) byId.set(id, repository);\r\n }\r\n }\r\n return byId.size > 0 ? { name, attributes: {}, children: [...byId.values()], text: '' } : undefined;\r\n };\r\n return {\r\n dependencies: [],\r\n managedDependencies: [],\r\n repositories: merge('repositories', (m) => m.repositories),\r\n pluginRepositories: merge('pluginRepositories', (m) => m.pluginRepositories),\r\n };\r\n}\r\n\r\nfunction toEffectiveModel(project: XmlElement): EffectiveModel {\r\n return {\r\n dependencies: readEffectiveDependencies(child(project, 'dependencies')),\r\n managedDependencies: readEffectiveDependencies(childAt(project, 'dependencyManagement', 'dependencies')),\r\n repositories: child(project, 'repositories'),\r\n pluginRepositories: child(project, 'pluginRepositories'),\r\n };\r\n}\r\n\r\nfunction readEffectiveDependencies(container: XmlElement | undefined): EffectiveDependency[] {\r\n return children(container, 'dependency').map((element) => ({\r\n groupId: childText(element, 'groupId') ?? '',\r\n artifactId: childText(element, 'artifactId') ?? '',\r\n version: childText(element, 'version') ?? '',\r\n scope: childText(element, 'scope') ?? 'compile',\r\n type: childText(element, 'type') ?? 'jar',\r\n classifier: childText(element, 'classifier'),\r\n }));\r\n}\r\n\r\n/** Builds a minimal POM that manages exactly the given artifacts. */\r\nexport function buildProbePom(artifacts: readonly ProbeArtifact[], model: EffectiveModel): string {\r\n const seen = new Set<string>();\r\n const entries: string[] = [];\r\n for (const artifact of artifacts) {\r\n const key = `${artifact.groupId}:${artifact.artifactId}:${artifact.type ?? 'jar'}:${artifact.classifier ?? ''}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n const fields = [\r\n `<groupId>${escapeXml(artifact.groupId)}</groupId>`,\r\n `<artifactId>${escapeXml(artifact.artifactId)}</artifactId>`,\r\n `<version>${escapeXml(artifact.version)}</version>`,\r\n artifact.type && artifact.type !== 'jar' ? `<type>${escapeXml(artifact.type)}</type>` : '',\r\n artifact.classifier ? `<classifier>${escapeXml(artifact.classifier)}</classifier>` : '',\r\n ].filter(Boolean);\r\n entries.push(` <dependency>${fields.join('')}</dependency>`);\r\n }\r\n\r\n const repositories = [model.repositories, model.pluginRepositories]\r\n .filter((element): element is XmlElement => element !== undefined)\r\n .map((element) => serializeXml(element, ' '))\r\n .join('\\n');\r\n\r\n return [\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\r\n '<project xmlns=\"http://maven.apache.org/POM/4.0.0\">',\r\n ' <modelVersion>4.0.0</modelVersion>',\r\n ' <groupId>elevate.probe</groupId>',\r\n ' <artifactId>elevate-probe</artifactId>',\r\n ' <version>0</version>',\r\n ' <packaging>pom</packaging>',\r\n repositories,\r\n ' <dependencyManagement>',\r\n ' <dependencies>',\r\n ...entries,\r\n ' </dependencies>',\r\n ' </dependencyManagement>',\r\n '</project>',\r\n '',\r\n ]\r\n .filter((line) => line !== '')\r\n .join('\\n');\r\n}\r\n\r\n/** Looks up newer versions for the given artifacts with the versions-maven-plugin. */\r\nexport async function queryNewerVersions(\r\n artifacts: readonly ProbeArtifact[],\r\n model: EffectiveModel,\r\n moduleDir: string,\r\n rootDir: string,\r\n scratch: ScratchDirectory,\r\n plugins: MavenPluginVersions,\r\n): Promise<VersionReport> {\r\n if (artifacts.length === 0) return { newerVersions: new Map(), failedLookups: new Set() };\r\n\r\n const probeDir = join(scratch.path, 'probe');\r\n mkdirSync(probeDir, { recursive: true });\r\n const probePom = join(probeDir, 'pom.xml');\r\n writeFileSync(probePom, buildProbePom(artifacts, model), 'utf8');\r\n\r\n const result = await runMaven(\r\n [\r\n '-N',\r\n '-f',\r\n relativeToCwd(moduleDir, probePom),\r\n `${VERSIONS_PLUGIN_ID}:${plugins.versions}:dependency-updates-report`,\r\n '-DdependencyUpdatesReportFormats=xml',\r\n '-DprocessDependencyManagementTransitive=false',\r\n ],\r\n { cwd: moduleDir, rootDir, timeoutMs: MAVEN_TIMEOUT_MS },\r\n );\r\n\r\n const log = `${result.stdout}\\n${result.stderr}`;\r\n const reportFile = join(probeDir, 'target', 'dependency-updates-report.xml');\r\n if (result.exitCode !== 0 || !existsSync(reportFile)) {\r\n if (isPluginUnavailable(log, VERSIONS_PLUGIN_ID)) {\r\n throw new MavenPluginUnavailableError(\r\n { id: VERSIONS_PLUGIN_ID, version: plugins.versions, key: 'versions', purpose: 'look up newer versions' },\r\n log,\r\n );\r\n }\r\n throw new MavenCommandError(`Maven could not look up newer versions:\\n${mavenErrors(log)}`, log);\r\n }\r\n\r\n return {\r\n newerVersions: parseUpdatesReport(readFileSync(reportFile, 'utf8')),\r\n failedLookups: parseFailedLookups(log),\r\n };\r\n}\r\n\r\n/** Collects the newer versions per artifact from the plugin's XML report. */\r\nexport function parseUpdatesReport(source: string): Map<string, string[]> {\r\n const report = parseXml(source);\r\n const sections = [\r\n ...children(child(report, 'dependencyManagements'), 'dependencyManagement'),\r\n ...children(child(report, 'dependencies'), 'dependency'),\r\n ];\r\n\r\n const result = new Map<string, string[]>();\r\n for (const entry of sections) {\r\n const key = `${childText(entry, 'groupId')}:${childText(entry, 'artifactId')}`;\r\n const versions = [\r\n ...collect(entry, 'subIncrementals', 'subIncremental'),\r\n ...collect(entry, 'incrementals', 'incremental'),\r\n ...collect(entry, 'minors', 'minor'),\r\n ...collect(entry, 'majors', 'major'),\r\n ];\r\n const known = result.get(key) ?? [];\r\n for (const version of versions) if (!known.includes(version)) known.push(version);\r\n result.set(key, known);\r\n }\r\n return result;\r\n}\r\n\r\nfunction collect(entry: XmlElement, container: string, item: string): string[] {\r\n return children(child(entry, container), item)\r\n .map((element) => element.text.trim())\r\n .filter(Boolean);\r\n}\r\n\r\n/**\r\n * The plugin downgrades repository errors to warnings and then reports the\r\n * artifact as up to date. Those warnings are the only trace of a failed\r\n * lookup, so they are surfaced instead of trusting the \"no update\" result.\r\n */\r\nexport function parseFailedLookups(log: string): Set<string> {\r\n const failed = new Set<string>();\r\n const pattern = /Could not (?:transfer|read) metadata ([^:\\s/]+):([^:\\s/]+)(?::[^\\s/]+)?\\/maven-metadata\\.xml/g;\r\n for (const match of log.matchAll(pattern)) failed.add(`${match[1]}:${match[2]}`);\r\n return failed;\r\n}\r\n","/**\r\n * Elevate — Maven dependency scanner.\r\n *\r\n * For each module:\r\n * 1. Maven builds the effective POM: the versions that actually apply.\r\n * 2. Each dependency is classified by origin. Modules of the same reactor are\r\n * compared with their local version (alignment); all others, modules of\r\n * other reactors included, are looked up with the versions-maven-plugin\r\n * through the build's own repositories.\r\n * 3. For every offered change the declaring literal is located, so the\r\n * update edits the right file — possibly a parent POM's property.\r\n *\r\n * Offered per module: its effective dependencies, the dependency management\r\n * entries it declares itself (including imported BOMs) and its parent when\r\n * that parent is not part of the repository.\r\n *\r\n * Maven runs are expensive (a JVM start each), so `scanMany` batches modules\r\n * of one reactor: one effective POM for the whole reactor and one version\r\n * report for all artifacts of all requested modules.\r\n */\r\n\r\nimport { join } from 'node:path';\r\nimport type { DependencyReaderPort, ScanContext } from '../../domain/ports.js';\r\nimport type {\r\n DependencyOrigin,\r\n ProjectModule,\r\n ReleaseChannel,\r\n ScanResult,\r\n SkippedDependency,\r\n UpdateCandidate,\r\n} from '../../domain/models.js';\r\nimport { classifyOrigin } from '../../domain/origin.js';\r\nimport semver from 'semver';\r\nimport { cleanJavaVersion, diffVersions, extractPreReleaseTag, isPreReleaseVersion } from '../../domain/versions.js';\r\nimport { MavenProject } from './maven-project.js';\r\nimport { interpolate } from './maven-pom.js';\r\nimport type { PomModel } from './maven-pom.js';\r\nimport { locateDependencyVersion, locateManagedVersion, locateParentVersion } from './maven-locator.js';\r\nimport type { DeclarationLookup } from './maven-locator.js';\r\nimport { ScratchDirectory, mergeRepositories, queryNewerVersions, readEffectivePoms } from './maven-resolution.js';\r\nimport { DEFAULT_MAVEN_PLUGINS } from './maven-resolution.js';\r\nimport type { EffectiveModel, MavenPluginVersions, VersionReport } from './maven-resolution.js';\r\n\r\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\r\n\r\n/** A dependency of the module together with how its version is located. */\r\ninterface Subject {\r\n groupId: string;\r\n artifactId: string;\r\n version: string;\r\n type?: string;\r\n classifier?: string;\r\n scope: UpdateCandidate['scope'];\r\n locate: (effectiveVersion: string) => DeclarationLookup;\r\n}\r\n\r\n/** A module whose dependencies are known but not yet looked up in the repositories. */\r\ninterface ModulePlan {\r\n module: ProjectModule;\r\n effective: EffectiveModel;\r\n candidates: UpdateCandidate[];\r\n skipped: SkippedDependency[];\r\n lookups: { subject: Subject; origin: DependencyOrigin }[];\r\n}\r\n\r\n/** Modules scanned with the same Maven runs. */\r\ninterface ScanGroup {\r\n /** Directory Maven runs in and the scratch directory lives below. */\r\n dir: string;\r\n /** Aggregator POM resolved recursively, when the group is a reactor batch. */\r\n aggregatorPom?: string;\r\n members: { module: ProjectModule; pom: PomModel }[];\r\n}\r\n\r\nexport class MavenDependencyAdapter implements DependencyReaderPort {\r\n constructor(private readonly plugins: MavenPluginVersions = DEFAULT_MAVEN_PLUGINS) {}\r\n\r\n async scan(module: ProjectModule, context: ScanContext): Promise<ScanResult> {\r\n const results = await this.scanMany([module], context);\r\n return results.get(module) ?? { candidates: [], skipped: [] };\r\n }\r\n\r\n async scanMany(modules: readonly ProjectModule[], context: ScanContext): Promise<Map<ProjectModule, ScanResult>> {\r\n const project = MavenProject.load(context.rootDir);\r\n const results = new Map<ProjectModule, ScanResult>();\r\n\r\n for (const group of groupModules(project, modules)) {\r\n const scratch = new ScratchDirectory(group.dir);\r\n try {\r\n for (const [module, result] of await this.scanGroup(project, group, context, scratch)) {\r\n results.set(module, result);\r\n }\r\n } finally {\r\n scratch.dispose();\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private async scanGroup(\r\n project: MavenProject,\r\n group: ScanGroup,\r\n context: ScanContext,\r\n scratch: ScratchDirectory,\r\n ): Promise<Map<ProjectModule, ScanResult>> {\r\n const rootDir = context.rootDir;\r\n const effectiveModels = group.aggregatorPom\r\n ? await readEffectivePoms(group.aggregatorPom, group.dir, rootDir, scratch, this.plugins, true)\r\n : await readEffectivePoms(group.members[0]!.pom.file, group.dir, rootDir, scratch, this.plugins);\r\n\r\n const plans: ModulePlan[] = [];\r\n for (const { module, pom } of group.members) {\r\n const coordinates = project.coordinatesOf(pom);\r\n // A module the reactor run did not cover (e.g. only listed in a profile)\r\n // is resolved on its own.\r\n const effective =\r\n effectiveModels.get(`${coordinates.groupId}:${coordinates.artifactId}`) ??\r\n (group.aggregatorPom\r\n ? [...(await readEffectivePoms(pom.file, module.path, rootDir, scratch, this.plugins)).values()][0]\r\n : [...effectiveModels.values()][0]);\r\n if (!effective) continue;\r\n plans.push(planModule(project, pom, module, effective, context));\r\n }\r\n\r\n const probe = plans.flatMap((plan) => plan.lookups.map(({ subject }) => subject));\r\n const report = await queryNewerVersions(\r\n probe,\r\n mergeRepositories(plans.map((plan) => plan.effective)),\r\n group.dir,\r\n rootDir,\r\n scratch,\r\n this.plugins,\r\n );\r\n\r\n return new Map(plans.map((plan) => [plan.module, finishModule(plan, report, context.channel)]));\r\n }\r\n}\r\n\r\n/**\r\n * Batches requested modules by reactor. A single module, or a module outside\r\n * any reactor, is resolved on its own (`-N`), which is cheaper than resolving\r\n * a whole reactor for it.\r\n */\r\nfunction groupModules(project: MavenProject, modules: readonly ProjectModule[]): ScanGroup[] {\r\n const groups = new Map<string, ScanGroup>();\r\n const reactorSizes = new Map<string, number>();\r\n for (const module of modules) {\r\n if (module.aggregatorDir) reactorSizes.set(module.aggregatorDir, (reactorSizes.get(module.aggregatorDir) ?? 0) + 1);\r\n }\r\n\r\n for (const module of modules) {\r\n const pom = project.pomAt(join(module.path, 'pom.xml'));\r\n if (!pom) continue;\r\n const reactor = module.aggregatorDir;\r\n const batched = reactor !== undefined && (reactorSizes.get(reactor) ?? 0) > 1;\r\n const key = batched ? `reactor:${reactor}` : `module:${module.path}`;\r\n const group = groups.get(key) ?? {\r\n dir: batched ? reactor : module.path,\r\n aggregatorPom: batched ? join(reactor, 'pom.xml') : undefined,\r\n members: [],\r\n };\r\n group.members.push({ module, pom });\r\n groups.set(key, group);\r\n }\r\n return [...groups.values()];\r\n}\r\n\r\n/** Collects the module's subjects, aligns workspace dependencies and lists the lookups. */\r\nfunction planModule(\r\n project: MavenProject,\r\n pom: PomModel,\r\n module: ProjectModule,\r\n effective: EffectiveModel,\r\n context: ScanContext,\r\n): ModulePlan {\r\n const { poms: chain, externalParent } = project.chainOf(pom);\r\n const rootDir = context.rootDir;\r\n const subjects = new Map<string, Subject>();\r\n\r\n for (const dep of effective.dependencies) {\r\n const key = `${dep.groupId}:${dep.artifactId}`;\r\n if (subjects.has(key)) continue;\r\n const target = { groupId: dep.groupId, artifactId: dep.artifactId };\r\n subjects.set(key, {\r\n ...dep,\r\n scope: dep.scope === 'test' ? 'test' : 'prod',\r\n locate: (effectiveVersion) => locateDependencyVersion(chain, { ...target, effectiveVersion }, rootDir),\r\n });\r\n }\r\n\r\n // Management entries declared by this module itself, including BOM imports.\r\n for (const managed of pom.managedDependencies) {\r\n const groupId = interpolate(managed.groupId, chain);\r\n const artifactId = interpolate(managed.artifactId, chain);\r\n const key = `${groupId}:${artifactId}`;\r\n if (subjects.has(key) || !managed.version) continue;\r\n\r\n const isImport = managed.scope === 'import';\r\n const version = isImport\r\n ? interpolate(managed.version, chain)\r\n : effective.managedDependencies.find((m) => m.groupId === groupId && m.artifactId === artifactId)?.version;\r\n if (!version || version.includes('${')) continue;\r\n\r\n const target = { groupId, artifactId };\r\n subjects.set(key, {\r\n groupId,\r\n artifactId,\r\n version,\r\n type: isImport ? 'pom' : managed.type,\r\n classifier: managed.classifier,\r\n scope: 'prod',\r\n locate: (effectiveVersion) => locateManagedVersion(chain, { ...target, effectiveVersion }, rootDir),\r\n });\r\n }\r\n\r\n // An external parent POM (e.g. spring-boot-starter-parent) declared here.\r\n if (pom.parent && externalParent === pom.parent) {\r\n const { groupId, artifactId } = pom.parent;\r\n const version = interpolate(pom.parent.version, chain);\r\n subjects.set(`${groupId}:${artifactId}`, {\r\n groupId,\r\n artifactId,\r\n version,\r\n type: 'pom',\r\n scope: 'prod',\r\n locate: (effectiveVersion) => locateParentVersion(pom, { groupId, artifactId, effectiveVersion }, rootDir),\r\n });\r\n }\r\n\r\n const plan: ModulePlan = { module, effective, candidates: [], skipped: [], lookups: [] };\r\n for (const [key, subject] of subjects) {\r\n const origin = classifyOrigin(key, 'maven', context);\r\n if (origin.kind !== 'workspace') {\r\n plan.lookups.push({ subject, origin });\r\n continue;\r\n }\r\n\r\n const target = context.workspace.get(key);\r\n if (target && inSameReactor(module, target)) {\r\n if (target.version && target.version !== subject.version) {\r\n collect(alignmentCandidate(subject, target.version, origin), plan.candidates, plan.skipped);\r\n }\r\n } else {\r\n // Maven resolves a project outside the reactor from a repository, like\r\n // any other artifact, so a local module with the same coordinates says\r\n // nothing about the version the build uses.\r\n plan.lookups.push({ subject, origin: classifyOrigin(key, 'maven', { ...context, workspace: new Map() }) });\r\n }\r\n }\r\n return plan;\r\n}\r\n\r\n/** Two modules are in the same reactor when both are built by the same outermost aggregator. */\r\nfunction inSameReactor(a: ProjectModule, b: ProjectModule): boolean {\r\n return a.aggregatorDir !== undefined && a.aggregatorDir === b.aggregatorDir;\r\n}\r\n\r\n/** Turns the version report into the module's candidates. */\r\nfunction finishModule(plan: ModulePlan, report: VersionReport, channel: ReleaseChannel): ScanResult {\r\n const { candidates, skipped } = plan;\r\n for (const { subject, origin } of plan.lookups) {\r\n const key = `${subject.groupId}:${subject.artifactId}`;\r\n const newer = newerThan(subject.version, report.newerVersions.get(key) ?? []);\r\n const latest = pickLatest(subject.version, newer, channel);\r\n if (!latest) {\r\n if (report.failedLookups.has(key)) {\r\n skipped.push({ identifier: key, origin: origin.kind, reason: 'lookup-failed', detail: 'repository error' });\r\n }\r\n continue;\r\n }\r\n collect(updateCandidate(subject, latest, newer, origin), candidates, skipped);\r\n }\r\n\r\n markSharedDeclarations(candidates);\r\n candidates.sort((a, b) => (DIFF_ORDER[a.diff] ?? 3) - (DIFF_ORDER[b.diff] ?? 3));\r\n return { candidates, skipped };\r\n}\r\n\r\n/**\r\n * In a batched report an artifact appears once, with the newer versions of\r\n * the first module that uses it. For a module on a later version, only the\r\n * part of that ascending list after its own version is newer.\r\n */\r\nexport function newerThan(current: string, ascending: readonly string[]): string[] {\r\n const index = ascending.indexOf(current);\r\n return index >= 0 ? ascending.slice(index + 1) : [...ascending];\r\n}\r\n\r\ntype Built = { candidate: UpdateCandidate } | { skipped: SkippedDependency };\r\n\r\nfunction collect(built: Built, candidates: UpdateCandidate[], skipped: SkippedDependency[]): void {\r\n if ('candidate' in built) candidates.push(built.candidate);\r\n else skipped.push(built.skipped);\r\n}\r\n\r\nfunction updateCandidate(subject: Subject, latest: string, newer: string[], origin: DependencyOrigin): Built {\r\n const base = buildCandidate(subject, latest, origin, 'update');\r\n if ('candidate' in base) {\r\n base.candidate.availableVersions = [...newer].reverse().concat(subject.version);\r\n }\r\n return base;\r\n}\r\n\r\nfunction alignmentCandidate(subject: Subject, localVersion: string, origin: DependencyOrigin): Built {\r\n const built = buildCandidate(subject, localVersion, origin, 'align');\r\n if ('candidate' in built) built.candidate.availableVersions = [localVersion];\r\n return built;\r\n}\r\n\r\nfunction buildCandidate(\r\n subject: Subject,\r\n target: string,\r\n origin: DependencyOrigin,\r\n action: UpdateCandidate['action'],\r\n): Built {\r\n const identifier = `${subject.groupId}:${subject.artifactId}`;\r\n const location = subject.locate(subject.version);\r\n if (!location.found) {\r\n return { skipped: { identifier, origin: origin.kind, reason: location.reason, detail: location.detail } };\r\n }\r\n\r\n const currentClean = cleanJavaVersion(subject.version) ?? '0.0.0';\r\n const targetClean = cleanJavaVersion(target) ?? currentClean;\r\n const diff = semver.eq(currentClean, targetClean) ? 'patch' : diffVersions(currentClean, targetClean);\r\n const isPreRelease = isPreReleaseVersion(target);\r\n\r\n return {\r\n candidate: {\r\n coordinate: { identifier, group: subject.groupId, artifact: subject.artifactId, ecosystem: 'maven' },\r\n currentRange: subject.version,\r\n currentClean,\r\n latest: target,\r\n newRange: target,\r\n diff,\r\n scope: subject.scope,\r\n selected: diff !== 'major',\r\n origin,\r\n action,\r\n declaration: location.declaration,\r\n isPreRelease,\r\n preReleaseTag: isPreRelease ? extractPreReleaseTag(target) : undefined,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Picks the newest version allowed by the channel. Newer versions arrive in\r\n * ascending order from the report. A flavour suffix such as `-jre` or\r\n * `-android` (Guava) is kept when a newer version with the same flavour\r\n * exists, so a JRE build is not replaced by an Android build.\r\n */\r\nexport function pickLatest(current: string, newer: readonly string[], channel: ReleaseChannel): string | undefined {\r\n const allowed = newer.filter((v) => channel === 'all' || !isPreReleaseVersion(v));\r\n const flavour = flavourOf(current);\r\n const sameFlavour = flavour ? allowed.filter((v) => flavourOf(v) === flavour) : [];\r\n const pool = sameFlavour.length > 0 ? sameFlavour : allowed;\r\n return pool[pool.length - 1];\r\n}\r\n\r\nfunction flavourOf(version: string): string | undefined {\r\n const suffix = version.match(/-([A-Za-z]+)$/)?.[1];\r\n return suffix && !isPreReleaseVersion(version) ? suffix.toLowerCase() : undefined;\r\n}\r\n\r\n/**\r\n * Several artifacts often share one version property (e.g. all Jackson\r\n * modules). Updating one updates all of them, which the UI must show.\r\n */\r\nfunction markSharedDeclarations(candidates: UpdateCandidate[]): void {\r\n const groups = new Map<string, UpdateCandidate[]>();\r\n for (const candidate of candidates) {\r\n const declaration = candidate.declaration;\r\n if (declaration?.kind !== 'property') continue;\r\n const key = `${declaration.file}#${declaration.propertyName}`;\r\n groups.set(key, [...(groups.get(key) ?? []), candidate]);\r\n }\r\n for (const group of groups.values()) {\r\n if (group.length < 2) continue;\r\n for (const candidate of group) {\r\n candidate.sharedWith = group\r\n .filter((other) => other !== candidate)\r\n .map((other) => other.coordinate.identifier);\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * Elevate — locates where a Maven dependency's version is declared.\r\n *\r\n * Maven's effective POM says which version applies, not where it is written.\r\n * An update must change the declaring literal: a `<version>` in the module,\r\n * a `<dependencyManagement>` entry or a property — possibly in a parent POM.\r\n *\r\n * The lookup follows Maven's rules on the raw POMs of the inheritance chain\r\n * and then cross-checks the literal against the effective version. If they\r\n * differ (active profiles, command-line properties, unusual inheritance) the\r\n * location is reported as a mismatch instead of guessed. Declarations outside\r\n * the repository (external parent POMs, imported BOMs) are reported as such:\r\n * they cannot be edited here; the parent or BOM itself has to be updated.\r\n */\r\n\r\nimport { relative } from 'node:path';\r\nimport type { VersionDeclaration } from '../../domain/models.js';\r\nimport type { XmlElement } from '../shared/xml.js';\r\nimport { findProperty, interpolate, propertyReference } from './maven-pom.js';\r\nimport type { PomDependency, PomModel } from './maven-pom.js';\r\n\r\nexport type DeclarationLookup =\r\n | { found: true; declaration: VersionDeclaration; element: XmlElement; value: string }\r\n | { found: false; reason: 'managed-externally' | 'declaration-mismatch'; detail: string };\r\n\r\ninterface Target {\r\n groupId: string;\r\n artifactId: string;\r\n /** The version Maven resolved for this dependency. */\r\n effectiveVersion: string;\r\n}\r\n\r\n/**\r\n * Locates the version of a dependency used by the first POM of `chain`.\r\n *\r\n * Search order, as Maven applies it: an explicit `<version>` in the module's\r\n * own dependency, then one inherited from a parent's `<dependencies>`, then\r\n * `<dependencyManagement>` from the module upwards.\r\n */\r\nexport function locateDependencyVersion(\r\n chain: readonly PomModel[],\r\n target: Target,\r\n rootDir: string,\r\n): DeclarationLookup {\r\n for (const pom of chain) {\r\n const dependency = findDependency(pom.dependencies, target, chain);\r\n if (!dependency) continue;\r\n // The nearest declaration wins entirely; without a version it is managed.\r\n if (!dependency.versionElement) break;\r\n return resolveLiteral(pom, 'dependency', dependency.versionElement, chain, target, rootDir);\r\n }\r\n return locateManagedVersion(chain, target, rootDir);\r\n}\r\n\r\n/** Locates a `<dependencyManagement>` version, searching from the module upwards. */\r\nexport function locateManagedVersion(\r\n chain: readonly PomModel[],\r\n target: Target,\r\n rootDir: string,\r\n): DeclarationLookup {\r\n for (const pom of chain) {\r\n const managed = findDependency(pom.managedDependencies, target, chain);\r\n if (managed?.versionElement) {\r\n return resolveLiteral(pom, 'dependency-management', managed.versionElement, chain, target, rootDir);\r\n }\r\n }\r\n return {\r\n found: false,\r\n reason: 'managed-externally',\r\n detail: 'version is managed outside this repository (external parent POM or imported BOM)',\r\n };\r\n}\r\n\r\n/** Locates the `<parent>` version of the module (for external parents). */\r\nexport function locateParentVersion(module: PomModel, target: Target, rootDir: string): DeclarationLookup {\r\n const element = module.parent?.versionElement;\r\n if (!element) {\r\n return { found: false, reason: 'declaration-mismatch', detail: 'parent has no <version> element' };\r\n }\r\n return resolveLiteral(module, 'parent', element, [module], target, rootDir);\r\n}\r\n\r\nfunction findDependency(\r\n dependencies: readonly PomDependency[],\r\n target: Target,\r\n chain: readonly PomModel[],\r\n): PomDependency | undefined {\r\n return dependencies.find(\r\n (dep) =>\r\n dep.scope !== 'import' &&\r\n interpolate(dep.groupId, chain) === target.groupId &&\r\n interpolate(dep.artifactId, chain) === target.artifactId,\r\n );\r\n}\r\n\r\n/**\r\n * Follows property references from a `<version>` element to the literal that\r\n * finally holds the value. Properties resolve from the module upwards — a\r\n * child's definition overrides the parent's, even for a version written in\r\n * the parent.\r\n */\r\nfunction resolveLiteral(\r\n pom: PomModel,\r\n kind: 'dependency' | 'dependency-management' | 'parent',\r\n versionElement: XmlElement,\r\n chain: readonly PomModel[],\r\n target: Target,\r\n rootDir: string,\r\n): DeclarationLookup {\r\n let file = pom.file;\r\n let element = versionElement;\r\n let value = versionElement.text.trim();\r\n let propertyName: string | undefined;\r\n\r\n for (let depth = 0; depth < 10; depth++) {\r\n const reference = propertyReference(value);\r\n if (!reference) break;\r\n if (reference.startsWith('project.') || reference.startsWith('pom.')) {\r\n return {\r\n found: false,\r\n reason: 'declaration-mismatch',\r\n detail: `version is the expression \\${${reference}}, not an editable value`,\r\n };\r\n }\r\n const definition = findProperty(reference, chain);\r\n if (!definition) {\r\n return {\r\n found: false,\r\n reason: 'managed-externally',\r\n detail: `property \\${${reference}} is defined outside this repository`,\r\n };\r\n }\r\n file = definition.pom.file;\r\n element = definition.property.element;\r\n value = definition.property.value;\r\n propertyName = reference;\r\n }\r\n\r\n if (value.includes('${')) {\r\n return {\r\n found: false,\r\n reason: 'declaration-mismatch',\r\n detail: `version '${value}' combines several expressions`,\r\n };\r\n }\r\n\r\n if (value !== target.effectiveVersion) {\r\n return {\r\n found: false,\r\n reason: 'declaration-mismatch',\r\n detail: `declared '${value}' but Maven resolves '${target.effectiveVersion}' (profile or command-line override?)`,\r\n };\r\n }\r\n\r\n const declaration: VersionDeclaration = {\r\n file,\r\n kind: propertyName ? 'property' : kind,\r\n propertyName,\r\n displayPath: relative(rootDir, file).replace(/\\\\/g, '/'),\r\n };\r\n return { found: true, declaration, element, value };\r\n}\r\n","/**\r\n * Elevate — Maven updater.\r\n *\r\n * Writes each new version to the literal that declares it — a dependency's\r\n * `<version>`, a `<dependencyManagement>` entry, a `<parent>` version or a\r\n * property, possibly in a parent POM. Edits splice the original text, so\r\n * formatting and comments stay intact, and each edit checks that the file\r\n * still holds the value seen during the scan.\r\n *\r\n * Dependency resolution is left to the verification step, which builds the\r\n * affected modules.\r\n */\r\n\r\nimport { readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { InstallError } from '../../domain/ports.js';\r\nimport type { ApplyOutcome, DependencyUpdaterPort } from '../../domain/ports.js';\r\nimport type { ProjectModule, UpdateCandidate, VersionDeclaration } from '../../domain/models.js';\r\nimport { StaleEditError, applyTextEdits } from '../shared/xml.js';\r\nimport type { TextEdit, XmlElement } from '../shared/xml.js';\r\nimport { interpolate, parsePom } from './maven-pom.js';\r\nimport type { PomDependency, PomModel } from './maven-pom.js';\r\nimport { MavenProject } from './maven-project.js';\r\n\r\nexport class MavenUpdaterAdapter implements DependencyUpdaterPort {\r\n affectedFiles(module: ProjectModule, _rootDir: string, updates: UpdateCandidate[]): string[] {\r\n const files = new Set(updates.map((u) => resolve(u.declaration?.file ?? join(module.path, 'pom.xml'))));\r\n return [...files];\r\n }\r\n\r\n async applyUpdates(\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n onProgress: (stepMessage: string) => void,\r\n ): Promise<ApplyOutcome> {\r\n const project = MavenProject.load(rootDir);\r\n const byFile = new Map<string, UpdateCandidate[]>();\r\n for (const update of updates) {\r\n if (!update.declaration) {\r\n throw new InstallError(`No version declaration known for ${update.coordinate.identifier}; rescan the module.`);\r\n }\r\n const file = resolve(update.declaration.file);\r\n byFile.set(file, [...(byFile.get(file) ?? []), update]);\r\n }\r\n\r\n // Compute every edit before writing anything, so a stale or conflicting\r\n // edit in the second file does not leave the first one half-updated.\r\n const writes: { file: string; content: string }[] = [];\r\n for (const [file, fileUpdates] of byFile) {\r\n onProgress(`Preparing ${fileUpdates.length} change(s) in ${fileUpdates[0]!.declaration!.displayPath}…`);\r\n const source = readFileSync(file, 'utf8');\r\n const pom = parsePom(source, file);\r\n const chain = project.pomAt(file) ? project.chainOf(project.pomAt(file)!).poms : [pom];\r\n const edits = collectEdits(pom, [pom, ...chain.slice(1)], fileUpdates);\r\n try {\r\n writes.push({ file, content: applyTextEdits(source, edits) });\r\n } catch (err) {\r\n if (err instanceof StaleEditError) throw new InstallError(`${file}: ${err.message}`);\r\n throw err;\r\n }\r\n }\r\n\r\n onProgress('Writing POM files…');\r\n for (const write of writes) writeFileSync(write.file, write.content, 'utf8');\r\n\r\n return {\r\n updatedCount: updates.length,\r\n auditMessage: `Updated ${updates.length} version declaration(s) in ${writes.length} POM file(s).`,\r\n auditSeverity: 'clean',\r\n integrityViolations: [],\r\n };\r\n }\r\n\r\n async resync(): Promise<void> {\r\n // Maven keeps no installed state next to the POMs; restoring them suffices.\r\n }\r\n}\r\n\r\n/** Maps updates to text edits; updates sharing one literal must agree on the version. */\r\nfunction collectEdits(pom: PomModel, chain: readonly PomModel[], updates: UpdateCandidate[]): TextEdit[] {\r\n const edits = new Map<XmlElement, TextEdit & { identifier: string }>();\r\n\r\n for (const update of updates) {\r\n const element = findDeclarationElement(pom, chain, update);\r\n if (!element) {\r\n throw new InstallError(\r\n `${update.declaration!.displayPath}: cannot find the version of ${update.coordinate.identifier} any more; rescan the module.`,\r\n );\r\n }\r\n\r\n const existing = edits.get(element);\r\n if (existing) {\r\n if (existing.replacement !== update.newRange) {\r\n throw new InstallError(\r\n `${update.coordinate.identifier} and ${existing.identifier} share ${describe(update.declaration!)} ` +\r\n `but target different versions (${update.newRange} vs ${existing.replacement}).`,\r\n );\r\n }\r\n continue;\r\n }\r\n edits.set(element, {\r\n element,\r\n expected: update.currentRange,\r\n replacement: update.newRange,\r\n identifier: update.coordinate.identifier,\r\n });\r\n }\r\n return [...edits.values()];\r\n}\r\n\r\nfunction findDeclarationElement(\r\n pom: PomModel,\r\n chain: readonly PomModel[],\r\n update: UpdateCandidate,\r\n): XmlElement | undefined {\r\n const declaration = update.declaration!;\r\n const { group, artifact } = update.coordinate;\r\n\r\n const matches = (dep: PomDependency) =>\r\n interpolate(dep.groupId, chain) === group && interpolate(dep.artifactId, chain) === artifact;\r\n\r\n switch (declaration.kind) {\r\n case 'property':\r\n return declaration.propertyName ? pom.properties.get(declaration.propertyName)?.element : undefined;\r\n case 'parent':\r\n return pom.parent?.versionElement;\r\n case 'dependency':\r\n return pom.dependencies.find(matches)?.versionElement;\r\n case 'dependency-management':\r\n return pom.managedDependencies.find(matches)?.versionElement;\r\n }\r\n}\r\n\r\nfunction describe(declaration: VersionDeclaration): string {\r\n return declaration.kind === 'property'\r\n ? `the property \\${${declaration.propertyName}} in ${declaration.displayPath}`\r\n : `a version in ${declaration.displayPath}`;\r\n}\r\n","/**\r\n * Elevate — Maven verification.\r\n *\r\n * Compiles main and test sources of every module affected by the update.\r\n * Within a reactor this is `-pl <changed modules> -amd`: the modules whose\r\n * POMs changed plus all modules that depend on them, because a version change\r\n * in an internal library breaks its consumers, not the library itself.\r\n * A change to the aggregator POM, or to a POM outside the reactor, rebuilds\r\n * the whole reactor.\r\n */\r\n\r\nimport { dirname, join, relative, resolve } from 'node:path';\r\nimport type { VerificationOptions, VerificationPort, VerificationResult } from '../../domain/ports.js';\r\nimport type { ProjectModule } from '../../domain/models.js';\r\nimport { runShellScript } from '../shared/process.js';\r\nimport type { RunResult } from '../shared/process.js';\r\nimport { MavenUnavailableError, mavenErrors, runMaven } from './maven-command.js';\r\nimport { MavenProject } from './maven-project.js';\r\n\r\nconst VERIFY_TIMEOUT_MS = 30 * 60_000;\r\n\r\nexport class MavenVerificationAdapter implements VerificationPort {\r\n async verify(module: ProjectModule, rootDir: string, options: VerificationOptions = {}): Promise<VerificationResult> {\r\n if (options.customScript) {\r\n const label = options.customLabel || options.customScript;\r\n const result = await runShellScript(options.customScript, { cwd: module.path, timeoutMs: VERIFY_TIMEOUT_MS });\r\n return result.exitCode === 0\r\n ? { status: 'clean', details: 'Verification script succeeded.', label }\r\n : { status: 'warn', details: failureDetails(result), label };\r\n }\r\n\r\n const plan = planBuild(module, rootDir, options.changedFiles ?? []);\r\n const label = `Maven build (${['test-compile', ...plan.args].join(' ')})`;\r\n\r\n try {\r\n const result = await runMaven(['-q', 'test-compile', ...plan.args], {\r\n cwd: plan.cwd,\r\n rootDir,\r\n timeoutMs: VERIFY_TIMEOUT_MS,\r\n });\r\n if (result.exitCode === 0) {\r\n return { status: 'clean', details: 'All affected modules compile, including tests.', label };\r\n }\r\n const details = result.timedOut ? 'Maven build timed out.' : failureDetails(result);\r\n return { status: 'warn', details, label };\r\n } catch (err) {\r\n if (err instanceof MavenUnavailableError) return { status: 'warn', details: err.message, label };\r\n throw err;\r\n }\r\n }\r\n}\r\n\r\n/** Maven's error lines, or the exit code when the command printed nothing. */\r\nfunction failureDetails(result: RunResult): string {\r\n const output = `${result.stdout}\\n${result.stderr}`.trim();\r\n return output ? mavenErrors(output) : `Exited with code ${result.exitCode}.`;\r\n}\r\n\r\ninterface BuildPlan {\r\n cwd: string;\r\n args: string[];\r\n}\r\n\r\n/** Chooses where to run Maven and which reactor modules to build. */\r\nexport function planBuild(module: ProjectModule, rootDir: string, changedFiles: readonly string[]): BuildPlan {\r\n const aggregatorDir = module.aggregatorDir;\r\n if (!aggregatorDir) return { cwd: module.path, args: [] };\r\n\r\n const project = MavenProject.load(rootDir);\r\n const files = changedFiles.length > 0 ? changedFiles : [join(module.path, 'pom.xml')];\r\n const selected = new Set<string>();\r\n\r\n for (const file of files) {\r\n const pom = project.pomAt(file);\r\n const dir = resolve(dirname(file));\r\n // Not part of this reactor, or the aggregator itself: everything may be affected.\r\n if (!pom || project.aggregatorDirOf(pom) !== aggregatorDir || dir === resolve(aggregatorDir)) {\r\n return { cwd: aggregatorDir, args: [] };\r\n }\r\n selected.add(relative(aggregatorDir, dir).replace(/\\\\/g, '/'));\r\n }\r\n\r\n return { cwd: aggregatorDir, args: ['-pl', [...selected].join(','), '-amd'] };\r\n}\r\n","/**\r\n * Elevate — Maven ecosystem strategy: wires the Maven adapters together.\r\n */\r\n\r\nimport type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\r\nimport type { Ecosystem } from '../../domain/models.js';\r\nimport { MavenModuleDiscoveryAdapter } from './maven-discovery.js';\r\nimport { MavenRegistryAdapter } from './maven-registry.js';\r\nimport { MavenDependencyAdapter } from './maven-scanner.js';\r\nimport { MavenUpdaterAdapter } from './maven-updater.js';\r\nimport { MavenVerificationAdapter } from './maven-verifier.js';\r\nimport { DEFAULT_MAVEN_PLUGINS } from './maven-resolution.js';\r\nimport type { MavenPluginVersions } from './maven-resolution.js';\r\n\r\nexport class MavenEcosystemStrategy implements EcosystemStrategy {\r\n readonly ecosystem: Ecosystem = 'maven';\r\n readonly displayName = 'Java / Maven';\r\n readonly icon = '☕';\r\n readonly manifestFile = 'pom.xml';\r\n\r\n readonly discovery = new MavenModuleDiscoveryAdapter();\r\n readonly registry: MavenRegistryAdapter;\r\n readonly reader: MavenDependencyAdapter;\r\n readonly updater = new MavenUpdaterAdapter();\r\n readonly verifier = new MavenVerificationAdapter();\r\n\r\n /** @param plugins versions of the Maven plugins Elevate runs (default: the pinned ones) */\r\n constructor(plugins: MavenPluginVersions = DEFAULT_MAVEN_PLUGINS) {\r\n this.registry = new MavenRegistryAdapter(plugins);\r\n this.reader = new MavenDependencyAdapter(plugins);\r\n }\r\n\r\n getTabLabels(\r\n counts: { total: number; prodCount: number; devCount: number },\r\n _t: any,\r\n ): TabLabels {\r\n return {\r\n all: `[1] Alle (${counts.total})`,\r\n prod: `[2] Compile (${counts.prodCount})`,\r\n dev: `[3] Test (${counts.devCount})`,\r\n };\r\n }\r\n}\r\n","/**\r\n * 🪶 Elevate — Ecosystem Factory (Factory Pattern)\r\n *\r\n * Creates and caches the ecosystem strategies for Node/npm and Java/Maven.\r\n */\r\n\r\nimport type { Ecosystem } from './models.js';\r\nimport type { EcosystemStrategy } from './ecosystem-strategy.js';\r\nimport { NpmEcosystemStrategy } from '../adapters/npm/npm-strategy.js';\r\nimport { MavenEcosystemStrategy } from '../adapters/maven/maven-strategy.js';\r\nimport type { MavenPluginVersions } from '../adapters/maven/maven-resolution.js';\r\n\r\n/** Settings the strategies are created with. */\r\nexport interface EcosystemSettings {\r\n /** Versions of the Maven plugins Elevate runs; defaults apply when omitted. */\r\n mavenPlugins?: MavenPluginVersions;\r\n}\r\n\r\nexport class EcosystemFactory {\r\n private static instances = new Map<Ecosystem, EcosystemStrategy>();\r\n private static settings: EcosystemSettings = {};\r\n\r\n /**\r\n * Stores the settings and drops the cached strategies, so strategies created\r\n * afterwards use them. Without a call the defaults apply.\r\n */\r\n static configure(settings: EcosystemSettings): void {\r\n this.settings = settings;\r\n this.instances.clear();\r\n }\r\n\r\n /** Returns the strategy for an ecosystem (lazily created singleton). */\r\n static getStrategy(ecosystem: Ecosystem): EcosystemStrategy {\r\n let strategy = this.instances.get(ecosystem);\r\n if (!strategy) {\r\n if (ecosystem === 'maven') {\r\n strategy = new MavenEcosystemStrategy(this.settings.mavenPlugins);\r\n } else {\r\n strategy = new NpmEcosystemStrategy();\r\n }\r\n this.instances.set(ecosystem, strategy);\r\n }\r\n return strategy;\r\n }\r\n\r\n /** All supported ecosystems. */\r\n static getAvailableEcosystems(): Ecosystem[] {\r\n return ['npm', 'maven'];\r\n }\r\n}\r\n","/**\r\n * 🪶 Elevate — main component (app shell)\r\n *\r\n * Orchestrates the ecosystem strategies (npm / Maven), views, hooks,\r\n * i18n, theme and keyboard navigation.\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback } from 'react';\r\nimport { Box, useInput, useApp } from 'ink';\r\nimport type { View, Ecosystem, UpdateCandidate } from './domain/models.js';\r\nimport type { ElevateConfig } from './config.js';\r\nimport { EcosystemFactory } from './domain/ecosystem-factory.js';\r\nimport { useI18n, resolveInitialLocale } from './i18n/index.js';\r\n\r\n// Domain-Driven Hooks\r\nimport { useWorkspaces } from './hooks/use-workspaces.js';\r\nimport { usePackages } from './hooks/use-packages.js';\r\nimport { useUpdater } from './hooks/use-updater.js';\r\n\r\n// Components\r\nimport { SplashScreen } from './components/splash-screen.js';\r\nimport { Header } from './components/header.js';\r\nimport { WorkspaceBar } from './components/workspace-bar.js';\r\nimport { TabBar } from './components/tab-bar.js';\r\nimport { PackageList } from './components/package-list.js';\r\nimport { StatusBar } from './components/status-bar.js';\r\nimport { ControlsBar } from './components/controls-bar.js';\r\nimport { WorkspaceModal } from './components/workspace-modal.js';\r\nimport { VersionModal } from './components/version-modal.js';\r\nimport { SummaryView } from './components/summary-view.js';\r\nimport { UpdatingView } from './components/updating-view.js';\r\n\r\ninterface AppProps {\r\n config: ElevateConfig;\r\n}\r\n\r\nexport const App: React.FC<AppProps> = ({ config }) => {\r\n const { exit } = useApp();\r\n const [view, setView] = useState<View>('splash');\r\n const [modalIndex, setModalIndex] = useState(0);\r\n const [versionPickerCandidate, setVersionPickerCandidate] = useState<UpdateCandidate | null>(null);\r\n\r\n // 1. Ecosystem selection (npm ⇄ Maven via strategy pattern)\r\n const [ecosystem, setEcosystem] = useState<Ecosystem>('npm');\r\n const strategy = useMemo(() => EcosystemFactory.getStrategy(ecosystem), [ecosystem]);\r\n\r\n const nextEcosystem: Ecosystem = ecosystem === 'npm' ? 'maven' : 'npm';\r\n const nextStrategy = useMemo(() => EcosystemFactory.getStrategy(nextEcosystem), [nextEcosystem]);\r\n\r\n const toggleEcosystem = useCallback(() => {\r\n setEcosystem((prev) => (prev === 'npm' ? 'maven' : 'npm'));\r\n }, []);\r\n\r\n // 2. i18n Hook\r\n const { locale, toggleLocale, t } = useI18n(resolveInitialLocale(config.locale));\r\n\r\n // 3. Domain hooks (receive the active strategy)\r\n const ws = useWorkspaces(strategy, config.rootDir);\r\n const pkg = usePackages(strategy, ws.active, ws.modules, config, config.channel);\r\n const updater = useUpdater(strategy, config.rootDir, setView, {\r\n script: config.postUpdateScript,\r\n label: config.postUpdateLabel,\r\n });\r\n\r\n // 4. Mascot state\r\n const mascotState =\r\n view === 'updating'\r\n ? 'updating'\r\n : pkg.loading\r\n ? 'scanning'\r\n : view === 'summary'\r\n ? 'success'\r\n : 'idle';\r\n\r\n // 5. Keyboard handling\r\n useInput((input, key) => {\r\n // While the version modal is open, its own useInput handles all keys\r\n if (view === 'version_modal') {\r\n return;\r\n }\r\n\r\n // Global: quit\r\n if (input === 'q' && view !== 'updating') {\r\n exit();\r\n return;\r\n }\r\n\r\n // Splash screen: Space or Enter skips straight to the dashboard (the scan already runs)\r\n if (view === 'splash') {\r\n if (key.return || input === ' ') {\r\n setView('dashboard');\r\n }\r\n return;\r\n }\r\n\r\n // Global: toggle language ([L])\r\n if ((input === 'l' || input === 'L') && view !== 'updating') {\r\n toggleLocale();\r\n return;\r\n }\r\n\r\n // ── Workspace-Modal ──\r\n if (view === 'workspace_modal') {\r\n if (key.upArrow || input === 'k') {\r\n setModalIndex((i) => Math.max(0, i - 1));\r\n } else if (key.downArrow || input === 'j') {\r\n setModalIndex((i) => Math.min(ws.modules.length - 1, i + 1));\r\n } else if (key.return) {\r\n ws.setActiveIndex(modalIndex);\r\n setView('dashboard');\r\n } else if (key.escape || input === 'w') {\r\n setView('dashboard');\r\n }\r\n return;\r\n }\r\n\r\n // ── Summary ──\r\n if (view === 'summary') {\r\n if (key.return || input === 'd') {\r\n setView('dashboard');\r\n pkg.scan();\r\n }\r\n return;\r\n }\r\n\r\n // ── Dashboard ──\r\n if (view === 'dashboard') {\r\n // Switch ecosystem ([E])\r\n if (input === 'e' || input === 'E') {\r\n toggleEcosystem();\r\n return;\r\n }\r\n\r\n // Select module ([W])\r\n if (input === 'w') {\r\n setModalIndex(ws.activeIndex);\r\n setView('workspace_modal');\r\n } else if (input === 'v' || input === 'V') {\r\n // Pick a specific version ([V])\r\n const focused = pkg.visible[pkg.cursor];\r\n if (focused) {\r\n setVersionPickerCandidate(focused);\r\n setView('version_modal');\r\n }\r\n } else if (key.tab) {\r\n pkg.cycleTab();\r\n } else if (input === '1') {\r\n pkg.switchTab('all');\r\n } else if (input === '2') {\r\n pkg.switchTab('prod');\r\n } else if (input === '3') {\r\n pkg.switchTab('dev');\r\n } else if (key.upArrow || input === 'k') {\r\n pkg.setCursor((i) => Math.max(0, i - 1));\r\n } else if (key.downArrow || input === 'j') {\r\n pkg.setCursor((i) => Math.min(pkg.visible.length - 1, i + 1));\r\n } else if (input === ' ') {\r\n const focused = pkg.visible[pkg.cursor];\r\n if (focused) pkg.togglePackage(focused.coordinate.identifier);\r\n } else if (input === 'a') {\r\n pkg.toggleAllVisible();\r\n } else if (input === 'r') {\r\n pkg.scan();\r\n } else if (input === 'u' && pkg.counts.selectedCount > 0 && !pkg.loading) {\r\n const selected = pkg.packages.filter((p) => p.selected);\r\n updater.run(ws.active, selected);\r\n }\r\n }\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\" padding={1}>\r\n {/* 1. Initial splash screen (always English) */}\r\n {view === 'splash' && (\r\n <SplashScreen\r\n onComplete={() => setView('dashboard')}\r\n author={config.author}\r\n />\r\n )}\r\n\r\n {/* 2. Dashboard views */}\r\n {view !== 'splash' && (\r\n <>\r\n <Header\r\n author={config.author}\r\n t={t}\r\n currentLocale={locale}\r\n strategy={strategy}\r\n nextStrategyName={`${nextStrategy.icon} ${nextStrategy.displayName}`}\r\n channel={config.channel}\r\n />\r\n\r\n {view === 'workspace_modal' && (\r\n <WorkspaceModal\r\n modules={ws.modules}\r\n focusedIndex={modalIndex}\r\n strategy={strategy}\r\n t={t}\r\n />\r\n )}\r\n\r\n {view === 'version_modal' && versionPickerCandidate && (\r\n <VersionModal\r\n candidate={versionPickerCandidate}\r\n strategy={strategy}\r\n config={config}\r\n t={t}\r\n onSelect={(chosenVersion) => {\r\n pkg.setCustomVersion(versionPickerCandidate.coordinate.identifier, chosenVersion);\r\n setView('dashboard');\r\n setVersionPickerCandidate(null);\r\n }}\r\n onCancel={() => {\r\n setView('dashboard');\r\n setVersionPickerCandidate(null);\r\n }}\r\n />\r\n )}\r\n\r\n {view === 'updating' && (\r\n <UpdatingView step={updater.step} t={t} ecosystem={strategy.ecosystem} />\r\n )}\r\n\r\n {view === 'summary' && updater.summary && (\r\n <SummaryView\r\n summary={updater.summary}\r\n module={ws.active}\r\n strategy={strategy}\r\n t={t}\r\n />\r\n )}\r\n\r\n {view === 'dashboard' && (\r\n <>\r\n <WorkspaceBar\r\n module={ws.active}\r\n internalScopes={config.internalScopes}\r\n strategy={strategy}\r\n t={t}\r\n />\r\n <TabBar\r\n activeTab={pkg.activeTab}\r\n counts={pkg.counts}\r\n strategy={strategy}\r\n t={t}\r\n />\r\n <PackageList\r\n items={pkg.visible}\r\n cursor={pkg.cursor}\r\n loading={pkg.loading}\r\n error={pkg.error}\r\n skipped={pkg.skipped}\r\n t={t}\r\n />\r\n <StatusBar\r\n counts={pkg.counts}\r\n visibleCount={pkg.visible.length}\r\n t={t}\r\n mascotState={mascotState}\r\n ecosystem={strategy.ecosystem}\r\n />\r\n <ControlsBar t={t} />\r\n </>\r\n )}\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","/**\r\n * 🪶 Elevate — i18n System\r\n *\r\n * Translation tables, language detection and the useI18n hook.\r\n */\r\n\r\nimport { useState, useCallback, useMemo } from 'react';\r\nimport type { Locale, Translations } from './types.js';\r\nimport { de } from './locales/de.js';\r\nimport { en } from './locales/en.js';\r\n\r\nexport * from './types.js';\r\n\r\nconst dictionaries: Record<Locale, Translations> = { de, en };\r\n\r\n/** Determines the initial language from the configuration or the environment. */\r\nexport function resolveInitialLocale(configured?: string): Locale {\r\n if (configured === 'de' || configured === 'en') return configured;\r\n\r\n const envLang = (process.env.LANG || process.env.LC_ALL || process.env.LANGUAGE || '').toLowerCase();\r\n if (envLang.startsWith('en')) return 'en';\r\n return 'de'; // Standard: Deutsch\r\n}\r\n\r\n/** Returns the translation table for a locale. */\r\nexport function getTranslations(locale: Locale): Translations {\r\n return dictionaries[locale] ?? dictionaries.de;\r\n}\r\n\r\n/** Hook that manages the active language. */\r\nexport function useI18n(initialLocale: Locale = 'de') {\r\n const [locale, setLocale] = useState<Locale>(initialLocale);\r\n\r\n const toggleLocale = useCallback(() => {\r\n setLocale((prev) => (prev === 'de' ? 'en' : 'de'));\r\n }, []);\r\n\r\n const t = useMemo(() => getTranslations(locale), [locale]);\r\n\r\n return {\r\n locale,\r\n setLocale,\r\n toggleLocale,\r\n t,\r\n } as const;\r\n}\r\n","import type { Translations } from '../types.js';\r\n\r\nexport const de: Translations = {\r\n header: {\r\n title: 'Elevate',\r\n developedBy: (name) => `Entwickelt & gepflegt von ${name}`,\r\n langToggleHint: '[L] DE / EN',\r\n ecosystemToggleHint: (nextName) => `[E] ${nextName}`,\r\n },\r\n workspace: {\r\n label: 'Workspace / Modul',\r\n switchHint: 'Drücke [W] zum Wechseln',\r\n modalTitle: '📁 Modul auswählen (↑/↓ Navigieren, Enter Auswählen, Esc Abbrechen):',\r\n },\r\n tabs: {\r\n all: (count) => `[1] Alle (${count})`,\r\n dependencies: (count) => `[2] Dependencies (${count})`,\r\n devDependencies: (count) => `[3] DevDependencies (${count})`,\r\n },\r\n list: {\r\n scanning: '⏳ Prüfe Registry auf verfügbare Updates…',\r\n allUpToDate: '🎉 Alle Abhängigkeiten in diesem Tab sind auf dem neuesten Stand!',\r\n moreAbove: '▲ … weitere oben',\r\n moreBelow: (remaining) => `▼ … weitere unten (${remaining} übrig)`,\r\n scanFailed: (message) => `❌ Scan fehlgeschlagen: ${message}`,\r\n skippedHeading: (count) => `⚠️ ${count} Abhängigkeit${count === 1 ? '' : 'en'} nicht angeboten:`,\r\n skipReason: (reason) =>\r\n ({\r\n 'private-on-public-registry': 'internes Paket, aber die Registry ist öffentlich — nicht abgefragt',\r\n 'lookup-failed': 'Abfrage der Registry fehlgeschlagen',\r\n 'managed-externally': 'Version wird außerhalb dieses Repos verwaltet',\r\n 'declaration-mismatch': 'Ort der Versionsangabe ist nicht eindeutig',\r\n 'invalid-name': 'ungültiger Paketname',\r\n })[reason],\r\n },\r\n badges: {\r\n patch: '[Patch]',\r\n minor: '[Minor]',\r\n major: '[MAJOR]',\r\n dev: '(dev/test)',\r\n prod: '(prod/compile)',\r\n align: '[Angleichen]',\r\n internal: '[Intern]',\r\n },\r\n status: {\r\n selectedOf: (selected, total) => `${selected} von ${total}`,\r\n breakdown: (patch, minor, major) => `(${patch} Patch, ${minor} Minor, ${major} Major)`,\r\n internalScopes: (scopes) => `🏢 Intern: ${scopes.join(', ')}`,\r\n noInternalScopes: '🏢 Workspace-Module werden lokal angeglichen',\r\n },\r\n controls: {\r\n navigate: 'Navigieren',\r\n toggle: 'Toggle',\r\n all: 'Alle',\r\n tabs: 'Tabs',\r\n workspace: 'Modul',\r\n ecosystem: 'Ökosystem',\r\n version: 'Version',\r\n language: 'Sprache',\r\n update: 'Update starten',\r\n quit: 'Beenden',\r\n },\r\n versionModal: {\r\n title: (pkgName) => `Version heraussuchen: ${pkgName}`,\r\n current: (version) => `Aktuell installiert: ${version}`,\r\n filterPlaceholder: 'Tippe zum Filtern (z. B. 3.2 oder 18)…',\r\n loading: 'Lade alle Versionen aus der Registry…',\r\n noVersions: 'Keine passenden Versionen gefunden.',\r\n hint: '[↑/↓/j/k] Navigieren │ [Enter] Auswählen │ [Esc] Abbrechen │ [Backspace] Filter löschen',\r\n latestBadge: 'LATEST',\r\n currentBadge: 'AKTUELL',\r\n customBadge: 'MANUELL',\r\n },\r\n updating: {\r\n title: '⚡ Aktualisierung läuft…',\r\n stepWriting: (step, total) => `${step}/${total} — Schreibe neue Versionen ins Manifest…`,\r\n stepInstalling: (step, total) => `${step}/${total} — Löse Abhängigkeiten auf (bitte kurz warten)…`,\r\n stepAnalyzing: (step, total) => `${step}/${total} — Analysiere Build & Output…`,\r\n stepCustom: (step, total, label) => `${step}/${total} — ${label}…`,\r\n doNotClose: 'Bitte das Terminal nicht schließen.',\r\n },\r\n summary: {\r\n title: '✨ Aktualisierung abgeschlossen!',\r\n successCount: (count, path) => `📦 ${count} Abhängigkeiten erfolgreich in ${path} aktualisiert.`,\r\n securityAudit: '🛡️ Status & Audit:',\r\n cleanAudit: 'Keine bekannten Probleme gefunden.',\r\n funding: (msg) => `💡 Funding: ${msg}`,\r\n postScript: (label) => `🔍 ${label}:`,\r\n backHint: '[Enter] Zurück zum Dashboard │ [Q] Beenden',\r\n rolledBackTitle: '↩️ Aktualisierung fehlgeschlagen — alle Änderungen zurückgenommen',\r\n rolledBack: 'Das Repository ist im selben Zustand wie vor der Aktualisierung.',\r\n changedFiles: (files) => `📝 Geändert: ${files.join(', ')}`,\r\n },\r\n mascot: {\r\n name: 'Pip',\r\n idleChirps: ['*piep*', '*flausch*', '*pick pick*', 'alles frisch! 🪶', '*blinzel*'],\r\n scanningChirps: ['*such*', 'prüfe...', 'oh, Updates?', 'einen Moment!'],\r\n updatingChirps: ['*schuft*', 'baue Code...', 'gleich fertig!', 'arbeite emsig...'],\r\n successChirps: ['hurra! 🎉', 'alles aktuell!', 'top gepflegt! 🪶', 'super gemacht!'],\r\n mavenChirps: ['*kaffee schlürf* ☕', 'Spring Boot läuft!', 'Java 25 rockt!', 'sauber gebaut!'],\r\n },\r\n splash: {\r\n tagline: 'Modernes Polyglot Dependency Dashboard',\r\n loading: 'Initialisiere Module & bereite Dashboard vor…',\r\n skipHint: '[Leertaste / Enter] zum Überspringen',\r\n },\r\n};\r\n","import type { Translations } from '../types.js';\r\n\r\nexport const en: Translations = {\r\n header: {\r\n title: 'Elevate',\r\n developedBy: (name) => `Developed & maintained by ${name}`,\r\n langToggleHint: '[L] EN / DE',\r\n ecosystemToggleHint: (nextName) => `[E] ${nextName}`,\r\n },\r\n workspace: {\r\n label: 'Workspace / Module',\r\n switchHint: 'Press [W] to switch',\r\n modalTitle: '📁 Select Module (↑/↓ Navigate, Enter Select, Esc Cancel):',\r\n },\r\n tabs: {\r\n all: (count) => `[1] All (${count})`,\r\n dependencies: (count) => `[2] Dependencies (${count})`,\r\n devDependencies: (count) => `[3] DevDependencies (${count})`,\r\n },\r\n list: {\r\n scanning: '⏳ Checking registry for available updates…',\r\n allUpToDate: '🎉 All dependencies in this tab are up to date!',\r\n moreAbove: '▲ … more above',\r\n moreBelow: (remaining) => `▼ … more below (${remaining} remaining)`,\r\n scanFailed: (message) => `❌ Scan failed: ${message}`,\r\n skippedHeading: (count) => `⚠️ ${count} dependenc${count === 1 ? 'y' : 'ies'} not offered:`,\r\n skipReason: (reason) =>\r\n ({\r\n 'private-on-public-registry': 'internal package, but its registry is public — not looked up',\r\n 'lookup-failed': 'registry lookup failed',\r\n 'managed-externally': 'version is managed outside this repository',\r\n 'declaration-mismatch': 'version location is ambiguous',\r\n 'invalid-name': 'invalid package name',\r\n })[reason],\r\n },\r\n badges: {\r\n patch: '[Patch]',\r\n minor: '[Minor]',\r\n major: '[MAJOR]',\r\n dev: '(dev/test)',\r\n prod: '(prod/compile)',\r\n align: '[Align]',\r\n internal: '[Internal]',\r\n },\r\n status: {\r\n selectedOf: (selected, total) => `${selected} of ${total}`,\r\n breakdown: (patch, minor, major) => `(${patch} Patch, ${minor} Minor, ${major} Major)`,\r\n internalScopes: (scopes) => `🏢 Internal: ${scopes.join(', ')}`,\r\n noInternalScopes: '🏢 Workspace modules are aligned locally',\r\n },\r\n controls: {\r\n navigate: 'Navigate',\r\n toggle: 'Toggle',\r\n all: 'All',\r\n tabs: 'Tabs',\r\n workspace: 'Module',\r\n ecosystem: 'Ecosystem',\r\n version: 'Version',\r\n language: 'Language',\r\n update: 'Start update',\r\n quit: 'Quit',\r\n },\r\n versionModal: {\r\n title: (pkgName) => `Pick version for: ${pkgName}`,\r\n current: (version) => `Currently installed: ${version}`,\r\n filterPlaceholder: 'Type to filter (e.g. 3.2 or 18)…',\r\n loading: 'Loading all versions from registry…',\r\n noVersions: 'No matching versions found.',\r\n hint: '[↑/↓/j/k] Navigate │ [Enter] Select │ [Esc] Cancel │ [Backspace] Clear filter',\r\n latestBadge: 'LATEST',\r\n currentBadge: 'CURRENT',\r\n customBadge: 'MANUAL',\r\n },\r\n updating: {\r\n title: '⚡ Update in progress…',\r\n stepWriting: (step, total) => `${step}/${total} — Writing new versions to manifest…`,\r\n stepInstalling: (step, total) => `${step}/${total} — Resolving dependencies (please wait)…`,\r\n stepAnalyzing: (step, total) => `${step}/${total} — Analyzing build & output…`,\r\n stepCustom: (step, total, label) => `${step}/${total} — ${label}…`,\r\n doNotClose: 'Please do not close the terminal.',\r\n },\r\n summary: {\r\n title: '✨ Update completed successfully!',\r\n successCount: (count, path) => `📦 ${count} dependencies updated successfully in ${path}.`,\r\n securityAudit: '🛡️ Status & Audit:',\r\n cleanAudit: 'No known issues found.',\r\n funding: (msg) => `💡 Funding: ${msg}`,\r\n postScript: (label) => `🔍 ${label}:`,\r\n backHint: '[Enter] Back to Dashboard │ [Q] Quit',\r\n rolledBackTitle: '↩️ Update failed — all changes were rolled back',\r\n rolledBack: 'The repository is in the same state as before the update.',\r\n changedFiles: (files) => `📝 Changed: ${files.join(', ')}`,\r\n },\r\n mascot: {\r\n name: 'Pip',\r\n idleChirps: ['*chirp*', '*fluff*', '*peck peck*', 'all fresh! 🪶', '*blink*'],\r\n scanningChirps: ['*peeking*', 'checking...', 'ooh, updates?', 'just a sec!'],\r\n updatingChirps: ['*working hard*', 'building...', 'almost there!', 'packing modules...'],\r\n successChirps: ['hooray! 🎉', 'all updated!', 'looking sharp! 🪶', 'great job!'],\r\n mavenChirps: ['*sipping coffee* ☕', 'Spring Boot rocks!', 'Java 25 is fly!', 'clean build!'],\r\n },\r\n splash: {\r\n tagline: 'Modern Polyglot Dependency Dashboard',\r\n loading: 'Initializing modules & preparing dashboard…',\r\n skipHint: '[Space / Enter] to skip',\r\n },\r\n};\r\n","/**\r\n * 🪶 Elevate — useWorkspaces hook\r\n *\r\n * Loads the modules of the active ecosystem through its ModuleDiscoveryPort\r\n * and tracks which module is selected.\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport type { ProjectModule } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\n\r\nexport function useWorkspaces(strategy: EcosystemStrategy, rootDir: string) {\r\n const [modules, setModules] = useState<ProjectModule[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n // Reload modules whenever the ecosystem strategy changes.\r\n const reload = useCallback(async () => {\r\n setLoading(true);\r\n setModules([]);\r\n setActiveIndex(0);\r\n try {\r\n setModules(await strategy.discovery.discover(rootDir));\r\n } catch {\r\n setModules([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [strategy, rootDir]);\r\n\r\n useEffect(() => {\r\n reload();\r\n }, [reload]);\r\n\r\n const active: ProjectModule = modules[activeIndex] || {\r\n id: 'empty',\r\n name: 'No module found',\r\n path: rootDir,\r\n relPath: 'Root',\r\n ecosystem: strategy.ecosystem,\r\n isRoot: true,\r\n };\r\n\r\n return {\r\n modules,\r\n active,\r\n activeIndex,\r\n setActiveIndex,\r\n loading,\r\n reload,\r\n } as const;\r\n}\r\n","/**\r\n * 🪶 Elevate — usePackages hook\r\n *\r\n * Scans a module through the DependencyReaderPort of the active ecosystem\r\n * strategy and manages selection, filtering and tabs. Dependencies the scan\r\n * could not offer and scan errors are kept for display, so an empty list is\r\n * never mistaken for \"everything is up to date\".\r\n */\r\n\r\nimport { useState, useEffect, useMemo, useCallback, useRef } from 'react';\r\nimport semver from 'semver';\r\nimport type {\r\n UpdateCandidate,\r\n Tab,\r\n SelectionCounts,\r\n ProjectModule,\r\n ReleaseChannel,\r\n SkippedDependency,\r\n VersionDiff,\r\n} from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport { cleanJavaVersion, diffVersions, extractPreReleaseTag, isPreReleaseVersion, rangePrefix } from '../domain/versions.js';\r\nimport { createScanContext, scanModule } from '../application/scan.js';\r\n\r\nexport function usePackages(\r\n strategy: EcosystemStrategy,\r\n module: ProjectModule,\r\n modules: readonly ProjectModule[],\r\n config: Pick<ElevateConfig, 'rootDir' | 'internalScopes'>,\r\n channel: ReleaseChannel = 'stable',\r\n) {\r\n const [candidates, setCandidates] = useState<UpdateCandidate[]>([]);\r\n const [skipped, setSkipped] = useState<SkippedDependency[]>([]);\r\n const [error, setError] = useState<string | undefined>();\r\n const [loading, setLoading] = useState(false);\r\n const [activeTab, setActiveTab] = useState<Tab>('all');\r\n const [cursor, setCursor] = useState(0);\r\n // Only the latest scan may publish results; earlier ones may finish later.\r\n const scanGeneration = useRef(0);\r\n\r\n const scan = useCallback(async () => {\r\n const generation = ++scanGeneration.current;\r\n if (!module || module.id === 'empty') {\r\n setCandidates([]);\r\n setSkipped([]);\r\n return;\r\n }\r\n setLoading(true);\r\n setCursor(0);\r\n setCandidates([]);\r\n setSkipped([]);\r\n setError(undefined);\r\n\r\n const context = createScanContext(modules, config, channel);\r\n const result = await scanModule(strategy, module, context);\r\n if (generation !== scanGeneration.current) return;\r\n setCandidates(result.candidates);\r\n setSkipped(result.skipped);\r\n setError(result.error);\r\n setLoading(false);\r\n }, [strategy, module.path, module.id, modules, config.rootDir, config.internalScopes, channel]);\r\n\r\n useEffect(() => {\r\n if (module && module.id !== 'empty') {\r\n scan();\r\n }\r\n }, [module.path, module.id, strategy.ecosystem, channel, modules]);\r\n\r\n // Visible packages for the active tab.\r\n const visible = useMemo(() => {\r\n if (activeTab === 'prod') return candidates.filter((c) => c.scope === 'prod');\r\n if (activeTab === 'dev') return candidates.filter((c) => c.scope !== 'prod');\r\n return candidates;\r\n }, [candidates, activeTab]);\r\n\r\n const counts: SelectionCounts = useMemo(() => {\r\n const selected = candidates.filter((c) => c.selected);\r\n return {\r\n total: candidates.length,\r\n prodCount: candidates.filter((c) => c.scope === 'prod').length,\r\n devCount: candidates.filter((c) => c.scope !== 'prod').length,\r\n selectedCount: selected.length,\r\n patchCount: selected.filter((c) => c.diff === 'patch').length,\r\n minorCount: selected.filter((c) => c.diff === 'minor').length,\r\n majorCount: selected.filter((c) => c.diff === 'major').length,\r\n };\r\n }, [candidates]);\r\n\r\n const togglePackage = useCallback((identifier: string) => {\r\n setCandidates((prev) =>\r\n prev.map((c) => (c.coordinate.identifier === identifier ? { ...c, selected: !c.selected } : c)),\r\n );\r\n }, []);\r\n\r\n const toggleAllVisible = useCallback(() => {\r\n const allSelected = visible.every((c) => c.selected);\r\n const visibleIds = new Set(visible.map((c) => c.coordinate.identifier));\r\n setCandidates((prev) =>\r\n prev.map((c) => (visibleIds.has(c.coordinate.identifier) ? { ...c, selected: !allSelected } : c)),\r\n );\r\n }, [visible]);\r\n\r\n // Sets a manually picked target version for a dependency.\r\n const setCustomVersion = useCallback((identifier: string, chosenVersion: string) => {\r\n setCandidates((prev) =>\r\n prev.map((c) => {\r\n if (c.coordinate.identifier !== identifier) return c;\r\n\r\n const target = c.coordinate.ecosystem === 'maven' ? cleanJavaVersion(chosenVersion) : semver.valid(chosenVersion);\r\n let diff: VersionDiff = 'minor';\r\n if (c.currentClean && target && semver.valid(c.currentClean)) {\r\n diff = semver.eq(c.currentClean, target) ? 'patch' : diffVersions(c.currentClean, target);\r\n }\r\n\r\n const isPre = isPreReleaseVersion(chosenVersion);\r\n return {\r\n ...c,\r\n newRange: c.coordinate.ecosystem === 'npm' ? `${rangePrefix(c.currentRange)}${chosenVersion}` : chosenVersion,\r\n latest: chosenVersion,\r\n diff,\r\n selected: true,\r\n isPreRelease: isPre,\r\n preReleaseTag: isPre ? extractPreReleaseTag(chosenVersion) : undefined,\r\n isCustomVersion: true,\r\n };\r\n }),\r\n );\r\n }, []);\r\n\r\n const switchTab = useCallback((tab: Tab) => {\r\n setActiveTab(tab);\r\n setCursor(0);\r\n }, []);\r\n\r\n const cycleTab = useCallback(() => {\r\n setActiveTab((t) => (t === 'all' ? 'prod' : t === 'prod' ? 'dev' : 'all'));\r\n setCursor(0);\r\n }, []);\r\n\r\n return {\r\n packages: candidates,\r\n skipped,\r\n error,\r\n loading,\r\n visible,\r\n counts,\r\n activeTab,\r\n cursor,\r\n setCursor,\r\n scan,\r\n switchTab,\r\n cycleTab,\r\n togglePackage,\r\n toggleAllVisible,\r\n setCustomVersion,\r\n } as const;\r\n}\r\n","/**\r\n * Elevate — scan use case shared by the TUI, the CLI and the MCP server.\r\n */\r\n\r\nimport type { ElevateConfig } from '../config.js';\r\nimport type { ProjectModule, ReleaseChannel, ScanResult, UpdateCandidate } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ScanContext } from '../domain/ports.js';\r\nimport { buildWorkspaceIndex } from '../domain/origin.js';\r\n\r\n/** Builds the scan context for a set of discovered modules. */\r\nexport function createScanContext(\r\n modules: readonly ProjectModule[],\r\n config: Pick<ElevateConfig, 'rootDir' | 'internalScopes'>,\r\n channel: ReleaseChannel,\r\n): ScanContext {\r\n return {\r\n rootDir: config.rootDir,\r\n workspace: buildWorkspaceIndex(modules),\r\n internalScopes: config.internalScopes,\r\n channel,\r\n };\r\n}\r\n\r\n/**\r\n * Finds a module by id, relative path or path suffix (case-insensitive).\r\n * Returns undefined when nothing matches.\r\n */\r\nexport function findModule(modules: readonly ProjectModule[], query: string): ProjectModule | undefined {\r\n const needle = query.toLowerCase().replace(/\\\\/g, '/');\r\n return modules.find(\r\n (m) =>\r\n m.id.toLowerCase() === needle ||\r\n m.relPath.toLowerCase() === needle ||\r\n m.path.toLowerCase().replace(/\\\\/g, '/').endsWith(needle),\r\n );\r\n}\r\n\r\n/** Scans a module and converts unexpected errors into a readable message. */\r\nexport async function scanModule(\r\n strategy: EcosystemStrategy,\r\n module: ProjectModule,\r\n context: ScanContext,\r\n): Promise<ScanResult & { error?: string }> {\r\n try {\r\n return await strategy.reader.scan(module, context);\r\n } catch (err) {\r\n return { candidates: [], skipped: [], error: err instanceof Error ? err.message : String(err) };\r\n }\r\n}\r\n\r\n/**\r\n * Scans several modules, using the adapter's batch scan when it has one. If a\r\n * batch fails, every module of it reports the error.\r\n */\r\nexport async function scanModules(\r\n strategy: EcosystemStrategy,\r\n modules: readonly ProjectModule[],\r\n context: ScanContext,\r\n): Promise<Map<ProjectModule, ScanResult & { error?: string }>> {\r\n const results = new Map<ProjectModule, ScanResult & { error?: string }>();\r\n if (modules.length > 1 && strategy.reader.scanMany) {\r\n try {\r\n const batch = await strategy.reader.scanMany(modules, context);\r\n for (const module of modules) results.set(module, batch.get(module) ?? { candidates: [], skipped: [] });\r\n } catch (err) {\r\n const error = err instanceof Error ? err.message : String(err);\r\n for (const module of modules) results.set(module, { candidates: [], skipped: [], error });\r\n }\r\n return results;\r\n }\r\n for (const module of modules) results.set(module, await scanModule(strategy, module, context));\r\n return results;\r\n}\r\n\r\n/** JSON shape of a candidate for CLI and MCP output. */\r\nexport function candidateToJson(u: UpdateCandidate) {\r\n return {\r\n identifier: u.coordinate.identifier,\r\n action: u.action,\r\n origin: u.origin.kind,\r\n currentRange: u.currentRange,\r\n currentClean: u.currentClean,\r\n latest: u.latest,\r\n newRange: u.newRange,\r\n diff: u.diff,\r\n scope: u.scope,\r\n isPreRelease: u.isPreRelease ?? false,\r\n preReleaseTag: u.preReleaseTag,\r\n declaredIn: u.declaration\r\n ? { file: u.declaration.displayPath, kind: u.declaration.kind, property: u.declaration.propertyName }\r\n : undefined,\r\n sharedWith: u.sharedWith,\r\n };\r\n}\r\n","/**\r\n * 🪶 Elevate — useUpdater hook\r\n *\r\n * Runs the shared update workflow (write, install, integrity check,\r\n * verification, rollback on failure) and exposes progress and result.\r\n */\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport type { UpdateCandidate, UpdateSummary, View, ProjectModule } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport { runUpdateWorkflow } from '../application/update-workflow.js';\r\n\r\nexport interface PostUpdateOptions {\r\n script?: string;\r\n label?: string;\r\n}\r\n\r\nexport function useUpdater(\r\n strategy: EcosystemStrategy,\r\n rootDir: string,\r\n setView: (view: View) => void,\r\n postUpdate?: PostUpdateOptions,\r\n) {\r\n const [step, setStep] = useState('');\r\n const [summary, setSummary] = useState<UpdateSummary | null>(null);\r\n\r\n const run = useCallback(\r\n async (module: ProjectModule, selected: UpdateCandidate[]) => {\r\n if (selected.length === 0) return;\r\n\r\n setView('updating');\r\n let result: UpdateSummary;\r\n try {\r\n result = await runUpdateWorkflow(strategy, module, rootDir, selected, {\r\n postUpdateScript: postUpdate?.script,\r\n postUpdateLabel: postUpdate?.label,\r\n onProgress: setStep,\r\n });\r\n } catch (err) {\r\n // Only reachable before any file was written (e.g. a snapshot read error).\r\n result = {\r\n updatedCount: 0,\r\n auditMessage: 'Update did not start.',\r\n auditSeverity: 'warn',\r\n rolledBack: true,\r\n failure: err instanceof Error ? err.message : String(err),\r\n };\r\n }\r\n setSummary(result);\r\n setView('summary');\r\n },\r\n [strategy, rootDir, setView, postUpdate],\r\n );\r\n\r\n return { step, summary, run } as const;\r\n}\r\n","/**\r\n * Elevate — update workflow with rollback.\r\n *\r\n * snapshot → write & install → integrity check → verification\r\n *\r\n * If any step fails, every captured file is restored and the installed state\r\n * is re-synchronised, so a failed update leaves the repository as it was.\r\n *\r\n * Verification also runs once before the update. A check that already fails\r\n * beforehand says nothing about the update, so it does not trigger a rollback;\r\n * the summary reports it as a pre-existing failure instead.\r\n * `keepOnFailure` keeps the changes of a failed verification for manual\r\n * investigation; install and integrity failures are always rolled back,\r\n * because they leave the dependency tree in a state nobody chose.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { relative } from 'node:path';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ProjectModule, UpdateCandidate, UpdateSummary } from '../domain/models.js';\r\nimport { InstallError } from '../domain/ports.js';\r\nimport type { VerificationOptions, VerificationResult } from '../domain/ports.js';\r\nimport { FileSnapshot } from '../adapters/shared/file-snapshot.js';\r\n\r\nexport interface UpdateWorkflowOptions {\r\n postUpdateScript?: string;\r\n postUpdateLabel?: string;\r\n skipVerification?: boolean;\r\n /** Keep the changes when verification fails (default: roll back). */\r\n keepOnFailure?: boolean;\r\n onProgress?: (step: string) => void;\r\n}\r\n\r\nexport async function runUpdateWorkflow(\r\n strategy: EcosystemStrategy,\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n options: UpdateWorkflowOptions = {},\r\n): Promise<UpdateSummary> {\r\n const progress = options.onProgress ?? (() => {});\r\n const snapshot = FileSnapshot.capture(strategy.updater.affectedFiles(module, rootDir, updates));\r\n\r\n const rollback = async (failure: string, partial: Partial<UpdateSummary> = {}): Promise<UpdateSummary> => {\r\n progress('Rolling back all changes…');\r\n snapshot.restore();\r\n let resyncFailure = '';\r\n try {\r\n await strategy.updater.resync(module, rootDir, progress);\r\n } catch (err) {\r\n resyncFailure = `\\nRestoring the installed state failed as well: ${message(err)}`;\r\n }\r\n return {\r\n auditMessage: 'Update was rolled back.',\r\n ...partial,\r\n auditSeverity: 'warn',\r\n updatedCount: 0,\r\n changedFiles: [],\r\n rolledBack: true,\r\n failure: failure + resyncFailure,\r\n };\r\n };\r\n\r\n const verify = (changedFiles: string[]) =>\r\n safeVerify(strategy, module, rootDir, {\r\n customScript: options.postUpdateScript,\r\n customLabel: options.postUpdateLabel,\r\n changedFiles,\r\n });\r\n\r\n let baseline: VerificationResult | undefined;\r\n if (!options.skipVerification) {\r\n progress('Running verification on the current state…');\r\n baseline = await verify(snapshot.files.filter((file) => existsSync(file)));\r\n }\r\n\r\n let applied;\r\n try {\r\n applied = await strategy.updater.applyUpdates(module, rootDir, updates, progress);\r\n } catch (err) {\r\n const output = err instanceof InstallError && err.output ? `\\n${err.output}` : '';\r\n return rollback(`${message(err)}${output}`);\r\n }\r\n\r\n const { integrityViolations, ...outcome } = applied;\r\n if (integrityViolations.length > 0) {\r\n return rollback(`Integrity check failed:\\n${integrityViolations.map((v) => `• ${v}`).join('\\n')}`, outcome);\r\n }\r\n\r\n const changedFiles = snapshot.changedFiles();\r\n if (options.skipVerification) {\r\n return { ...outcome, changedFiles: displayPaths(changedFiles, rootDir) };\r\n }\r\n\r\n progress('Running verification…');\r\n const verification = await verify(changedFiles);\r\n const preExisting = verification.status === 'warn' && baseline?.status === 'warn';\r\n\r\n const summary: UpdateSummary = {\r\n ...outcome,\r\n verificationStatus: verification.status,\r\n verificationDetails: preExisting\r\n ? `Verification already failed before the update; the update was kept.\\n${verification.details}`\r\n : verification.details,\r\n verificationLabel: verification.label,\r\n changedFiles: displayPaths(changedFiles, rootDir),\r\n };\r\n\r\n if (verification.status === 'warn' && !preExisting && !options.keepOnFailure) {\r\n return rollback(`Verification failed: ${verification.label}`, summary);\r\n }\r\n return summary;\r\n}\r\n\r\n/** Runs verification; an exception counts as a failed verification instead of escaping the workflow. */\r\nasync function safeVerify(\r\n strategy: EcosystemStrategy,\r\n module: ProjectModule,\r\n rootDir: string,\r\n options: VerificationOptions,\r\n): Promise<VerificationResult> {\r\n try {\r\n return await strategy.verifier.verify(module, rootDir, options);\r\n } catch (err) {\r\n return { status: 'warn', details: message(err), label: options.customLabel || 'Verification' };\r\n }\r\n}\r\n\r\nfunction message(err: unknown): string {\r\n return err instanceof Error ? err.message : String(err);\r\n}\r\n\r\nfunction displayPaths(files: string[], rootDir: string): string[] {\r\n return files.map((file) => relative(rootDir, file).replace(/\\\\/g, '/'));\r\n}\r\n","/**\r\n * Elevate — file snapshots for rollback.\r\n *\r\n * Captures the exact bytes of every file an update may touch, including the\r\n * fact that a file did not exist yet, so a failed update can be undone\r\n * completely.\r\n */\r\n\r\nimport { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\r\n\r\nexport class FileSnapshot {\r\n private constructor(private readonly entries: ReadonlyMap<string, Buffer | null>) {}\r\n\r\n /** Records the current content (or absence) of each file. */\r\n static capture(files: Iterable<string>): FileSnapshot {\r\n const entries = new Map<string, Buffer | null>();\r\n for (const file of files) {\r\n if (entries.has(file)) continue;\r\n entries.set(file, existsSync(file) ? readFileSync(file) : null);\r\n }\r\n return new FileSnapshot(entries);\r\n }\r\n\r\n /** The files covered by this snapshot. */\r\n get files(): string[] {\r\n return [...this.entries.keys()];\r\n }\r\n\r\n /** Files whose content differs from the snapshot. */\r\n changedFiles(): string[] {\r\n return this.files.filter((file) => {\r\n const before = this.entries.get(file) ?? null;\r\n const exists = existsSync(file);\r\n if (before === null) return exists;\r\n return !exists || !readFileSync(file).equals(before);\r\n });\r\n }\r\n\r\n /** Writes every file back to its captured state; removes files that did not exist. */\r\n restore(): void {\r\n for (const [file, content] of this.entries) {\r\n if (content === null) {\r\n rmSync(file, { force: true });\r\n } else {\r\n writeFileSync(file, content);\r\n }\r\n }\r\n }\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport { en } from '../i18n/locales/en.js';\r\n\r\ninterface Props {\r\n onComplete: () => void;\r\n author?: string;\r\n}\r\n\r\n/**\r\n * 🪶 Elevate — initial splash screen\r\n *\r\n * Shows an intro with the mascot Pip, a progress bar and author\r\n * information. The splash screen is deliberately always in English.\r\n * Switches to the dashboard after ~3.2 seconds or on a key press.\r\n */\r\nexport const SplashScreen: React.FC<Props> = ({ onComplete, author }) => {\r\n const t = en;\r\n\r\n const [progress, setProgress] = useState(0);\r\n const [frame, setFrame] = useState(0);\r\n\r\n // Animation and progress timer\r\n useEffect(() => {\r\n const progressTimer = setInterval(() => {\r\n setProgress((prev) => {\r\n if (prev >= 100) {\r\n clearInterval(progressTimer);\r\n setTimeout(onComplete, 250);\r\n return 100;\r\n }\r\n return prev + 5;\r\n });\r\n }, 150);\r\n\r\n const mascotTimer = setInterval(() => {\r\n setFrame((prev) => (prev + 1) % 4);\r\n }, 400);\r\n\r\n return () => {\r\n clearInterval(progressTimer);\r\n clearInterval(mascotTimer);\r\n };\r\n }, [onComplete]);\r\n\r\n // Mascot animation frames for the splash screen (always English chirps)\r\n const mascotFrames = [\r\n { face: '( •ө• )', arms: '/ >🪶', chirp: '*chirp!*' },\r\n { face: '( ᵔөᵔ )', arms: '/ >🪶', chirp: '*hello!*' },\r\n { face: '( -ө- )', arms: '/ >🪶', chirp: '*blink*' },\r\n { face: '( •ө• )', arms: '\\\\(•ө•)/', chirp: 'ready! ✨' },\r\n ];\r\n const curMascot = mascotFrames[frame % mascotFrames.length]!;\r\n\r\n // 24-segment progress bar\r\n const barLength = 24;\r\n const filledLength = Math.round((progress / 100) * barLength);\r\n const emptyLength = Math.max(0, barLength - filledLength);\r\n const progressBar = '█'.repeat(filledLength) + '░'.repeat(emptyLength);\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n alignItems=\"center\"\r\n justifyContent=\"center\"\r\n borderStyle=\"round\"\r\n borderColor={theme.colors.brand}\r\n paddingY={2}\r\n paddingX={4}\r\n marginY={1}\r\n >\r\n {/* 1. Title and icon */}\r\n <Box marginBottom={1}>\r\n <Text bold color={theme.colors.brand}>\r\n {theme.icon} E L E V A T E\r\n </Text>\r\n </Box>\r\n\r\n <Text color={theme.colors.muted}>{t.splash.tagline}</Text>\r\n\r\n {/* 2. Large centred mascot */}\r\n <Box flexDirection=\"column\" alignItems=\"center\" marginY={1}>\r\n <Text color={theme.colors.mascotComb} bold>\r\n (\\_/)\r\n </Text>\r\n <Box>\r\n <Text color={theme.colors.mascotBody} bold>\r\n {curMascot.face}{' '}\r\n </Text>\r\n <Text color={theme.colors.brandLight} italic>\r\n {curMascot.chirp}\r\n </Text>\r\n </Box>\r\n <Text color={theme.colors.brandLight} bold>\r\n {curMascot.arms}\r\n </Text>\r\n </Box>\r\n\r\n {/* 3. Author note */}\r\n {author && (\r\n <Box marginBottom={1}>\r\n <Text color={theme.colors.muted}>{t.header.developedBy(author)}</Text>\r\n </Box>\r\n )}\r\n\r\n {/* 4. Progress bar */}\r\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\r\n <Box>\r\n <Text color={theme.colors.brandLight} bold>\r\n [{progressBar}] {Math.min(100, progress)}%\r\n </Text>\r\n </Box>\r\n <Box marginTop={1}>\r\n <Text color={theme.colors.muted}>{t.splash.loading}</Text>\r\n </Box>\r\n </Box>\r\n\r\n {/* 5. Skip hint */}\r\n <Box marginTop={1}>\r\n <Text color={theme.colors.muted} dimColor>\r\n {t.splash.skipHint}\r\n </Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","/**\r\n * 🪶 Elevate — Theme & Brand Tokens\r\n *\r\n * Brand colour: orange\r\n * Symbol: feather (🪶)\r\n */\r\n\r\nexport const theme = {\r\n icon: '🪶',\r\n colors: {\r\n // Brand and accents (orange palette)\r\n brand: '#FF8800',\r\n brandLight: '#FFA726',\r\n brandDark: '#E65100',\r\n brandSoft: '#FFE0B2',\r\n accent: '#FF9800',\r\n\r\n // Mascot\r\n mascotBody: '#FFD54F',\r\n mascotComb: '#FF7043',\r\n mascotBeak: '#FF9800',\r\n mascotBlush: '#FF8A80',\r\n mascotFeet: '#FFA726',\r\n\r\n // Status colours\r\n success: 'green',\r\n warning: 'yellow',\r\n danger: 'red',\r\n muted: 'gray',\r\n white: 'white',\r\n\r\n // UI elements\r\n border: '#FF8800',\r\n borderMuted: 'gray',\r\n focus: '#FFA726',\r\n },\r\n} as const;\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ReleaseChannel } from '../domain/models.js';\r\n\r\ninterface Props {\r\n author?: string;\r\n t: Translations;\r\n currentLocale: string;\r\n strategy: EcosystemStrategy;\r\n nextStrategyName: string;\r\n channel: ReleaseChannel;\r\n}\r\n\r\n/** Header with active ecosystem, release channel, language and author. */\r\nexport const Header: React.FC<Props> = ({\r\n author,\r\n t,\r\n currentLocale,\r\n strategy,\r\n nextStrategyName,\r\n channel,\r\n}) => (\r\n <Box\r\n borderStyle=\"round\"\r\n borderColor={theme.colors.brand}\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n >\r\n {/* Left: logo, ecosystem and channel */}\r\n <Box alignItems=\"center\">\r\n <Text bold color={theme.colors.brand}>\r\n {theme.icon} {t.header.title}\r\n </Text>\r\n\r\n {/* Active ecosystem and channel */}\r\n <Box marginLeft={2}>\r\n <Text color={theme.colors.muted}>│ </Text>\r\n <Text color={theme.colors.brandLight} bold>\r\n {strategy.icon} {strategy.displayName}\r\n </Text>\r\n <Text color={theme.colors.muted}> [{channel}] </Text>\r\n <Text color={theme.colors.muted}>\r\n ({t.header.ecosystemToggleHint(nextStrategyName)})\r\n </Text>\r\n </Box>\r\n\r\n {/* Language */}\r\n <Box marginLeft={2}>\r\n <Text color={theme.colors.muted}>│ </Text>\r\n <Text color={theme.colors.brandLight} bold>\r\n [{currentLocale.toUpperCase()}]\r\n </Text>\r\n <Text color={theme.colors.muted}> {t.header.langToggleHint}</Text>\r\n </Box>\r\n </Box>\r\n\r\n {/* Right: maintainer */}\r\n {author && (\r\n <Text color={theme.colors.muted}>\r\n {t.header.developedBy(author)}\r\n </Text>\r\n )}\r\n </Box>\r\n);\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { ProjectModule } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { Translations } from '../i18n/types.js';\r\n\r\ninterface Props {\r\n module: ProjectModule;\r\n internalScopes: string[];\r\n strategy: EcosystemStrategy;\r\n t: Translations;\r\n}\r\n\r\n/** Shows the active module and the configured internal scopes. */\r\nexport const WorkspaceBar: React.FC<Props> = ({ module, internalScopes, strategy, t }) => {\r\n const scopeHint =\r\n internalScopes.length > 0 ? t.status.internalScopes(internalScopes) : t.status.noInternalScopes;\r\n\r\n return (\r\n <Box marginY={1} justifyContent=\"space-between\" alignItems=\"center\">\r\n <Box alignItems=\"center\" flexShrink={1}>\r\n <Text bold>📍 {strategy.icon} {t.workspace.label}: </Text>\r\n <Text bold color={theme.colors.brandLight}>\r\n {module.name}\r\n </Text>\r\n <Text color={theme.colors.muted}> ({module.relPath})</Text>\r\n </Box>\r\n <Box alignItems=\"center\" marginLeft={2}>\r\n <Text color={theme.colors.muted}>{scopeHint}</Text>\r\n <Text color={theme.colors.muted}> │ </Text>\r\n <Text color={theme.colors.brandLight} bold>[W]</Text>\r\n <Text color={theme.colors.muted}> {t.workspace.switchHint.replace('[W]', '').trim()}</Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { Tab, SelectionCounts } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { Translations } from '../i18n/types.js';\r\n\r\ninterface Props {\r\n activeTab: Tab;\r\n counts: SelectionCounts;\r\n strategy: EcosystemStrategy;\r\n t: Translations;\r\n}\r\n\r\n/** Tab bar; the labels come from the active ecosystem. */\r\nexport const TabBar: React.FC<Props> = ({ activeTab, counts, strategy, t }) => {\r\n const labels = strategy.getTabLabels(counts, t);\r\n\r\n return (\r\n <Box borderStyle=\"single\" borderColor={theme.colors.borderMuted} paddingX={1}>\r\n <Text\r\n bold\r\n color={activeTab === 'all' ? theme.colors.brand : theme.colors.white}\r\n underline={activeTab === 'all'}\r\n >\r\n {labels.all}\r\n </Text>\r\n <Text color={theme.colors.muted}> │ </Text>\r\n <Text\r\n bold\r\n color={activeTab === 'prod' ? theme.colors.brand : theme.colors.white}\r\n underline={activeTab === 'prod'}\r\n >\r\n {labels.prod}\r\n </Text>\r\n <Text color={theme.colors.muted}> │ </Text>\r\n <Text\r\n bold\r\n color={activeTab === 'dev' ? theme.colors.brand : theme.colors.white}\r\n underline={activeTab === 'dev'}\r\n >\r\n {labels.dev}\r\n </Text>\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { SkippedDependency, UpdateCandidate } from '../domain/models.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport { PackageRow } from './package-row.js';\r\n\r\ninterface Props {\r\n items: UpdateCandidate[];\r\n cursor: number;\r\n loading: boolean;\r\n /** Scan error; replaces the list so a failure is never shown as \"up to date\". */\r\n error?: string;\r\n /** Dependencies the scan could not offer, shown below the list. */\r\n skipped: SkippedDependency[];\r\n t: Translations;\r\n}\r\n\r\nconst WINDOW_SIZE = 7;\r\nconst MAX_SKIPPED_SHOWN = 3;\r\n\r\n/** Scrollable package list showing a window around the cursor. */\r\nexport const PackageList: React.FC<Props> = ({ items, cursor, loading, error, skipped, t }) => {\r\n const startIdx = Math.max(\r\n 0,\r\n Math.min(\r\n cursor - Math.floor(WINDOW_SIZE / 2),\r\n Math.max(0, items.length - WINDOW_SIZE),\r\n ),\r\n );\r\n const window = items.slice(startIdx, startIdx + WINDOW_SIZE);\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor={theme.colors.border}\r\n padding={1}\r\n marginY={1}\r\n minHeight={10}\r\n >\r\n {loading ? (\r\n <Box marginY={2} justifyContent=\"center\">\r\n <Text color={theme.colors.warning}>{t.list.scanning}</Text>\r\n </Box>\r\n ) : error ? (\r\n <Box marginY={1} flexDirection=\"column\">\r\n <Text color={theme.colors.danger}>{t.list.scanFailed(error.split('\\n')[0] ?? '')}</Text>\r\n {error\r\n .split('\\n')\r\n .slice(1, 6)\r\n .map((line, idx) => (\r\n <Text key={idx} color={theme.colors.muted}>\r\n {' '}\r\n {line}\r\n </Text>\r\n ))}\r\n </Box>\r\n ) : items.length === 0 ? (\r\n <Box marginY={2} justifyContent=\"center\">\r\n <Text color={theme.colors.success}>{t.list.allUpToDate}</Text>\r\n </Box>\r\n ) : (\r\n <>\r\n {startIdx > 0 && <Text color={theme.colors.muted}>{t.list.moreAbove}</Text>}\r\n {window.map((item, idx) => (\r\n <PackageRow\r\n key={`${item.coordinate.identifier}_${startIdx + idx}`}\r\n item={item}\r\n isFocused={startIdx + idx === cursor}\r\n t={t}\r\n />\r\n ))}\r\n {startIdx + WINDOW_SIZE < items.length && (\r\n <Text color={theme.colors.muted}>{t.list.moreBelow(items.length - (startIdx + WINDOW_SIZE))}</Text>\r\n )}\r\n </>\r\n )}\r\n\r\n {!loading && !error && skipped.length > 0 && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text color={theme.colors.warning}>{t.list.skippedHeading(skipped.length)}</Text>\r\n {skipped.slice(0, MAX_SKIPPED_SHOWN).map((s) => (\r\n <Text key={s.identifier} color={theme.colors.muted}>\r\n {' '}• {s.identifier}: {t.list.skipReason(s.reason)}\r\n </Text>\r\n ))}\r\n {skipped.length > MAX_SKIPPED_SHOWN && (\r\n <Text color={theme.colors.muted}>{' '}…</Text>\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { UpdateCandidate } from '../domain/models.js';\r\nimport type { Translations } from '../i18n/types.js';\r\n\r\ninterface Props {\r\n item: UpdateCandidate;\r\n isFocused: boolean;\r\n t: Translations;\r\n}\r\n\r\n/** One row of the package list with checkbox, versions and badges. */\r\nexport const PackageRow: React.FC<Props> = ({ item, isFocused, t }) => {\r\n const badge =\r\n item.diff === 'major' ? (\r\n <Text bold color={theme.colors.danger}>{t.badges.major}</Text>\r\n ) : item.diff === 'minor' ? (\r\n <Text color={theme.colors.warning}>{t.badges.minor}</Text>\r\n ) : (\r\n <Text color={theme.colors.success}>{t.badges.patch}</Text>\r\n );\r\n\r\n const displayName = item.coordinate.identifier;\r\n const isDevOrTest = item.scope === 'dev' || item.scope === 'test';\r\n const property = item.declaration?.kind === 'property' ? `\\${${item.declaration.propertyName}}` : undefined;\r\n\r\n return (\r\n <Box justifyContent=\"space-between\">\r\n <Box>\r\n <Text color={theme.colors.brandLight} bold>\r\n {isFocused ? '➔ ' : ' '}\r\n </Text>\r\n <Text color={item.selected ? theme.colors.success : theme.colors.muted} bold>\r\n {item.selected ? '[✔] ' : '[ ] '}\r\n </Text>\r\n <Text bold={isFocused} color={isFocused ? theme.colors.brandLight : theme.colors.white}>\r\n {displayName.slice(0, 42).padEnd(42)}{' '}\r\n </Text>\r\n <Text color={theme.colors.muted}>{item.currentRange.padEnd(12)} </Text>\r\n <Text color={theme.colors.muted}>➔ </Text>\r\n <Text bold color={theme.colors.white}>\r\n {item.newRange.padEnd(12)}{' '}\r\n </Text>\r\n </Box>\r\n <Box>\r\n {property && <Text color={theme.colors.muted}>{property} </Text>}\r\n {item.action === 'align' && (\r\n <Text bold color={theme.colors.brandLight}>\r\n {t.badges.align}{' '}\r\n </Text>\r\n )}\r\n {item.origin.kind === 'private' && (\r\n <Text color={theme.colors.brandLight}>{t.badges.internal} </Text>\r\n )}\r\n {item.isCustomVersion && (\r\n <Text bold color={theme.colors.brandLight}>\r\n [{t.versionModal.customBadge}]{' '}\r\n </Text>\r\n )}\r\n {item.isPreRelease && (\r\n <Text bold color=\"#E040FB\">\r\n [{item.preReleaseTag || 'PRE'}]{' '}\r\n </Text>\r\n )}\r\n {badge}\r\n <Text color={theme.colors.muted}> {isDevOrTest ? t.badges.dev : t.badges.prod}</Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { SelectionCounts, Ecosystem } from '../domain/models.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport { ChickenMascot, type MascotState } from './mascot.js';\r\n\r\ninterface Props {\r\n counts: SelectionCounts;\r\n visibleCount: number;\r\n t: Translations;\r\n mascotState?: MascotState;\r\n ecosystem?: Ecosystem;\r\n}\r\n\r\n/** Status bar: counters on the left, mascot on the right. */\r\nexport const StatusBar: React.FC<Props> = ({\r\n counts,\r\n visibleCount,\r\n t,\r\n mascotState = 'idle',\r\n ecosystem = 'npm',\r\n}) => {\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor={theme.colors.borderMuted}\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n >\r\n {/* Left: counters (pinned to the left edge) */}\r\n <Box>\r\n <Text bold>{t.status.selectedOf(counts.selectedCount, visibleCount)} </Text>\r\n <Text color={theme.colors.muted}>\r\n {t.status.breakdown(counts.patchCount, counts.minorCount, counts.majorCount)}\r\n </Text>\r\n </Box>\r\n\r\n {/* Right: animated mascot */}\r\n <ChickenMascot state={mascotState} t={t} ecosystem={ecosystem} />\r\n </Box>\r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport type { Ecosystem } from '../domain/models.js';\r\n\r\nexport type MascotState = 'idle' | 'scanning' | 'updating' | 'success';\r\n\r\ninterface Props {\r\n state?: MascotState;\r\n t: Translations;\r\n ecosystem?: Ecosystem;\r\n}\r\n\r\n/**\r\n * 🐣 Animated chick mascot (\"Pip\")\r\n *\r\n * Inspired by the small animated companion in the Claude Code CLI.\r\n * Blinks, changes expression and chirps according to the current\r\n * state and the selected ecosystem (Node vs. Java).\r\n */\r\nexport const ChickenMascot: React.FC<Props> = ({ state = 'idle', t, ecosystem = 'npm' }) => {\r\n const [frame, setFrame] = useState(0);\r\n const [chirpIndex, setChirpIndex] = useState(0);\r\n\r\n // Animation timer (a new frame every 1.4 seconds)\r\n useEffect(() => {\r\n const timer = setInterval(() => {\r\n setFrame((prev) => (prev + 1) % 6);\r\n }, 1400);\r\n\r\n return () => clearInterval(timer);\r\n }, []);\r\n\r\n // Speech bubble timer (new text every 4.2 seconds)\r\n useEffect(() => {\r\n const chirpTimer = setInterval(() => {\r\n setChirpIndex((prev) => prev + 1);\r\n }, 4200);\r\n\r\n return () => clearInterval(chirpTimer);\r\n }, []);\r\n\r\n // Expression depending on state and frame\r\n let chickFace = '( •ө• )';\r\n let wingLeft = ' ';\r\n let wingRight = ' ';\r\n let currentChirp = '';\r\n\r\n if (state === 'scanning') {\r\n const scanningFaces = ['( •ө• )?', '( ˘ө˘ )🔍', '( •ө• )🔎', '( ᵔөᵔ )?'];\r\n chickFace = scanningFaces[frame % scanningFaces.length]!;\r\n currentChirp = t.mascot.scanningChirps[chirpIndex % t.mascot.scanningChirps.length]!;\r\n } else if (state === 'updating') {\r\n const updatingFrames = [\r\n { face: '( •ө• )', l: 'ง', r: 'ง' },\r\n { face: '( ˘ө˘ )', l: '~', r: '~' },\r\n { face: '( •ө• )', l: 'ᕙ', r: 'ᕗ' },\r\n { face: '( ᵔөᵔ )', l: 'ง', r: 'ง' },\r\n ];\r\n const cur = updatingFrames[frame % updatingFrames.length]!;\r\n chickFace = cur.face;\r\n wingLeft = cur.l;\r\n wingRight = cur.r;\r\n currentChirp = t.mascot.updatingChirps[chirpIndex % t.mascot.updatingChirps.length]!;\r\n } else if (state === 'success') {\r\n const successFaces = ['\\\\( ᵔөᵔ )/', '\\\\( •ө• )/ 🎉', '*( ᵔөᵔ )* 🪶', '\\\\( ᵔөᵔ )/ ✨'];\r\n chickFace = successFaces[frame % successFaces.length]!;\r\n currentChirp = t.mascot.successChirps[chirpIndex % t.mascot.successChirps.length]!;\r\n } else {\r\n // Idle state: subtle blinking and bobbing\r\n const idleFaces = [\r\n { face: '( •ө• )', l: ' ', r: ' ' },\r\n { face: '( •ө• )', l: ' ', r: ' ' },\r\n { face: '( -ө- )', l: ' ', r: ' ' }, // Blinzeln\r\n { face: '( ᵔөᵔ )', l: ' ', r: ' ' }, // Lächeln\r\n { face: '( •ө- )', l: ' ', r: ' ' }, // Zwinkern\r\n { face: '( ˘ө˘ )', l: ' ', r: '~🪶' }, // Flausch-Feder\r\n ];\r\n const cur = idleFaces[frame % idleFaces.length]!;\r\n chickFace = cur.face;\r\n wingLeft = cur.l;\r\n wingRight = cur.r;\r\n\r\n const chirpsPool =\r\n ecosystem === 'maven'\r\n ? [...t.mascot.idleChirps, ...t.mascot.mavenChirps]\r\n : t.mascot.idleChirps;\r\n\r\n currentChirp = chirpsPool[chirpIndex % chirpsPool.length]!;\r\n }\r\n\r\n return (\r\n <Box alignItems=\"center\">\r\n {/* Comb */}\r\n <Text color={theme.colors.mascotComb} bold>\r\n {wingLeft === ' ' ? ' ' : wingLeft}\r\n </Text>\r\n\r\n {/* Body and beak */}\r\n <Text color={theme.colors.mascotBody} bold>\r\n {chickFace}\r\n </Text>\r\n\r\n {/* Right wing / feather */}\r\n <Text color={theme.colors.brandLight} bold>\r\n {wingRight}\r\n </Text>\r\n\r\n {/* Small speech bubble / chirp */}\r\n {currentChirp ? (\r\n <Box marginLeft={1}>\r\n <Text color={theme.colors.brandLight} italic>\r\n {currentChirp}\r\n </Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { Translations } from '../i18n/types.js';\r\n\r\ninterface Props {\r\n t: Translations;\r\n}\r\n\r\n/** Keyboard shortcut bar, including [E] to switch ecosystems. */\r\nexport const ControlsBar: React.FC<Props> = ({ t }) => (\r\n <Box marginTop={1} flexWrap=\"wrap\">\r\n <Text color={theme.colors.brandLight} bold>[↑/↓]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.navigate} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[Space]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.toggle} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[A]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.all} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[Tab/1/2/3]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.tabs} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[W]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.workspace} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[V]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.version} │ </Text>\r\n\r\n <Text color={theme.colors.brand} bold>[E]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.ecosystem} │ </Text>\r\n\r\n <Text color={theme.colors.brandLight} bold>[L]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.language} │ </Text>\r\n\r\n <Text color={theme.colors.success} bold>[U]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.update} │ </Text>\r\n\r\n <Text color={theme.colors.danger} bold>[Q]</Text>\r\n <Text color={theme.colors.muted}> {t.controls.quit}</Text>\r\n </Box>\r\n);\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { ProjectModule } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { Translations } from '../i18n/types.js';\r\n\r\ninterface Props {\r\n modules: ProjectModule[];\r\n focusedIndex: number;\r\n strategy: EcosystemStrategy;\r\n t: Translations;\r\n}\r\n\r\n/** Modal module selector for the active ecosystem. */\r\nexport const WorkspaceModal: React.FC<Props> = ({ modules, focusedIndex, strategy, t }) => (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor={theme.colors.brand}\r\n padding={1}\r\n marginY={1}\r\n >\r\n <Text bold color={theme.colors.brandLight}>\r\n {strategy.icon} {t.workspace.modalTitle}\r\n </Text>\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n {modules.map((m, idx) => (\r\n <Box key={m.path}>\r\n <Text\r\n color={idx === focusedIndex ? theme.colors.brandLight : theme.colors.white}\r\n bold={idx === focusedIndex}\r\n >\r\n {idx === focusedIndex ? ' ➔ ' : ' '}\r\n {m.name.slice(0, 48).padEnd(48)}\r\n </Text>\r\n <Text color={theme.colors.muted}>({m.relPath})</Text>\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n);\r\n","/**\r\n * 🪶 Elevate — version picker modal\r\n *\r\n * Lets the user search and pick any target version for a dependency.\r\n */\r\n\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { UpdateCandidate } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../domain/versions.js';\r\nimport { lookupVersions } from '../application/version-lookup.js';\r\nimport type { ElevateConfig } from '../config.js';\r\n\r\ninterface Props {\r\n candidate: UpdateCandidate;\r\n strategy: EcosystemStrategy;\r\n config: Pick<ElevateConfig, 'rootDir' | 'internalScopes'>;\r\n t: Translations;\r\n onSelect: (version: string) => void;\r\n onCancel: () => void;\r\n}\r\n\r\nconst WINDOW_SIZE = 8;\r\n\r\nexport const VersionModal: React.FC<Props> = ({\r\n candidate,\r\n strategy,\r\n config,\r\n t,\r\n onSelect,\r\n onCancel,\r\n}) => {\r\n const [allVersions, setAllVersions] = useState<string[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [filterText, setFilterText] = useState('');\r\n const [cursor, setCursor] = useState(0);\r\n\r\n // Load all available versions\r\n useEffect(() => {\r\n let active = true;\r\n setLoading(true);\r\n\r\n // Versions delivered by the scan (Maven reports, workspace alignment) are\r\n // used as-is; otherwise the registry is asked, with the same guard against\r\n // public lookups of internal packages as everywhere else.\r\n const pending = candidate.availableVersions\r\n ? Promise.resolve(candidate.availableVersions)\r\n : lookupVersions(strategy, candidate.coordinate, config);\r\n\r\n pending\r\n .then((versions) => {\r\n if (!active) return;\r\n setAllVersions(versions);\r\n // Start at the newest version\r\n setCursor(0);\r\n })\r\n .catch(() => {\r\n if (!active) return;\r\n setAllVersions([]);\r\n })\r\n .finally(() => {\r\n if (active) setLoading(false);\r\n });\r\n\r\n return () => {\r\n active = false;\r\n };\r\n }, [strategy, candidate, config]);\r\n\r\n // Versions matching the filter text\r\n const filtered = useMemo(() => {\r\n if (!filterText.trim()) return allVersions;\r\n const lower = filterText.toLowerCase();\r\n return allVersions.filter((v) => v.toLowerCase().includes(lower));\r\n }, [allVersions, filterText]);\r\n\r\n // Keyboard input for filtering and navigation\r\n useInput((input, key) => {\r\n if (key.escape) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n if (key.return) {\r\n if (filtered.length > 0 && cursor >= 0 && cursor < filtered.length) {\r\n onSelect(filtered[cursor]!);\r\n }\r\n return;\r\n }\r\n\r\n if (key.upArrow || (input === 'k' && filterText === '')) {\r\n setCursor((prev) => Math.max(0, prev - 1));\r\n return;\r\n }\r\n\r\n if (key.downArrow || (input === 'j' && filterText === '')) {\r\n setCursor((prev) => Math.min(filtered.length - 1, prev + 1));\r\n return;\r\n }\r\n\r\n if (key.pageUp) {\r\n setCursor((prev) => Math.max(0, prev - 5));\r\n return;\r\n }\r\n\r\n if (key.pageDown) {\r\n setCursor((prev) => Math.min(filtered.length - 1, prev + 5));\r\n return;\r\n }\r\n\r\n if (key.backspace || key.delete) {\r\n setFilterText((prev) => prev.slice(0, -1));\r\n setCursor(0);\r\n return;\r\n }\r\n\r\n // With an empty filter, 'q' closes the modal\r\n if (input === 'q' && filterText === '') {\r\n onCancel();\r\n return;\r\n }\r\n\r\n // Append filter characters (digits, letters, dots, hyphens)\r\n if (input && !key.ctrl && !key.meta && /^[\\w.\\-+~]$/.test(input)) {\r\n setFilterText((prev) => prev + input);\r\n setCursor(0);\r\n }\r\n });\r\n\r\n // Visible window for scrolling\r\n const startIdx = Math.max(\r\n 0,\r\n Math.min(\r\n cursor - Math.floor(WINDOW_SIZE / 2),\r\n Math.max(0, filtered.length - WINDOW_SIZE),\r\n ),\r\n );\r\n const windowed = filtered.slice(startIdx, startIdx + WINDOW_SIZE);\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"round\"\r\n borderColor={theme.colors.brand}\r\n padding={1}\r\n marginY={1}\r\n >\r\n {/* 1. Header and package name */}\r\n <Box justifyContent=\"space-between\" marginBottom={1}>\r\n <Text bold color={theme.colors.brandLight}>\r\n {theme.icon} {t.versionModal.title(candidate.coordinate.identifier)}\r\n </Text>\r\n <Text color={theme.colors.muted}>\r\n {t.versionModal.current(candidate.currentRange)}\r\n </Text>\r\n </Box>\r\n\r\n {/* 2. Filter field */}\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor={theme.colors.border}\r\n paddingX={1}\r\n marginBottom={1}\r\n >\r\n <Text bold color={theme.colors.white}>\r\n Filter:{' '}\r\n </Text>\r\n <Text color={filterText ? theme.colors.brandLight : theme.colors.muted}>\r\n {filterText || t.versionModal.filterPlaceholder}\r\n </Text>\r\n {filterText ? (\r\n <Text color={theme.colors.brandLight} bold>\r\n _\r\n </Text>\r\n ) : null}\r\n {filterText ? (\r\n <Box marginLeft={2}>\r\n <Text color={theme.colors.muted}>\r\n ({filtered.length} Treffer)\r\n </Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n\r\n {/* 3. Version list */}\r\n {loading ? (\r\n <Box marginY={2} justifyContent=\"center\">\r\n <Text color={theme.colors.warning}>⏳ {t.versionModal.loading}</Text>\r\n </Box>\r\n ) : filtered.length === 0 ? (\r\n <Box marginY={2} justifyContent=\"center\">\r\n <Text color={theme.colors.danger}>\r\n ❌ {t.versionModal.noVersions}\r\n </Text>\r\n </Box>\r\n ) : (\r\n <Box flexDirection=\"column\">\r\n {startIdx > 0 && (\r\n <Text color={theme.colors.muted}>\r\n ▲ … {startIdx} weitere oben\r\n </Text>\r\n )}\r\n\r\n {windowed.map((ver, idx) => {\r\n const actualIdx = startIdx + idx;\r\n const isFocused = actualIdx === cursor;\r\n const isLatest = ver === candidate.latest;\r\n const isCurrent = ver === candidate.currentClean;\r\n const isPre = isPreReleaseVersion(ver);\r\n const preTag = isPre ? extractPreReleaseTag(ver) : undefined;\r\n\r\n return (\r\n <Box key={ver} justifyContent=\"space-between\">\r\n <Box>\r\n <Text\r\n color={\r\n isFocused ? theme.colors.brandLight : theme.colors.muted\r\n }\r\n bold={isFocused}\r\n >\r\n {isFocused ? ' ➔ ' : ' '}\r\n </Text>\r\n <Text\r\n bold={isFocused}\r\n color={\r\n isFocused\r\n ? theme.colors.brandLight\r\n : isCurrent\r\n ? theme.colors.muted\r\n : theme.colors.white\r\n }\r\n >\r\n {ver.padEnd(28)}\r\n </Text>\r\n </Box>\r\n\r\n <Box>\r\n {isCurrent && (\r\n <Text color={theme.colors.muted}>\r\n [{t.versionModal.currentBadge}]{' '}\r\n </Text>\r\n )}\r\n {isLatest && (\r\n <Text bold color={theme.colors.brand}>\r\n [{t.versionModal.latestBadge}]{' '}\r\n </Text>\r\n )}\r\n {isPre && (\r\n <Text bold color=\"#E040FB\">\r\n [{preTag || 'PRE'}]{' '}\r\n </Text>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n })}\r\n\r\n {startIdx + WINDOW_SIZE < filtered.length && (\r\n <Text color={theme.colors.muted}>\r\n ▼ … {filtered.length - (startIdx + WINDOW_SIZE)} weitere unten\r\n </Text>\r\n )}\r\n </Box>\r\n )}\r\n\r\n {/* 4. Keyboard hints */}\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor={theme.colors.border}\r\n paddingX={1}\r\n marginTop={1}\r\n >\r\n <Text color={theme.colors.muted}>{t.versionModal.hint}</Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","/**\r\n * Elevate — ad-hoc version lookups (`elevate versions`, MCP, version picker).\r\n *\r\n * Applies the same rule as the scanners: an internal package is never looked\r\n * up on a public registry, because the request itself would reveal the\r\n * internal name and invite a dependency-confusion attack.\r\n */\r\n\r\nimport type { ElevateConfig } from '../config.js';\r\nimport type { DependencyCoordinate, Ecosystem } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport { matchesInternalScope } from '../domain/origin.js';\r\n\r\n/** Thrown when a lookup would send an internal package name to a public registry. */\r\nexport class PublicLookupRefusedError extends Error {\r\n constructor(identifier: string, registry: string) {\r\n super(\r\n `'${identifier}' is an internal package (internalScopes) and its lookup would go to the public registry ${registry}. ` +\r\n 'Configure a private registry for it instead.',\r\n );\r\n this.name = 'PublicLookupRefusedError';\r\n }\r\n}\r\n\r\n/** Builds a coordinate from a CLI-style identifier (`name` or `groupId:artifactId`). */\r\nexport function coordinateFromIdentifier(identifier: string, ecosystem: Ecosystem): DependencyCoordinate {\r\n if (ecosystem === 'maven') {\r\n const [group, artifact] = identifier.split(':');\r\n return { identifier, group, artifact: artifact || group!, ecosystem };\r\n }\r\n return { identifier, artifact: identifier, ecosystem };\r\n}\r\n\r\n/** All published versions (newest first), refusing public lookups of internal packages. */\r\nexport async function lookupVersions(\r\n strategy: EcosystemStrategy,\r\n coordinate: DependencyCoordinate,\r\n config: Pick<ElevateConfig, 'rootDir' | 'internalScopes'>,\r\n): Promise<string[]> {\r\n if (matchesInternalScope(coordinate.identifier, coordinate.ecosystem, config.internalScopes)) {\r\n const endpoint = await strategy.registry.resolveEndpoint(coordinate, config.rootDir);\r\n if (endpoint.isPublic) throw new PublicLookupRefusedError(coordinate.identifier, endpoint.url);\r\n }\r\n return strategy.registry.getAllVersions(coordinate, config.rootDir);\r\n}\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { UpdateSummary, ProjectModule } from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport { ChickenMascot } from './mascot.js';\r\n\r\ninterface Props {\r\n summary: UpdateSummary;\r\n module: ProjectModule;\r\n strategy: EcosystemStrategy;\r\n t: Translations;\r\n}\r\n\r\n/** Result of the update workflow: success, or failure with rollback. */\r\nexport const SummaryView: React.FC<Props> = ({ summary, module, strategy, t }) => {\r\n const failed = Boolean(summary.rolledBack);\r\n const accent = failed ? theme.colors.danger : theme.colors.success;\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={accent} padding={1} marginY={1}>\r\n <Box justifyContent=\"space-between\" alignItems=\"center\">\r\n <Text bold color={accent}>\r\n {strategy.icon} {failed ? t.summary.rolledBackTitle : t.summary.title}\r\n </Text>\r\n {!failed && <ChickenMascot state=\"success\" t={t} ecosystem={strategy.ecosystem} />}\r\n </Box>\r\n\r\n <Box flexDirection=\"column\" marginY={1}>\r\n {failed ? (\r\n <>\r\n <Text color={theme.colors.white}>{t.summary.rolledBack}</Text>\r\n {summary.failure?.split('\\n').slice(0, 8).map((line, idx) => (\r\n <Text key={idx} color={theme.colors.warning}>\r\n {line}\r\n </Text>\r\n ))}\r\n </>\r\n ) : (\r\n <>\r\n <Text color={theme.colors.white}>{t.summary.successCount(summary.updatedCount, module.relPath)}</Text>\r\n {summary.changedFiles && summary.changedFiles.length > 0 && (\r\n <Text color={theme.colors.muted}>{t.summary.changedFiles(summary.changedFiles)}</Text>\r\n )}\r\n <Box marginTop={1}>\r\n <Text color={summary.auditSeverity === 'clean' ? theme.colors.success : theme.colors.warning} bold>\r\n {t.summary.securityAudit}{' '}\r\n </Text>\r\n <Text>{summary.auditMessage}</Text>\r\n </Box>\r\n </>\r\n )}\r\n\r\n {summary.fundingMessage && !failed && (\r\n <Box marginTop={1}>\r\n <Text color={theme.colors.muted}>{t.summary.funding(summary.fundingMessage)}</Text>\r\n </Box>\r\n )}\r\n\r\n {summary.verificationStatus && (\r\n <Box marginTop={1} flexDirection=\"column\">\r\n <Text color={summary.verificationStatus === 'clean' ? theme.colors.success : theme.colors.warning} bold>\r\n {t.summary.postScript(summary.verificationLabel ?? '')}\r\n </Text>\r\n <Text color={theme.colors.muted}>{summary.verificationDetails}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Box borderStyle=\"single\" borderColor={theme.colors.borderMuted} paddingX={1} marginTop={1}>\r\n <Text bold color={theme.colors.brandLight}>\r\n {t.summary.backHint}\r\n </Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { theme } from '../theme.js';\r\nimport type { Translations } from '../i18n/types.js';\r\nimport type { Ecosystem } from '../domain/models.js';\r\nimport { ChickenMascot } from './mascot.js';\r\n\r\ninterface Props {\r\n step: string;\r\n t: Translations;\r\n ecosystem?: Ecosystem;\r\n}\r\n\r\n/** Progress view during the update workflow, with the working mascot. */\r\nexport const UpdatingView: React.FC<Props> = ({ step, t, ecosystem = 'npm' }) => (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"round\"\r\n borderColor={theme.colors.brand}\r\n padding={1}\r\n marginY={1}\r\n >\r\n <Box justifyContent=\"space-between\" alignItems=\"center\">\r\n <Text bold color={theme.colors.brandLight}>\r\n {t.updating.title}\r\n </Text>\r\n <ChickenMascot state=\"updating\" t={t} ecosystem={ecosystem} />\r\n </Box>\r\n\r\n <Box marginY={1}>\r\n <Text bold color={theme.colors.brandLight}>\r\n {step}\r\n </Text>\r\n </Box>\r\n\r\n <Text color={theme.colors.muted}>{t.updating.doNotClose}</Text>\r\n </Box>\r\n);\r\n","/**\r\n * 🪶 Elevate — CLI Argument Parser\r\n *\r\n * Provides typed, zero-dependency command line argument parsing\r\n * using Node.js native `node:util.parseArgs` conventions.\r\n */\r\n\r\nexport interface CliOptions {\r\n subcommand?: 'modules' | 'scan' | 'versions' | 'update' | 'init' | 'mcp' | 'help';\r\n ecosystem?: 'npm' | 'maven';\r\n module?: string;\r\n channel?: 'stable' | 'all';\r\n packages?: string[];\r\n all?: boolean;\r\n allModules?: boolean;\r\n allowMajor?: boolean;\r\n dryRun?: boolean;\r\n skipVerify?: boolean;\r\n keepOnFailure?: boolean;\r\n json?: boolean;\r\n positional?: string;\r\n help?: boolean;\r\n}\r\n\r\nexport function parseCliArgs(args: string[]): CliOptions {\r\n const [first, ...rest] = args;\r\n\r\n if (!first || first === '--help' || first === '-h' || first === 'help') {\r\n if (first === '--help' || first === '-h' || first === 'help') {\r\n return { subcommand: 'help' };\r\n }\r\n // No arguments provided -> launch interactive TUI\r\n return {};\r\n }\r\n\r\n // Direct MCP Server invocation\r\n if (first === 'mcp' || first === 'serve') {\r\n return { subcommand: 'mcp' };\r\n }\r\n\r\n const validCommands = ['modules', 'scan', 'versions', 'update', 'init'] as const;\r\n const isSubcommand = validCommands.includes(first as any);\r\n\r\n const subcommand = isSubcommand ? (first as 'modules' | 'scan' | 'versions' | 'update' | 'init') : undefined;\r\n const remaining = isSubcommand ? rest : args;\r\n\r\n const result: CliOptions = { subcommand };\r\n const positionals: string[] = [];\r\n\r\n for (let i = 0; i < remaining.length; i++) {\r\n const arg = remaining[i]!;\r\n\r\n if (arg === '--json') {\r\n result.json = true;\r\n } else if (arg === '--all') {\r\n result.all = true;\r\n } else if (arg === '--all-modules') {\r\n result.allModules = true;\r\n } else if (arg === '--allow-major') {\r\n result.allowMajor = true;\r\n } else if (arg === '--dry-run') {\r\n result.dryRun = true;\r\n } else if (arg === '--skip-verify') {\r\n result.skipVerify = true;\r\n } else if (arg === '--keep-on-failure') {\r\n result.keepOnFailure = true;\r\n } else if (arg === '--help' || arg === '-h') {\r\n result.help = true;\r\n } else if (arg.startsWith('--ecosystem=')) {\r\n const val = arg.split('=')[1];\r\n if (val === 'npm' || val === 'maven') result.ecosystem = val;\r\n } else if (arg === '-e' || arg === '--ecosystem') {\r\n const val = remaining[++i];\r\n if (val === 'npm' || val === 'maven') result.ecosystem = val;\r\n } else if (arg.startsWith('--module=')) {\r\n result.module = arg.split('=')[1];\r\n } else if (arg === '-m' || arg === '--module') {\r\n result.module = remaining[++i];\r\n } else if (arg.startsWith('--channel=')) {\r\n const val = arg.split('=')[1];\r\n if (val === 'stable' || val === 'all') result.channel = val;\r\n } else if (arg === '-c' || arg === '--channel') {\r\n const val = remaining[++i];\r\n if (val === 'stable' || val === 'all') result.channel = val;\r\n } else if (arg.startsWith('--packages=')) {\r\n result.packages = arg.split('=')[1]?.split(',').map((s) => s.trim()).filter(Boolean);\r\n } else if (arg === '-p' || arg === '--packages') {\r\n result.packages = remaining[++i]?.split(',').map((s) => s.trim()).filter(Boolean);\r\n } else if (!arg.startsWith('-')) {\r\n positionals.push(arg);\r\n }\r\n }\r\n\r\n if (positionals.length > 0) {\r\n result.positional = positionals[0];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function printCliHelp(): void {\r\n console.log(`\r\n🪶 Elevate — Modern Polyglot Dependency Manager & Updater\r\n\r\nUSAGE:\r\n elevate Launch interactive terminal dashboard (TUI)\r\n elevate <subcommand> [flags] Execute headless command (for CI/CD & AI agents)\r\n elevate mcp Start Model Context Protocol (MCP) server\r\n\r\nSUBCOMMANDS:\r\n modules List all detected repository modules\r\n scan Scan dependencies for available updates\r\n versions <package> List all published versions of a package\r\n update Apply updates to specified or all packages\r\n init Configure AI coding tools (MCP + agent skills)\r\n mcp Start stdio-based MCP server\r\n\r\nFLAGS:\r\n -e, --ecosystem <npm|maven> Target ecosystem (default: npm)\r\n -m, --module <name|path> Target module ID or relative path (default: root)\r\n -c, --channel <stable|all> Release channel (default: stable)\r\n -p, --packages <pkg1,pkg2@1.2.3> Comma-separated list of packages to update\r\n --all Update all eligible dependencies\r\n --all-modules Scan across all discovered monorepo modules\r\n --allow-major Allow breaking major version upgrades\r\n --dry-run Simulate updates without modifying any files\r\n --skip-verify Skip post-update build & test verification\r\n --keep-on-failure Keep changes when verification fails (default: roll back)\r\n --json Format output as machine-readable JSON\r\n -h, --help Display this help message\r\n\r\nEXAMPLES:\r\n elevate scan --json\r\n elevate scan --ecosystem=maven --channel=stable --all-modules --json\r\n elevate versions chalk --ecosystem=npm --json\r\n elevate update --module=apps/e2e-cockpit --packages=chalk@5.6.2 --json\r\n elevate update --ecosystem=npm --all --allow-major --dry-run\r\n elevate init\r\n elevate init --json\r\n`);\r\n}\r\n","/**\r\n * 🪶 Elevate — CLI Command: `modules`\r\n *\r\n * Lists all discovered modules in the monorepo for the specified ecosystem.\r\n */\r\n\r\nimport type { CliOptions } from './parser.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\n\r\nexport async function handleModulesCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\r\n const ecosystem = options.ecosystem ?? 'npm';\r\n const strategy = EcosystemFactory.getStrategy(ecosystem);\r\n\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify({ ecosystem, count: modules.length, modules }, null, 2));\r\n return 0;\r\n }\r\n\r\n console.log(`\\n🪶 Discovered ${strategy.icon} ${strategy.displayName} Modules (${modules.length}):\\n`);\r\n for (const m of modules) {\r\n const isRootBadge = m.isRoot ? ' [ROOT]' : '';\r\n console.log(` • ${m.name.padEnd(45)} (${m.relPath})${isRootBadge}`);\r\n }\r\n console.log('');\r\n return 0;\r\n}\r\n","/**\r\n * Elevate — English descriptions of scan results for CLI and MCP output.\r\n */\r\n\r\nimport type { SkippedDependency } from '../domain/models.js';\r\n\r\n/** One-line explanation of why a dependency was not offered. */\r\nexport function describeSkip(skipped: SkippedDependency): string {\r\n const detail = skipped.detail ? ` (${skipped.detail})` : '';\r\n switch (skipped.reason) {\r\n case 'private-on-public-registry':\r\n return `internal package not looked up: it would be resolved from a public registry${detail}`;\r\n case 'lookup-failed':\r\n return `registry lookup failed${detail}`;\r\n case 'managed-externally':\r\n return `not editable here${detail}`;\r\n case 'declaration-mismatch':\r\n return `version location is ambiguous${detail}`;\r\n case 'invalid-name':\r\n return 'not a valid package name';\r\n }\r\n}\r\n","/**\r\n * Elevate — CLI command: `scan`\r\n *\r\n * Scans dependencies of one or all modules for available updates and\r\n * internal dependencies that need alignment.\r\n *\r\n * Exit codes: 0 = up to date, 1 = updates available, 3 = scan error.\r\n */\r\n\r\nimport type { CliOptions } from './parser.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport type { ProjectModule, ScanResult } from '../domain/models.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\nimport { candidateToJson, createScanContext, findModule, scanModules } from '../application/scan.js';\r\nimport { describeSkip } from '../application/describe.js';\r\n\r\nexport async function handleScanCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\r\n const ecosystem = options.ecosystem ?? 'npm';\r\n const channel = options.channel ?? config.channel ?? 'stable';\r\n const strategy = EcosystemFactory.getStrategy(ecosystem);\r\n\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n if (modules.length === 0) {\r\n if (options.json) {\r\n console.log(JSON.stringify({ error: `No ${strategy.displayName} modules found.`, ecosystem }, null, 2));\r\n } else {\r\n console.error(`❌ No ${strategy.displayName} modules found.`);\r\n }\r\n return 1;\r\n }\r\n\r\n const targetModules: ProjectModule[] = [];\r\n if (options.allModules) {\r\n targetModules.push(...modules);\r\n } else if (options.module) {\r\n const match = findModule(modules, options.module);\r\n if (!match) {\r\n if (options.json) {\r\n console.log(\r\n JSON.stringify(\r\n { error: `Module '${options.module}' not found.`, available: modules.map((m) => m.relPath) },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } else {\r\n console.error(`❌ Module '${options.module}' not found.`);\r\n }\r\n return 1;\r\n }\r\n targetModules.push(match);\r\n } else {\r\n targetModules.push(modules[0]!);\r\n }\r\n\r\n const context = createScanContext(modules, config, channel);\r\n if (!options.json) process.stderr.write(`🔍 Scanning ${targetModules.map((m) => m.relPath).join(', ')}…\\n`);\r\n const scanned = await scanModules(strategy, targetModules, context);\r\n const results: { module: ProjectModule; result: ScanResult & { error?: string } }[] = targetModules.map(\r\n (module) => ({ module, result: scanned.get(module)! }),\r\n );\r\n\r\n const totalUpdatesCount = results.reduce((sum, r) => sum + r.result.candidates.length, 0);\r\n const hasErrors = results.some((r) => r.result.error);\r\n const exitCode = hasErrors ? 3 : totalUpdatesCount > 0 ? 1 : 0;\r\n\r\n if (options.json) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ecosystem,\r\n channel,\r\n scannedModules: targetModules.length,\r\n totalUpdatesCount,\r\n results: results.map(({ module, result }) => ({\r\n moduleId: module.id,\r\n modulePath: module.relPath,\r\n updateCount: result.candidates.length,\r\n error: result.error,\r\n updates: result.candidates.map(candidateToJson),\r\n skipped: result.skipped,\r\n })),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return exitCode;\r\n }\r\n\r\n console.log(`\\n🪶 Elevate Scan Results (${strategy.icon} ${strategy.displayName}, Channel: ${channel}):\\n`);\r\n\r\n for (const { module, result } of results) {\r\n console.log(`📦 Module: ${module.name} (${module.relPath}) — ${result.candidates.length} update(s) available`);\r\n if (result.error) {\r\n console.log(` ❌ Scan failed: ${result.error.replace(/\\n/g, '\\n ')}\\n`);\r\n continue;\r\n }\r\n\r\n const modulePom = module.isRoot ? 'pom.xml' : `${module.relPath}/pom.xml`;\r\n if (result.candidates.length === 0) console.log(' ✨ All dependencies are up to date.');\r\n for (const u of result.candidates) {\r\n const diffTag = `[${u.diff.toUpperCase()}]`.padEnd(9);\r\n const actionTag = u.action === 'align' ? '[ALIGN] ' : u.origin.kind === 'private' ? '[INTERNAL] ' : '';\r\n const preBadge = u.isPreRelease ? `[${u.preReleaseTag || 'PRE'}] ` : '';\r\n const where = u.declaration && u.declaration.displayPath !== modulePom\r\n ? ` (in ${u.declaration.displayPath}${u.declaration.propertyName ? ` \\${${u.declaration.propertyName}}` : ''})`\r\n : '';\r\n console.log(\r\n ` • ${diffTag} ${actionTag}${preBadge}${u.coordinate.identifier.padEnd(36)} ${u.currentRange.padEnd(12)} ➔ ${u.latest}${where}`,\r\n );\r\n }\r\n\r\n for (const s of result.skipped) {\r\n console.log(` ⚠️ ${s.identifier}: ${describeSkip(s)}`);\r\n }\r\n console.log('');\r\n }\r\n\r\n console.log(`Summary: ${totalUpdatesCount} pending update(s) across ${targetModules.length} module(s).\\n`);\r\n return exitCode;\r\n}\r\n","/**\r\n * Elevate — CLI command: `versions`\r\n *\r\n * Retrieves the published version history of a package from the registry.\r\n */\r\n\r\nimport type { CliOptions } from './parser.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../domain/versions.js';\r\nimport { coordinateFromIdentifier, lookupVersions } from '../application/version-lookup.js';\r\n\r\nexport async function handleVersionsCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\r\n const pkgIdentifier = options.positional;\r\n if (!pkgIdentifier) {\r\n console.error('❌ Error: Please specify a package name (e.g. `elevate versions chalk`).');\r\n return 1;\r\n }\r\n\r\n // An identifier containing ':' is a Maven coordinate unless stated otherwise.\r\n const ecosystem = options.ecosystem ?? (pkgIdentifier.includes(':') ? 'maven' : 'npm');\r\n const strategy = EcosystemFactory.getStrategy(ecosystem);\r\n const coordinate = coordinateFromIdentifier(pkgIdentifier, ecosystem);\r\n\r\n let versions: string[];\r\n try {\r\n versions = await lookupVersions(strategy, coordinate, config);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n if (options.json) console.log(JSON.stringify({ error: message, package: pkgIdentifier }, null, 2));\r\n else console.error(`❌ ${message}`);\r\n return 1;\r\n }\r\n\r\n if (options.json) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ecosystem,\r\n package: pkgIdentifier,\r\n totalCount: versions.length,\r\n latest: versions[0] || null,\r\n versions: versions.map((v) => ({\r\n version: v,\r\n isPreRelease: isPreReleaseVersion(v),\r\n tag: extractPreReleaseTag(v),\r\n })),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return 0;\r\n }\r\n\r\n console.log(\r\n `\\n🪶 Published versions for '${pkgIdentifier}' (${strategy.icon} ${strategy.displayName}, ${versions.length} total):\\n`,\r\n );\r\n for (const v of versions.slice(0, 30)) {\r\n const tag = isPreReleaseVersion(v) ? `[${extractPreReleaseTag(v) || 'PRE'}]` : '[STABLE]';\r\n console.log(` • ${v.padEnd(25)} ${tag}`);\r\n }\r\n console.log(versions.length > 30 ? ` … and ${versions.length - 30} older versions.\\n` : '');\r\n\r\n return 0;\r\n}\r\n","/**\r\n * Elevate — turns update requests (CLI `--packages`, MCP `updates`) into\r\n * candidates, enforcing the same guardrails everywhere.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { DependencyOriginKind, Ecosystem, ScanResult, UpdateCandidate, VersionDiff } from '../domain/models.js';\r\nimport { cleanJavaVersion, diffVersions, extractPreReleaseTag, isPreReleaseVersion, rangePrefix } from '../domain/versions.js';\r\nimport { describeSkip } from './describe.js';\r\n\r\nexport interface UpdateRequest {\r\n identifier: string;\r\n /** Explicit target version; defaults to the version offered by the scan. */\r\n targetVersion?: string;\r\n}\r\n\r\n/** A request that cannot be applied, with an explanation for the user. */\r\nexport class UpdateSelectionError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'UpdateSelectionError';\r\n }\r\n}\r\n\r\nexport interface SelectionOptions {\r\n ecosystem: Ecosystem;\r\n allowMajor: boolean;\r\n /** Origin of an identifier; manual targets are only allowed for public packages. */\r\n originOf: (identifier: string) => DependencyOriginKind;\r\n}\r\n\r\n/** Selects all offered candidates; majors only when explicitly allowed. */\r\nexport function selectAll(scan: ScanResult, allowMajor: boolean): { selected: UpdateCandidate[]; skippedMajors: UpdateCandidate[] } {\r\n const selected = scan.candidates.filter((c) => allowMajor || c.diff !== 'major');\r\n const skippedMajors = scan.candidates.filter((c) => !allowMajor && c.diff === 'major');\r\n return { selected: selected.map((c) => ({ ...c, selected: true })), skippedMajors };\r\n}\r\n\r\n/** Resolves explicit requests against the scan result. Throws `UpdateSelectionError`. */\r\nexport function selectRequested(\r\n scan: ScanResult,\r\n requests: readonly UpdateRequest[],\r\n options: SelectionOptions,\r\n): UpdateCandidate[] {\r\n return requests.map((request) => {\r\n const found = scan.candidates.find((c) => c.coordinate.identifier === request.identifier);\r\n if (found) return retarget(found, request.targetVersion, options);\r\n\r\n const skipped = scan.skipped.find((s) => s.identifier === request.identifier);\r\n if (skipped) {\r\n throw new UpdateSelectionError(`'${request.identifier}' cannot be updated: ${describeSkip(skipped)}.`);\r\n }\r\n if (!request.targetVersion) {\r\n throw new UpdateSelectionError(\r\n `'${request.identifier}' has no pending update. Specify a target version (e.g. ${request.identifier}@1.2.3).`,\r\n );\r\n }\r\n if (options.ecosystem === 'maven') {\r\n throw new UpdateSelectionError(\r\n `'${request.identifier}' has no pending update. Maven updates are written where the scan located the version; ` +\r\n 'a dependency without an offered update cannot be retargeted.',\r\n );\r\n }\r\n if (options.originOf(request.identifier) !== 'public') {\r\n // A hand-picked range for a workspace or internal package could make npm\r\n // install a registry package with that name instead of the internal one.\r\n throw new UpdateSelectionError(\r\n `'${request.identifier}' is a workspace or internal package without a pending update; it cannot be set manually.`,\r\n );\r\n }\r\n return manualNpmCandidate(request.identifier, request.targetVersion, options);\r\n });\r\n}\r\n\r\nfunction retarget(found: UpdateCandidate, target: string | undefined, options: SelectionOptions): UpdateCandidate {\r\n if (!target || target === found.latest) {\r\n if (found.diff === 'major' && !options.allowMajor) {\r\n throw new UpdateSelectionError(\r\n `'${found.coordinate.identifier}' is a major update (${found.currentClean} ➔ ${found.latest}). Pass --allow-major / allowMajor.`,\r\n );\r\n }\r\n return { ...found, selected: true };\r\n }\r\n\r\n if (found.action === 'align') {\r\n throw new UpdateSelectionError(\r\n `'${found.coordinate.identifier}' is a workspace module; it can only be aligned to its local version ${found.latest}.`,\r\n );\r\n }\r\n\r\n // Maven updates are not resolved before verification. Accepting only versions\r\n // the repositories reported during the scan guarantees the target exists,\r\n // even when verification is skipped.\r\n if (options.ecosystem === 'maven' && found.availableVersions && !found.availableVersions.includes(target)) {\r\n throw new UpdateSelectionError(\r\n `'${found.coordinate.identifier}' has no version ${target} in the configured repositories. ` +\r\n `Available: ${found.availableVersions.slice(0, 5).join(', ')}${found.availableVersions.length > 5 ? ', …' : ''}.`,\r\n );\r\n }\r\n\r\n const diff = computeDiff(found.currentClean, target, options.ecosystem);\r\n if (diff === 'major' && !options.allowMajor) {\r\n throw new UpdateSelectionError(\r\n `'${found.coordinate.identifier}' requires a major upgrade to ${target}. Pass --allow-major / allowMajor.`,\r\n );\r\n }\r\n\r\n const isPreRelease = isPreReleaseVersion(target);\r\n return {\r\n ...found,\r\n newRange: options.ecosystem === 'npm' ? `${rangePrefix(found.currentRange)}${target}` : target,\r\n diff,\r\n selected: true,\r\n isCustomVersion: true,\r\n isPreRelease,\r\n preReleaseTag: isPreRelease ? extractPreReleaseTag(target) : undefined,\r\n };\r\n}\r\n\r\nfunction manualNpmCandidate(identifier: string, target: string, options: SelectionOptions): UpdateCandidate {\r\n if (!semver.valid(target)) {\r\n throw new UpdateSelectionError(`'${target}' is not a valid version for '${identifier}'.`);\r\n }\r\n return {\r\n coordinate: { identifier, artifact: identifier, ecosystem: options.ecosystem },\r\n currentRange: 'unknown',\r\n currentClean: '0.0.0',\r\n latest: target,\r\n newRange: target,\r\n diff: 'minor',\r\n scope: 'prod',\r\n selected: true,\r\n origin: { kind: 'public' },\r\n action: 'update',\r\n isCustomVersion: true,\r\n };\r\n}\r\n\r\nfunction computeDiff(current: string, target: string, ecosystem: Ecosystem): VersionDiff {\r\n const to = ecosystem === 'maven' ? cleanJavaVersion(target) : semver.valid(target);\r\n if (!to || !semver.valid(current)) return 'minor';\r\n return semver.eq(current, to) ? 'patch' : diffVersions(current, to);\r\n}\r\n","/**\r\n * Elevate — CLI command: `update`\r\n *\r\n * Applies dependency updates to a target module with safety guardrails:\r\n * - major updates require `--allow-major`\r\n * - `--dry-run` simulates without touching files\r\n * - after writing, the update is installed, checked for integrity and\r\n * verified; any failure rolls all changes back (`--keep-on-failure` keeps\r\n * the changes of a failed verification for investigation)\r\n *\r\n * Exit codes: 0 = success, 1 = invalid request, 2 = update failed / rolled back.\r\n */\r\n\r\nimport type { CliOptions } from './parser.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport type { UpdateCandidate } from '../domain/models.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\nimport { classifyOrigin } from '../domain/origin.js';\r\nimport { createScanContext, findModule, scanModule } from '../application/scan.js';\r\nimport { UpdateSelectionError, selectAll, selectRequested } from '../application/update-selection.js';\r\nimport type { UpdateRequest } from '../application/update-selection.js';\r\nimport { runUpdateWorkflow } from '../application/update-workflow.js';\r\n\r\nexport async function handleUpdateCommand(options: CliOptions, config: ElevateConfig): Promise<number> {\r\n const ecosystem = options.ecosystem ?? 'npm';\r\n const strategy = EcosystemFactory.getStrategy(ecosystem);\r\n const fail = (message: string, code = 1) => {\r\n if (options.json) console.log(JSON.stringify({ success: false, error: message }, null, 2));\r\n else console.error(`❌ ${message}`);\r\n return code;\r\n };\r\n\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n if (modules.length === 0) return fail(`No ${strategy.displayName} modules found.`);\r\n\r\n const targetModule = options.module ? findModule(modules, options.module) : modules[0];\r\n if (!targetModule) return fail(`Module '${options.module}' not found.`);\r\n\r\n if (!options.all && !(options.packages && options.packages.length > 0)) {\r\n return fail('Please specify packages to update via --packages=\"pkg1,pkg2@1.2.3\" or --all.');\r\n }\r\n\r\n const context = createScanContext(modules, config, options.channel ?? config.channel ?? 'stable');\r\n const scan = await scanModule(strategy, targetModule, context);\r\n if (scan.error) return fail(`Scan failed: ${scan.error}`, 2);\r\n\r\n let updatesToApply: UpdateCandidate[];\r\n if (options.all) {\r\n const { selected, skippedMajors } = selectAll(scan, Boolean(options.allowMajor));\r\n if (!options.json) {\r\n for (const c of skippedMajors) {\r\n console.warn(`⚠️ Skipping major update for '${c.coordinate.identifier}' (requires --allow-major)`);\r\n }\r\n }\r\n updatesToApply = selected;\r\n } else {\r\n try {\r\n updatesToApply = selectRequested(scan, (options.packages ?? []).map(parsePackageArgument), {\r\n ecosystem,\r\n allowMajor: Boolean(options.allowMajor),\r\n originOf: (identifier) => classifyOrigin(identifier, ecosystem, context).kind,\r\n });\r\n } catch (err) {\r\n if (err instanceof UpdateSelectionError) return fail(err.message);\r\n throw err;\r\n }\r\n }\r\n\r\n if (updatesToApply.length === 0) {\r\n if (options.json) {\r\n console.log(JSON.stringify({ message: 'No updates selected to apply.', updatedCount: 0 }, null, 2));\r\n } else {\r\n console.log('ℹ️ No updates selected to apply.');\r\n }\r\n return 0;\r\n }\r\n\r\n if (options.dryRun) {\r\n const simulation = {\r\n dryRun: true,\r\n targetModule: targetModule.relPath,\r\n ecosystem,\r\n updatesCount: updatesToApply.length,\r\n updates: updatesToApply.map((u) => ({\r\n identifier: u.coordinate.identifier,\r\n action: u.action,\r\n currentRange: u.currentRange,\r\n newRange: u.newRange,\r\n diff: u.diff,\r\n declaredIn: u.declaration?.displayPath,\r\n })),\r\n };\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(simulation, null, 2));\r\n } else {\r\n console.log(`\\n🪶 [DRY-RUN] Planned updates for ${targetModule.name} (${updatesToApply.length}):\\n`);\r\n for (const u of updatesToApply) {\r\n const where = u.declaration ? ` [${u.declaration.displayPath}]` : '';\r\n console.log(\r\n ` • ${u.coordinate.identifier.padEnd(36)} ${u.currentRange} ➔ ${u.newRange} (${u.diff.toUpperCase()})${where}`,\r\n );\r\n }\r\n console.log('\\n(No files were modified because --dry-run is active).\\n');\r\n }\r\n return 0;\r\n }\r\n\r\n if (!options.json) console.log(`\\n⚡ Applying ${updatesToApply.length} update(s) to ${targetModule.name}…`);\r\n\r\n const summary = await runUpdateWorkflow(strategy, targetModule, config.rootDir, updatesToApply, {\r\n postUpdateScript: config.postUpdateScript,\r\n postUpdateLabel: config.postUpdateLabel,\r\n skipVerification: options.skipVerify,\r\n keepOnFailure: options.keepOnFailure,\r\n onProgress: (step) => {\r\n if (!options.json) console.log(` ${step}`);\r\n },\r\n });\r\n\r\n const success = !summary.rolledBack && summary.verificationStatus !== 'warn';\r\n\r\n if (options.json) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n success,\r\n module: targetModule.relPath,\r\n ecosystem,\r\n updatedCount: summary.updatedCount,\r\n auditMessage: summary.auditMessage,\r\n auditSeverity: summary.auditSeverity,\r\n fundingMessage: summary.fundingMessage,\r\n rolledBack: summary.rolledBack ?? false,\r\n failure: summary.failure,\r\n changedFiles: summary.changedFiles,\r\n verification: summary.verificationStatus\r\n ? {\r\n status: summary.verificationStatus,\r\n label: summary.verificationLabel,\r\n details: summary.verificationDetails,\r\n }\r\n : undefined,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return success ? 0 : 2;\r\n }\r\n\r\n if (summary.rolledBack) {\r\n console.error(`\\n❌ Update failed and was rolled back.\\n`);\r\n console.error(` ${summary.failure?.replace(/\\n/g, '\\n ')}`);\r\n if (summary.verificationDetails) console.error(`\\n Details:\\n ${summary.verificationDetails.replace(/\\n/g, '\\n ')}`);\r\n console.error('');\r\n return 2;\r\n }\r\n\r\n console.log(success ? `\\n✨ Update completed successfully!\\n` : `\\n⚠️ Update applied, but verification failed.\\n`);\r\n console.log(` • Updated: ${summary.updatedCount} package(s)`);\r\n if (summary.changedFiles?.length) console.log(` • Changed files: ${summary.changedFiles.join(', ')}`);\r\n console.log(` • Status: ${summary.auditSeverity.toUpperCase()} — ${summary.auditMessage}`);\r\n if (summary.verificationStatus) {\r\n console.log(` • Verification: ${summary.verificationStatus.toUpperCase()} (${summary.verificationLabel})`);\r\n if (summary.verificationStatus === 'warn') console.warn(` Details: ${summary.verificationDetails}`);\r\n }\r\n console.log('');\r\n\r\n return success ? 0 : 2;\r\n}\r\n\r\n/** Parses `name`, `name@1.2.3`, `@scope/name@1.2.3` or `group:artifact@1.2.3`. */\r\nexport function parsePackageArgument(item: string): UpdateRequest {\r\n const at = item.lastIndexOf('@');\r\n if (at > 0) return { identifier: item.slice(0, at), targetVersion: item.slice(at + 1) || undefined };\r\n return { identifier: item };\r\n}\r\n","/**\r\n * 🪶 Elevate — CLI Command: `init`\r\n *\r\n * Auto-detects AI coding environments (Cursor, Claude, Antigravity, VS Code,\r\n * Windsurf) and configures Elevate's MCP server + agent skill files so that\r\n * AI agents automatically discover and prefer Elevate for dependency management.\r\n *\r\n * Usage:\r\n * elevate init Interactive auto-detection\r\n * elevate init --all Configure all detected environments without prompts\r\n * elevate init --json Machine-readable output\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { homedir, platform } from 'node:os';\r\nimport { join, resolve } from 'node:path';\r\nimport type { CliOptions } from './parser.js';\r\n\r\n// ── Types ────────────────────────────────────────────────────────────────────\r\n\r\ninterface DetectedEnvironment {\r\n id: string;\r\n name: string;\r\n icon: string;\r\n detected: boolean;\r\n reason: string;\r\n mcpConfigured: boolean;\r\n skillConfigured: boolean;\r\n}\r\n\r\ninterface InitResult {\r\n cwd: string;\r\n environments: DetectedEnvironment[];\r\n actions: string[];\r\n errors: string[];\r\n}\r\n\r\n// ── MCP Server Entry (identical across all environments) ─────────────────────\r\n\r\nfunction mcpServerEntry(): Record<string, unknown> {\r\n return {\r\n command: 'npx',\r\n args: ['-y', '@dennisrepa/elevate', 'mcp'],\r\n };\r\n}\r\n\r\n// ── Skill / Instruction Content ──────────────────────────────────────────────\r\n\r\nconst ELEVATE_SKILL_CONTENT = `# Elevate — Dependency Management Agent Skill\r\n\r\n## When to Use\r\nUse the Elevate MCP tools whenever the task involves:\r\n- Scanning or auditing dependencies for available updates\r\n- Updating one or more packages to specific or latest versions\r\n- Listing available versions of a package from npm or Maven registries\r\n- Discovering monorepo modules and their dependency structure\r\n- Any dependency-related operation in a monorepo\r\n\r\n## Important\r\n**Never** run raw \\`npm update\\`, \\`npm install <pkg>@latest\\`, or manually edit\r\n\\`package.json\\` / \\`pom.xml\\` version fields. Always use Elevate's MCP tools\r\ninstead — they handle monorepo-aware scanning, internal dependency alignment,\r\nsafety guardrails (major version protection), post-update verification and\r\nautomatic rollback.\r\n\r\n## Available MCP Tools\r\n| Tool | Purpose |\r\n|-------------------------------|---------------------------------------------------------------|\r\n| \\`elevate_discover_modules\\` | Discover all modules in a monorepo |\r\n| \\`elevate_scan\\` | Scan for updates and internal dependencies to align |\r\n| \\`elevate_get_versions\\` | List all published versions of a specific package |\r\n| \\`elevate_apply_updates\\` | Apply updates with guardrails, verification and rollback |\r\n| \\`elevate_verify\\` | Run build & consistency verification |\r\n\r\n## Typical Workflow\r\n1. \\`elevate_discover_modules\\` — Discover project structure\r\n2. \\`elevate_scan\\` — Identify outdated dependencies. Updates with \\`action: \"align\"\\` set an\r\n internal dependency to the local version of a workspace module. Entries under\r\n \\`skipped\\` were deliberately not offered; report their \\`explanation\\` instead of\r\n working around them (e.g. internal packages are never looked up on public registries).\r\n3. \\`elevate_apply_updates\\` — Apply selected updates (\\`allowMajor\\` only when explicitly\r\n requested). A failed install or verification is rolled back automatically.\r\n4. \\`elevate_verify\\` — Verify build integrity when needed\r\n`;\r\n\r\n// ── Path Helpers ─────────────────────────────────────────────────────────────\r\n\r\nconst home = homedir();\r\nconst isWin = platform() === 'win32';\r\n\r\nfunction appData(): string {\r\n return process.env.APPDATA || join(home, 'AppData', 'Roaming');\r\n}\r\n\r\n// ── Environment Detectors ────────────────────────────────────────────────────\r\n\r\nfunction detectCursor(cwd: string): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'cursor',\r\n name: 'Cursor',\r\n icon: '🖱️',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n // Check workspace-level .cursor/ dir\r\n const workspaceCursorDir = join(cwd, '.cursor');\r\n const globalCursorDir = join(home, '.cursor');\r\n\r\n if (existsSync(workspaceCursorDir) || existsSync(globalCursorDir)) {\r\n env.detected = true;\r\n env.reason = existsSync(workspaceCursorDir)\r\n ? `Found .cursor/ in workspace`\r\n : `Found ~/.cursor/ global config`;\r\n }\r\n\r\n // Check if MCP already configured\r\n const mcpPath = join(cwd, '.cursor', 'mcp.json');\r\n if (existsSync(mcpPath)) {\r\n try {\r\n const content = JSON.parse(readFileSync(mcpPath, 'utf8'));\r\n if (content?.mcpServers?.elevate) {\r\n env.mcpConfigured = true;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // Check if rules already exist\r\n const rulesPath = join(cwd, '.cursorrules');\r\n if (existsSync(rulesPath)) {\r\n const content = readFileSync(rulesPath, 'utf8');\r\n if (content.includes('elevate') || content.includes('Elevate')) {\r\n env.skillConfigured = true;\r\n }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction detectClaudeDesktop(): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'claude-desktop',\r\n name: 'Claude Desktop',\r\n icon: '🤖',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n const configPath = isWin\r\n ? join(appData(), 'Claude', 'claude_desktop_config.json')\r\n : join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\r\n\r\n if (existsSync(configPath)) {\r\n env.detected = true;\r\n env.reason = `Found ${configPath}`;\r\n\r\n try {\r\n const content = JSON.parse(readFileSync(configPath, 'utf8'));\r\n if (content?.mcpServers?.elevate) {\r\n env.mcpConfigured = true;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction detectClaudeCode(cwd: string): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'claude-code',\r\n name: 'Claude Code',\r\n icon: '⌨️',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n // Check for .mcp.json (project scope) or CLAUDE.md\r\n const mcpJsonPath = join(cwd, '.mcp.json');\r\n const claudeMdPath = join(cwd, 'CLAUDE.md');\r\n\r\n if (existsSync(mcpJsonPath) || existsSync(claudeMdPath)) {\r\n env.detected = true;\r\n env.reason = existsSync(mcpJsonPath)\r\n ? `Found .mcp.json in workspace`\r\n : `Found CLAUDE.md in workspace`;\r\n }\r\n\r\n // Check if MCP already configured\r\n if (existsSync(mcpJsonPath)) {\r\n try {\r\n const content = JSON.parse(readFileSync(mcpJsonPath, 'utf8'));\r\n if (content?.mcpServers?.elevate) {\r\n env.mcpConfigured = true;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // Check if skill already in CLAUDE.md\r\n if (existsSync(claudeMdPath)) {\r\n const content = readFileSync(claudeMdPath, 'utf8');\r\n if (content.includes('elevate') || content.includes('Elevate')) {\r\n env.skillConfigured = true;\r\n }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction detectAntigravity(cwd: string): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'antigravity',\r\n name: 'Google Antigravity',\r\n icon: '🚀',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n // Check global ~/.gemini/ or workspace .agents/\r\n const globalGeminiDir = join(home, '.gemini');\r\n const workspaceAgentsDir = join(cwd, '.agents');\r\n\r\n if (existsSync(globalGeminiDir) || existsSync(workspaceAgentsDir)) {\r\n env.detected = true;\r\n env.reason = existsSync(workspaceAgentsDir)\r\n ? `Found .agents/ in workspace`\r\n : `Found ~/.gemini/ global config`;\r\n }\r\n\r\n // Check if MCP already configured\r\n const mcpPaths = [\r\n join(cwd, '.agents', 'mcp_config.json'),\r\n join(home, '.gemini', 'config', 'mcp_config.json'),\r\n ];\r\n for (const p of mcpPaths) {\r\n if (existsSync(p)) {\r\n try {\r\n const content = JSON.parse(readFileSync(p, 'utf8'));\r\n if (content?.mcpServers?.elevate) {\r\n env.mcpConfigured = true;\r\n break;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction detectVSCode(cwd: string): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'vscode',\r\n name: 'VS Code / Copilot',\r\n icon: '💎',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n const vscodeDir = join(cwd, '.vscode');\r\n if (existsSync(vscodeDir)) {\r\n env.detected = true;\r\n env.reason = `Found .vscode/ in workspace`;\r\n }\r\n\r\n // Check if MCP already configured\r\n const mcpPath = join(cwd, '.vscode', 'mcp.json');\r\n if (existsSync(mcpPath)) {\r\n try {\r\n const content = JSON.parse(readFileSync(mcpPath, 'utf8'));\r\n if (content?.servers?.elevate) {\r\n env.mcpConfigured = true;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // Check copilot instructions\r\n const copilotInstructions = join(cwd, '.github', 'copilot-instructions.md');\r\n if (existsSync(copilotInstructions)) {\r\n const content = readFileSync(copilotInstructions, 'utf8');\r\n if (content.includes('elevate') || content.includes('Elevate')) {\r\n env.skillConfigured = true;\r\n }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction detectWindsurf(): DetectedEnvironment {\r\n const env: DetectedEnvironment = {\r\n id: 'windsurf',\r\n name: 'Windsurf',\r\n icon: '🏄',\r\n detected: false,\r\n reason: '',\r\n mcpConfigured: false,\r\n skillConfigured: false,\r\n };\r\n\r\n const configPath = isWin\r\n ? join(appData(), 'Codeium', 'Windsurf', 'mcp_config.json')\r\n : join(home, '.codeium', 'windsurf', 'mcp_config.json');\r\n\r\n // Also check the alternate location\r\n const altPath = join(home, '.codeium', 'windsurf', 'mcp_config.json');\r\n\r\n if (existsSync(configPath) || existsSync(altPath)) {\r\n env.detected = true;\r\n env.reason = `Found Windsurf config`;\r\n\r\n const path = existsSync(configPath) ? configPath : altPath;\r\n try {\r\n const content = JSON.parse(readFileSync(path, 'utf8'));\r\n if (content?.mcpServers?.elevate) {\r\n env.mcpConfigured = true;\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n return env;\r\n}\r\n\r\n// ── Configuration Writers ────────────────────────────────────────────────────\r\n\r\nfunction mergeJsonMcpServer(\r\n filePath: string,\r\n serverKey: string,\r\n topLevelKey: string,\r\n): { written: boolean; message: string } {\r\n let existing: Record<string, unknown> = {};\r\n\r\n if (existsSync(filePath)) {\r\n try {\r\n existing = JSON.parse(readFileSync(filePath, 'utf8'));\r\n } catch {\r\n existing = {};\r\n }\r\n }\r\n\r\n const servers = (existing[topLevelKey] as Record<string, unknown>) || {};\r\n if (servers[serverKey]) {\r\n return { written: false, message: `${filePath}: elevate already registered` };\r\n }\r\n\r\n servers[serverKey] = mcpServerEntry();\r\n existing[topLevelKey] = servers;\r\n\r\n const dir = filePath.substring(0, filePath.lastIndexOf(isWin ? '\\\\' : '/'));\r\n if (dir && !existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(filePath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\r\n return { written: true, message: `${filePath}: elevate MCP server registered` };\r\n}\r\n\r\nfunction appendSkillToFile(\r\n filePath: string,\r\n content: string,\r\n marker: string,\r\n): { written: boolean; message: string } {\r\n if (existsSync(filePath)) {\r\n const existing = readFileSync(filePath, 'utf8');\r\n if (existing.includes(marker)) {\r\n return { written: false, message: `${filePath}: skill already present` };\r\n }\r\n writeFileSync(filePath, existing + '\\n\\n' + content, 'utf8');\r\n return { written: true, message: `${filePath}: skill appended` };\r\n }\r\n\r\n const dir = filePath.substring(0, filePath.lastIndexOf(isWin ? '\\\\' : '/'));\r\n if (dir && !existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(filePath, content, 'utf8');\r\n return { written: true, message: `${filePath}: skill created` };\r\n}\r\n\r\n// ── Per-Environment Configurators ────────────────────────────────────────────\r\n\r\nfunction configureCursor(cwd: string, result: InitResult): void {\r\n // MCP\r\n const mcpPath = join(cwd, '.cursor', 'mcp.json');\r\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Cursor MCP: ${mcp.message}`);\r\n\r\n // Skills (.cursorrules)\r\n const rulesPath = join(cwd, '.cursorrules');\r\n const skill = appendSkillToFile(rulesPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\r\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Cursor Rules: ${skill.message}`);\r\n}\r\n\r\nfunction configureClaudeDesktop(result: InitResult): void {\r\n const configPath = isWin\r\n ? join(appData(), 'Claude', 'claude_desktop_config.json')\r\n : join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\r\n\r\n const mcp = mergeJsonMcpServer(configPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Claude Desktop MCP: ${mcp.message}`);\r\n}\r\n\r\nfunction configureClaudeCode(cwd: string, result: InitResult): void {\r\n // MCP (.mcp.json in project root)\r\n const mcpPath = join(cwd, '.mcp.json');\r\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Claude Code MCP: ${mcp.message}`);\r\n\r\n // Skills (CLAUDE.md)\r\n const claudeMdPath = join(cwd, 'CLAUDE.md');\r\n const skill = appendSkillToFile(claudeMdPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\r\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Claude Code Skill: ${skill.message}`);\r\n}\r\n\r\nfunction configureAntigravity(cwd: string, result: InitResult): void {\r\n // MCP (workspace-level .agents/mcp_config.json)\r\n const mcpPath = join(cwd, '.agents', 'mcp_config.json');\r\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Antigravity MCP: ${mcp.message}`);\r\n}\r\n\r\nfunction configureVSCode(cwd: string, result: InitResult): void {\r\n // MCP (.vscode/mcp.json — note: VS Code uses \"servers\" not \"mcpServers\")\r\n const mcpPath = join(cwd, '.vscode', 'mcp.json');\r\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'servers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} VS Code MCP: ${mcp.message}`);\r\n\r\n // Copilot instructions\r\n const instructionsPath = join(cwd, '.github', 'copilot-instructions.md');\r\n const skill = appendSkillToFile(instructionsPath, ELEVATE_SKILL_CONTENT, 'elevate_scan');\r\n result.actions.push(`${skill.written ? '✅' : '⏭️'} Copilot Instructions: ${skill.message}`);\r\n}\r\n\r\nfunction configureWindsurf(result: InitResult): void {\r\n const configPath = isWin\r\n ? join(appData(), 'Codeium', 'Windsurf', 'mcp_config.json')\r\n : join(home, '.codeium', 'windsurf', 'mcp_config.json');\r\n\r\n const mcp = mergeJsonMcpServer(configPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Windsurf MCP: ${mcp.message}`);\r\n}\r\n\r\n// ── Main Command Handler ─────────────────────────────────────────────────────\r\n\r\nexport async function handleInitCommand(options: CliOptions): Promise<number> {\r\n const cwd = resolve(process.cwd());\r\n\r\n const result: InitResult = {\r\n cwd,\r\n environments: [],\r\n actions: [],\r\n errors: [],\r\n };\r\n\r\n // ── Step 1: Detect all environments ────────────────────────────────────────\r\n\r\n const detectors: (() => DetectedEnvironment)[] = [\r\n () => detectCursor(cwd),\r\n () => detectClaudeDesktop(),\r\n () => detectClaudeCode(cwd),\r\n () => detectAntigravity(cwd),\r\n () => detectVSCode(cwd),\r\n () => detectWindsurf(),\r\n ];\r\n\r\n for (const detect of detectors) {\r\n result.environments.push(detect());\r\n }\r\n\r\n const detected = result.environments.filter((e) => e.detected);\r\n\r\n // ── Step 2: Configure detected environments ────────────────────────────────\r\n\r\n if (detected.length === 0) {\r\n // Nothing detected? Still offer to create foundational files\r\n if (!options.json) {\r\n console.log(`\\n🪶 Elevate Init\\n`);\r\n console.log(` No AI coding environments detected in this workspace.`);\r\n console.log(` Creating portable .mcp.json for broad compatibility.\\n`);\r\n }\r\n // Create a generic .mcp.json that works with Claude Code and most MCP clients\r\n const mcpPath = join(cwd, '.mcp.json');\r\n const mcp = mergeJsonMcpServer(mcpPath, 'elevate', 'mcpServers');\r\n result.actions.push(`${mcp.written ? '✅' : '⏭️'} Generic MCP: ${mcp.message}`);\r\n } else {\r\n if (!options.json) {\r\n console.log(`\\n🪶 Elevate Init — Detected ${detected.length} environment(s)\\n`);\r\n }\r\n\r\n const configurators: Record<string, (cwd: string, result: InitResult) => void> = {\r\n cursor: configureCursor,\r\n 'claude-desktop': (_cwd, r) => configureClaudeDesktop(r),\r\n 'claude-code': configureClaudeCode,\r\n antigravity: configureAntigravity,\r\n vscode: configureVSCode,\r\n windsurf: (_cwd, r) => configureWindsurf(r),\r\n };\r\n\r\n for (const env of detected) {\r\n try {\r\n const configure = configurators[env.id];\r\n if (configure) {\r\n configure(cwd, result);\r\n }\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n result.errors.push(`${env.name}: ${msg}`);\r\n }\r\n }\r\n }\r\n\r\n // ── Step 3: Output ─────────────────────────────────────────────────────────\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(result, null, 2));\r\n return result.errors.length > 0 ? 1 : 0;\r\n }\r\n\r\n // Pretty console output\r\n console.log(' Environments:');\r\n for (const env of result.environments) {\r\n const status = env.detected ? '✅' : ' ';\r\n const mcpBadge = env.mcpConfigured ? ' [MCP ✓]' : '';\r\n const skillBadge = env.skillConfigured ? ' [Skill ✓]' : '';\r\n console.log(` ${status} ${env.icon} ${env.name.padEnd(22)}${env.detected ? env.reason : 'not detected'}${mcpBadge}${skillBadge}`);\r\n }\r\n\r\n if (result.actions.length > 0) {\r\n console.log(`\\n Actions:`);\r\n for (const action of result.actions) {\r\n console.log(` ${action}`);\r\n }\r\n }\r\n\r\n if (result.errors.length > 0) {\r\n console.log(`\\n ⚠️ Errors:`);\r\n for (const error of result.errors) {\r\n console.log(` ❌ ${error}`);\r\n }\r\n }\r\n\r\n console.log(`\\n Done! Restart your AI coding tools to pick up the new MCP configuration.`);\r\n console.log(` Agents will now automatically use Elevate for dependency management.\\n`);\r\n\r\n return result.errors.length > 0 ? 1 : 0;\r\n}\r\n","/**\r\n * 🪶 Elevate — Model Context Protocol (MCP) Server\r\n *\r\n * Exposes five granular MCP tools over stdio for AI agents\r\n * (Claude, Antigravity, Cursor, GitHub Copilot). The tools share their\r\n * logic with the CLI through the application layer.\r\n */\r\n\r\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport type { ProjectModule, ReleaseChannel } from '../domain/models.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\nimport { classifyOrigin } from '../domain/origin.js';\r\nimport { isPreReleaseVersion, extractPreReleaseTag } from '../domain/versions.js';\r\nimport { candidateToJson, createScanContext, findModule, scanModule, scanModules } from '../application/scan.js';\r\nimport { describeSkip } from '../application/describe.js';\r\nimport { selectRequested } from '../application/update-selection.js';\r\nimport type { UpdateRequest } from '../application/update-selection.js';\r\nimport { runUpdateWorkflow } from '../application/update-workflow.js';\r\nimport { coordinateFromIdentifier, lookupVersions } from '../application/version-lookup.js';\r\n\r\nconst ECOSYSTEM_PROPERTY = {\r\n type: 'string',\r\n enum: ['npm', 'maven'],\r\n description: 'Target ecosystem (default: npm)',\r\n};\r\n\r\nexport async function startMcpServer(config: ElevateConfig): Promise<void> {\r\n const server = new Server(\r\n {\r\n name: 'elevate-mcp',\r\n version: '1.2.0',\r\n },\r\n {\r\n capabilities: {\r\n tools: {},\r\n },\r\n },\r\n );\r\n\r\n // 1. Tool definitions and schemas\r\n server.setRequestHandler(ListToolsRequestSchema, async () => {\r\n return {\r\n tools: [\r\n {\r\n name: 'elevate_discover_modules',\r\n description:\r\n 'Discovers all repository modules and workspaces for Node/npm (package.json) or Java/Maven (pom.xml).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ecosystem: ECOSYSTEM_PROPERTY,\r\n },\r\n },\r\n },\r\n {\r\n name: 'elevate_scan',\r\n description:\r\n 'Scans a module (or all modules) for available dependency updates. Each update has an origin ' +\r\n '(workspace, private, public) and an action: \"update\" (newer registry version) or \"align\" ' +\r\n '(set an internal dependency to the local version of the workspace module). Dependencies that ' +\r\n 'could not be offered are listed under \"skipped\" with the reason.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ecosystem: ECOSYSTEM_PROPERTY,\r\n moduleId: {\r\n type: 'string',\r\n description:\r\n 'Module ID or relative path (e.g. \"apps/e2e-cockpit\"). If omitted, scans the root or primary module.',\r\n },\r\n channel: {\r\n type: 'string',\r\n enum: ['stable', 'all'],\r\n description:\r\n 'Release channel: \"stable\" (production-ready versions only) or \"all\" (including pre-releases/betas). Default: stable',\r\n },\r\n allModules: {\r\n type: 'boolean',\r\n description: 'If true, scans all discovered modules across the monorepo.',\r\n },\r\n },\r\n },\r\n },\r\n {\r\n name: 'elevate_get_versions',\r\n description:\r\n 'Fetches the complete published version history of a package from the registry. ' +\r\n 'Refuses to query a public registry for internal packages (internalScopes).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ecosystem: ECOSYSTEM_PROPERTY,\r\n identifier: {\r\n type: 'string',\r\n description: 'Package identifier (npm: chalk, maven: org.slf4j:slf4j-api)',\r\n },\r\n },\r\n required: ['identifier'],\r\n },\r\n },\r\n {\r\n name: 'elevate_apply_updates',\r\n description:\r\n 'Applies targeted dependency updates to a module, installs packages and runs build & test verification. ' +\r\n 'If installation, the workspace link check or verification fails, all changes are rolled back.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ecosystem: ECOSYSTEM_PROPERTY,\r\n moduleId: {\r\n type: 'string',\r\n description: 'Module ID or relative path of the target module',\r\n },\r\n updates: {\r\n type: 'array',\r\n description: 'List of packages to update with optional target versions',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n identifier: { type: 'string', description: 'Package identifier' },\r\n targetVersion: {\r\n type: 'string',\r\n description:\r\n 'Specific target version (e.g. \"5.6.2\"). If omitted, the version offered by the scan is used.',\r\n },\r\n },\r\n required: ['identifier'],\r\n },\r\n },\r\n allowMajor: {\r\n type: 'boolean',\r\n description: 'Safety guardrail: Must be explicitly true to permit breaking major version upgrades.',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, simulates planned changes without modifying any files.',\r\n },\r\n skipVerification: {\r\n type: 'boolean',\r\n description: 'Skips the post-update build and test verification step.',\r\n },\r\n keepOnFailure: {\r\n type: 'boolean',\r\n description: 'Keeps the changes when verification fails instead of rolling them back.',\r\n },\r\n },\r\n required: ['moduleId', 'updates'],\r\n },\r\n },\r\n {\r\n name: 'elevate_verify',\r\n description:\r\n 'Runs module-specific verification and build checks (e.g. npm ls, mvn test-compile).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ecosystem: ECOSYSTEM_PROPERTY,\r\n moduleId: {\r\n type: 'string',\r\n description: 'Module ID or relative path of the module to verify',\r\n },\r\n },\r\n },\r\n },\r\n ],\r\n };\r\n });\r\n\r\n // 2. Tool execution handlers\r\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { name, arguments: args = {} } = request.params;\r\n const ecosystem = (args.ecosystem as 'npm' | 'maven') || 'npm';\r\n const strategy = EcosystemFactory.getStrategy(ecosystem);\r\n const reply = (value: unknown) => ({ content: [{ type: 'text', text: JSON.stringify(value, null, 2) }] });\r\n\r\n const resolveModule = (modules: ProjectModule[], query: unknown): ProjectModule => {\r\n const mod = query ? findModule(modules, String(query)) : modules[0];\r\n if (!mod) throw new Error(`Module '${query ?? 'default'}' not found.`);\r\n return mod;\r\n };\r\n\r\n try {\r\n // ── Tool 1: elevate_discover_modules ──\r\n if (name === 'elevate_discover_modules') {\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n return reply({\r\n ecosystem,\r\n count: modules.length,\r\n modules: modules.map((m) => ({\r\n id: m.id,\r\n name: m.name,\r\n relPath: m.relPath,\r\n isRoot: m.isRoot,\r\n version: m.version,\r\n })),\r\n });\r\n }\r\n\r\n // ── Tool 2: elevate_scan ──\r\n if (name === 'elevate_scan') {\r\n const channel = (args.channel as ReleaseChannel) || config.channel || 'stable';\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n const targetModules = args.allModules ? modules : [resolveModule(modules, args.moduleId)];\r\n const context = createScanContext(modules, config, channel);\r\n\r\n const results: unknown[] = [];\r\n let totalCount = 0;\r\n const scanned = await scanModules(strategy, targetModules, context);\r\n for (const mod of targetModules) {\r\n const result = scanned.get(mod)!;\r\n totalCount += result.candidates.length;\r\n results.push({\r\n moduleId: mod.id,\r\n modulePath: mod.relPath,\r\n updateCount: result.candidates.length,\r\n error: result.error,\r\n updates: result.candidates.map(candidateToJson),\r\n skipped: result.skipped.map((s) => ({ ...s, explanation: describeSkip(s) })),\r\n });\r\n }\r\n\r\n return reply({ ecosystem, channel, scannedModules: targetModules.length, totalUpdatesCount: totalCount, results });\r\n }\r\n\r\n // ── Tool 3: elevate_get_versions ──\r\n if (name === 'elevate_get_versions') {\r\n const identifier = String(args.identifier);\r\n const versions = await lookupVersions(strategy, coordinateFromIdentifier(identifier, ecosystem), config);\r\n return reply({\r\n ecosystem,\r\n package: identifier,\r\n totalCount: versions.length,\r\n latest: versions[0] || null,\r\n versions: versions.map((v) => ({\r\n version: v,\r\n isPreRelease: isPreReleaseVersion(v),\r\n tag: extractPreReleaseTag(v),\r\n })),\r\n });\r\n }\r\n\r\n // ── Tool 4: elevate_apply_updates ──\r\n if (name === 'elevate_apply_updates') {\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n const mod = resolveModule(modules, args.moduleId);\r\n const context = createScanContext(modules, config, config.channel);\r\n const scan = await scanModule(strategy, mod, context);\r\n if (scan.error) throw new Error(`Scan failed: ${scan.error}`);\r\n\r\n const updatesToApply = selectRequested(scan, (args.updates as UpdateRequest[]) || [], {\r\n ecosystem,\r\n allowMajor: Boolean(args.allowMajor),\r\n originOf: (identifier) => classifyOrigin(identifier, ecosystem, context).kind,\r\n });\r\n\r\n if (updatesToApply.length === 0) {\r\n return reply({ success: true, targetModule: mod.relPath, ecosystem, updatedCount: 0, message: 'No updates selected to apply.' });\r\n }\r\n\r\n if (args.dryRun) {\r\n return reply({\r\n dryRun: true,\r\n targetModule: mod.relPath,\r\n ecosystem,\r\n updatesCount: updatesToApply.length,\r\n updates: updatesToApply.map((u) => ({\r\n identifier: u.coordinate.identifier,\r\n action: u.action,\r\n currentRange: u.currentRange,\r\n newRange: u.newRange,\r\n diff: u.diff,\r\n declaredIn: u.declaration?.displayPath,\r\n })),\r\n });\r\n }\r\n\r\n const summary = await runUpdateWorkflow(strategy, mod, config.rootDir, updatesToApply, {\r\n postUpdateScript: config.postUpdateScript,\r\n postUpdateLabel: config.postUpdateLabel,\r\n skipVerification: Boolean(args.skipVerification),\r\n keepOnFailure: Boolean(args.keepOnFailure),\r\n });\r\n\r\n return reply({\r\n success: !summary.rolledBack && summary.verificationStatus !== 'warn',\r\n targetModule: mod.relPath,\r\n ecosystem,\r\n ...summary,\r\n });\r\n }\r\n\r\n // ── Tool 5: elevate_verify ──\r\n if (name === 'elevate_verify') {\r\n const modules = await strategy.discovery.discover(config.rootDir);\r\n const mod = resolveModule(modules, args.moduleId);\r\n const verifyResult = await strategy.verifier.verify(mod, config.rootDir, {\r\n customScript: config.postUpdateScript,\r\n customLabel: config.postUpdateLabel,\r\n });\r\n return reply({ module: mod.relPath, ecosystem, ...verifyResult });\r\n }\r\n\r\n throw new Error(`Unknown tool: ${name}`);\r\n } catch (err: any) {\r\n return {\r\n isError: true,\r\n content: [\r\n {\r\n type: 'text',\r\n text: `❌ Error executing tool '${name}': ${err.message || String(err)}`,\r\n },\r\n ],\r\n };\r\n }\r\n });\r\n\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n"],"mappings":"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","names":["existsSync","readFileSync","dirname","join","resolve","resolve","child","readFileSync","join","semver","semver","existsSync","readFileSync","dirname","join","resolve","dirname","join","resolve","resolve","dirname","existsSync","join","readFileSync","readFileSync","join","semver","readFileSync","join","relative","message","existsSync","readFileSync","join","join","readFileSync","relative","existsSync","dirname","join","relative","resolve","existsSync","statSync","join","resolve","existsSync","readFileSync","dirname","join","resolve","message","readFileSync","dirname","resolve","existsSync","join","resolve","join","existsSync","statSync","resolve","existsSync","join","relative","dirname","existsSync","join","existsSync","dirname","join","relative","resolve","message","IS_WINDOWS","resolve","join","existsSync","relative","dirname","existsSync","readFileSync","readdirSync","writeFileSync","join","join","existsSync","readdirSync","readFileSync","join","writeFileSync","existsSync","readFileSync","join","existsSync","join","semver","relative","relative","DIFF_ORDER","join","collect","alignmentCandidate","semver","readFileSync","writeFileSync","join","resolve","resolve","join","readFileSync","writeFileSync","dirname","join","relative","resolve","VERIFY_TIMEOUT_MS","label","join","resolve","dirname","relative","resolve","existsSync","join","dirname","message","loadConfig","readFileSync","useState","useMemo","useCallback","Box","useInput","message","message","useState","useCallback","useState","useEffect","useMemo","useCallback","semver","useState","useCallback","useEffect","useMemo","semver","useState","useCallback","existsSync","relative","existsSync","readFileSync","rmSync","writeFileSync","changedFiles","existsSync","relative","useState","useCallback","useState","useEffect","useState","useEffect","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","Box","Text","jsx","jsxs","Text","Box","jsx","jsxs","Box","Text","Box","Text","useState","useEffect","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","useState","useEffect","useMemo","Box","Text","jsx","jsxs","WINDOW_SIZE","useState","useEffect","useMemo","Box","Text","Box","Text","Fragment","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Fragment","jsx","jsxs","useState","useMemo","useCallback","useInput","Box","message","semver","message","semver","message","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","jsx","loadConfig"]}