@dennisrepa/elevate 1.5.0 â 1.7.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/README.md +1 -1
- package/dist/cli.js +104 -24
- package/dist/cli.js.map +1 -1
- package/docs/de.md +1 -0
- package/docs/en.md +1 -0
- package/package.json +2 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/domain/version-policy.ts","../src/domain/versions.ts","../src/adapters/npm/npm-package-manager.ts","../src/adapters/shared/checkout.ts","../src/adapters/shared/process.ts","../src/adapters/npm/npm-discovery.ts","../src/adapters/npm/pnpm-workspace.ts","../src/adapters/npm/npm-registry.ts","../src/domain/origin.ts","../src/adapters/npm/npm-commands.ts","../src/adapters/npm/npm-config.ts","../src/adapters/npm/npm-scanner.ts","../src/adapters/shared/pool.ts","../src/adapters/npm/npm-protocols.ts","../src/adapters/npm/npm-updater.ts","../src/domain/ports.ts","../src/adapters/npm/npm-lockfile.ts","../src/adapters/npm/pnpm-audit.ts","../src/adapters/npm/pnpm-lockfile.ts","../src/adapters/npm/npm-verifier.ts","../src/adapters/npm/npm-strategy.ts","../src/adapters/cargo/cargo-strategy.ts","../src/adapters/cargo/cargo-discovery.ts","../src/adapters/cargo/cargo-command.ts","../src/adapters/cargo/cargo-metadata.ts","../src/adapters/cargo/cargo-config.ts","../src/version.ts","../src/adapters/cargo/cargo-index.ts","../src/adapters/cargo/cargo-registry.ts","../src/adapters/cargo/cargo-versions.ts","../src/adapters/cargo/cargo-requirement.ts","../src/adapters/cargo/cargo-scanner.ts","../src/adapters/cargo/cargo-toml.ts","../src/adapters/cargo/cargo-updater.ts","../src/adapters/shared/xml.ts","../src/adapters/shared/text-edit.ts","../src/adapters/cargo/cargo-lockfile.ts","../src/adapters/cargo/cargo-verifier.ts","../src/adapters/maven/maven-discovery.ts","../src/adapters/maven/maven-project.ts","../src/adapters/maven/maven-pom.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/application/scan.ts","../src/hooks/use-packages.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 â per-ecosystem version rules.\r\n *\r\n * Collects what differs between ecosystems when a target version is chosen, so\r\n * callers ask the strategy instead of testing the ecosystem name.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { VersionDiff } from './models.js';\r\nimport { cleanJavaVersion, diffVersions, rangePrefix } from './versions.js';\r\n\r\nexport interface VersionPolicy {\r\n /** A version in comparable SemVer form, or null when it has no numeric core. */\r\n normalize(version: string): string | null;\r\n /** The text to write for `target`, given the requirement currently in the manifest. */\r\n rewrite(currentRange: string, target: string): string;\r\n /** Size of the change from `current` (normalised) to `target` (raw). */\r\n diff(current: string, target: string): VersionDiff;\r\n /** Whether a dependency without a pending update may be set to a version by hand. */\r\n readonly allowsManualTargets: boolean;\r\n}\r\n\r\n/** Diff using SemVer; an unreadable side counts as `minor`. */\r\nexport function semverDiff(current: string, target: string, normalize: (v: string) => string | null): VersionDiff {\r\n const to = normalize(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\nexport const npmVersionPolicy: VersionPolicy = {\r\n normalize: (v) => semver.valid(v),\r\n rewrite: (current, target) => `${rangePrefix(current)}${target}`,\r\n diff: (current, target) => semverDiff(current, target, (v) => semver.valid(v)),\r\n allowsManualTargets: true,\r\n};\r\n\r\nexport const mavenVersionPolicy: VersionPolicy = {\r\n normalize: cleanJavaVersion,\r\n rewrite: (_current, target) => target,\r\n diff: (current, target) => semverDiff(current, target, cleanJavaVersion),\r\n allowsManualTargets: false,\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 â package manager detection.\r\n *\r\n * Elevate's Node.js support drives npm and pnpm. In a repository managed by\r\n * Yarn or Bun, running either would create a second lockfile and a\r\n * `node_modules` layout the project does not use, so such repositories are\r\n * 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\nimport { runCommand } from '../shared/process.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 Elevate does not drive (Yarn, Bun). */\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 and pnpm for Node.js projects; using either here would create a 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/**\r\n * Returns the package manager Elevate drives for this repository; throws\r\n * `UnsupportedPackageManagerError` for Yarn and Bun.\r\n */\r\nexport function assertSupportedPackageManager(rootDir: string): 'npm' | 'pnpm' {\r\n const detected = detectPackageManager(rootDir);\r\n if (detected.name === 'npm' || detected.name === 'pnpm') return detected.name;\r\n throw new UnsupportedPackageManagerError(detected);\r\n}\r\n\r\n/** Thrown when pnpm is required but cannot be run. */\r\nexport class PackageManagerNotFoundError extends Error {\r\n constructor(reason: string, detected: DetectedPackageManager) {\r\n super(\r\n `pnpm could not be run in this repository (${reason}). This repository is managed by pnpm ` +\r\n `(${detected.evidence}); install pnpm or enable Corepack (corepack enable). Nothing was changed.`,\r\n );\r\n this.name = 'PackageManagerNotFoundError';\r\n }\r\n}\r\n\r\nconst VERSION_TIMEOUT_MS = 15_000;\r\nconst verifiedRoots = new Set<string>();\r\n\r\n/**\r\n * Makes sure `pnpm --version` succeeds before anything is touched. A success is\r\n * remembered per root for the life of the process; a failure is not.\r\n */\r\nexport async function ensurePnpmRunnable(rootDir: string, detected: DetectedPackageManager): Promise<void> {\r\n const key = resolve(rootDir);\r\n if (verifiedRoots.has(key)) return;\r\n\r\n let reason: string | undefined;\r\n try {\r\n const result = await runCommand('pnpm', ['--version'], { cwd: rootDir, timeoutMs: VERSION_TIMEOUT_MS });\r\n if (result.timedOut) reason = 'pnpm --version timed out';\r\n else if (result.exitCode !== 0) {\r\n const line = firstLine(result.stderr) || firstLine(result.stdout);\r\n reason = `pnpm --version exited with code ${result.exitCode}: ${line}`;\r\n }\r\n } catch {\r\n reason = 'command not found';\r\n }\r\n if (reason !== undefined) throw new PackageManagerNotFoundError(reason, detected);\r\n verifiedRoots.add(key);\r\n}\r\n\r\n/**\r\n * Guard for operations on a repository: refuses Yarn and Bun, and for pnpm\r\n * checks that it can run. Returns the manager to drive.\r\n */\r\nexport async function prepareSupportedPackageManager(rootDir: string): Promise<'npm' | 'pnpm'> {\r\n const manager = assertSupportedPackageManager(rootDir);\r\n if (manager === 'pnpm') await ensurePnpmRunnable(rootDir, detectPackageManager(rootDir));\r\n return manager;\r\n}\r\n\r\nfunction firstLine(text: string): string {\r\n return text.split(/\\r?\\n/).find((l) => l.trim() !== '')?.trim() ?? '';\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 â 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 â 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`. In a pnpm repository\r\n * the patterns come from `pnpm-workspace.yaml` instead and go through the same\r\n * library, so patterns, negation and `node_modules` are treated alike.\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\nimport { detectPackageManager } from './npm-package-manager.js';\r\nimport { readPnpmWorkspace } from './pnpm-workspace.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`, or that contains a\r\n * valid `pnpm-workspace.yaml`.\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 || readPnpmWorkspace(dir)) 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 // A pnpm repository declares its packages in pnpm-workspace.yaml and ignores the field.\r\n const patterns =\r\n detectPackageManager(rootDir).name === 'pnpm' ? readPnpmWorkspace(rootDir)?.packages : rootPkg?.workspaces;\r\n if (!patterns || (Array.isArray(patterns) && patterns.length === 0)) return modules;\r\n\r\n let workspaces: Map<string, string>;\r\n try {\r\n workspaces = await mapWorkspaces({ cwd: rootDir, pkg: { ...rootPkg, workspaces: patterns } });\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 â pnpm-workspace.yaml.\r\n *\r\n * Reads the package patterns and catalogs of a pnpm workspace, and replaces a\r\n * catalog entry's range in place. The YAML document API is used for writing\r\n * because it keeps the position of every node: only the entry's range is\r\n * replaced, comments, quoting and line endings stay as they are.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { isMap, isScalar, parse, parseDocument } from 'yaml';\r\nimport type { Scalar } from 'yaml';\r\n\r\nexport const PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml';\r\n\r\nexport interface PnpmWorkspace {\r\n /** Absolute path of the file. */\r\n file: string;\r\n /** `[]` when missing or empty. */\r\n packages: string[];\r\n /** By catalog name; the default catalog is `default`. */\r\n catalogs: ReadonlyMap<string, ReadonlyMap<string, string>>;\r\n /** `catalog` and `catalogs.default` are both defined. */\r\n ambiguousDefaultCatalog: boolean;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction entries(value: unknown): Map<string, string> {\r\n const map = new Map<string, string>();\r\n if (isRecord(value)) {\r\n for (const [name, range] of Object.entries(value)) {\r\n if (typeof range === 'string') map.set(name, range);\r\n }\r\n }\r\n return map;\r\n}\r\n\r\n/** `undefined` when the file is absent or not valid YAML. */\r\nexport function readPnpmWorkspace(rootDir: string): PnpmWorkspace | undefined {\r\n const file = join(rootDir, PNPM_WORKSPACE_FILE);\r\n let data: unknown;\r\n try {\r\n data = parse(readFileSync(file, 'utf8'));\r\n } catch {\r\n return undefined;\r\n }\r\n if (data !== null && !isRecord(data)) return undefined;\r\n const doc = (data ?? {}) as Record<string, unknown>;\r\n\r\n const packages = Array.isArray(doc.packages) ? doc.packages.filter((p): p is string => typeof p === 'string') : [];\r\n\r\n const catalogs = new Map<string, Map<string, string>>();\r\n const named = isRecord(doc.catalogs) ? doc.catalogs : {};\r\n for (const [name, content] of Object.entries(named)) catalogs.set(name, entries(content));\r\n const hasTopLevel = isRecord(doc.catalog);\r\n const hasNamedDefault = isRecord(named.default);\r\n if (hasTopLevel) catalogs.set('default', entries(doc.catalog));\r\n\r\n return { file, packages, catalogs, ambiguousDefaultCatalog: hasTopLevel && hasNamedDefault };\r\n}\r\n\r\n/**\r\n * Returns `source` with the range of one catalog entry replaced. Throws when\r\n * the entry does not exist.\r\n */\r\nexport function setCatalogRange(source: string, catalog: string, name: string, newRange: string): string {\r\n const doc = parseDocument(source);\r\n const holders = catalog === 'default' ? [doc.get('catalog', true), doc.getIn(['catalogs', 'default'], true)] : [doc.getIn(['catalogs', catalog], true)];\r\n\r\n for (const holder of holders) {\r\n if (!isMap(holder)) continue;\r\n const node = holder.get(name, true);\r\n if (!isScalar(node) || !node.range) continue;\r\n const scalar = node as Scalar;\r\n const [start, end] = scalar.range!;\r\n const quote = scalar.type === 'QUOTE_DOUBLE' ? '\"' : scalar.type === 'QUOTE_SINGLE' ? \"'\" : '';\r\n return source.slice(0, start) + quote + newRange + quote + source.slice(end);\r\n }\r\n throw new Error(`No entry for '${name}' in catalog '${catalog}' of ${PNPM_WORKSPACE_FILE}.`);\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\nimport { commands, driverFor } from './npm-commands.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` (`pnpm view` in a pnpm repository); resolves null on any failure. */\r\n protected async view(name: string, field: string, cwd: string): Promise<unknown> {\r\n try {\r\n const { command, args } = commands.view(driverFor(cwd), name, field);\r\n const result = await runCommand(command, args, {\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 â 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 â package manager commands.\r\n *\r\n * The only place that knows which executable and arguments each package\r\n * manager gets. Everything else asks this table.\r\n */\r\n\r\nimport { detectPackageManager } from './npm-package-manager.js';\r\n\r\nexport type Driver = 'npm' | 'pnpm';\r\n\r\nexport interface CommandLine {\r\n command: Driver;\r\n args: string[];\r\n}\r\n\r\n/**\r\n * The package manager that answers version and configuration queries in\r\n * `dir`. Yarn and Bun repositories are not refused for read-only queries and\r\n * are served by npm.\r\n */\r\nexport function driverFor(dir: string): Driver {\r\n return detectPackageManager(dir).name === 'pnpm' ? 'pnpm' : 'npm';\r\n}\r\n\r\nexport const commands = {\r\n /** Install after Elevate wrote new ranges. pnpm is told explicitly not to freeze: `CI` would otherwise imply it. */\r\n install: (m: Driver): CommandLine =>\r\n m === 'pnpm' ? { command: 'pnpm', args: ['install', '--no-frozen-lockfile'] } : { command: 'npm', args: ['install'] },\r\n /** Restore the installed state after a rollback. */\r\n restore: (m: Driver): CommandLine =>\r\n m === 'pnpm' ? { command: 'pnpm', args: ['install', '--frozen-lockfile'] } : { command: 'npm', args: ['install'] },\r\n /** Default verification. */\r\n verify: (m: Driver): CommandLine =>\r\n m === 'pnpm'\r\n ? { command: 'pnpm', args: ['install', '--frozen-lockfile', '--lockfile-only'] }\r\n : { command: 'npm', args: ['ls'] },\r\n view: (m: Driver, name: string, field: string): CommandLine => ({ command: m, args: ['view', name, field, '--json'] }),\r\n config: (m: Driver): CommandLine => ({ command: m, args: ['config', 'list', '--json'] }),\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\nimport { commands, driverFor } from './npm-commands.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', 'npm.jsr.io']);\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 { command, args } = commands.config(driverFor(cwd));\r\n const result = await runCommand(command, args, { 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` (`pnpm view` in a pnpm repository).\r\n *\r\n * In a pnpm repository `workspace:` ranges are aligned, a plain range on a\r\n * module is listed as not linked, and `catalog:` ranges are resolved through\r\n * pnpm-workspace.yaml.\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 VersionDeclaration,\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 { prepareSupportedPackageManager } from './npm-package-manager.js';\r\nimport { splitRangeProtocol } from './npm-protocols.js';\r\nimport { readPnpmWorkspace } from './pnpm-workspace.js';\r\nimport type { PnpmWorkspace } from './pnpm-workspace.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 const manager = await prepareSupportedPackageManager(context.rootDir);\r\n const pnpm = manager === 'pnpm';\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 workspaceFile = pnpm ? readPnpmWorkspace(context.rootDir) : undefined;\r\n\r\n const outcomes = await mapPooled(declaredDependencies(pkg), CONCURRENCY, async (dep): Promise<Outcome> => {\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 if (pnpm && isUpgradableRange(dep.range) && splitRangeProtocol(dep.range).protocol === undefined) {\r\n // pnpm resolves a plain range from the registry, never from the workspace.\r\n return { skipped: { identifier: dep.name, origin: 'workspace', reason: 'not-linked', detail: dep.range } };\r\n }\r\n const candidate = target ? alignmentCandidate(dep, target, origin, pnpm) : null;\r\n return candidate ? { candidate } : null;\r\n }\r\n if (pnpm && splitRangeProtocol(dep.range).protocol === 'catalog') {\r\n return this.catalogOutcome(dep, origin, context, module.path, workspaceFile);\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 /** A `catalog:` dependency: the range comes from pnpm-workspace.yaml and is written back there. */\r\n private async catalogOutcome(\r\n dep: DeclaredDependency,\r\n origin: DependencyOrigin,\r\n context: ScanContext,\r\n modulePath: string,\r\n workspaceFile: PnpmWorkspace | undefined,\r\n ): Promise<Outcome> {\r\n const catalogName = splitRangeProtocol(dep.range).rest || 'default';\r\n const unresolved = (detail: string): Outcome => ({\r\n skipped: { identifier: dep.name, origin: origin.kind, reason: 'catalog-unresolved', detail },\r\n });\r\n if (!workspaceFile) return unresolved('pnpm-workspace.yaml is missing or not valid YAML');\r\n if (catalogName === 'default' && workspaceFile.ambiguousDefaultCatalog) {\r\n return unresolved(\"catalog 'default' is defined twice (catalog and catalogs.default)\");\r\n }\r\n const catalog = workspaceFile.catalogs.get(catalogName);\r\n if (!catalog) return unresolved(`no catalog '${catalogName}'`);\r\n const range = catalog.get(dep.name);\r\n if (range === undefined) return unresolved(`no entry for '${dep.name}' in catalog '${catalogName}'`);\r\n\r\n const declaration: VersionDeclaration = {\r\n file: workspaceFile.file,\r\n kind: 'catalog',\r\n catalogName,\r\n displayPath: 'pnpm-workspace.yaml',\r\n };\r\n const sharedWith = usersOfCatalogEntry(context, modulePath, dep.name, catalogName);\r\n return this.registryOutcome({ ...dep, range }, origin, context, {\r\n declaration,\r\n ...(sharedWith.length > 0 ? { sharedWith } : {}),\r\n });\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 extra: Partial<UpdateCandidate> = {},\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 ...extra,\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 pnpm = false,\r\n): UpdateCandidate | null {\r\n // Only a pnpm repository interprets `workspace:`; elsewhere it is no SemVer range and stays untouched.\r\n const split = pnpm ? splitRangeProtocol(dep.range) : { protocol: undefined, rest: dep.range };\r\n const range = split.protocol === 'workspace' ? split.rest : dep.range;\r\n const protocol = split.protocol === 'workspace' ? 'workspace:' : '';\r\n\r\n const local = target.version;\r\n if (!local || !semver.valid(local) || !isUpgradableRange(range)) return null;\r\n if (semver.satisfies(local, range, { includePrerelease: true })) return null;\r\n\r\n const currentClean = semver.minVersion(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: `${protocol}${rangePrefix(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/** Ids of the other modules whose scanned sections refer to the same catalog entry. */\r\nfunction usersOfCatalogEntry(context: ScanContext, selfPath: string, name: string, catalogName: string): string[] {\r\n const users: string[] = [];\r\n for (const module of context.workspace.values()) {\r\n if (module.path === selfPath) continue;\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 continue;\r\n }\r\n const dep = declaredDependencies(pkg).find((d) => d.name === name);\r\n if (!dep || splitRangeProtocol(dep.range).protocol !== 'catalog') continue;\r\n if ((splitRangeProtocol(dep.range).rest || 'default') !== catalogName) continue;\r\n users.push(module.id);\r\n }\r\n return users;\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 â pnpm range protocols.\r\n *\r\n * `workspace:` and `catalog:` ranges are only interpreted in pnpm\r\n * repositories; in an npm repository they stay non-SemVer and are ignored.\r\n */\r\n\r\nexport interface SplitRange {\r\n protocol: 'workspace' | 'catalog' | undefined;\r\n /** What follows `workspace:` or `catalog:`; the whole range without a protocol. */\r\n rest: string;\r\n}\r\n\r\nexport function splitRangeProtocol(range: string): SplitRange {\r\n if (range.startsWith('workspace:')) return { protocol: 'workspace', rest: range.slice('workspace:'.length) };\r\n if (range.startsWith('catalog:')) return { protocol: 'catalog', rest: range.slice('catalog:'.length) };\r\n return { protocol: undefined, rest: range };\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 type { RunResult } from '../shared/process.js';\r\nimport {\r\n PackageManagerNotFoundError,\r\n UnsupportedPackageManagerError,\r\n detectPackageManager,\r\n prepareSupportedPackageManager,\r\n} from './npm-package-manager.js';\r\nimport { DEPENDENCY_SECTIONS } from './npm-scanner.js';\r\nimport { findUnlinkedWorkspaceDependencies, readLockfile } from './npm-lockfile.js';\r\nimport { commands } from './npm-commands.js';\r\nimport type { Driver } from './npm-commands.js';\r\nimport { AUDIT_TIMEOUT_MS, parsePnpmAudit, unavailable } from './pnpm-audit.js';\r\nimport type { AuditSummary } from './pnpm-audit.js';\r\nimport { findUnlinkedPnpmDependencies, readPnpmLockfile } from './pnpm-lockfile.js';\r\nimport { setCatalogRange } from './pnpm-workspace.js';\r\n\r\nconst INSTALL_TIMEOUT_MS = 10 * 60_000;\r\n\r\n/** pnpm prints errors on stdout (9 to 11) or stderr (12), so both are quoted; npm's go to stderr. */\r\nfunction failureDetails(manager: Driver, result: RunResult): string {\r\n return manager === 'pnpm' ? tail(`${result.stdout}\\n${result.stderr}`) : tail(result.stderr || result.stdout);\r\n}\r\n\r\nexport class NpmUpdaterAdapter implements DependencyUpdaterPort {\r\n affectedFiles(module: ProjectModule, rootDir: string): string[] {\r\n if (detectPackageManager(rootDir).name === 'pnpm') {\r\n return [\r\n join(module.path, 'package.json'),\r\n join(rootDir, 'package.json'),\r\n join(rootDir, 'pnpm-lock.yaml'),\r\n join(rootDir, 'pnpm-workspace.yaml'),\r\n ];\r\n }\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 let manager: Driver;\r\n try {\r\n manager = await prepareSupportedPackageManager(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError || err instanceof PackageManagerNotFoundError) {\r\n throw new InstallError(err.message);\r\n }\r\n throw err;\r\n }\r\n\r\n // A catalog entry is written where it is declared; the module's package.json keeps its `catalog:` reference.\r\n const catalogUpdates = updates.filter((u) => u.declaration?.kind === 'catalog');\r\n const manifestUpdates = updates.filter((u) => u.declaration?.kind !== 'catalog');\r\n\r\n const pkgPath = join(module.path, 'package.json');\r\n let manifest: { source: string; pkg: any } | undefined;\r\n if (manifestUpdates.length > 0 || catalogUpdates.length === 0) {\r\n try {\r\n const source = readFileSync(pkgPath, 'utf8');\r\n manifest = { source, 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\r\n if (manifest) {\r\n onProgress('Writing new versions to package.jsonâĶ');\r\n for (const item of manifestUpdates) {\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 manifest.pkg[section]?.[name] === 'string') manifest.pkg[section][name] = item.newRange;\r\n }\r\n }\r\n writeFileSync(pkgPath, serializeLike(manifest.source, manifest.pkg), 'utf8');\r\n }\r\n\r\n if (catalogUpdates.length > 0) {\r\n onProgress('Writing new versions to pnpm-workspace.yamlâĶ');\r\n writeCatalogRanges(catalogUpdates);\r\n }\r\n\r\n const install = commands.install(manager);\r\n onProgress(`Running ${manager} installâĶ`);\r\n const result = await runCommand(install.command, install.args, { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n const reason = result.timedOut ? `${manager} install timed out` : `${manager} install failed`;\r\n throw new InstallError(reason, failureDetails(manager, result));\r\n }\r\n\r\n const lockName = manager === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json';\r\n onProgress(`Checking workspace links in ${lockName}âĶ`);\r\n const integrityViolations = verifyAlignedLinks(manager, module, rootDir, updates);\r\n\r\n if (manager === 'pnpm') {\r\n const audit = integrityViolations.length > 0 ? undefined : await runPnpmAudit(rootDir);\r\n return {\r\n updatedCount: updates.length,\r\n auditMessage: audit?.message ?? '',\r\n auditSeverity: audit?.severity ?? 'clean',\r\n fundingMessage: undefined,\r\n integrityViolations,\r\n };\r\n }\r\n\r\n const combined = `${result.stdout}\\n${result.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 Elevate does not drive, so there is nothing to restore.\r\n const name = detectPackageManager(rootDir).name;\r\n if (name !== 'npm' && name !== 'pnpm') return;\r\n\r\n const restore = commands.restore(name);\r\n onProgress(`Restoring node_modules (${name} install)âĶ`);\r\n const result = await runCommand(restore.command, restore.args, { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n throw new InstallError(\r\n `${name} install failed while restoring the previous state`,\r\n name === 'pnpm' ? failureDetails(name, result) : tail(result.stderr),\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Replaces each catalog entry in the file that declares it, once per file. */\r\nfunction writeCatalogRanges(updates: UpdateCandidate[]): void {\r\n const sources = new Map<string, string>();\r\n for (const item of updates) {\r\n const declaration = item.declaration!;\r\n try {\r\n let source = sources.get(declaration.file) ?? readFileSync(declaration.file, 'utf8');\r\n source = setCatalogRange(source, declaration.catalogName ?? 'default', item.coordinate.artifact, item.newRange);\r\n sources.set(declaration.file, source);\r\n } catch (err) {\r\n throw new InstallError(err instanceof Error ? err.message : `Cannot update ${declaration.displayPath}.`);\r\n }\r\n }\r\n for (const [file, source] of sources) writeFileSync(file, source, 'utf8');\r\n}\r\n\r\n/** The vulnerability summary of pnpm; an audit that gives no result is a warning, never a failure. */\r\nasync function runPnpmAudit(rootDir: string): Promise<AuditSummary> {\r\n try {\r\n const result = await runCommand('pnpm', ['audit', '--json'], { cwd: rootDir, timeoutMs: AUDIT_TIMEOUT_MS });\r\n if (result.timedOut) return unavailable(`pnpm audit timed out after ${AUDIT_TIMEOUT_MS / 1000} seconds`);\r\n return parsePnpmAudit(result.stdout);\r\n } catch {\r\n return unavailable('pnpm audit returned no result');\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(\r\n manager: Driver,\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n): 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 moduleRelPath = relative(rootDir, module.path).replace(/\\\\/g, '/');\r\n if (manager === 'pnpm') return findUnlinkedPnpmDependencies(readPnpmLockfile(rootDir), moduleRelPath, aligned);\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 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 * Problems of the most recent `discover` run that did not stop it, e.g. one\r\n * workspace whose tool run failed while others were found. Empty when none.\r\n */\r\n diagnostics?(): string[];\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 â reading `pnpm audit --json`.\r\n */\r\n\r\nexport const AUDIT_TIMEOUT_MS = 60_000;\r\n\r\nconst LEVELS = ['info', 'low', 'moderate', 'high', 'critical'] as const;\r\n\r\nexport interface AuditSummary {\r\n message: string;\r\n severity: 'clean' | 'warn';\r\n}\r\n\r\nexport function unavailable(reason: string): AuditSummary {\r\n return { message: `Vulnerability check unavailable: ${reason}.`, severity: 'warn' };\r\n}\r\n\r\n/** Only `metadata.vulnerabilities` decides; the exit code does not. */\r\nexport function parsePnpmAudit(output: string): AuditSummary {\r\n let json: any;\r\n try {\r\n json = JSON.parse(output);\r\n } catch {\r\n return unavailable('pnpm audit returned no result');\r\n }\r\n const counts = json?.metadata?.vulnerabilities;\r\n if (counts && typeof counts === 'object') {\r\n const parts: string[] = [];\r\n let total = 0;\r\n for (const level of LEVELS) {\r\n const n = Number(counts[level]) || 0;\r\n total += n;\r\n if (n > 0) parts.push(`${n} ${level}`);\r\n }\r\n if (total === 0) return { message: 'No known vulnerabilities found.', severity: 'clean' };\r\n return {\r\n message: `${total} ${total === 1 ? 'vulnerability' : 'vulnerabilities'} (${parts.join(', ')})`,\r\n severity: 'warn',\r\n };\r\n }\r\n const errorMessage = json?.error?.message;\r\n if (typeof errorMessage === 'string' && errorMessage) return unavailable(errorMessage);\r\n return unavailable('pnpm audit returned no result');\r\n}\r\n","/**\r\n * Elevate â pnpm-lock.yaml integrity checks.\r\n *\r\n * pnpm links a workspace package only for a dependency written with the\r\n * `workspace:` protocol. After an update that aligned such dependencies, the\r\n * `importers` section of the lockfile (lockfileVersion 9.x, pnpm 9 to 12)\r\n * proves that they are linked and not installed from a registry.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { parse } from 'yaml';\r\n\r\nexport interface PnpmImporterEntry {\r\n specifier: string;\r\n version: string;\r\n}\r\n\r\nexport type PnpmImporters = Record<string, Record<string, Record<string, PnpmImporterEntry>>>;\r\n\r\nexport type PnpmLockfile =\r\n | { kind: 'ok'; importers: PnpmImporters }\r\n | { kind: 'missing' }\r\n | { kind: 'unreadable' }\r\n | { kind: 'unsupported'; lockfileVersion: string };\r\n\r\nconst SECTIONS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const;\r\n\r\nexport function readPnpmLockfile(rootDir: string): PnpmLockfile {\r\n const file = join(rootDir, 'pnpm-lock.yaml');\r\n if (!existsSync(file)) return { kind: 'missing' };\r\n let data: any;\r\n try {\r\n data = parse(readFileSync(file, 'utf8'));\r\n } catch {\r\n return { kind: 'unreadable' };\r\n }\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) return { kind: 'unreadable' };\r\n\r\n const lockfileVersion = String(data.lockfileVersion ?? '');\r\n if (!/^9(\\.|$)/.test(lockfileVersion)) return { kind: 'unsupported', lockfileVersion };\r\n const importers = data.importers ?? {};\r\n if (typeof importers !== 'object' || Array.isArray(importers)) return { kind: 'unreadable' };\r\n return { kind: 'ok', importers: importers as PnpmImporters };\r\n}\r\n\r\n/**\r\n * One message per aligned dependency that is not linked.\r\n *\r\n * @param moduleRelPath module directory relative to the root ('' for the root)\r\n */\r\nexport function findUnlinkedPnpmDependencies(\r\n lockfile: PnpmLockfile,\r\n moduleRelPath: string,\r\n names: readonly string[],\r\n): string[] {\r\n switch (lockfile.kind) {\r\n case 'missing':\r\n return ['pnpm-lock.yaml is missing; workspace links cannot be verified'];\r\n case 'unreadable':\r\n return ['pnpm-lock.yaml could not be read; workspace links cannot be verified'];\r\n case 'unsupported':\r\n return [\r\n `pnpm-lock.yaml has lockfileVersion '${lockfile.lockfileVersion}', which Elevate cannot read; workspace links cannot be verified`,\r\n ];\r\n }\r\n\r\n const importer = lockfile.importers[moduleRelPath === '' ? '.' : moduleRelPath] ?? {};\r\n const violations: string[] = [];\r\n for (const name of names) {\r\n let entry: PnpmImporterEntry | undefined;\r\n for (const section of SECTIONS) {\r\n entry = importer[section]?.[name];\r\n if (entry) break;\r\n }\r\n if (!entry) violations.push(`${name}: not present in pnpm-lock.yaml`);\r\n else if (!String(entry.version).startsWith('link:')) {\r\n violations.push(`${name}: resolved to ${entry.version} 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 (npm) or `pnpm install --frozen-lockfile --lockfile-only`\r\n * (pnpm; `pnpm ls` exits 0 for missing dependencies, so it cannot judge).\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 {\r\n PackageManagerNotFoundError,\r\n UnsupportedPackageManagerError,\r\n prepareSupportedPackageManager,\r\n} from './npm-package-manager.js';\r\nimport { commands } from './npm-commands.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 let manager: 'npm' | 'pnpm' = 'npm';\r\n if (!options.customScript) {\r\n // Judging a tree a different package manager installed would be wrong.\r\n try {\r\n manager = await prepareSupportedPackageManager(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError || err instanceof PackageManagerNotFoundError) {\r\n return { status: 'warn', details: err.message, label: options.customLabel || 'Dependency verification' };\r\n }\r\n throw err;\r\n }\r\n }\r\n const defaultLabel =\r\n manager === 'pnpm'\r\n ? 'Lockfile consistency (pnpm install --frozen-lockfile)'\r\n : 'Dependency tree integrity (npm ls)';\r\n const label = options.customLabel || options.customScript || defaultLabel;\r\n\r\n const verify = commands.verify(manager);\r\n const result = options.customScript\r\n ? await runShellScript(options.customScript, { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS })\r\n : await runCommand(verify.command, verify.args, { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n\r\n if (result.exitCode === 0) {\r\n const details =\r\n manager === 'pnpm' && !options.customScript\r\n ? 'pnpm-lock.yaml is up to date with all package.json files.'\r\n : 'All dependencies are installed and consistent.';\r\n return { status: 'clean', details, label };\r\n }\r\n const output =\r\n manager === 'pnpm' && !options.customScript\r\n ? tail(`${result.stdout}\\n${result.stderr}`)\r\n : tail(result.stderr || result.stdout);\r\n return { status: 'warn', details: result.timedOut ? 'Verification timed out.' : output, label };\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 { npmVersionPolicy } from '../../domain/version-policy.js';\r\nimport { detectPackageManager } from './npm-package-manager.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\r\n packageManagerFor(rootDir: string): string {\r\n return detectPackageManager(rootDir).name;\r\n }\r\n\r\n displayNameFor(rootDir: string): string {\r\n return detectPackageManager(rootDir).name === 'pnpm' ? 'Node / pnpm' : 'Node / npm';\r\n }\r\n readonly icon = 'ðĶ';\r\n readonly manifestFile = 'package.json';\r\n readonly versioning = npmVersionPolicy;\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 â Cargo ecosystem strategy: wires the Cargo adapters together.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\r\nimport type { Ecosystem } from '../../domain/models.js';\r\nimport type { VersionPolicy } from '../../domain/version-policy.js';\r\nimport { CargoModuleDiscoveryAdapter } from './cargo-discovery.js';\r\nimport { CargoConfigReader } from './cargo-config.js';\r\nimport { CargoIndexClient } from './cargo-index.js';\r\nimport { loadMetadata } from './cargo-metadata.js';\r\nimport { CargoRegistryAdapter } from './cargo-registry.js';\r\nimport { cargoDiff, rewriteRequirement } from './cargo-requirement.js';\r\nimport { CargoDependencyAdapter } from './cargo-scanner.js';\r\nimport { CargoUpdaterAdapter } from './cargo-updater.js';\r\nimport { CargoVerificationAdapter } from './cargo-verifier.js';\r\n\r\nexport const cargoVersionPolicy: VersionPolicy = {\r\n normalize: (v) => semver.valid(v),\r\n rewrite: rewriteRequirement,\r\n diff: (current, target) => (semver.valid(current) && semver.valid(target) ? (semver.eq(current, target) ? 'patch' : cargoDiff(current, target)) : 'minor'),\r\n // Updates are written where the scan found the declaration.\r\n allowsManualTargets: false,\r\n};\r\n\r\nexport class CargoEcosystemStrategy implements EcosystemStrategy {\r\n readonly ecosystem: Ecosystem = 'cargo';\r\n readonly displayName = 'Rust / Cargo';\r\n readonly icon = 'ðĶ';\r\n readonly manifestFile = 'Cargo.toml';\r\n readonly versioning = cargoVersionPolicy;\r\n\r\n private readonly config = new CargoConfigReader();\r\n private readonly index = new CargoIndexClient();\r\n private readonly endpoint = (registry: string | undefined, cwd: string) => this.config.resolve(registry, cwd);\r\n\r\n readonly discovery = new CargoModuleDiscoveryAdapter();\r\n readonly registry = new CargoRegistryAdapter({ index: this.index, endpoint: this.endpoint });\r\n readonly reader = new CargoDependencyAdapter({ loadMetadata, index: this.index, endpoint: this.endpoint });\r\n readonly updater = new CargoUpdaterAdapter();\r\n readonly verifier = new CargoVerificationAdapter();\r\n\r\n getTabLabels(counts: { total: number; prodCount: number; devCount: number }, t: any): 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 â Cargo workspace discovery.\r\n *\r\n * Finds every `Cargo.toml` in the repository (not only at the root, so a Rust\r\n * crate beside a JavaScript app is found) and lets Cargo itself report the\r\n * workspace members: one `cargo metadata` run per workspace.\r\n */\r\n\r\nimport { existsSync, readdirSync, readFileSync } 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 { CargoUnavailableError } from './cargo-command.js';\r\nimport { CargoMetadataError, loadMetadata } from './cargo-metadata.js';\r\n\r\n/** Directories that never hold modules. A manifest below `src` is a test fixture or template. */\r\nconst IGNORED = new Set(['target', 'node_modules', 'vendor', 'dist', 'build', 'out', 'src']);\r\n\r\nconst norm = (path: string) => resolve(path).replace(/\\\\/g, '/');\r\n\r\nfunction findManifests(root: string): string[] {\r\n const found: string[] = [];\r\n const walk = (dir: string, depth: number) => {\r\n let entries;\r\n try {\r\n entries = readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n if (entries.some((e) => e.isFile() && e.name === 'Cargo.toml')) found.push(join(dir, 'Cargo.toml'));\r\n for (const entry of entries) {\r\n if (entry.isDirectory() && !entry.name.startsWith('.') && !IGNORED.has(entry.name)) walk(join(dir, entry.name), depth + 1);\r\n }\r\n };\r\n walk(root, 0);\r\n // Shallowest first, so a workspace root is read before the crates inside it.\r\n return found.sort((a, b) => a.split(/[\\\\/]/).length - b.split(/[\\\\/]/).length || a.localeCompare(b));\r\n}\r\n\r\nconst declaresWorkspace = (dir: string) => {\r\n try {\r\n return /^\\s*\\[workspace[\\].]/m.test(readFileSync(join(dir, 'Cargo.toml'), 'utf8'));\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nexport class CargoModuleDiscoveryAdapter implements ModuleDiscoveryPort {\r\n private problems: string[] = [];\r\n\r\n diagnostics(): string[] {\r\n return [...this.problems];\r\n }\r\n\r\n /** The nearest ancestor declaring `[workspace]`; failing that, the nearest directory with a manifest. */\r\n findRoot(startDir: string, boundaryDir: string | undefined): string | undefined {\r\n const boundary = boundaryDir ? resolve(boundaryDir) : undefined;\r\n const chain: string[] = [];\r\n for (let dir = resolve(startDir); ; ) {\r\n chain.push(dir);\r\n const parent = dirname(dir);\r\n if (dir === boundary || parent === dir) break;\r\n dir = parent;\r\n }\r\n return chain.find(declaresWorkspace) ?? chain.find((d) => existsSync(join(d, 'Cargo.toml')));\r\n }\r\n\r\n async discover(rootDir: string): Promise<ProjectModule[]> {\r\n const covered = new Set<string>();\r\n const modules: ProjectModule[] = [];\r\n const errors: CargoMetadataError[] = [];\r\n this.problems = [];\r\n\r\n for (const manifest of findManifests(rootDir)) {\r\n if (covered.has(norm(manifest))) continue;\r\n try {\r\n const metadata = await loadMetadata(dirname(manifest));\r\n for (const pkg of metadata.packages) {\r\n covered.add(norm(pkg.manifest_path));\r\n const path = dirname(pkg.manifest_path);\r\n const relPath = relative(rootDir, path).replace(/\\\\/g, '/');\r\n modules.push({\r\n id: pkg.name,\r\n name: pkg.name,\r\n path,\r\n relPath: relPath === '' ? 'Root' : relPath,\r\n ecosystem: 'cargo',\r\n isRoot: relPath === '',\r\n version: pkg.version,\r\n aggregatorDir: resolve(metadata.workspace_root),\r\n });\r\n }\r\n } catch (err) {\r\n if (err instanceof CargoUnavailableError) throw err;\r\n if (err instanceof CargoMetadataError) {\r\n errors.push(err);\r\n this.problems.push(err.message);\r\n }\r\n else throw err;\r\n }\r\n }\r\n\r\n // Failures are only fatal when they leave nothing to show.\r\n if (modules.length === 0 && errors.length > 0) throw errors[0]!;\r\n modules.sort((a, b) => (a.isRoot ? -1 : b.isRoot ? 1 : a.relPath.localeCompare(b.relPath)));\r\n\r\n // Independent workspaces may each hold a crate of the same name; ids must stay unique.\r\n const taken = new Set<string>();\r\n for (const module of modules) {\r\n if (taken.has(module.id)) module.id = `${module.name} (${module.relPath})`;\r\n taken.add(module.id);\r\n }\r\n return modules;\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo invocation.\r\n *\r\n * Runs `cargo` from the PATH in a given working directory. Without it, Cargo\r\n * features fail with `CargoUnavailableError` instead of silently degrading.\r\n */\r\n\r\nimport { runCommand } from '../shared/process.js';\r\nimport type { RunResult } from '../shared/process.js';\r\n\r\n/** Thrown when `cargo` cannot be started. */\r\nexport class CargoUnavailableError extends Error {\r\n constructor() {\r\n super('Cargo is not available: no `cargo` on the PATH. Install Rust (https://rustup.rs).');\r\n this.name = 'CargoUnavailableError';\r\n }\r\n}\r\n\r\nexport async function runCargo(args: string[], options: { cwd: string; timeoutMs?: number }): Promise<RunResult> {\r\n let result: RunResult;\r\n try {\r\n result = await runCommand('cargo', args, options);\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') throw new CargoUnavailableError();\r\n throw err;\r\n }\r\n if (looksLikeMissingCommand(result) && !(await cargoStarts(options.cwd))) throw new CargoUnavailableError();\r\n return result;\r\n}\r\n\r\n/**\r\n * On Windows the command runs through cmd.exe, which reports a missing program\r\n * as an ordinary failure (exit code 1 and a message in the user's language), not\r\n * as ENOENT. Cargo itself always prefixes its failures with \"error\", so a failure\r\n * without output on stdout and without that prefix is worth one `cargo --version`.\r\n */\r\nfunction looksLikeMissingCommand(result: RunResult): boolean {\r\n return (\r\n process.platform === 'win32' && result.exitCode !== 0 && !result.stdout.trim() && !/^error/m.test(result.stderr)\r\n );\r\n}\r\n\r\nasync function cargoStarts(cwd: string): Promise<boolean> {\r\n try {\r\n return (await runCommand('cargo', ['--version'], { cwd, timeoutMs: 30_000 })).exitCode === 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Cargo's error lines for a concise failure message. */\r\nexport function cargoErrors(output: string): string {\r\n const lines = output.split(/\\r?\\n/);\r\n const errors = lines.filter((l) => /^error(\\[E\\d+\\])?:/.test(l));\r\n const summary = (errors.length > 0 ? errors : lines.filter((l) => l.trim()).slice(-10)).slice(0, 12);\r\n if (/toolchain '.+' is not installed/.test(output)) {\r\n summary.push('Install it with `rustup toolchain install` (the project pins it in rust-toolchain.toml).');\r\n }\r\n return summary.join('\\n');\r\n}\r\n","/**\r\n * Elevate â `cargo metadata --no-deps`.\r\n *\r\n * Works without network access and without a Cargo.lock, resolves\r\n * `workspace = true` inheritance, and reports each dependency with its\r\n * normalised requirement, kind, target and source.\r\n */\r\n\r\nimport { runCargo, cargoErrors } from './cargo-command.js';\r\n\r\nexport interface MetadataDependency {\r\n name: string;\r\n req: string;\r\n kind: 'dev' | 'build' | null;\r\n rename: string | null;\r\n /** `registry+âĶcrates.io-index`, `sparse+<url>`, `git+âĶ`; null for path dependencies. */\r\n source: string | null;\r\n /** Index URL of an alternative registry. */\r\n registry?: string | null;\r\n path?: string;\r\n target: string | null;\r\n optional: boolean;\r\n}\r\n\r\nexport interface MetadataPackage {\r\n name: string;\r\n version: string;\r\n manifest_path: string;\r\n rust_version: string | null;\r\n dependencies: MetadataDependency[];\r\n}\r\n\r\nexport interface CargoMetadata {\r\n packages: MetadataPackage[];\r\n workspace_root: string;\r\n}\r\n\r\nexport class CargoMetadataError extends Error {\r\n constructor(message: string, readonly dir: string) {\r\n super(message);\r\n this.name = 'CargoMetadataError';\r\n }\r\n}\r\n\r\nexport async function loadMetadata(dir: string): Promise<CargoMetadata> {\r\n const result = await runCargo(['metadata', '--no-deps', '--format-version', '1'], { cwd: dir, timeoutMs: 60_000 });\r\n if (result.exitCode !== 0) {\r\n throw new CargoMetadataError(`cargo metadata failed in ${dir}: ${cargoErrors(result.stderr || result.stdout)}`, dir);\r\n }\r\n try {\r\n return JSON.parse(result.stdout) as CargoMetadata;\r\n } catch {\r\n throw new CargoMetadataError(`cargo metadata printed no JSON in ${dir}.`, dir);\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo registry configuration.\r\n *\r\n * `cargo metadata` does not show source replacement, and `cargo config get`\r\n * is nightly-only, so the few settings that decide where a lookup goes are\r\n * read from the configuration files and environment directly.\r\n *\r\n * The reader is deliberately narrow and fails closed: a replacement it cannot\r\n * interpret (a vendored directory, a local registry, a git source) is refused.\r\n * Falling back to crates.io would bypass the mirror or air gap the project\r\n * was set up with.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\r\nimport { getStaticTOMLValue, parseTOML } from 'toml-eslint-parser';\r\n\r\nconst CRATES_IO = 'registry+https://github.com/rust-lang/crates.io-index';\r\nconst PUBLIC_HOSTS = new Set(['index.crates.io', 'static.crates.io', 'crates.io', 'github.com']);\r\n\r\nexport class UnsupportedSourceError extends Error {\r\n constructor(detail: string) {\r\n super(`Cargo is configured to use a package source Elevate cannot read (${detail}). No lookup was made.`);\r\n this.name = 'UnsupportedSourceError';\r\n }\r\n}\r\n\r\ntype Table = Record<string, any>;\r\n\r\nfunction isPublicIndex(index: string): boolean {\r\n try {\r\n const url = new URL(index.replace(/^(sparse|registry)\\+/, ''));\r\n return PUBLIC_HOSTS.has(url.hostname.toLowerCase()) && (url.hostname !== 'github.com' || url.pathname.includes('crates.io-index'));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Overlays `top` onto `base` key by key. */\r\nfunction merge(base: Table, top: Table): Table {\r\n const out: Table = { ...base };\r\n for (const [key, value] of Object.entries(top)) {\r\n const existing = out[key];\r\n out[key] =\r\n value && typeof value === 'object' && !Array.isArray(value) && existing && typeof existing === 'object' && !Array.isArray(existing)\r\n ? merge(existing, value)\r\n : value;\r\n }\r\n return out;\r\n}\r\n\r\nfunction loadFile(file: string, depth = 0): Table {\r\n let table: Table;\r\n try {\r\n table = getStaticTOMLValue(parseTOML(readFileSync(file, 'utf8'))) as Table;\r\n } catch {\r\n return {};\r\n }\r\n const includes: unknown = table.include;\r\n delete table.include;\r\n if (!Array.isArray(includes) || depth > 4) return table;\r\n let included: Table = {};\r\n for (const entry of includes) {\r\n const path = typeof entry === 'string' ? entry : entry?.path;\r\n if (typeof path === 'string') included = merge(included, loadFile(isAbsolute(path) ? path : resolve(dirname(file), path), depth + 1));\r\n }\r\n return merge(included, table);\r\n}\r\n\r\nexport class CargoConfigReader {\r\n private readonly env: NodeJS.ProcessEnv;\r\n private readonly cache = new Map<string, Table>();\r\n\r\n constructor(options: { env?: NodeJS.ProcessEnv } = {}) {\r\n this.env = options.env ?? process.env;\r\n }\r\n\r\n /** The configuration as Cargo would merge it for `cwd`: nearest file first, CARGO_HOME last. */\r\n private config(cwd: string): Table {\r\n const start = resolve(cwd);\r\n let cached = this.cache.get(start);\r\n if (cached) return cached;\r\n const files: string[] = [];\r\n for (let dir = start; ; ) {\r\n for (const name of ['config.toml', 'config']) {\r\n const file = join(dir, '.cargo', name);\r\n if (existsSync(file)) {\r\n files.push(file);\r\n break;\r\n }\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n const home = this.env.CARGO_HOME ?? join(homedir(), '.cargo');\r\n for (const name of ['config.toml', 'config']) {\r\n const file = join(home, name);\r\n if (existsSync(file) && !files.includes(file)) {\r\n files.push(file);\r\n break;\r\n }\r\n }\r\n // Later entries have lower precedence, so apply them first.\r\n cached = files.reduceRight((acc, file) => merge(acc, loadFile(file)), {} as Table);\r\n this.cache.set(start, cached);\r\n return cached;\r\n }\r\n\r\n /** `[source.*]` comes from files only: Cargo ignores `CARGO_SOURCE_*` variables (checked with Cargo 1.97). */\r\n private sourceField(config: Table, source: string, field: string): string | undefined {\r\n const value = config.source?.[source]?.[field];\r\n return typeof value === 'string' ? value : undefined;\r\n }\r\n\r\n /**\r\n * The index a lookup goes to. `registry` is the index URL of an alternative\r\n * registry as Cargo reports it, or undefined for crates.io.\r\n */\r\n async resolve(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }> {\r\n const config = this.config(cwd);\r\n let name = registry === undefined ? 'crates-io' : this.sourceNamed(config, registry);\r\n let index = registry ?? CRATES_IO;\r\n const seen = new Set<string>();\r\n\r\n while (name !== undefined) {\r\n if (seen.has(name)) throw new UnsupportedSourceError(`replacement cycle at '${name}'`);\r\n seen.add(name);\r\n const next = this.sourceField(config, name, 'replace-with');\r\n if (next === undefined) break;\r\n for (const kind of ['directory', 'local-registry', 'git']) {\r\n if (this.sourceField(config, next, kind) !== undefined) throw new UnsupportedSourceError(`'${next}' is a ${kind} source`);\r\n }\r\n const target = this.sourceField(config, next, 'registry');\r\n if (target !== undefined) {\r\n index = target;\r\n name = next;\r\n // A source that is itself replaced continues the chain; one that is not ends it.\r\n if (this.sourceField(config, next, 'replace-with') === undefined) break;\r\n continue;\r\n }\r\n if (this.sourceField(config, next, 'replace-with') === undefined) {\r\n throw new UnsupportedSourceError(`'${next}' has no registry`);\r\n }\r\n name = next;\r\n }\r\n return { index, isPublic: isPublicIndex(index) };\r\n }\r\n\r\n /** Name of the `[source.*]` table whose registry is `url`, if any. */\r\n private sourceNamed(config: Table, url: string): string | undefined {\r\n return Object.keys(config.source ?? {}).find((n) => this.sourceField(config, n, 'registry') === url);\r\n }\r\n}\r\n","/**\r\n * Elevate â the product version.\r\n *\r\n * Bundled builds get it injected at build time (`__ELEVATE_VERSION__`), because\r\n * no package.json lies next to a bundle or a standalone binary. From source it\r\n * is read from package.json.\r\n */\r\n\r\nimport { createRequire } from 'node:module';\r\n\r\ndeclare const __ELEVATE_VERSION__: string | undefined;\r\n\r\nfunction fromPackage(): string {\r\n try {\r\n return (createRequire(import.meta.url)('../package.json') as { version: string }).version;\r\n } catch {\r\n return '0.0.0';\r\n }\r\n}\r\n\r\nexport const VERSION: string = typeof __ELEVATE_VERSION__ === 'string' ? __ELEVATE_VERSION__ : fromPackage();\r\n","/**\r\n * Elevate â Cargo sparse index client.\r\n *\r\n * Reads one index file per crate over HTTP. It sends no credentials: a\r\n * registry that asks for authentication is reported as such instead of being\r\n * served, so Elevate never handles registry tokens.\r\n */\r\n\r\nimport { VERSION } from '../../version.js';\r\n\r\nexport interface IndexVersion {\r\n version: string;\r\n yanked: boolean;\r\n /** Minimum supported Rust version the crate declares. */\r\n rustVersion: string | undefined;\r\n}\r\n\r\nexport class RegistryAuthRequiredError extends Error {\r\n constructor(readonly index: string) {\r\n super(`The registry ${index} requires authentication. Elevate does not handle registry credentials.`);\r\n this.name = 'RegistryAuthRequiredError';\r\n }\r\n}\r\n\r\nexport class CrateNotFoundError extends Error {\r\n constructor(readonly crate: string, readonly index: string) {\r\n super(`'${crate}' is not in the registry ${index}.`);\r\n this.name = 'CrateNotFoundError';\r\n }\r\n}\r\n\r\nexport class UnsupportedIndexError extends Error {\r\n constructor(readonly index: string) {\r\n super(`The registry index ${index} is not a sparse index; Elevate cannot read it.`);\r\n this.name = 'UnsupportedIndexError';\r\n }\r\n}\r\n\r\nconst CRATES_IO_SPARSE = 'https://index.crates.io/';\r\nconst CRATES_IO_GIT = 'registry+https://github.com/rust-lang/crates.io-index';\r\n\r\n/** Path of a crate's index file below the index root. */\r\nexport function indexPath(name: string): string {\r\n const n = name.toLowerCase();\r\n if (n.length <= 2) return `${n.length}/${n}`;\r\n if (n.length === 3) return `3/${n[0]}/${n}`;\r\n return `${n.slice(0, 2)}/${n.slice(2, 4)}/${n}`;\r\n}\r\n\r\nexport function parseIndex(text: string): IndexVersion[] {\r\n const versions: IndexVersion[] = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n if (!raw.trim()) continue;\r\n try {\r\n const entry = JSON.parse(raw);\r\n if (typeof entry.vers !== 'string') continue;\r\n versions.push({ version: entry.vers, yanked: entry.yanked === true, rustVersion: entry.rust_version });\r\n } catch {\r\n // A line that is not JSON says nothing about the others.\r\n }\r\n }\r\n return versions;\r\n}\r\n\r\n/** Turns an index URL as Cargo prints it into the root of a sparse index. */\r\nfunction sparseRoot(index: string): string {\r\n if (index === CRATES_IO_GIT) return CRATES_IO_SPARSE;\r\n if (index.startsWith('sparse+')) {\r\n const url = index.slice('sparse+'.length);\r\n return url.endsWith('/') ? url : `${url}/`;\r\n }\r\n throw new UnsupportedIndexError(index);\r\n}\r\n\r\nconst userAgent = () => `elevate/${VERSION} (+https://github.com/DennisRepa/Elevate)`;\r\n\r\nfunction networkReason(err: unknown): string {\r\n const cause = (err as { cause?: { message?: string } })?.cause?.message;\r\n return cause ?? (err instanceof Error ? err.message : String(err));\r\n}\r\n\r\nexport class CargoIndexClient {\r\n private readonly memo = new Map<string, Promise<IndexVersion[]>>();\r\n\r\n constructor(\r\n private readonly fetchFn: typeof fetch = fetch,\r\n private readonly env: NodeJS.ProcessEnv = process.env,\r\n ) {}\r\n\r\n /** All versions of a crate in oldest-first file order. Memoised per index and crate. */\r\n versions(index: string, crate: string): Promise<IndexVersion[]> {\r\n const key = `${index}\\n${crate.toLowerCase()}`;\r\n let pending = this.memo.get(key);\r\n if (!pending) {\r\n pending = this.load(index, crate);\r\n this.memo.set(key, pending);\r\n }\r\n return pending;\r\n }\r\n\r\n private async load(index: string, crate: string): Promise<IndexVersion[]> {\r\n const url = `${sparseRoot(index)}${indexPath(crate)}`;\r\n let response: Response;\r\n try {\r\n response = await this.fetchFn(url, { headers: { 'user-agent': userAgent() } });\r\n } catch (err) {\r\n throw new Error(`Cannot reach ${url}: ${networkReason(err)}${this.proxyHint()}`);\r\n }\r\n if (response.status === 401 || response.status === 403) throw new RegistryAuthRequiredError(index);\r\n if (response.status === 404) throw new CrateNotFoundError(crate, index);\r\n if (!response.ok) throw new Error(`Registry answered ${response.status} for ${url}.`);\r\n return parseIndex(await response.text());\r\n }\r\n\r\n /**\r\n * Node's fetch ignores HTTP(S)_PROXY unless NODE_USE_ENV_PROXY=1 is set when\r\n * the process starts (measured with Node 22.23; it cannot be switched on later).\r\n */\r\n private proxyHint(): string {\r\n const proxied = this.env.HTTPS_PROXY || this.env.https_proxy || this.env.HTTP_PROXY || this.env.http_proxy;\r\n if (!proxied || this.env.NODE_USE_ENV_PROXY === '1') return '';\r\n return ' A proxy is configured, but Node does not use it for registry lookups unless you start Elevate with NODE_USE_ENV_PROXY=1.';\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo registry adapter for ad-hoc version queries\r\n * (`elevate versions`, MCP `elevate_get_versions`, the version picker).\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 type { IndexVersion } from './cargo-index.js';\r\nimport { selectVersion } from './cargo-versions.js';\r\n\r\nexport interface CargoRegistryDeps {\r\n index: { versions(index: string, crate: string): Promise<IndexVersion[]> };\r\n endpoint(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }>;\r\n}\r\n\r\nexport class CargoRegistryAdapter implements RegistryPort {\r\n constructor(private readonly deps: CargoRegistryDeps) {}\r\n\r\n async resolveEndpoint(coordinate: DependencyCoordinate, cwd: string): Promise<RegistryEndpoint> {\r\n const { index, isPublic } = await this.deps.endpoint(coordinate.registry, cwd);\r\n return { url: index, isPublic };\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 return selectVersion(await this.load(coordinate, cwd), { channel }).version ?? null;\r\n }\r\n\r\n /** Published, not yanked, newest first. Lookup errors propagate so they are not mistaken for \"no versions\". */\r\n async getAllVersions(coordinate: DependencyCoordinate, cwd = process.cwd()): Promise<string[]> {\r\n return (await this.load(coordinate, cwd))\r\n .filter((v) => !v.yanked && semver.valid(v.version))\r\n .map((v) => v.version)\r\n .sort(semver.rcompare);\r\n }\r\n\r\n private async load(coordinate: DependencyCoordinate, cwd: string): Promise<IndexVersion[]> {\r\n const { index } = await this.deps.endpoint(coordinate.registry, cwd);\r\n return this.deps.index.versions(index, coordinate.artifact);\r\n }\r\n}\r\n","/**\r\n * Elevate â chooses the version to offer from a crate's index entries.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { ReleaseChannel } from '../../domain/models.js';\r\nimport type { IndexVersion } from './cargo-index.js';\r\n\r\nexport interface Selection {\r\n version: string | undefined;\r\n /** The newest candidate that was passed over because it needs a newer rustc than the project declares. */\r\n blockedByMsrv?: { version: string; requires: string };\r\n}\r\n\r\nconst rust = (v: string) => semver.coerce(v)?.version;\r\n\r\nexport function selectVersion(\r\n versions: readonly IndexVersion[],\r\n options: { channel: ReleaseChannel; rustVersion?: string },\r\n): Selection {\r\n const candidates = versions\r\n .filter((v) => !v.yanked && semver.valid(v.version))\r\n .filter((v) => options.channel === 'all' || semver.prerelease(v.version) === null)\r\n .sort((a, b) => semver.rcompare(a.version, b.version));\r\n\r\n const project = options.rustVersion ? rust(options.rustVersion) : undefined;\r\n let blocked: Selection['blockedByMsrv'];\r\n for (const candidate of candidates) {\r\n const needs = candidate.rustVersion ? rust(candidate.rustVersion) : undefined;\r\n if (project && needs && semver.gt(needs, project)) {\r\n blocked ??= { version: candidate.version, requires: candidate.rustVersion! };\r\n continue;\r\n }\r\n return { version: candidate.version, ...(blocked ? { blockedByMsrv: blocked } : {}) };\r\n }\r\n return { version: undefined, ...(blocked ? { blockedByMsrv: blocked } : {}) };\r\n}\r\n","/**\r\n * Elevate â Cargo version requirements.\r\n *\r\n * Cargo's syntax differs from npm's where it matters: a bare `1.2.3` means\r\n * `^1.2.3` (npm's `semver` reads it as exact), and `0.x` versions break at the\r\n * first non-zero component. Everything that touches a Cargo requirement goes\r\n * through this module so the `semver` package is never handed a raw Cargo string.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { VersionDiff } from '../../domain/models.js';\r\n\r\n/** One comparator, operator bare/`^`/`~`/`=`, one to three numeric components. */\r\nconst SIMPLE = /^(\\^|~|=)?\\s*(\\d+(?:\\.\\d+){0,2})$/;\r\n\r\n/** Translates a Cargo requirement into a range the `semver` package understands. */\r\nexport function toSemverRange(requirement: string): string | null {\r\n const parts = requirement.split(',').map((p) => p.trim());\r\n if (parts.some((p) => p === '')) return null;\r\n const converted = parts.map((part) => {\r\n const bare = part.match(/^\\d/);\r\n return bare ? `^${part}` : part;\r\n });\r\n return semver.validRange(converted.join(' ')) ? converted.join(' ') : null;\r\n}\r\n\r\n/** Whether `version` satisfies the Cargo requirement. */\r\nexport function satisfiesRequirement(requirement: string, version: string): boolean {\r\n const range = toSemverRange(requirement);\r\n return range !== null && semver.satisfies(version, range, { includePrerelease: false });\r\n}\r\n\r\n/** Only a single plain comparator can be rewritten; wildcards and compound requirements are left alone. */\r\nexport function isUpgradableRequirement(requirement: string): boolean {\r\n return SIMPLE.test(requirement.trim());\r\n}\r\n\r\n/** The lowest version the requirement allows, or null if it is not a valid requirement. */\r\nexport function requirementFloor(requirement: string): string | null {\r\n const range = toSemverRange(requirement);\r\n return range ? (semver.minVersion(range)?.version ?? null) : null;\r\n}\r\n\r\n/**\r\n * Writes `target` in the style of `current`: same operator, same number of\r\n * components (`1` -> `2`, `1.0` -> `2.3`, `1.0.100` -> `1.0.229`). A pre-release\r\n * target is written in full. When the result still allows the target and equals\r\n * `current`, there is nothing to change.\r\n */\r\nexport function rewriteRequirement(current: string, target: string): string {\r\n const match = current.trim().match(SIMPLE);\r\n if (!match) return target;\r\n if (semver.prerelease(target)) return `${match[1] ?? ''}${target}`;\r\n const precision = match[2]!.split('.').length;\r\n const [major, minor, patch] = target.split(/[-+]/)[0]!.split('.');\r\n const written = [major, minor, patch].slice(0, precision).join('.');\r\n return `${match[1] ?? ''}${written}`;\r\n}\r\n\r\n/** Difference of two versions by Cargo's compatibility rule (leftmost non-zero component breaks). */\r\nexport function cargoDiff(from: string, to: string): VersionDiff {\r\n const a = semver.parse(from);\r\n const b = semver.parse(to);\r\n if (!a || !b) return 'minor';\r\n if (a.major > 0 || b.major > a.major) {\r\n if (b.major !== a.major) return 'major';\r\n return b.minor !== a.minor ? 'minor' : 'patch';\r\n }\r\n if (a.minor > 0) {\r\n if (b.minor !== a.minor) return 'major';\r\n return 'minor';\r\n }\r\n return 'major';\r\n}\r\n","/**\r\n * Elevate â Cargo dependency scanner.\r\n *\r\n * `cargo metadata` says which dependencies a crate has and where each comes\r\n * from; the Cargo.toml text says where the version is written. Both are\r\n * combined: a dependency becomes a candidate only when its declaration was\r\n * found and agrees with what Cargo resolved.\r\n *\r\n * - workspace: a path dependency on a member. Cargo refuses a `version` that\r\n * excludes the member's version, so such a literal is offered for alignment.\r\n * - private: a crate from an alternative registry, or named by `internalScopes`.\r\n * It is looked up only in its own registry, never on a public one.\r\n * - public: everything else, looked up in the registry Cargo would use.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\nimport semver from 'semver';\r\nimport type { DependencyReaderPort, ScanContext } from '../../domain/ports.js';\r\nimport type {\r\n DependencyOrigin,\r\n ProjectModule,\r\n ScanResult,\r\n SkippedDependency,\r\n UpdateCandidate,\r\n VersionDeclaration,\r\n} from '../../domain/models.js';\r\nimport { matchesInternalScope } from '../../domain/origin.js';\r\nimport { extractPreReleaseTag } from '../../domain/versions.js';\r\nimport { mapPooled } from '../shared/pool.js';\r\nimport type { IndexVersion } from './cargo-index.js';\r\nimport type { CargoMetadata, MetadataDependency, MetadataPackage } from './cargo-metadata.js';\r\nimport {\r\n cargoDiff,\r\n isUpgradableRequirement,\r\n requirementFloor,\r\n rewriteRequirement,\r\n satisfiesRequirement,\r\n toSemverRange,\r\n} from './cargo-requirement.js';\r\nimport { parseCargoManifest } from './cargo-toml.js';\r\nimport type { DependencyDeclaration, DependencySection } from './cargo-toml.js';\r\nimport { selectVersion } from './cargo-versions.js';\r\n\r\nconst CONCURRENCY = 6;\r\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\r\n\r\nexport interface CargoScannerDeps {\r\n loadMetadata(dir: string): Promise<CargoMetadata>;\r\n index: { versions(index: string, crate: string): Promise<IndexVersion[]> };\r\n /** The index a lookup goes to: the alternative registry's, or the one Cargo uses for crates.io. */\r\n endpoint(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }>;\r\n}\r\n\r\ntype Outcome = { candidate: UpdateCandidate; note?: SkippedDependency } | { skipped: SkippedDependency } | null;\r\n\r\nexport class CargoDependencyAdapter implements DependencyReaderPort {\r\n constructor(private readonly deps: CargoScannerDeps) {}\r\n\r\n async scan(module: ProjectModule, context: ScanContext): Promise<ScanResult> {\r\n const metadata = await this.deps.loadMetadata(module.aggregatorDir ?? module.path);\r\n const pkg = metadata.packages.find((p) => samePath(join(p.manifest_path, '..'), module.path));\r\n if (!pkg) return { candidates: [], skipped: [] };\r\n\r\n const own = readDeclarations(pkg.manifest_path);\r\n const rootManifest = join(metadata.workspace_root, 'Cargo.toml');\r\n const root = readDeclarations(rootManifest);\r\n const groups = groupDependencies(pkg.dependencies);\r\n\r\n const outcomes = await mapPooled(groups, CONCURRENCY, async (group): Promise<Outcome> => {\r\n const primary = group.find((d) => d.kind === null) ?? group[0]!;\r\n const key = primary.rename ?? primary.name;\r\n const decl = findDeclaration(own, key, primary);\r\n const located = locate(decl, root, key, context.rootDir, pkg.manifest_path, rootManifest);\r\n const scope = group.every((d) => d.kind === 'dev') ? 'dev' : 'prod';\r\n const qualifier = primary.target ?? (primary.kind === 'build' ? 'build' : undefined);\r\n const common = { scope, qualifier } as const;\r\n\r\n if (primary.source === null && primary.path) {\r\n // Matched by location: a path dependency elsewhere that shares a member's name is not that member.\r\n const target = [...context.workspace.values()].find((m) => samePath(m.path, primary.path!));\r\n return target ? alignment(primary, target, located, common) : null;\r\n }\r\n if (!primary.source || primary.source.startsWith('git+')) return null;\r\n const outcome = await this.registryOutcome(primary, located, pkg, metadata, common, context);\r\n const other = group.find((d) => d !== primary && !sameRequirement(d.req, primary.req));\r\n if (outcome && 'candidate' in outcome && other) {\r\n // Only the declarations that match the scanned requirement are rewritten; say what is left.\r\n outcome.note = {\r\n identifier: primary.name,\r\n origin: outcome.candidate.origin.kind,\r\n reason: 'declaration-mismatch',\r\n detail: `${sectionOf(other)} requires ${other.req}; it is not changed`,\r\n };\r\n }\r\n return outcome;\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) {\r\n candidates.push(outcome.candidate);\r\n if (outcome.note) skipped.push(outcome.note);\r\n }\r\n else skipped.push(outcome.skipped);\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 private async registryOutcome(\r\n dep: MetadataDependency,\r\n located: Located | undefined,\r\n pkg: MetadataPackage,\r\n metadata: CargoMetadata,\r\n common: { scope: 'prod' | 'dev'; qualifier: string | undefined },\r\n context: ScanContext,\r\n ): Promise<Outcome> {\r\n const literal = located?.version.value ?? dep.req;\r\n if (!isUpgradableRequirement(literal)) return null;\r\n\r\n if (!located || !sameRequirement(located.version.value, dep.req)) {\r\n return { skipped: { identifier: dep.name, origin: 'public', reason: 'declaration-mismatch', detail: `${literal} in the manifest, ${dep.req} for Cargo` } };\r\n }\r\n\r\n let origin: DependencyOrigin = { kind: 'public' };\r\n if (dep.registry) origin = { kind: 'private', matchedBy: 'scoped-registry', registry: dep.registry };\r\n else if (matchesInternalScope(dep.name, 'cargo', context.internalScopes)) origin = { kind: 'private', matchedBy: 'internal-scope' };\r\n\r\n const endpoint = await this.deps.endpoint(dep.registry ?? undefined, context.rootDir);\r\n if (origin.kind === 'private' && endpoint.isPublic) {\r\n // Asking a public registry about an internal name is what dependency confusion exploits.\r\n return { skipped: { identifier: dep.name, origin: 'private', reason: 'private-on-public-registry', detail: endpoint.index } };\r\n }\r\n\r\n let versions: IndexVersion[];\r\n try {\r\n versions = await this.deps.index.versions(endpoint.index, dep.name);\r\n } catch (err) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'lookup-failed', detail: err instanceof Error ? err.message : String(err) } };\r\n }\r\n\r\n const chosen = selectVersion(versions, { channel: context.channel, rustVersion: pkg.rust_version ?? undefined });\r\n const floor = requirementFloor(literal);\r\n if (!chosen.version) {\r\n if (chosen.blockedByMsrv && floor) {\r\n const { version, requires } = chosen.blockedByMsrv;\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'incompatible-rust-version', detail: ` (${version} needs Rust ${requires})` } };\r\n }\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'lookup-failed', detail: 'no usable version in the registry' } };\r\n }\r\n\r\n const latest = chosen.version;\r\n if (!floor || !semver.gt(latest, floor)) {\r\n // Nothing usable is newer, but a release held back by the project's Rust version is worth a note.\r\n const held = chosen.blockedByMsrv;\r\n if (floor && held && semver.gt(held.version, floor)) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'incompatible-rust-version', detail: ` (${held.version} needs Rust ${held.requires})` } };\r\n }\r\n return null;\r\n }\r\n const newRange = rewriteRequirement(literal, latest);\r\n if (newRange === literal) return null;\r\n\r\n const tag = semver.prerelease(latest) ? (extractPreReleaseTag(latest) ?? 'PRE') : undefined;\r\n const diff = cargoDiff(floor, latest);\r\n const candidate: UpdateCandidate = {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'cargo', ...(dep.registry ? { registry: dep.registry } : {}) },\r\n currentRange: literal,\r\n currentClean: floor,\r\n latest,\r\n newRange,\r\n diff,\r\n scope: common.scope,\r\n selected: diff !== 'major',\r\n origin,\r\n action: 'update',\r\n declaration: located.declaration,\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n ...(common.qualifier ? { qualifier: common.qualifier } : {}),\r\n ...(located.inherited ? { sharedWith: sharersOf(metadata, pkg, dep.rename ?? dep.name) } : {}),\r\n };\r\n return { candidate };\r\n }\r\n}\r\n\r\ninterface Located {\r\n version: { value: string; start: number; end: number };\r\n declaration: VersionDeclaration;\r\n inherited: boolean;\r\n}\r\n\r\nfunction alignment(\r\n dep: MetadataDependency,\r\n target: ProjectModule,\r\n located: Located | undefined,\r\n common: { scope: 'prod' | 'dev'; qualifier: string | undefined },\r\n): Outcome {\r\n const local = target.version;\r\n if (!located || !local || !semver.valid(local)) return null;\r\n const literal = located.version.value;\r\n if (!isUpgradableRequirement(literal) || satisfiesRequirement(literal, local)) return null;\r\n\r\n const floor = requirementFloor(literal) ?? '0.0.0';\r\n const diff = cargoDiff(floor, local);\r\n const tag = semver.prerelease(local) ? (extractPreReleaseTag(local) ?? 'PRE') : undefined;\r\n return {\r\n candidate: {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'cargo' },\r\n currentRange: literal,\r\n currentClean: floor,\r\n latest: local,\r\n newRange: rewriteRequirement(literal, local),\r\n diff,\r\n scope: common.scope,\r\n selected: diff !== 'major',\r\n origin: { kind: 'workspace', moduleId: target.id, moduleRelPath: target.relPath },\r\n action: 'align',\r\n declaration: located.declaration,\r\n availableVersions: [local],\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n ...(common.qualifier ? { qualifier: common.qualifier } : {}),\r\n },\r\n };\r\n}\r\n\r\nfunction groupDependencies(deps: MetadataDependency[]): MetadataDependency[][] {\r\n const groups = new Map<string, MetadataDependency[]>();\r\n for (const dep of deps) {\r\n const id = `${dep.rename ?? dep.name}`;\r\n groups.set(id, [...(groups.get(id) ?? []), dep]);\r\n }\r\n return [...groups.values()];\r\n}\r\n\r\nfunction readDeclarations(manifestPath: string): DependencyDeclaration[] {\r\n try {\r\n return parseCargoManifest(readFileSync(manifestPath, 'utf8'));\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nconst sectionOf = (dep: MetadataDependency): DependencySection =>\r\n dep.kind === 'dev' ? 'dev-dependencies' : dep.kind === 'build' ? 'build-dependencies' : 'dependencies';\r\n\r\nfunction findDeclaration(decls: DependencyDeclaration[], key: string, dep: MetadataDependency) {\r\n const candidates = decls.filter((d) => !d.inWorkspace && d.key === key);\r\n return (\r\n candidates.find((d) => d.section === sectionOf(dep) && (d.target ?? null) === dep.target) ?? candidates[0]\r\n );\r\n}\r\n\r\nfunction locate(\r\n decl: DependencyDeclaration | undefined,\r\n root: DependencyDeclaration[],\r\n key: string,\r\n repoRoot: string,\r\n manifestPath: string,\r\n rootManifest: string,\r\n): Located | undefined {\r\n if (!decl) return undefined;\r\n if (decl.inherited) {\r\n const shared = root.find((d) => d.inWorkspace && d.key === key);\r\n if (!shared?.version) return undefined;\r\n return {\r\n version: shared.version,\r\n inherited: true,\r\n declaration: { file: rootManifest, kind: 'dependency-management', displayPath: display(repoRoot, rootManifest) },\r\n };\r\n }\r\n if (!decl.version) return undefined;\r\n return {\r\n version: decl.version,\r\n inherited: false,\r\n declaration: { file: manifestPath, kind: 'dependency', displayPath: display(repoRoot, manifestPath) },\r\n };\r\n}\r\n\r\n/** Other members that inherit the same workspace dependency. */\r\nfunction sharersOf(metadata: CargoMetadata, self: MetadataPackage, key: string): string[] {\r\n return metadata.packages\r\n .filter((p) => p !== self)\r\n .filter((p) => readDeclarations(p.manifest_path).some((d) => d.key === key && d.inherited))\r\n .map((p) => p.name);\r\n}\r\n\r\nconst display = (repoRoot: string, file: string) => relative(repoRoot, file).replace(/\\\\/g, '/');\r\nconst samePath = (a: string, b: string) => relative(a, b) === '';\r\n\r\nfunction sameRequirement(literal: string, req: string): boolean {\r\n const a = toSemverRange(literal);\r\n const b = toSemverRange(req);\r\n return a !== null && b !== null && semver.validRange(a) === semver.validRange(b);\r\n}\r\n","/**\r\n * Elevate â Cargo.toml dependency declarations.\r\n *\r\n * Finds, for every dependency of a manifest, where its version is written.\r\n * The parser reports exact source ranges, so an update can replace just the\r\n * characters inside the quotes and leave comments, quote style and line\r\n * endings alone.\r\n */\r\n\r\nimport { parseTOML } from 'toml-eslint-parser';\r\n\r\nexport type DependencySection = 'dependencies' | 'dev-dependencies' | 'build-dependencies';\r\n\r\nexport interface VersionLiteral {\r\n value: string;\r\n /** Offsets of the text between the quotes. */\r\n start: number;\r\n end: number;\r\n}\r\n\r\nexport interface DependencyDeclaration {\r\n /** Table key: the crate name, or its rename when `package = \"âĶ\"` is used. */\r\n key: string;\r\n section: DependencySection;\r\n /** `cfg(âĶ)` or target triple of a `[target.*]` table. */\r\n target?: string;\r\n /** Declared in `[workspace.dependencies]`. */\r\n inWorkspace: boolean;\r\n /** `workspace = true`: the version lives in the workspace root. */\r\n inherited: boolean;\r\n /** `package = \"âĶ\"`: the real crate name behind a rename. */\r\n package?: string;\r\n version?: VersionLiteral;\r\n}\r\n\r\nconst SECTIONS: Record<string, DependencySection> = {\r\n dependencies: 'dependencies',\r\n 'dev-dependencies': 'dev-dependencies',\r\n dev_dependencies: 'dev-dependencies',\r\n 'build-dependencies': 'build-dependencies',\r\n build_dependencies: 'build-dependencies',\r\n};\r\n\r\ninterface Leaf {\r\n path: string[];\r\n node: any;\r\n}\r\n\r\nexport function parseCargoManifest(source: string): DependencyDeclaration[] {\r\n const root = parseTOML(source).body[0] as any;\r\n const leaves: Leaf[] = [];\r\n\r\n const keyPath = (key: any): string[] => key.keys.map((k: any) => (k.type === 'TOMLBare' ? k.name : k.value));\r\n const visitPair = (prefix: string[], pair: any): void => {\r\n const path = [...prefix, ...keyPath(pair.key)];\r\n leaves.push({ path, node: pair.value });\r\n if (pair.value.type === 'TOMLInlineTable') for (const inner of pair.value.body) visitPair(path, inner);\r\n };\r\n\r\n for (const element of root.body) {\r\n if (element.type === 'TOMLKeyValue') visitPair([], element);\r\n else if (element.type === 'TOMLTable') {\r\n const header = keyPath(element.key);\r\n for (const pair of element.body) visitPair(header, pair);\r\n leaves.push({ path: header, node: element });\r\n }\r\n }\r\n\r\n const byKey = new Map<string, DependencyDeclaration>();\r\n for (const { path, node } of leaves) {\r\n const located = locateSection(path);\r\n if (!located || located.rest.length === 0) continue;\r\n const [key, field] = located.rest;\r\n const id = `${located.inWorkspace}|${located.target ?? ''}|${located.section}|${key}`;\r\n let decl = byKey.get(id);\r\n if (!decl) {\r\n decl = { key: key!, section: located.section, target: located.target, inWorkspace: located.inWorkspace, inherited: false };\r\n byKey.set(id, decl);\r\n }\r\n if (located.rest.length === 1 && node.type === 'TOMLValue' && node.kind === 'string') {\r\n decl.version = literalOf(node);\r\n } else if (field === 'version' && located.rest.length === 2 && node.type === 'TOMLValue' && node.kind === 'string') {\r\n decl.version = literalOf(node);\r\n } else if (field === 'workspace' && located.rest.length === 2 && node.value === true) {\r\n decl.inherited = true;\r\n } else if (field === 'package' && located.rest.length === 2 && node.type === 'TOMLValue') {\r\n decl.package = String(node.value);\r\n }\r\n }\r\n return [...byKey.values()];\r\n}\r\n\r\nfunction literalOf(node: any): VersionLiteral {\r\n return { value: node.value, start: node.range[0] + 1, end: node.range[1] - 1 };\r\n}\r\n\r\n/** Splits a table path into dependency section, target and the keys below it. */\r\nfunction locateSection(path: string[]) {\r\n let i = 0;\r\n let target: string | undefined;\r\n let inWorkspace = false;\r\n if (path[0] === 'workspace' && path[1] === 'dependencies') {\r\n return { section: 'dependencies' as const, inWorkspace: true, target, rest: path.slice(2) };\r\n }\r\n if (path[0] === 'target' && path.length >= 3) {\r\n target = path[1];\r\n i = 2;\r\n }\r\n const section = SECTIONS[path[i] ?? ''];\r\n if (!section) return undefined;\r\n return { section, inWorkspace, target, rest: path.slice(i + 1) };\r\n}\r\n","/**\r\n * Elevate â Cargo updater.\r\n *\r\n * Writes each new requirement to the literal that declares it â in the\r\n * member's Cargo.toml or, for `workspace = true`, in the workspace root â\r\n * splicing only the version text. Then it brings Cargo.lock in line:\r\n *\r\n * 1. `cargo update -p name@old` re-resolves to the newest allowed version\r\n * 2. `cargo update -p name@new --precise <target>` only if the chosen version is older\r\n *\r\n * Step 2 is needed because `--precise` is ignored while the old lock entry no\r\n * longer fits the manifest (verified with Cargo 1.97). A repository without a\r\n * Cargo.lock gets none.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport semver from 'semver';\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 { applyRangeEdits } from '../shared/text-edit.js';\r\nimport type { RangeEdit } from '../shared/text-edit.js';\r\nimport { StaleEditError } from '../shared/xml.js';\r\nimport { readLockedVersions } from './cargo-lockfile.js';\r\nimport { satisfiesRequirement } from './cargo-requirement.js';\r\nimport { parseCargoManifest } from './cargo-toml.js';\r\n\r\nconst UPDATE_TIMEOUT_MS = 10 * 60_000;\r\n\r\nconst workspaceDir = (module: ProjectModule, rootDir: string) => module.aggregatorDir ?? module.path ?? rootDir;\r\n\r\nexport class CargoUpdaterAdapter 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, 'Cargo.toml'))));\r\n files.add(join(workspaceDir(module, rootDir), 'Cargo.lock'));\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 dir = workspaceDir(module, rootDir);\r\n const lockFile = join(dir, 'Cargo.lock');\r\n const lockedBefore = readLockedVersions(lockFile);\r\n\r\n // Every edit is computed before the first write, so a stale file leaves nothing half-updated.\r\n const byFile = new Map<string, UpdateCandidate[]>();\r\n for (const update of updates) {\r\n const file = resolve(update.declaration?.file ?? join(module.path, 'Cargo.toml'));\r\n byFile.set(file, [...(byFile.get(file) ?? []), update]);\r\n }\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 ${file}âĶ`);\r\n const source = readFileSync(file, 'utf8');\r\n const decls = parseCargoManifest(source);\r\n const edits: RangeEdit[] = [];\r\n for (const update of fileUpdates) {\r\n const inWorkspace = update.declaration?.kind === 'dependency-management';\r\n const name = update.coordinate.identifier;\r\n const found = decls.filter(\r\n (d) => d.inWorkspace === inWorkspace && (d.package ?? d.key) === name && d.version?.value === update.currentRange,\r\n );\r\n if (found.length === 0) {\r\n throw new InstallError(`${file}: cannot find the version of ${name} (${update.currentRange}) any more; rescan the module.`);\r\n }\r\n for (const d of found) {\r\n edits.push({ start: d.version!.start, end: d.version!.end, expected: d.version!.value, replacement: update.newRange });\r\n }\r\n }\r\n try {\r\n writes.push({ file, content: applyRangeEdits(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 onProgress('Writing Cargo.toml filesâĶ');\r\n for (const write of writes) writeFileSync(write.file, write.content, 'utf8');\r\n\r\n const registryUpdates = updates.filter((u) => u.action === 'update');\r\n if (existsSync(lockFile) && registryUpdates.length > 0) {\r\n await this.refreshLock(dir, lockFile, lockedBefore, registryUpdates, onProgress);\r\n }\r\n\r\n return {\r\n updatedCount: updates.length,\r\n auditMessage: `Updated ${updates.length} requirement(s) in ${writes.length} Cargo.toml file(s)${existsSync(lockFile) ? '; Cargo.lock refreshed' : ''}.`,\r\n auditSeverity: 'clean',\r\n integrityViolations: [],\r\n };\r\n }\r\n\r\n async resync(): Promise<void> {\r\n // Cargo keeps no installed state next to the manifests; restoring them and Cargo.lock suffices.\r\n }\r\n\r\n private async refreshLock(\r\n dir: string,\r\n lockFile: string,\r\n before: Map<string, string[]>,\r\n updates: UpdateCandidate[],\r\n onProgress: (stepMessage: string) => void,\r\n ): Promise<void> {\r\n const specs: string[] = [];\r\n for (const update of updates) {\r\n const name = update.coordinate.identifier;\r\n const versions = before.get(name) ?? [];\r\n // The entry the old requirement resolved to; a crate locked twice is told apart by that.\r\n const old = versions.find((v) => satisfiesRequirement(update.currentRange, v)) ?? versions[0];\r\n if (old) specs.push(`${name}@${old}`);\r\n }\r\n if (specs.length === 0) return;\r\n\r\n onProgress('Updating Cargo.lockâĶ');\r\n await this.cargoUpdate(dir, specs.flatMap((s) => ['-p', s]));\r\n\r\n const after = readLockedVersions(lockFile);\r\n for (const update of updates) {\r\n const name = update.coordinate.identifier;\r\n const locked = (after.get(name) ?? []).find((v) => satisfiesRequirement(update.newRange, v));\r\n if (locked && semver.valid(update.latest) && locked !== update.latest) {\r\n onProgress(`Pinning ${name} to ${update.latest}âĶ`);\r\n await this.cargoUpdate(dir, ['-p', `${name}@${locked}`, '--precise', update.latest]);\r\n }\r\n }\r\n }\r\n\r\n private async cargoUpdate(dir: string, args: string[]): Promise<void> {\r\n const result = await runCommand('cargo', ['update', ...args], { cwd: dir, timeoutMs: UPDATE_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n const reason = result.timedOut ? 'cargo update timed out' : 'cargo update failed';\r\n throw new InstallError(reason, tail(result.stderr || result.stdout));\r\n }\r\n }\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, '&').replace(/</g, '<').replace(/>/g, '>');\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, '"')}\"`)\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 â range based text edits.\r\n *\r\n * Replaces exact character ranges of a source text, so everything around them\r\n * (comments, quotes, indentation, line endings) stays byte-identical. Every\r\n * edit states the text it expects to replace; a mismatch means the file\r\n * changed since it was scanned.\r\n */\r\n\r\nimport { StaleEditError } from './xml.js';\r\n\r\nexport interface RangeEdit {\r\n start: number;\r\n end: number;\r\n /** The text currently at `start..end`. */\r\n expected: string;\r\n replacement: string;\r\n}\r\n\r\nexport function applyRangeEdits(source: string, edits: readonly RangeEdit[]): string {\r\n for (const edit of edits) {\r\n const found = source.slice(edit.start, edit.end);\r\n if (found !== edit.expected) {\r\n throw new StaleEditError(`Found '${found}', expected '${edit.expected}'. The file changed since it was scanned.`);\r\n }\r\n }\r\n const ordered = [...edits].sort((a, b) => b.start - a.start);\r\n for (let i = 1; i < ordered.length; i++) {\r\n if (ordered[i]!.end > ordered[i - 1]!.start) throw new StaleEditError('Overlapping edits on the same text.');\r\n }\r\n let result = source;\r\n for (const edit of ordered) result = result.slice(0, edit.start) + edit.replacement + result.slice(edit.end);\r\n return result;\r\n}\r\n","/**\r\n * Elevate â Cargo.lock reader.\r\n *\r\n * Only the locked versions per crate are needed. A crate can be locked in\r\n * several versions at once, which makes a bare `-p name` ambiguous.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { getStaticTOMLValue, parseTOML } from 'toml-eslint-parser';\r\n\r\n/** Locked versions per crate name; empty when the file is missing or unreadable. */\r\nexport function readLockedVersions(lockFile: string): Map<string, string[]> {\r\n const locked = new Map<string, string[]>();\r\n if (!existsSync(lockFile)) return locked;\r\n try {\r\n const data = getStaticTOMLValue(parseTOML(readFileSync(lockFile, 'utf8'))) as { package?: { name: string; version: string }[] };\r\n for (const pkg of data.package ?? []) locked.set(pkg.name, [...(locked.get(pkg.name) ?? []), pkg.version]);\r\n } catch {\r\n // An unreadable lockfile is left for cargo to complain about.\r\n }\r\n return locked;\r\n}\r\n","/**\r\n * Elevate â Cargo verification.\r\n *\r\n * `cargo check --all-targets` type-checks libraries, binaries, tests, benches\r\n * and examples without generating code â the counterpart of `mvn test-compile`.\r\n * It covers the members whose manifests changed plus every member that depends\r\n * on them by path, because a change in a library breaks its consumers. A\r\n * changed workspace root manifest (shared `[workspace.dependencies]`) checks\r\n * the whole workspace.\r\n *\r\n * Doctests, non-default features and other targets are not covered; a\r\n * `postUpdateScript` is the way to add them.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { 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, tail } from '../shared/process.js';\r\nimport { cargoErrors, runCargo } from './cargo-command.js';\r\nimport { loadMetadata } from './cargo-metadata.js';\r\nimport type { CargoMetadata } from './cargo-metadata.js';\r\n\r\nconst VERIFY_TIMEOUT_MS = 30 * 60_000;\r\n\r\nconst same = (a: string, b: string) => relative(resolve(a), resolve(b)) === '';\r\n\r\n/** The arguments of the `cargo check` that covers the change. */\r\nexport function planCheck(metadata: CargoMetadata, module: ProjectModule, changedFiles: readonly string[], locked: boolean): string[] {\r\n const args = ['check', '--all-targets', ...(locked ? ['--locked'] : [])];\r\n const rootManifest = join(metadata.workspace_root, 'Cargo.toml');\r\n const memberManifests = new Set(metadata.packages.map((p) => resolve(p.manifest_path)));\r\n\r\n if (changedFiles.some((f) => same(f, rootManifest))) {\r\n // A root manifest that is itself a member only matters when it holds workspace-wide settings.\r\n const isVirtualRoot = !memberManifests.has(resolve(rootManifest));\r\n if (isVirtualRoot || metadata.packages.length > 1) return [...args, '--workspace'];\r\n }\r\n\r\n const changed = new Set(\r\n metadata.packages.filter((p) => changedFiles.some((f) => same(f, p.manifest_path))).map((p) => p.name),\r\n );\r\n if (changed.size === 0) changed.add(module.id);\r\n\r\n // Everything that reaches a changed member through path dependencies.\r\n for (let grew = true; grew; ) {\r\n grew = false;\r\n for (const p of metadata.packages) {\r\n if (changed.has(p.name)) continue;\r\n if (p.dependencies.some((d) => d.source === null && d.path && changed.has(d.name))) {\r\n changed.add(p.name);\r\n grew = true;\r\n }\r\n }\r\n }\r\n const ordered = metadata.packages.filter((p) => changed.has(p.name)).map((p) => p.name);\r\n return [...args, ...ordered.flatMap((name) => ['-p', name])];\r\n}\r\n\r\nexport interface CargoVerifierDeps {\r\n loadMetadata(dir: string): Promise<CargoMetadata>;\r\n hasLock(dir: string): boolean;\r\n}\r\n\r\nexport class CargoVerificationAdapter implements VerificationPort {\r\n constructor(\r\n private readonly deps: CargoVerifierDeps = { loadMetadata, hasLock: (dir) => existsSync(join(dir, 'Cargo.lock')) },\r\n ) {}\r\n\r\n async verify(module: ProjectModule, rootDir: string, options: VerificationOptions = {}): Promise<VerificationResult> {\r\n const dir = module.aggregatorDir ?? module.path ?? rootDir;\r\n\r\n if (options.customScript) {\r\n const label = options.customLabel || options.customScript;\r\n const result = await runShellScript(options.customScript, { cwd: dir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n return result.exitCode === 0\r\n ? { status: 'clean', details: 'Verification script succeeded.', label }\r\n : { status: 'warn', details: tail(result.stderr || result.stdout), label };\r\n }\r\n\r\n const metadata = await this.deps.loadMetadata(dir);\r\n const args = planCheck(metadata, module, options.changedFiles ?? [], this.deps.hasLock(dir));\r\n const label = `Cargo build (cargo ${args.join(' ')})`;\r\n const result = await runCargo(args, { cwd: dir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n if (result.exitCode === 0) return { status: 'clean', details: 'All affected crates type-check, including tests.', label };\r\n return {\r\n status: 'warn',\r\n details: result.timedOut ? 'cargo check timed out.' : cargoErrors(`${result.stderr}\\n${result.stdout}`),\r\n label,\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 â 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 { mavenVersionPolicy } from '../../domain/version-policy.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 readonly versioning = mavenVersionPolicy;\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, Java/Maven and Rust/Cargo.\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 { CargoEcosystemStrategy } from '../adapters/cargo/cargo-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 if (ecosystem === 'cargo') {\r\n strategy = new CargoEcosystemStrategy();\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', 'cargo'];\r\n }\r\n\r\n /** The ecosystem after `current`, for the dashboard's ecosystem switch. */\r\n static next(current: Ecosystem): Ecosystem {\r\n const all = this.getAvailableEcosystems();\r\n return all[(all.indexOf(current) + 1) % all.length]!;\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 â Cargo 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 = EcosystemFactory.next(ecosystem);\r\n const nextStrategy = useMemo(() => EcosystemFactory.getStrategy(nextEcosystem), [nextEcosystem]);\r\n\r\n const toggleEcosystem = useCallback(() => {\r\n setEcosystem((prev) => EcosystemFactory.next(prev));\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 rootDir={config.rootDir}\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 diagnostics={ws.diagnostics}\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 'not-linked': 'Workspace-Paket, das pnpm ohne das workspace:-Protokoll nicht verlinkt',\r\n 'catalog-unresolved': 'Catalog-Eintrag konnte nicht aufgelÃķst werden',\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 shared: (count) => `[+${count} Crates]`,\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 alsoChanges: (names) => `Ãndert auch: ${names.join(', ')}`,\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 cargoChirps: ['*krabbel* ðĶ', 'cargo check lÃĪuft durch!', 'Borrow Checker nickt!', 'furchtlose Updates!'],\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 'not-linked': 'workspace package that pnpm does not link without the workspace: protocol',\r\n 'catalog-unresolved': 'catalog entry could not be resolved',\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 shared: (count) => `[+${count} crates]`,\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 alsoChanges: (names) => `Also changes: ${names.join(', ')}`,\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 cargoChirps: ['*crab walk* ðĶ', 'cargo check passes!', 'borrow checker approves!', 'fearless updates!'],\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 { discoverModules } from '../application/scan.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 const [diagnostics, setDiagnostics] = useState<string[]>([]);\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 setDiagnostics([]);\r\n try {\r\n const found = await discoverModules(strategy, rootDir);\r\n setModules(found.modules);\r\n setDiagnostics(found.diagnostics);\r\n } catch (err) {\r\n // A failed discovery is shown, not mistaken for \"no modules\".\r\n setModules([]);\r\n setDiagnostics([err instanceof Error ? err.message : String(err)]);\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 diagnostics,\r\n reload,\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/** Discovers the modules of an ecosystem together with the problems that did not stop discovery. */\r\nexport async function discoverModules(\r\n strategy: EcosystemStrategy,\r\n rootDir: string,\r\n): Promise<{ modules: ProjectModule[]; diagnostics: string[] }> {\r\n const modules = await strategy.discovery.discover(rootDir);\r\n return { modules, diagnostics: strategy.discovery.diagnostics?.() ?? [] };\r\n}\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 ? {\r\n file: u.declaration.displayPath,\r\n kind: u.declaration.kind,\r\n property: u.declaration.propertyName,\r\n catalog: u.declaration.catalogName,\r\n }\r\n : undefined,\r\n sharedWith: u.sharedWith,\r\n };\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 type {\r\n UpdateCandidate,\r\n Tab,\r\n SelectionCounts,\r\n ProjectModule,\r\n ReleaseChannel,\r\n SkippedDependency,\r\n} from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport { extractPreReleaseTag, isPreReleaseVersion } 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 policy = strategy.versioning;\r\n const diff = c.currentClean ? policy.diff(c.currentClean, chosenVersion) : 'minor';\r\n\r\n const isPre = isPreReleaseVersion(chosenVersion);\r\n return {\r\n ...c,\r\n newRange: policy.rewrite(c.currentRange, 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 }, [strategy]);\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 â 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 /** Repository root, so the label can name the package manager. */\r\n rootDir?: string;\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 rootDir,\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} {(rootDir && strategy.displayNameFor?.(rootDir)) || 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 /** What discovery could not load; shown so a missing module is explained. */\r\n diagnostics?: string[];\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, diagnostics = [] }) => {\r\n const scopeHint =\r\n internalScopes.length > 0 ? t.status.internalScopes(internalScopes) : t.status.noInternalScopes;\r\n\r\n return (\r\n <Box flexDirection=\"column\">\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 {diagnostics.slice(0, 2).map((d) => (\r\n <Text key={d} color={theme.colors.danger} wrap=\"truncate-end\">â {d.split('\\n')[0]}</Text>\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 { 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 // Where the dependency applies (build, cfg(unix)) and who shares its declaration go into the\r\n // name column, so the row keeps its width. A long name is cut, the hints are not.\r\n const shared = item.sharedWith && item.sharedWith.length > 0 ? ` ${t.badges.shared(item.sharedWith.length)}` : '';\r\n const label = item.qualifier ? `${item.coordinate.identifier} (${item.qualifier})` : item.coordinate.identifier;\r\n const displayName = label.slice(0, 42 - shared.length) + shared;\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 : ecosystem === 'cargo'\r\n ? [...t.mascot.idleChirps, ...t.mascot.cargoChirps]\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 {candidate.sharedWith && candidate.sharedWith.length > 0 && (\r\n <Box marginBottom={1}>\r\n <Text color={theme.colors.warning}>{t.versionModal.alsoChanges(candidate.sharedWith)}</Text>\r\n </Box>\r\n )}\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\nimport type { Ecosystem } from '../domain/models.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\n\r\nconst isEcosystem = (v: string | undefined): v is Ecosystem => EcosystemFactory.getAvailableEcosystems().includes(v as Ecosystem);\r\n\r\nexport interface CliOptions {\r\n subcommand?: 'modules' | 'scan' | 'versions' | 'update' | 'init' | 'mcp' | 'help';\r\n ecosystem?: Ecosystem;\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 (isEcosystem(val)) result.ecosystem = val;\r\n } else if (arg === '-e' || arg === '--ecosystem') {\r\n const val = remaining[++i];\r\n if (isEcosystem(val)) 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|cargo> 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 { discoverModules } from '../application/scan.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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n const displayName = strategy.displayNameFor?.(config.rootDir) ?? strategy.displayName;\r\n const packageManager = strategy.packageManagerFor?.(config.rootDir);\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify({ ecosystem, ...(packageManager ? { packageManager } : {}), count: modules.length, modules, diagnostics }, null, 2));\r\n return 0;\r\n }\r\n\r\n console.log(`\\nðŠķ Discovered ${strategy.icon} ${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 for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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 case 'not-linked':\r\n return `workspace package that pnpm does not link unless it is declared with the workspace: protocol${detail}`;\r\n case 'catalog-unresolved':\r\n return `catalog entry could not be resolved${detail}`;\r\n case 'incompatible-rust-version':\r\n return `newer versions need a newer Rust than the project's rust-version${detail}`;\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, discoverModules, 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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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 } from '../domain/models.js';\r\nimport { extractPreReleaseTag, isPreReleaseVersion } from '../domain/versions.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.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 (!policyOf(options).allowsManualTargets) {\r\n throw new UpdateSelectionError(\r\n `'${request.identifier}' has no pending update. 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 (!policyOf(options).allowsManualTargets && 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 = policyOf(options).diff(found.currentClean, target);\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: policyOf(options).rewrite(found.currentRange, 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 policyOf(options: SelectionOptions) {\r\n return EcosystemFactory.getStrategy(options.ecosystem).versioning;\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, discoverModules, 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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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 { Ecosystem, 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, discoverModules, 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 { VERSION } from '../version.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: EcosystemFactory.getAvailableEcosystems(),\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: VERSION,\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), Java/Maven (pom.xml) or Rust/Cargo (Cargo.toml).',\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, cargo: serde)',\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 Ecosystem) || '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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n const packageManager = strategy.packageManagerFor?.(config.rootDir);\r\n return reply({\r\n ecosystem,\r\n ...(packageManager ? { packageManager } : {}),\r\n count: modules.length,\r\n diagnostics,\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","semver","semver","existsSync","dirname","join","resolve","resolve","child","resolve","dirname","existsSync","join","readFileSync","dirname","join","resolve","readFileSync","join","readFileSync","resolve","join","dirname","semver","semver","readFileSync","join","semver","readFileSync","join","semver","readFileSync","join","relative","message","existsSync","readFileSync","join","existsSync","readFileSync","join","parse","join","readFileSync","audit","relative","semver","existsSync","readFileSync","dirname","join","relative","resolve","message","resolve","entries","join","readFileSync","dirname","existsSync","relative","existsSync","readFileSync","dirname","join","resolve","home","semver","semver","semver","semver","readFileSync","join","relative","semver","parseTOML","SECTIONS","CONCURRENCY","DIFF_ORDER","join","semver","readFileSync","relative","existsSync","readFileSync","writeFileSync","join","resolve","semver","message","existsSync","readFileSync","getStaticTOMLValue","parseTOML","resolve","join","readFileSync","writeFileSync","existsSync","semver","existsSync","join","relative","resolve","VERIFY_TIMEOUT_MS","relative","resolve","join","existsSync","label","result","semver","existsSync","dirname","join","relative","resolve","existsSync","readdirSync","statSync","join","resolve","existsSync","readFileSync","dirname","join","resolve","readFileSync","dirname","resolve","existsSync","join","resolve","join","existsSync","entries","readdirSync","statSync","resolve","existsSync","join","relative","dirname","existsSync","join","existsSync","dirname","isAbsolute","join","relative","resolve","message","IS_WINDOWS","resolve","join","existsSync","relative","dirname","isAbsolute","existsSync","readFileSync","readdirSync","writeFileSync","join","join","existsSync","readdirSync","readFileSync","merge","entries","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","failureDetails","join","resolve","dirname","relative","resolve","existsSync","join","dirname","message","loadConfig","readFileSync","useState","useMemo","useCallback","Box","useInput","message","message","useState","useCallback","useState","useCallback","useState","useEffect","useMemo","useCallback","useState","useCallback","useEffect","useMemo","useState","useCallback","existsSync","relative","existsSync","readFileSync","rmSync","writeFileSync","entries","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","homedir","join","resolve","jsx","loadConfig"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/config.ts","../src/domain/version-policy.ts","../src/domain/versions.ts","../src/adapters/npm/npm-package-manager.ts","../src/adapters/shared/checkout.ts","../src/adapters/shared/process.ts","../src/adapters/npm/npm-discovery.ts","../src/adapters/npm/pnpm-workspace.ts","../src/adapters/npm/npm-registry.ts","../src/domain/origin.ts","../src/adapters/npm/npm-commands.ts","../src/adapters/npm/npm-config.ts","../src/adapters/npm/npm-scanner.ts","../src/adapters/shared/pool.ts","../src/adapters/npm/npm-protocols.ts","../src/adapters/npm/npm-updater.ts","../src/domain/ports.ts","../src/adapters/npm/npm-lockfile.ts","../src/adapters/npm/pnpm-audit.ts","../src/adapters/npm/pnpm-lockfile.ts","../src/adapters/npm/npm-verifier.ts","../src/adapters/npm/npm-strategy.ts","../src/adapters/cargo/cargo-strategy.ts","../src/adapters/cargo/cargo-discovery.ts","../src/adapters/cargo/cargo-command.ts","../src/adapters/cargo/cargo-metadata.ts","../src/adapters/cargo/cargo-config.ts","../src/version.ts","../src/adapters/cargo/cargo-index.ts","../src/adapters/cargo/cargo-registry.ts","../src/adapters/cargo/cargo-versions.ts","../src/adapters/cargo/cargo-requirement.ts","../src/adapters/cargo/cargo-scanner.ts","../src/adapters/cargo/cargo-toml.ts","../src/adapters/cargo/cargo-lockfile.ts","../src/adapters/cargo/cargo-updater.ts","../src/adapters/shared/xml.ts","../src/adapters/shared/text-edit.ts","../src/adapters/cargo/cargo-verifier.ts","../src/adapters/maven/maven-discovery.ts","../src/adapters/maven/maven-project.ts","../src/adapters/maven/maven-pom.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/application/scan.ts","../src/hooks/use-packages.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 â per-ecosystem version rules.\r\n *\r\n * Collects what differs between ecosystems when a target version is chosen, so\r\n * callers ask the strategy instead of testing the ecosystem name.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { VersionDiff } from './models.js';\r\nimport { cleanJavaVersion, diffVersions, rangePrefix } from './versions.js';\r\n\r\nexport interface VersionPolicy {\r\n /** A version in comparable SemVer form, or null when it has no numeric core. */\r\n normalize(version: string): string | null;\r\n /** The text to write for `target`, given the requirement currently in the manifest. */\r\n rewrite(currentRange: string, target: string): string;\r\n /** Size of the change from `current` (normalised) to `target` (raw). */\r\n diff(current: string, target: string): VersionDiff;\r\n /** Whether a dependency without a pending update may be set to a version by hand. */\r\n readonly allowsManualTargets: boolean;\r\n}\r\n\r\n/** Diff using SemVer; an unreadable side counts as `minor`. */\r\nexport function semverDiff(current: string, target: string, normalize: (v: string) => string | null): VersionDiff {\r\n const to = normalize(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\nexport const npmVersionPolicy: VersionPolicy = {\r\n normalize: (v) => semver.valid(v),\r\n rewrite: (current, target) => `${rangePrefix(current)}${target}`,\r\n diff: (current, target) => semverDiff(current, target, (v) => semver.valid(v)),\r\n allowsManualTargets: true,\r\n};\r\n\r\nexport const mavenVersionPolicy: VersionPolicy = {\r\n normalize: cleanJavaVersion,\r\n rewrite: (_current, target) => target,\r\n diff: (current, target) => semverDiff(current, target, cleanJavaVersion),\r\n allowsManualTargets: false,\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 â package manager detection.\r\n *\r\n * Elevate's Node.js support drives npm and pnpm. In a repository managed by\r\n * Yarn or Bun, running either would create a second lockfile and a\r\n * `node_modules` layout the project does not use, so such repositories are\r\n * 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\nimport { runCommand } from '../shared/process.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 Elevate does not drive (Yarn, Bun). */\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 and pnpm for Node.js projects; using either here would create a 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/**\r\n * Returns the package manager Elevate drives for this repository; throws\r\n * `UnsupportedPackageManagerError` for Yarn and Bun.\r\n */\r\nexport function assertSupportedPackageManager(rootDir: string): 'npm' | 'pnpm' {\r\n const detected = detectPackageManager(rootDir);\r\n if (detected.name === 'npm' || detected.name === 'pnpm') return detected.name;\r\n throw new UnsupportedPackageManagerError(detected);\r\n}\r\n\r\n/** Thrown when pnpm is required but cannot be run. */\r\nexport class PackageManagerNotFoundError extends Error {\r\n constructor(reason: string, detected: DetectedPackageManager) {\r\n super(\r\n `pnpm could not be run in this repository (${reason}). This repository is managed by pnpm ` +\r\n `(${detected.evidence}); install pnpm or enable Corepack (corepack enable). Nothing was changed.`,\r\n );\r\n this.name = 'PackageManagerNotFoundError';\r\n }\r\n}\r\n\r\nconst VERSION_TIMEOUT_MS = 15_000;\r\nconst verifiedRoots = new Set<string>();\r\n\r\n/**\r\n * Makes sure `pnpm --version` succeeds before anything is touched. A success is\r\n * remembered per root for the life of the process; a failure is not.\r\n */\r\nexport async function ensurePnpmRunnable(rootDir: string, detected: DetectedPackageManager): Promise<void> {\r\n const key = resolve(rootDir);\r\n if (verifiedRoots.has(key)) return;\r\n\r\n let reason: string | undefined;\r\n try {\r\n const result = await runCommand('pnpm', ['--version'], { cwd: rootDir, timeoutMs: VERSION_TIMEOUT_MS });\r\n if (result.timedOut) reason = 'pnpm --version timed out';\r\n else if (result.exitCode !== 0) {\r\n const line = firstLine(result.stderr) || firstLine(result.stdout);\r\n reason = `pnpm --version exited with code ${result.exitCode}: ${line}`;\r\n }\r\n } catch {\r\n reason = 'command not found';\r\n }\r\n if (reason !== undefined) throw new PackageManagerNotFoundError(reason, detected);\r\n verifiedRoots.add(key);\r\n}\r\n\r\n/**\r\n * Guard for operations on a repository: refuses Yarn and Bun, and for pnpm\r\n * checks that it can run. Returns the manager to drive.\r\n */\r\nexport async function prepareSupportedPackageManager(rootDir: string): Promise<'npm' | 'pnpm'> {\r\n const manager = assertSupportedPackageManager(rootDir);\r\n if (manager === 'pnpm') await ensurePnpmRunnable(rootDir, detectPackageManager(rootDir));\r\n return manager;\r\n}\r\n\r\nfunction firstLine(text: string): string {\r\n return text.split(/\\r?\\n/).find((l) => l.trim() !== '')?.trim() ?? '';\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 â 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 â 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`. In a pnpm repository\r\n * the patterns come from `pnpm-workspace.yaml` instead and go through the same\r\n * library, so patterns, negation and `node_modules` are treated alike.\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\nimport { detectPackageManager } from './npm-package-manager.js';\r\nimport { readPnpmWorkspace } from './pnpm-workspace.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`, or that contains a\r\n * valid `pnpm-workspace.yaml`.\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 || readPnpmWorkspace(dir)) 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 // A pnpm repository declares its packages in pnpm-workspace.yaml and ignores the field.\r\n const patterns =\r\n detectPackageManager(rootDir).name === 'pnpm' ? readPnpmWorkspace(rootDir)?.packages : rootPkg?.workspaces;\r\n if (!patterns || (Array.isArray(patterns) && patterns.length === 0)) return modules;\r\n\r\n let workspaces: Map<string, string>;\r\n try {\r\n workspaces = await mapWorkspaces({ cwd: rootDir, pkg: { ...rootPkg, workspaces: patterns } });\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 â pnpm-workspace.yaml.\r\n *\r\n * Reads the package patterns and catalogs of a pnpm workspace, and replaces a\r\n * catalog entry's range in place. The YAML document API is used for writing\r\n * because it keeps the position of every node: only the entry's range is\r\n * replaced, comments, quoting and line endings stay as they are.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { isMap, isScalar, parse, parseDocument } from 'yaml';\r\nimport type { Scalar } from 'yaml';\r\n\r\nexport const PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml';\r\n\r\nexport interface PnpmWorkspace {\r\n /** Absolute path of the file. */\r\n file: string;\r\n /** `[]` when missing or empty. */\r\n packages: string[];\r\n /** By catalog name; the default catalog is `default`. */\r\n catalogs: ReadonlyMap<string, ReadonlyMap<string, string>>;\r\n /** `catalog` and `catalogs.default` are both defined. */\r\n ambiguousDefaultCatalog: boolean;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction entries(value: unknown): Map<string, string> {\r\n const map = new Map<string, string>();\r\n if (isRecord(value)) {\r\n for (const [name, range] of Object.entries(value)) {\r\n if (typeof range === 'string') map.set(name, range);\r\n }\r\n }\r\n return map;\r\n}\r\n\r\n/** `undefined` when the file is absent or not valid YAML. */\r\nexport function readPnpmWorkspace(rootDir: string): PnpmWorkspace | undefined {\r\n const file = join(rootDir, PNPM_WORKSPACE_FILE);\r\n let data: unknown;\r\n try {\r\n data = parse(readFileSync(file, 'utf8'));\r\n } catch {\r\n return undefined;\r\n }\r\n if (data !== null && !isRecord(data)) return undefined;\r\n const doc = (data ?? {}) as Record<string, unknown>;\r\n\r\n const packages = Array.isArray(doc.packages) ? doc.packages.filter((p): p is string => typeof p === 'string') : [];\r\n\r\n const catalogs = new Map<string, Map<string, string>>();\r\n const named = isRecord(doc.catalogs) ? doc.catalogs : {};\r\n for (const [name, content] of Object.entries(named)) catalogs.set(name, entries(content));\r\n const hasTopLevel = isRecord(doc.catalog);\r\n const hasNamedDefault = isRecord(named.default);\r\n if (hasTopLevel) catalogs.set('default', entries(doc.catalog));\r\n\r\n return { file, packages, catalogs, ambiguousDefaultCatalog: hasTopLevel && hasNamedDefault };\r\n}\r\n\r\n/**\r\n * Returns `source` with the range of one catalog entry replaced. Throws when\r\n * the entry does not exist.\r\n */\r\nexport function setCatalogRange(source: string, catalog: string, name: string, newRange: string): string {\r\n const doc = parseDocument(source);\r\n const holders = catalog === 'default' ? [doc.get('catalog', true), doc.getIn(['catalogs', 'default'], true)] : [doc.getIn(['catalogs', catalog], true)];\r\n\r\n for (const holder of holders) {\r\n if (!isMap(holder)) continue;\r\n const node = holder.get(name, true);\r\n if (!isScalar(node) || !node.range) continue;\r\n const scalar = node as Scalar;\r\n const [start, end] = scalar.range!;\r\n const quote = scalar.type === 'QUOTE_DOUBLE' ? '\"' : scalar.type === 'QUOTE_SINGLE' ? \"'\" : '';\r\n return source.slice(0, start) + quote + newRange + quote + source.slice(end);\r\n }\r\n throw new Error(`No entry for '${name}' in catalog '${catalog}' of ${PNPM_WORKSPACE_FILE}.`);\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\nimport { commands, driverFor } from './npm-commands.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` (`pnpm view` in a pnpm repository); resolves null on any failure. */\r\n protected async view(name: string, field: string, cwd: string): Promise<unknown> {\r\n try {\r\n const { command, args } = commands.view(driverFor(cwd), name, field);\r\n const result = await runCommand(command, args, {\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 â 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 â package manager commands.\r\n *\r\n * The only place that knows which executable and arguments each package\r\n * manager gets. Everything else asks this table.\r\n */\r\n\r\nimport { detectPackageManager } from './npm-package-manager.js';\r\n\r\nexport type Driver = 'npm' | 'pnpm';\r\n\r\nexport interface CommandLine {\r\n command: Driver;\r\n args: string[];\r\n}\r\n\r\n/**\r\n * The package manager that answers version and configuration queries in\r\n * `dir`. Yarn and Bun repositories are not refused for read-only queries and\r\n * are served by npm.\r\n */\r\nexport function driverFor(dir: string): Driver {\r\n return detectPackageManager(dir).name === 'pnpm' ? 'pnpm' : 'npm';\r\n}\r\n\r\nexport const commands = {\r\n /** Install after Elevate wrote new ranges. pnpm is told explicitly not to freeze: `CI` would otherwise imply it. */\r\n install: (m: Driver): CommandLine =>\r\n m === 'pnpm' ? { command: 'pnpm', args: ['install', '--no-frozen-lockfile'] } : { command: 'npm', args: ['install'] },\r\n /** Restore the installed state after a rollback. */\r\n restore: (m: Driver): CommandLine =>\r\n m === 'pnpm' ? { command: 'pnpm', args: ['install', '--frozen-lockfile'] } : { command: 'npm', args: ['install'] },\r\n /** Default verification. */\r\n verify: (m: Driver): CommandLine =>\r\n m === 'pnpm'\r\n ? { command: 'pnpm', args: ['install', '--frozen-lockfile', '--lockfile-only'] }\r\n : { command: 'npm', args: ['ls'] },\r\n view: (m: Driver, name: string, field: string): CommandLine => ({ command: m, args: ['view', name, field, '--json'] }),\r\n config: (m: Driver): CommandLine => ({ command: m, args: ['config', 'list', '--json'] }),\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\nimport { commands, driverFor } from './npm-commands.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', 'npm.jsr.io']);\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 { command, args } = commands.config(driverFor(cwd));\r\n const result = await runCommand(command, args, { 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` (`pnpm view` in a pnpm repository).\r\n *\r\n * In a pnpm repository `workspace:` ranges are aligned, a plain range on a\r\n * module is listed as not linked, and `catalog:` ranges are resolved through\r\n * pnpm-workspace.yaml.\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 VersionDeclaration,\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 { prepareSupportedPackageManager } from './npm-package-manager.js';\r\nimport { splitRangeProtocol } from './npm-protocols.js';\r\nimport { readPnpmWorkspace } from './pnpm-workspace.js';\r\nimport type { PnpmWorkspace } from './pnpm-workspace.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 const manager = await prepareSupportedPackageManager(context.rootDir);\r\n const pnpm = manager === 'pnpm';\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 workspaceFile = pnpm ? readPnpmWorkspace(context.rootDir) : undefined;\r\n\r\n const outcomes = await mapPooled(declaredDependencies(pkg), CONCURRENCY, async (dep): Promise<Outcome> => {\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 if (pnpm && isUpgradableRange(dep.range) && splitRangeProtocol(dep.range).protocol === undefined) {\r\n // pnpm resolves a plain range from the registry, never from the workspace.\r\n return { skipped: { identifier: dep.name, origin: 'workspace', reason: 'not-linked', detail: dep.range } };\r\n }\r\n const candidate = target ? alignmentCandidate(dep, target, origin, pnpm) : null;\r\n return candidate ? { candidate } : null;\r\n }\r\n if (pnpm && splitRangeProtocol(dep.range).protocol === 'catalog') {\r\n return this.catalogOutcome(dep, origin, context, module.path, workspaceFile);\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 /** A `catalog:` dependency: the range comes from pnpm-workspace.yaml and is written back there. */\r\n private async catalogOutcome(\r\n dep: DeclaredDependency,\r\n origin: DependencyOrigin,\r\n context: ScanContext,\r\n modulePath: string,\r\n workspaceFile: PnpmWorkspace | undefined,\r\n ): Promise<Outcome> {\r\n const catalogName = splitRangeProtocol(dep.range).rest || 'default';\r\n const unresolved = (detail: string): Outcome => ({\r\n skipped: { identifier: dep.name, origin: origin.kind, reason: 'catalog-unresolved', detail },\r\n });\r\n if (!workspaceFile) return unresolved('pnpm-workspace.yaml is missing or not valid YAML');\r\n if (catalogName === 'default' && workspaceFile.ambiguousDefaultCatalog) {\r\n return unresolved(\"catalog 'default' is defined twice (catalog and catalogs.default)\");\r\n }\r\n const catalog = workspaceFile.catalogs.get(catalogName);\r\n if (!catalog) return unresolved(`no catalog '${catalogName}'`);\r\n const range = catalog.get(dep.name);\r\n if (range === undefined) return unresolved(`no entry for '${dep.name}' in catalog '${catalogName}'`);\r\n\r\n const declaration: VersionDeclaration = {\r\n file: workspaceFile.file,\r\n kind: 'catalog',\r\n catalogName,\r\n displayPath: 'pnpm-workspace.yaml',\r\n };\r\n const sharedWith = usersOfCatalogEntry(context, modulePath, dep.name, catalogName);\r\n return this.registryOutcome({ ...dep, range }, origin, context, {\r\n declaration,\r\n ...(sharedWith.length > 0 ? { sharedWith } : {}),\r\n });\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 extra: Partial<UpdateCandidate> = {},\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 ...extra,\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 pnpm = false,\r\n): UpdateCandidate | null {\r\n // Only a pnpm repository interprets `workspace:`; elsewhere it is no SemVer range and stays untouched.\r\n const split = pnpm ? splitRangeProtocol(dep.range) : { protocol: undefined, rest: dep.range };\r\n const range = split.protocol === 'workspace' ? split.rest : dep.range;\r\n const protocol = split.protocol === 'workspace' ? 'workspace:' : '';\r\n\r\n const local = target.version;\r\n if (!local || !semver.valid(local) || !isUpgradableRange(range)) return null;\r\n if (semver.satisfies(local, range, { includePrerelease: true })) return null;\r\n\r\n const currentClean = semver.minVersion(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: `${protocol}${rangePrefix(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/** Ids of the other modules whose scanned sections refer to the same catalog entry. */\r\nfunction usersOfCatalogEntry(context: ScanContext, selfPath: string, name: string, catalogName: string): string[] {\r\n const users: string[] = [];\r\n for (const module of context.workspace.values()) {\r\n if (module.path === selfPath) continue;\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 continue;\r\n }\r\n const dep = declaredDependencies(pkg).find((d) => d.name === name);\r\n if (!dep || splitRangeProtocol(dep.range).protocol !== 'catalog') continue;\r\n if ((splitRangeProtocol(dep.range).rest || 'default') !== catalogName) continue;\r\n users.push(module.id);\r\n }\r\n return users;\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 â pnpm range protocols.\r\n *\r\n * `workspace:` and `catalog:` ranges are only interpreted in pnpm\r\n * repositories; in an npm repository they stay non-SemVer and are ignored.\r\n */\r\n\r\nexport interface SplitRange {\r\n protocol: 'workspace' | 'catalog' | undefined;\r\n /** What follows `workspace:` or `catalog:`; the whole range without a protocol. */\r\n rest: string;\r\n}\r\n\r\nexport function splitRangeProtocol(range: string): SplitRange {\r\n if (range.startsWith('workspace:')) return { protocol: 'workspace', rest: range.slice('workspace:'.length) };\r\n if (range.startsWith('catalog:')) return { protocol: 'catalog', rest: range.slice('catalog:'.length) };\r\n return { protocol: undefined, rest: range };\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 type { RunResult } from '../shared/process.js';\r\nimport {\r\n PackageManagerNotFoundError,\r\n UnsupportedPackageManagerError,\r\n detectPackageManager,\r\n prepareSupportedPackageManager,\r\n} from './npm-package-manager.js';\r\nimport { DEPENDENCY_SECTIONS } from './npm-scanner.js';\r\nimport { findUnlinkedWorkspaceDependencies, readLockfile } from './npm-lockfile.js';\r\nimport { commands } from './npm-commands.js';\r\nimport type { Driver } from './npm-commands.js';\r\nimport { AUDIT_TIMEOUT_MS, parsePnpmAudit, unavailable } from './pnpm-audit.js';\r\nimport type { AuditSummary } from './pnpm-audit.js';\r\nimport { findUnlinkedPnpmDependencies, readPnpmLockfile } from './pnpm-lockfile.js';\r\nimport { setCatalogRange } from './pnpm-workspace.js';\r\n\r\nconst INSTALL_TIMEOUT_MS = 10 * 60_000;\r\n\r\n/** pnpm prints errors on stdout (9 to 11) or stderr (12), so both are quoted; npm's go to stderr. */\r\nfunction failureDetails(manager: Driver, result: RunResult): string {\r\n return manager === 'pnpm' ? tail(`${result.stdout}\\n${result.stderr}`) : tail(result.stderr || result.stdout);\r\n}\r\n\r\nexport class NpmUpdaterAdapter implements DependencyUpdaterPort {\r\n affectedFiles(module: ProjectModule, rootDir: string): string[] {\r\n if (detectPackageManager(rootDir).name === 'pnpm') {\r\n return [\r\n join(module.path, 'package.json'),\r\n join(rootDir, 'package.json'),\r\n join(rootDir, 'pnpm-lock.yaml'),\r\n join(rootDir, 'pnpm-workspace.yaml'),\r\n ];\r\n }\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 let manager: Driver;\r\n try {\r\n manager = await prepareSupportedPackageManager(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError || err instanceof PackageManagerNotFoundError) {\r\n throw new InstallError(err.message);\r\n }\r\n throw err;\r\n }\r\n\r\n // A catalog entry is written where it is declared; the module's package.json keeps its `catalog:` reference.\r\n const catalogUpdates = updates.filter((u) => u.declaration?.kind === 'catalog');\r\n const manifestUpdates = updates.filter((u) => u.declaration?.kind !== 'catalog');\r\n\r\n const pkgPath = join(module.path, 'package.json');\r\n let manifest: { source: string; pkg: any } | undefined;\r\n if (manifestUpdates.length > 0 || catalogUpdates.length === 0) {\r\n try {\r\n const source = readFileSync(pkgPath, 'utf8');\r\n manifest = { source, 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\r\n if (manifest) {\r\n onProgress('Writing new versions to package.jsonâĶ');\r\n for (const item of manifestUpdates) {\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 manifest.pkg[section]?.[name] === 'string') manifest.pkg[section][name] = item.newRange;\r\n }\r\n }\r\n writeFileSync(pkgPath, serializeLike(manifest.source, manifest.pkg), 'utf8');\r\n }\r\n\r\n if (catalogUpdates.length > 0) {\r\n onProgress('Writing new versions to pnpm-workspace.yamlâĶ');\r\n writeCatalogRanges(catalogUpdates);\r\n }\r\n\r\n const install = commands.install(manager);\r\n onProgress(`Running ${manager} installâĶ`);\r\n const result = await runCommand(install.command, install.args, { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n const reason = result.timedOut ? `${manager} install timed out` : `${manager} install failed`;\r\n throw new InstallError(reason, failureDetails(manager, result));\r\n }\r\n\r\n const lockName = manager === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json';\r\n onProgress(`Checking workspace links in ${lockName}âĶ`);\r\n const integrityViolations = verifyAlignedLinks(manager, module, rootDir, updates);\r\n\r\n if (manager === 'pnpm') {\r\n const audit = integrityViolations.length > 0 ? undefined : await runPnpmAudit(rootDir);\r\n return {\r\n updatedCount: updates.length,\r\n auditMessage: audit?.message ?? '',\r\n auditSeverity: audit?.severity ?? 'clean',\r\n fundingMessage: undefined,\r\n integrityViolations,\r\n };\r\n }\r\n\r\n const combined = `${result.stdout}\\n${result.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 Elevate does not drive, so there is nothing to restore.\r\n const name = detectPackageManager(rootDir).name;\r\n if (name !== 'npm' && name !== 'pnpm') return;\r\n\r\n const restore = commands.restore(name);\r\n onProgress(`Restoring node_modules (${name} install)âĶ`);\r\n const result = await runCommand(restore.command, restore.args, { cwd: rootDir, timeoutMs: INSTALL_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n throw new InstallError(\r\n `${name} install failed while restoring the previous state`,\r\n name === 'pnpm' ? failureDetails(name, result) : tail(result.stderr),\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Replaces each catalog entry in the file that declares it, once per file. */\r\nfunction writeCatalogRanges(updates: UpdateCandidate[]): void {\r\n const sources = new Map<string, string>();\r\n for (const item of updates) {\r\n const declaration = item.declaration!;\r\n try {\r\n let source = sources.get(declaration.file) ?? readFileSync(declaration.file, 'utf8');\r\n source = setCatalogRange(source, declaration.catalogName ?? 'default', item.coordinate.artifact, item.newRange);\r\n sources.set(declaration.file, source);\r\n } catch (err) {\r\n throw new InstallError(err instanceof Error ? err.message : `Cannot update ${declaration.displayPath}.`);\r\n }\r\n }\r\n for (const [file, source] of sources) writeFileSync(file, source, 'utf8');\r\n}\r\n\r\n/** The vulnerability summary of pnpm; an audit that gives no result is a warning, never a failure. */\r\nasync function runPnpmAudit(rootDir: string): Promise<AuditSummary> {\r\n try {\r\n const result = await runCommand('pnpm', ['audit', '--json'], { cwd: rootDir, timeoutMs: AUDIT_TIMEOUT_MS });\r\n if (result.timedOut) return unavailable(`pnpm audit timed out after ${AUDIT_TIMEOUT_MS / 1000} seconds`);\r\n return parsePnpmAudit(result.stdout);\r\n } catch {\r\n return unavailable('pnpm audit returned no result');\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(\r\n manager: Driver,\r\n module: ProjectModule,\r\n rootDir: string,\r\n updates: UpdateCandidate[],\r\n): 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 moduleRelPath = relative(rootDir, module.path).replace(/\\\\/g, '/');\r\n if (manager === 'pnpm') return findUnlinkedPnpmDependencies(readPnpmLockfile(rootDir), moduleRelPath, aligned);\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 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 * Problems of the most recent `discover` run that did not stop it, e.g. one\r\n * workspace whose tool run failed while others were found. Empty when none.\r\n */\r\n diagnostics?(): string[];\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 â reading `pnpm audit --json`.\r\n */\r\n\r\nexport const AUDIT_TIMEOUT_MS = 60_000;\r\n\r\nconst LEVELS = ['info', 'low', 'moderate', 'high', 'critical'] as const;\r\n\r\nexport interface AuditSummary {\r\n message: string;\r\n severity: 'clean' | 'warn';\r\n}\r\n\r\nexport function unavailable(reason: string): AuditSummary {\r\n return { message: `Vulnerability check unavailable: ${reason}.`, severity: 'warn' };\r\n}\r\n\r\n/** Only `metadata.vulnerabilities` decides; the exit code does not. */\r\nexport function parsePnpmAudit(output: string): AuditSummary {\r\n let json: any;\r\n try {\r\n json = JSON.parse(output);\r\n } catch {\r\n return unavailable('pnpm audit returned no result');\r\n }\r\n const counts = json?.metadata?.vulnerabilities;\r\n if (counts && typeof counts === 'object') {\r\n const parts: string[] = [];\r\n let total = 0;\r\n for (const level of LEVELS) {\r\n const n = Number(counts[level]) || 0;\r\n total += n;\r\n if (n > 0) parts.push(`${n} ${level}`);\r\n }\r\n if (total === 0) return { message: 'No known vulnerabilities found.', severity: 'clean' };\r\n return {\r\n message: `${total} ${total === 1 ? 'vulnerability' : 'vulnerabilities'} (${parts.join(', ')})`,\r\n severity: 'warn',\r\n };\r\n }\r\n const errorMessage = json?.error?.message;\r\n if (typeof errorMessage === 'string' && errorMessage) return unavailable(errorMessage);\r\n return unavailable('pnpm audit returned no result');\r\n}\r\n","/**\r\n * Elevate â pnpm-lock.yaml integrity checks.\r\n *\r\n * pnpm links a workspace package only for a dependency written with the\r\n * `workspace:` protocol. After an update that aligned such dependencies, the\r\n * `importers` section of the lockfile (lockfileVersion 9.x, pnpm 9 to 12)\r\n * proves that they are linked and not installed from a registry.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { parse } from 'yaml';\r\n\r\nexport interface PnpmImporterEntry {\r\n specifier: string;\r\n version: string;\r\n}\r\n\r\nexport type PnpmImporters = Record<string, Record<string, Record<string, PnpmImporterEntry>>>;\r\n\r\nexport type PnpmLockfile =\r\n | { kind: 'ok'; importers: PnpmImporters }\r\n | { kind: 'missing' }\r\n | { kind: 'unreadable' }\r\n | { kind: 'unsupported'; lockfileVersion: string };\r\n\r\nconst SECTIONS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const;\r\n\r\nexport function readPnpmLockfile(rootDir: string): PnpmLockfile {\r\n const file = join(rootDir, 'pnpm-lock.yaml');\r\n if (!existsSync(file)) return { kind: 'missing' };\r\n let data: any;\r\n try {\r\n data = parse(readFileSync(file, 'utf8'));\r\n } catch {\r\n return { kind: 'unreadable' };\r\n }\r\n if (typeof data !== 'object' || data === null || Array.isArray(data)) return { kind: 'unreadable' };\r\n\r\n const lockfileVersion = String(data.lockfileVersion ?? '');\r\n if (!/^9(\\.|$)/.test(lockfileVersion)) return { kind: 'unsupported', lockfileVersion };\r\n const importers = data.importers ?? {};\r\n if (typeof importers !== 'object' || Array.isArray(importers)) return { kind: 'unreadable' };\r\n return { kind: 'ok', importers: importers as PnpmImporters };\r\n}\r\n\r\n/**\r\n * One message per aligned dependency that is not linked.\r\n *\r\n * @param moduleRelPath module directory relative to the root ('' for the root)\r\n */\r\nexport function findUnlinkedPnpmDependencies(\r\n lockfile: PnpmLockfile,\r\n moduleRelPath: string,\r\n names: readonly string[],\r\n): string[] {\r\n switch (lockfile.kind) {\r\n case 'missing':\r\n return ['pnpm-lock.yaml is missing; workspace links cannot be verified'];\r\n case 'unreadable':\r\n return ['pnpm-lock.yaml could not be read; workspace links cannot be verified'];\r\n case 'unsupported':\r\n return [\r\n `pnpm-lock.yaml has lockfileVersion '${lockfile.lockfileVersion}', which Elevate cannot read; workspace links cannot be verified`,\r\n ];\r\n }\r\n\r\n const importer = lockfile.importers[moduleRelPath === '' ? '.' : moduleRelPath] ?? {};\r\n const violations: string[] = [];\r\n for (const name of names) {\r\n let entry: PnpmImporterEntry | undefined;\r\n for (const section of SECTIONS) {\r\n entry = importer[section]?.[name];\r\n if (entry) break;\r\n }\r\n if (!entry) violations.push(`${name}: not present in pnpm-lock.yaml`);\r\n else if (!String(entry.version).startsWith('link:')) {\r\n violations.push(`${name}: resolved to ${entry.version} 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 (npm) or `pnpm install --frozen-lockfile --lockfile-only`\r\n * (pnpm; `pnpm ls` exits 0 for missing dependencies, so it cannot judge).\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 {\r\n PackageManagerNotFoundError,\r\n UnsupportedPackageManagerError,\r\n prepareSupportedPackageManager,\r\n} from './npm-package-manager.js';\r\nimport { commands } from './npm-commands.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 let manager: 'npm' | 'pnpm' = 'npm';\r\n if (!options.customScript) {\r\n // Judging a tree a different package manager installed would be wrong.\r\n try {\r\n manager = await prepareSupportedPackageManager(rootDir);\r\n } catch (err) {\r\n if (err instanceof UnsupportedPackageManagerError || err instanceof PackageManagerNotFoundError) {\r\n return { status: 'warn', details: err.message, label: options.customLabel || 'Dependency verification' };\r\n }\r\n throw err;\r\n }\r\n }\r\n const defaultLabel =\r\n manager === 'pnpm'\r\n ? 'Lockfile consistency (pnpm install --frozen-lockfile)'\r\n : 'Dependency tree integrity (npm ls)';\r\n const label = options.customLabel || options.customScript || defaultLabel;\r\n\r\n const verify = commands.verify(manager);\r\n const result = options.customScript\r\n ? await runShellScript(options.customScript, { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS })\r\n : await runCommand(verify.command, verify.args, { cwd: rootDir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n\r\n if (result.exitCode === 0) {\r\n const details =\r\n manager === 'pnpm' && !options.customScript\r\n ? 'pnpm-lock.yaml is up to date with all package.json files.'\r\n : 'All dependencies are installed and consistent.';\r\n return { status: 'clean', details, label };\r\n }\r\n const output =\r\n manager === 'pnpm' && !options.customScript\r\n ? tail(`${result.stdout}\\n${result.stderr}`)\r\n : tail(result.stderr || result.stdout);\r\n return { status: 'warn', details: result.timedOut ? 'Verification timed out.' : output, label };\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 { npmVersionPolicy } from '../../domain/version-policy.js';\r\nimport { detectPackageManager } from './npm-package-manager.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\r\n packageManagerFor(rootDir: string): string {\r\n return detectPackageManager(rootDir).name;\r\n }\r\n\r\n displayNameFor(rootDir: string): string {\r\n return detectPackageManager(rootDir).name === 'pnpm' ? 'Node / pnpm' : 'Node / npm';\r\n }\r\n readonly icon = 'ðĶ';\r\n readonly manifestFile = 'package.json';\r\n readonly versioning = npmVersionPolicy;\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 â Cargo ecosystem strategy: wires the Cargo adapters together.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { EcosystemStrategy, TabLabels } from '../../domain/ecosystem-strategy.js';\r\nimport type { Ecosystem } from '../../domain/models.js';\r\nimport type { VersionPolicy } from '../../domain/version-policy.js';\r\nimport { CargoModuleDiscoveryAdapter } from './cargo-discovery.js';\r\nimport { CargoConfigReader } from './cargo-config.js';\r\nimport { CargoIndexClient } from './cargo-index.js';\r\nimport { loadMetadata } from './cargo-metadata.js';\r\nimport { CargoRegistryAdapter } from './cargo-registry.js';\r\nimport { cargoDiff, rewriteRequirement } from './cargo-requirement.js';\r\nimport { CargoDependencyAdapter } from './cargo-scanner.js';\r\nimport { CargoUpdaterAdapter } from './cargo-updater.js';\r\nimport { CargoVerificationAdapter } from './cargo-verifier.js';\r\n\r\nexport const cargoVersionPolicy: VersionPolicy = {\r\n normalize: (v) => semver.valid(v),\r\n rewrite: rewriteRequirement,\r\n diff: (current, target) => (semver.valid(current) && semver.valid(target) ? (semver.eq(current, target) ? 'patch' : cargoDiff(current, target)) : 'minor'),\r\n // Updates are written where the scan found the declaration.\r\n allowsManualTargets: false,\r\n};\r\n\r\nexport class CargoEcosystemStrategy implements EcosystemStrategy {\r\n readonly ecosystem: Ecosystem = 'cargo';\r\n readonly displayName = 'Rust / Cargo';\r\n readonly icon = 'ðĶ';\r\n readonly manifestFile = 'Cargo.toml';\r\n readonly versioning = cargoVersionPolicy;\r\n\r\n private readonly config = new CargoConfigReader();\r\n private readonly index = new CargoIndexClient();\r\n private readonly endpoint = (registry: string | undefined, cwd: string) => this.config.resolve(registry, cwd);\r\n\r\n readonly discovery = new CargoModuleDiscoveryAdapter();\r\n readonly registry = new CargoRegistryAdapter({ index: this.index, endpoint: this.endpoint });\r\n readonly reader = new CargoDependencyAdapter({ loadMetadata, index: this.index, endpoint: this.endpoint });\r\n readonly updater = new CargoUpdaterAdapter();\r\n readonly verifier = new CargoVerificationAdapter();\r\n\r\n getTabLabels(counts: { total: number; prodCount: number; devCount: number }, t: any): 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 â Cargo workspace discovery.\r\n *\r\n * Finds every `Cargo.toml` in the repository (not only at the root, so a Rust\r\n * crate beside a JavaScript app is found) and lets Cargo itself report the\r\n * workspace members: one `cargo metadata` run per workspace.\r\n */\r\n\r\nimport { existsSync, readdirSync, readFileSync } 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 { CargoUnavailableError } from './cargo-command.js';\r\nimport { CargoMetadataError, loadMetadata } from './cargo-metadata.js';\r\n\r\n/** Directories that never hold modules. A manifest below `src` is a test fixture or template. */\r\nconst IGNORED = new Set(['target', 'node_modules', 'vendor', 'dist', 'build', 'out', 'src']);\r\n\r\nconst norm = (path: string) => resolve(path).replace(/\\\\/g, '/');\r\n\r\nfunction findManifests(root: string): string[] {\r\n const found: string[] = [];\r\n const walk = (dir: string, depth: number) => {\r\n let entries;\r\n try {\r\n entries = readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n if (entries.some((e) => e.isFile() && e.name === 'Cargo.toml')) found.push(join(dir, 'Cargo.toml'));\r\n for (const entry of entries) {\r\n if (entry.isDirectory() && !entry.name.startsWith('.') && !IGNORED.has(entry.name)) walk(join(dir, entry.name), depth + 1);\r\n }\r\n };\r\n walk(root, 0);\r\n // Shallowest first, so a workspace root is read before the crates inside it.\r\n return found.sort((a, b) => a.split(/[\\\\/]/).length - b.split(/[\\\\/]/).length || a.localeCompare(b));\r\n}\r\n\r\nconst declaresWorkspace = (dir: string) => {\r\n try {\r\n return /^\\s*\\[workspace[\\].]/m.test(readFileSync(join(dir, 'Cargo.toml'), 'utf8'));\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nexport class CargoModuleDiscoveryAdapter implements ModuleDiscoveryPort {\r\n private problems: string[] = [];\r\n\r\n diagnostics(): string[] {\r\n return [...this.problems];\r\n }\r\n\r\n /** The nearest ancestor declaring `[workspace]`; failing that, the nearest directory with a manifest. */\r\n findRoot(startDir: string, boundaryDir: string | undefined): string | undefined {\r\n const boundary = boundaryDir ? resolve(boundaryDir) : undefined;\r\n const chain: string[] = [];\r\n for (let dir = resolve(startDir); ; ) {\r\n chain.push(dir);\r\n const parent = dirname(dir);\r\n if (dir === boundary || parent === dir) break;\r\n dir = parent;\r\n }\r\n return chain.find(declaresWorkspace) ?? chain.find((d) => existsSync(join(d, 'Cargo.toml')));\r\n }\r\n\r\n async discover(rootDir: string): Promise<ProjectModule[]> {\r\n const covered = new Set<string>();\r\n const modules: ProjectModule[] = [];\r\n const errors: CargoMetadataError[] = [];\r\n this.problems = [];\r\n\r\n for (const manifest of findManifests(rootDir)) {\r\n if (covered.has(norm(manifest))) continue;\r\n try {\r\n const metadata = await loadMetadata(dirname(manifest));\r\n for (const pkg of metadata.packages) {\r\n covered.add(norm(pkg.manifest_path));\r\n const path = dirname(pkg.manifest_path);\r\n const relPath = relative(rootDir, path).replace(/\\\\/g, '/');\r\n modules.push({\r\n id: pkg.name,\r\n name: pkg.name,\r\n path,\r\n relPath: relPath === '' ? 'Root' : relPath,\r\n ecosystem: 'cargo',\r\n isRoot: relPath === '',\r\n version: pkg.version,\r\n aggregatorDir: resolve(metadata.workspace_root),\r\n });\r\n }\r\n } catch (err) {\r\n if (err instanceof CargoUnavailableError) throw err;\r\n if (err instanceof CargoMetadataError) {\r\n errors.push(err);\r\n this.problems.push(err.message);\r\n }\r\n else throw err;\r\n }\r\n }\r\n\r\n // Failures are only fatal when they leave nothing to show.\r\n if (modules.length === 0 && errors.length > 0) throw errors[0]!;\r\n modules.sort((a, b) => (a.isRoot ? -1 : b.isRoot ? 1 : a.relPath.localeCompare(b.relPath)));\r\n\r\n // Independent workspaces may each hold a crate of the same name; ids must stay unique.\r\n const taken = new Set<string>();\r\n for (const module of modules) {\r\n if (taken.has(module.id)) module.id = `${module.name} (${module.relPath})`;\r\n taken.add(module.id);\r\n }\r\n return modules;\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo invocation.\r\n *\r\n * Runs `cargo` from the PATH in a given working directory. Without it, Cargo\r\n * features fail with `CargoUnavailableError` instead of silently degrading.\r\n */\r\n\r\nimport { runCommand } from '../shared/process.js';\r\nimport type { RunResult } from '../shared/process.js';\r\n\r\n/** Thrown when `cargo` cannot be started. */\r\nexport class CargoUnavailableError extends Error {\r\n constructor() {\r\n super('Cargo is not available: no `cargo` on the PATH. Install Rust (https://rustup.rs).');\r\n this.name = 'CargoUnavailableError';\r\n }\r\n}\r\n\r\nexport async function runCargo(args: string[], options: { cwd: string; timeoutMs?: number }): Promise<RunResult> {\r\n let result: RunResult;\r\n try {\r\n result = await runCommand('cargo', args, options);\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') throw new CargoUnavailableError();\r\n throw err;\r\n }\r\n if (looksLikeMissingCommand(result) && !(await cargoStarts(options.cwd))) throw new CargoUnavailableError();\r\n return result;\r\n}\r\n\r\n/**\r\n * On Windows the command runs through cmd.exe, which reports a missing program\r\n * as an ordinary failure (exit code 1 and a message in the user's language), not\r\n * as ENOENT. Cargo itself always prefixes its failures with \"error\", so a failure\r\n * without output on stdout and without that prefix is worth one `cargo --version`.\r\n */\r\nfunction looksLikeMissingCommand(result: RunResult): boolean {\r\n return (\r\n process.platform === 'win32' && result.exitCode !== 0 && !result.stdout.trim() && !/^error/m.test(result.stderr)\r\n );\r\n}\r\n\r\nasync function cargoStarts(cwd: string): Promise<boolean> {\r\n try {\r\n return (await runCommand('cargo', ['--version'], { cwd, timeoutMs: 30_000 })).exitCode === 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Cargo's error lines for a concise failure message. */\r\nexport function cargoErrors(output: string): string {\r\n const lines = output.split(/\\r?\\n/);\r\n const errors = lines.filter((l) => /^error(\\[E\\d+\\])?:/.test(l));\r\n const summary = (errors.length > 0 ? errors : lines.filter((l) => l.trim()).slice(-10)).slice(0, 12);\r\n if (/toolchain '.+' is not installed/.test(output)) {\r\n summary.push('Install it with `rustup toolchain install` (the project pins it in rust-toolchain.toml).');\r\n }\r\n return summary.join('\\n');\r\n}\r\n","/**\r\n * Elevate â `cargo metadata --no-deps`.\r\n *\r\n * Works without network access and without a Cargo.lock, resolves\r\n * `workspace = true` inheritance, and reports each dependency with its\r\n * normalised requirement, kind, target and source.\r\n */\r\n\r\nimport { runCargo, cargoErrors } from './cargo-command.js';\r\n\r\nexport interface MetadataDependency {\r\n name: string;\r\n req: string;\r\n kind: 'dev' | 'build' | null;\r\n rename: string | null;\r\n /** `registry+âĶcrates.io-index`, `sparse+<url>`, `git+âĶ`; null for path dependencies. */\r\n source: string | null;\r\n /** Index URL of an alternative registry. */\r\n registry?: string | null;\r\n path?: string;\r\n target: string | null;\r\n optional: boolean;\r\n}\r\n\r\nexport interface MetadataPackage {\r\n name: string;\r\n version: string;\r\n manifest_path: string;\r\n rust_version: string | null;\r\n dependencies: MetadataDependency[];\r\n}\r\n\r\nexport interface CargoMetadata {\r\n packages: MetadataPackage[];\r\n workspace_root: string;\r\n}\r\n\r\nexport class CargoMetadataError extends Error {\r\n constructor(message: string, readonly dir: string) {\r\n super(message);\r\n this.name = 'CargoMetadataError';\r\n }\r\n}\r\n\r\nexport async function loadMetadata(dir: string): Promise<CargoMetadata> {\r\n const result = await runCargo(['metadata', '--no-deps', '--format-version', '1'], { cwd: dir, timeoutMs: 60_000 });\r\n if (result.exitCode !== 0) {\r\n throw new CargoMetadataError(`cargo metadata failed in ${dir}: ${cargoErrors(result.stderr || result.stdout)}`, dir);\r\n }\r\n try {\r\n return JSON.parse(result.stdout) as CargoMetadata;\r\n } catch {\r\n throw new CargoMetadataError(`cargo metadata printed no JSON in ${dir}.`, dir);\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo registry configuration.\r\n *\r\n * `cargo metadata` does not show source replacement, and `cargo config get`\r\n * is nightly-only, so the few settings that decide where a lookup goes are\r\n * read from the configuration files and environment directly.\r\n *\r\n * The reader is deliberately narrow and fails closed: a replacement it cannot\r\n * interpret (a vendored directory, a local registry, a git source) is refused.\r\n * Falling back to crates.io would bypass the mirror or air gap the project\r\n * was set up with.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\r\nimport { getStaticTOMLValue, parseTOML } from 'toml-eslint-parser';\r\n\r\nconst CRATES_IO = 'registry+https://github.com/rust-lang/crates.io-index';\r\nconst PUBLIC_HOSTS = new Set(['index.crates.io', 'static.crates.io', 'crates.io', 'github.com']);\r\n\r\nexport class UnsupportedSourceError extends Error {\r\n constructor(detail: string) {\r\n super(`Cargo is configured to use a package source Elevate cannot read (${detail}). No lookup was made.`);\r\n this.name = 'UnsupportedSourceError';\r\n }\r\n}\r\n\r\ntype Table = Record<string, any>;\r\n\r\nfunction isPublicIndex(index: string): boolean {\r\n try {\r\n const url = new URL(index.replace(/^(sparse|registry)\\+/, ''));\r\n return PUBLIC_HOSTS.has(url.hostname.toLowerCase()) && (url.hostname !== 'github.com' || url.pathname.includes('crates.io-index'));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Overlays `top` onto `base` key by key. */\r\nfunction merge(base: Table, top: Table): Table {\r\n const out: Table = { ...base };\r\n for (const [key, value] of Object.entries(top)) {\r\n const existing = out[key];\r\n out[key] =\r\n value && typeof value === 'object' && !Array.isArray(value) && existing && typeof existing === 'object' && !Array.isArray(existing)\r\n ? merge(existing, value)\r\n : value;\r\n }\r\n return out;\r\n}\r\n\r\nfunction loadFile(file: string, depth = 0): Table {\r\n let table: Table;\r\n try {\r\n table = getStaticTOMLValue(parseTOML(readFileSync(file, 'utf8'))) as Table;\r\n } catch {\r\n return {};\r\n }\r\n const includes: unknown = table.include;\r\n delete table.include;\r\n if (!Array.isArray(includes) || depth > 4) return table;\r\n let included: Table = {};\r\n for (const entry of includes) {\r\n const path = typeof entry === 'string' ? entry : entry?.path;\r\n if (typeof path === 'string') included = merge(included, loadFile(isAbsolute(path) ? path : resolve(dirname(file), path), depth + 1));\r\n }\r\n return merge(included, table);\r\n}\r\n\r\nexport class CargoConfigReader {\r\n private readonly env: NodeJS.ProcessEnv;\r\n private readonly cache = new Map<string, Table>();\r\n\r\n constructor(options: { env?: NodeJS.ProcessEnv } = {}) {\r\n this.env = options.env ?? process.env;\r\n }\r\n\r\n /** The configuration as Cargo would merge it for `cwd`: nearest file first, CARGO_HOME last. */\r\n private config(cwd: string): Table {\r\n const start = resolve(cwd);\r\n let cached = this.cache.get(start);\r\n if (cached) return cached;\r\n const files: string[] = [];\r\n for (let dir = start; ; ) {\r\n for (const name of ['config.toml', 'config']) {\r\n const file = join(dir, '.cargo', name);\r\n if (existsSync(file)) {\r\n files.push(file);\r\n break;\r\n }\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n const home = this.env.CARGO_HOME ?? join(homedir(), '.cargo');\r\n for (const name of ['config.toml', 'config']) {\r\n const file = join(home, name);\r\n if (existsSync(file) && !files.includes(file)) {\r\n files.push(file);\r\n break;\r\n }\r\n }\r\n // Later entries have lower precedence, so apply them first.\r\n cached = files.reduceRight((acc, file) => merge(acc, loadFile(file)), {} as Table);\r\n this.cache.set(start, cached);\r\n return cached;\r\n }\r\n\r\n /** `[source.*]` comes from files only: Cargo ignores `CARGO_SOURCE_*` variables (checked with Cargo 1.97). */\r\n private sourceField(config: Table, source: string, field: string): string | undefined {\r\n const value = config.source?.[source]?.[field];\r\n return typeof value === 'string' ? value : undefined;\r\n }\r\n\r\n /**\r\n * The index a lookup goes to. `registry` is the index URL of an alternative\r\n * registry as Cargo reports it, or undefined for crates.io.\r\n */\r\n async resolve(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }> {\r\n const config = this.config(cwd);\r\n let name = registry === undefined ? 'crates-io' : this.sourceNamed(config, registry);\r\n let index = registry ?? CRATES_IO;\r\n const seen = new Set<string>();\r\n\r\n while (name !== undefined) {\r\n if (seen.has(name)) throw new UnsupportedSourceError(`replacement cycle at '${name}'`);\r\n seen.add(name);\r\n const next = this.sourceField(config, name, 'replace-with');\r\n if (next === undefined) break;\r\n for (const kind of ['directory', 'local-registry', 'git']) {\r\n if (this.sourceField(config, next, kind) !== undefined) throw new UnsupportedSourceError(`'${next}' is a ${kind} source`);\r\n }\r\n const target = this.sourceField(config, next, 'registry');\r\n if (target !== undefined) {\r\n index = target;\r\n name = next;\r\n // A source that is itself replaced continues the chain; one that is not ends it.\r\n if (this.sourceField(config, next, 'replace-with') === undefined) break;\r\n continue;\r\n }\r\n if (this.sourceField(config, next, 'replace-with') === undefined) {\r\n throw new UnsupportedSourceError(`'${next}' has no registry`);\r\n }\r\n name = next;\r\n }\r\n return { index, isPublic: isPublicIndex(index) };\r\n }\r\n\r\n /** Name of the `[source.*]` table whose registry is `url`, if any. */\r\n private sourceNamed(config: Table, url: string): string | undefined {\r\n return Object.keys(config.source ?? {}).find((n) => this.sourceField(config, n, 'registry') === url);\r\n }\r\n}\r\n","/**\r\n * Elevate â the product version.\r\n *\r\n * Bundled builds get it injected at build time (`__ELEVATE_VERSION__`), because\r\n * no package.json lies next to a bundle or a standalone binary. From source it\r\n * is read from package.json.\r\n */\r\n\r\nimport { createRequire } from 'node:module';\r\n\r\ndeclare const __ELEVATE_VERSION__: string | undefined;\r\n\r\nfunction fromPackage(): string {\r\n try {\r\n return (createRequire(import.meta.url)('../package.json') as { version: string }).version;\r\n } catch {\r\n return '0.0.0';\r\n }\r\n}\r\n\r\nexport const VERSION: string = typeof __ELEVATE_VERSION__ === 'string' ? __ELEVATE_VERSION__ : fromPackage();\r\n","/**\r\n * Elevate â Cargo sparse index client.\r\n *\r\n * Reads one index file per crate over HTTP. It sends no credentials: a\r\n * registry that asks for authentication is reported as such instead of being\r\n * served, so Elevate never handles registry tokens.\r\n */\r\n\r\nimport { VERSION } from '../../version.js';\r\n\r\nexport interface IndexVersion {\r\n version: string;\r\n yanked: boolean;\r\n /** Minimum supported Rust version the crate declares. */\r\n rustVersion: string | undefined;\r\n}\r\n\r\nexport class RegistryAuthRequiredError extends Error {\r\n constructor(readonly index: string) {\r\n super(`The registry ${index} requires authentication. Elevate does not handle registry credentials.`);\r\n this.name = 'RegistryAuthRequiredError';\r\n }\r\n}\r\n\r\nexport class CrateNotFoundError extends Error {\r\n constructor(readonly crate: string, readonly index: string) {\r\n super(`'${crate}' is not in the registry ${index}.`);\r\n this.name = 'CrateNotFoundError';\r\n }\r\n}\r\n\r\nexport class UnsupportedIndexError extends Error {\r\n constructor(readonly index: string) {\r\n super(`The registry index ${index} is not a sparse index; Elevate cannot read it.`);\r\n this.name = 'UnsupportedIndexError';\r\n }\r\n}\r\n\r\nconst CRATES_IO_SPARSE = 'https://index.crates.io/';\r\nconst CRATES_IO_GIT = 'registry+https://github.com/rust-lang/crates.io-index';\r\n\r\n/** Path of a crate's index file below the index root. */\r\nexport function indexPath(name: string): string {\r\n const n = name.toLowerCase();\r\n if (n.length <= 2) return `${n.length}/${n}`;\r\n if (n.length === 3) return `3/${n[0]}/${n}`;\r\n return `${n.slice(0, 2)}/${n.slice(2, 4)}/${n}`;\r\n}\r\n\r\nexport function parseIndex(text: string): IndexVersion[] {\r\n const versions: IndexVersion[] = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n if (!raw.trim()) continue;\r\n try {\r\n const entry = JSON.parse(raw);\r\n if (typeof entry.vers !== 'string') continue;\r\n versions.push({ version: entry.vers, yanked: entry.yanked === true, rustVersion: entry.rust_version });\r\n } catch {\r\n // A line that is not JSON says nothing about the others.\r\n }\r\n }\r\n return versions;\r\n}\r\n\r\n/** Turns an index URL as Cargo prints it into the root of a sparse index. */\r\nfunction sparseRoot(index: string): string {\r\n if (index === CRATES_IO_GIT) return CRATES_IO_SPARSE;\r\n if (index.startsWith('sparse+')) {\r\n const url = index.slice('sparse+'.length);\r\n return url.endsWith('/') ? url : `${url}/`;\r\n }\r\n throw new UnsupportedIndexError(index);\r\n}\r\n\r\nconst userAgent = () => `elevate/${VERSION} (+https://github.com/DennisRepa/Elevate)`;\r\n\r\nfunction networkReason(err: unknown): string {\r\n const cause = (err as { cause?: { message?: string } })?.cause?.message;\r\n return cause ?? (err instanceof Error ? err.message : String(err));\r\n}\r\n\r\nexport class CargoIndexClient {\r\n private readonly memo = new Map<string, Promise<IndexVersion[]>>();\r\n\r\n constructor(\r\n private readonly fetchFn: typeof fetch = fetch,\r\n private readonly env: NodeJS.ProcessEnv = process.env,\r\n ) {}\r\n\r\n /** All versions of a crate in oldest-first file order. Memoised per index and crate. */\r\n versions(index: string, crate: string): Promise<IndexVersion[]> {\r\n const key = `${index}\\n${crate.toLowerCase()}`;\r\n let pending = this.memo.get(key);\r\n if (!pending) {\r\n pending = this.load(index, crate);\r\n this.memo.set(key, pending);\r\n }\r\n return pending;\r\n }\r\n\r\n private async load(index: string, crate: string): Promise<IndexVersion[]> {\r\n const url = `${sparseRoot(index)}${indexPath(crate)}`;\r\n let response: Response;\r\n try {\r\n response = await this.fetchFn(url, { headers: { 'user-agent': userAgent() } });\r\n } catch (err) {\r\n throw new Error(`Cannot reach ${url}: ${networkReason(err)}${this.proxyHint()}`);\r\n }\r\n if (response.status === 401 || response.status === 403) throw new RegistryAuthRequiredError(index);\r\n if (response.status === 404) throw new CrateNotFoundError(crate, index);\r\n if (!response.ok) throw new Error(`Registry answered ${response.status} for ${url}.`);\r\n return parseIndex(await response.text());\r\n }\r\n\r\n /**\r\n * Node's fetch ignores HTTP(S)_PROXY unless NODE_USE_ENV_PROXY=1 is set when\r\n * the process starts (measured with Node 22.23; it cannot be switched on later).\r\n */\r\n private proxyHint(): string {\r\n const proxied = this.env.HTTPS_PROXY || this.env.https_proxy || this.env.HTTP_PROXY || this.env.http_proxy;\r\n if (!proxied || this.env.NODE_USE_ENV_PROXY === '1') return '';\r\n return ' A proxy is configured, but Node does not use it for registry lookups unless you start Elevate with NODE_USE_ENV_PROXY=1.';\r\n }\r\n}\r\n","/**\r\n * Elevate â Cargo registry adapter for ad-hoc version queries\r\n * (`elevate versions`, MCP `elevate_get_versions`, the version picker).\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 type { IndexVersion } from './cargo-index.js';\r\nimport { selectVersion } from './cargo-versions.js';\r\n\r\nexport interface CargoRegistryDeps {\r\n index: { versions(index: string, crate: string): Promise<IndexVersion[]> };\r\n endpoint(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }>;\r\n}\r\n\r\nexport class CargoRegistryAdapter implements RegistryPort {\r\n constructor(private readonly deps: CargoRegistryDeps) {}\r\n\r\n async resolveEndpoint(coordinate: DependencyCoordinate, cwd: string): Promise<RegistryEndpoint> {\r\n const { index, isPublic } = await this.deps.endpoint(coordinate.registry, cwd);\r\n return { url: index, isPublic };\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 return selectVersion(await this.load(coordinate, cwd), { channel }).version ?? null;\r\n }\r\n\r\n /** Published, not yanked, newest first. Lookup errors propagate so they are not mistaken for \"no versions\". */\r\n async getAllVersions(coordinate: DependencyCoordinate, cwd = process.cwd()): Promise<string[]> {\r\n return (await this.load(coordinate, cwd))\r\n .filter((v) => !v.yanked && semver.valid(v.version))\r\n .map((v) => v.version)\r\n .sort(semver.rcompare);\r\n }\r\n\r\n private async load(coordinate: DependencyCoordinate, cwd: string): Promise<IndexVersion[]> {\r\n const { index } = await this.deps.endpoint(coordinate.registry, cwd);\r\n return this.deps.index.versions(index, coordinate.artifact);\r\n }\r\n}\r\n","/**\r\n * Elevate â chooses the version to offer from a crate's index entries.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { ReleaseChannel } from '../../domain/models.js';\r\nimport type { IndexVersion } from './cargo-index.js';\r\n\r\nexport interface Selection {\r\n version: string | undefined;\r\n /** The newest candidate that was passed over because it needs a newer rustc than the project declares. */\r\n blockedByMsrv?: { version: string; requires: string };\r\n}\r\n\r\nconst rust = (v: string) => semver.coerce(v)?.version;\r\n\r\n/** Versions the project could take, newest first: not yanked, in the channel, and not needing a newer Rust than declared. */\r\nexport function eligibleVersions(\r\n versions: readonly IndexVersion[],\r\n options: { channel: ReleaseChannel; rustVersion?: string },\r\n): string[] {\r\n const project = options.rustVersion ? rust(options.rustVersion) : undefined;\r\n return versions\r\n .filter((v) => !v.yanked && semver.valid(v.version))\r\n .filter((v) => options.channel === 'all' || semver.prerelease(v.version) === null)\r\n .filter((v) => {\r\n const needs = v.rustVersion ? rust(v.rustVersion) : undefined;\r\n return !(project && needs && semver.gt(needs, project));\r\n })\r\n .map((v) => v.version)\r\n .sort(semver.rcompare);\r\n}\r\n\r\nexport function selectVersion(\r\n versions: readonly IndexVersion[],\r\n options: { channel: ReleaseChannel; rustVersion?: string },\r\n): Selection {\r\n const candidates = versions\r\n .filter((v) => !v.yanked && semver.valid(v.version))\r\n .filter((v) => options.channel === 'all' || semver.prerelease(v.version) === null)\r\n .sort((a, b) => semver.rcompare(a.version, b.version));\r\n\r\n const project = options.rustVersion ? rust(options.rustVersion) : undefined;\r\n let blocked: Selection['blockedByMsrv'];\r\n for (const candidate of candidates) {\r\n const needs = candidate.rustVersion ? rust(candidate.rustVersion) : undefined;\r\n if (project && needs && semver.gt(needs, project)) {\r\n blocked ??= { version: candidate.version, requires: candidate.rustVersion! };\r\n continue;\r\n }\r\n return { version: candidate.version, ...(blocked ? { blockedByMsrv: blocked } : {}) };\r\n }\r\n return { version: undefined, ...(blocked ? { blockedByMsrv: blocked } : {}) };\r\n}\r\n","/**\r\n * Elevate â Cargo version requirements.\r\n *\r\n * Cargo's syntax differs from npm's where it matters: a bare `1.2.3` means\r\n * `^1.2.3` (npm's `semver` reads it as exact), and `0.x` versions break at the\r\n * first non-zero component. Everything that touches a Cargo requirement goes\r\n * through this module so the `semver` package is never handed a raw Cargo string.\r\n */\r\n\r\nimport semver from 'semver';\r\nimport type { VersionDiff } from '../../domain/models.js';\r\n\r\n/** One comparator, operator bare/`^`/`~`/`=`, one to three numeric components. */\r\nconst SIMPLE = /^(\\^|~|=)?\\s*(\\d+(?:\\.\\d+){0,2})$/;\r\n\r\n/** Translates a Cargo requirement into a range the `semver` package understands. */\r\nexport function toSemverRange(requirement: string): string | null {\r\n const parts = requirement.split(',').map((p) => p.trim());\r\n if (parts.some((p) => p === '')) return null;\r\n const converted = parts.map((part) => {\r\n const bare = part.match(/^\\d/);\r\n return bare ? `^${part}` : part;\r\n });\r\n return semver.validRange(converted.join(' ')) ? converted.join(' ') : null;\r\n}\r\n\r\n/** Whether `version` satisfies the Cargo requirement. */\r\nexport function satisfiesRequirement(requirement: string, version: string): boolean {\r\n const range = toSemverRange(requirement);\r\n return range !== null && semver.satisfies(version, range, { includePrerelease: false });\r\n}\r\n\r\n/** Only a single plain comparator can be rewritten; wildcards and compound requirements are left alone. */\r\nexport function isUpgradableRequirement(requirement: string): boolean {\r\n return SIMPLE.test(requirement.trim());\r\n}\r\n\r\n/** The lowest version the requirement allows, or null if it is not a valid requirement. */\r\nexport function requirementFloor(requirement: string): string | null {\r\n const range = toSemverRange(requirement);\r\n return range ? (semver.minVersion(range)?.version ?? null) : null;\r\n}\r\n\r\n/**\r\n * Writes `target` in the style of `current`: same operator, same number of\r\n * components (`1` -> `2`, `1.0` -> `2.3`, `1.0.100` -> `1.0.229`). A pre-release\r\n * target is written in full. When the result still allows the target and equals\r\n * `current`, there is nothing to change.\r\n */\r\nexport function rewriteRequirement(current: string, target: string): string {\r\n const match = current.trim().match(SIMPLE);\r\n if (!match) return target;\r\n if (semver.prerelease(target)) return `${match[1] ?? ''}${target}`;\r\n const precision = match[2]!.split('.').length;\r\n const [major, minor, patch] = target.split(/[-+]/)[0]!.split('.');\r\n const written = [major, minor, patch].slice(0, precision).join('.');\r\n return `${match[1] ?? ''}${written}`;\r\n}\r\n\r\n/** Difference of two versions by Cargo's compatibility rule (leftmost non-zero component breaks). */\r\nexport function cargoDiff(from: string, to: string): VersionDiff {\r\n const a = semver.parse(from);\r\n const b = semver.parse(to);\r\n if (!a || !b) return 'minor';\r\n if (a.major > 0 || b.major > a.major) {\r\n if (b.major !== a.major) return 'major';\r\n return b.minor !== a.minor ? 'minor' : 'patch';\r\n }\r\n if (a.minor > 0) {\r\n if (b.minor !== a.minor) return 'major';\r\n return 'minor';\r\n }\r\n return 'major';\r\n}\r\n","/**\r\n * Elevate â Cargo dependency scanner.\r\n *\r\n * `cargo metadata` says which dependencies a crate has and where each comes\r\n * from; the Cargo.toml text says where the version is written. Both are\r\n * combined: a dependency becomes a candidate only when its declaration was\r\n * found and agrees with what Cargo resolved.\r\n *\r\n * - workspace: a path dependency on a member. Cargo refuses a `version` that\r\n * excludes the member's version, so such a literal is offered for alignment.\r\n * - private: a crate from an alternative registry, or named by `internalScopes`.\r\n * It is looked up only in its own registry, never on a public one.\r\n * - public: everything else, looked up in the registry Cargo would use.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\nimport semver from 'semver';\r\nimport type { DependencyReaderPort, ScanContext } from '../../domain/ports.js';\r\nimport type {\r\n DependencyOrigin,\r\n ProjectModule,\r\n ScanResult,\r\n SkippedDependency,\r\n UpdateCandidate,\r\n VersionDeclaration,\r\n} from '../../domain/models.js';\r\nimport { matchesInternalScope } from '../../domain/origin.js';\r\nimport { extractPreReleaseTag } from '../../domain/versions.js';\r\nimport { mapPooled } from '../shared/pool.js';\r\nimport type { IndexVersion } from './cargo-index.js';\r\nimport type { CargoMetadata, MetadataDependency, MetadataPackage } from './cargo-metadata.js';\r\nimport {\r\n cargoDiff,\r\n isUpgradableRequirement,\r\n requirementFloor,\r\n rewriteRequirement,\r\n satisfiesRequirement,\r\n toSemverRange,\r\n} from './cargo-requirement.js';\r\nimport { parseCargoManifest } from './cargo-toml.js';\r\nimport type { DependencyDeclaration, DependencySection } from './cargo-toml.js';\r\nimport { readLockedVersions } from './cargo-lockfile.js';\r\nimport { eligibleVersions, selectVersion } from './cargo-versions.js';\r\n\r\nconst CONCURRENCY = 6;\r\nconst DIFF_ORDER: Record<string, number> = { major: 0, minor: 1, patch: 2 };\r\n\r\nexport interface CargoScannerDeps {\r\n loadMetadata(dir: string): Promise<CargoMetadata>;\r\n index: { versions(index: string, crate: string): Promise<IndexVersion[]> };\r\n /** The index a lookup goes to: the alternative registry's, or the one Cargo uses for crates.io. */\r\n endpoint(registry: string | undefined, cwd: string): Promise<{ index: string; isPublic: boolean }>;\r\n}\r\n\r\ntype Outcome = { candidate: UpdateCandidate; note?: SkippedDependency } | { skipped: SkippedDependency } | null;\r\n\r\nexport class CargoDependencyAdapter implements DependencyReaderPort {\r\n constructor(private readonly deps: CargoScannerDeps) {}\r\n\r\n async scan(module: ProjectModule, context: ScanContext): Promise<ScanResult> {\r\n const metadata = await this.deps.loadMetadata(module.aggregatorDir ?? module.path);\r\n const pkg = metadata.packages.find((p) => samePath(join(p.manifest_path, '..'), module.path));\r\n if (!pkg) return { candidates: [], skipped: [] };\r\n\r\n const own = readDeclarations(pkg.manifest_path);\r\n const locks = readLockedVersions(join(metadata.workspace_root, 'Cargo.lock'));\r\n const rootManifest = join(metadata.workspace_root, 'Cargo.toml');\r\n const root = readDeclarations(rootManifest);\r\n const groups = groupDependencies(pkg.dependencies);\r\n\r\n const outcomes = await mapPooled(groups, CONCURRENCY, async (group): Promise<Outcome> => {\r\n const primary = group.find((d) => d.kind === null) ?? group[0]!;\r\n const key = primary.rename ?? primary.name;\r\n const decl = findDeclaration(own, key, primary);\r\n const located = locate(decl, root, key, context.rootDir, pkg.manifest_path, rootManifest);\r\n const scope = group.every((d) => d.kind === 'dev') ? 'dev' : 'prod';\r\n const qualifier = primary.target ?? (primary.kind === 'build' ? 'build' : undefined);\r\n const common = { scope, qualifier } as const;\r\n\r\n if (primary.source === null && primary.path) {\r\n // Matched by location: a path dependency elsewhere that shares a member's name is not that member.\r\n const target = [...context.workspace.values()].find((m) => samePath(m.path, primary.path!));\r\n return target ? alignment(primary, target, located, common) : null;\r\n }\r\n if (!primary.source || primary.source.startsWith('git+')) return null;\r\n const outcome = await this.registryOutcome(primary, located, pkg, metadata, locks, common, context);\r\n const other = group.find((d) => d !== primary && !sameRequirement(d.req, primary.req));\r\n if (outcome && 'candidate' in outcome && other) {\r\n // Only the declarations that match the scanned requirement are rewritten; say what is left.\r\n outcome.note = {\r\n identifier: primary.name,\r\n origin: outcome.candidate.origin.kind,\r\n reason: 'declaration-mismatch',\r\n detail: `${sectionOf(other)} requires ${other.req}; it is not changed`,\r\n };\r\n }\r\n return outcome;\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) {\r\n candidates.push(outcome.candidate);\r\n if (outcome.note) skipped.push(outcome.note);\r\n }\r\n else skipped.push(outcome.skipped);\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 private async registryOutcome(\r\n dep: MetadataDependency,\r\n located: Located | undefined,\r\n pkg: MetadataPackage,\r\n metadata: CargoMetadata,\r\n locks: Map<string, string[]>,\r\n common: { scope: 'prod' | 'dev'; qualifier: string | undefined },\r\n context: ScanContext,\r\n ): Promise<Outcome> {\r\n const literal = located?.version.value ?? dep.req;\r\n if (!isUpgradableRequirement(literal)) return null;\r\n\r\n if (!located || !sameRequirement(located.version.value, dep.req)) {\r\n return { skipped: { identifier: dep.name, origin: 'public', reason: 'declaration-mismatch', detail: `${literal} in the manifest, ${dep.req} for Cargo` } };\r\n }\r\n\r\n let origin: DependencyOrigin = { kind: 'public' };\r\n if (dep.registry) origin = { kind: 'private', matchedBy: 'scoped-registry', registry: dep.registry };\r\n else if (matchesInternalScope(dep.name, 'cargo', context.internalScopes)) origin = { kind: 'private', matchedBy: 'internal-scope' };\r\n\r\n const endpoint = await this.deps.endpoint(dep.registry ?? undefined, context.rootDir);\r\n if (origin.kind === 'private' && endpoint.isPublic) {\r\n // Asking a public registry about an internal name is what dependency confusion exploits.\r\n return { skipped: { identifier: dep.name, origin: 'private', reason: 'private-on-public-registry', detail: endpoint.index } };\r\n }\r\n\r\n let versions: IndexVersion[];\r\n try {\r\n versions = await this.deps.index.versions(endpoint.index, dep.name);\r\n } catch (err) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'lookup-failed', detail: err instanceof Error ? err.message : String(err) } };\r\n }\r\n\r\n const chosen = selectVersion(versions, { channel: context.channel, rustVersion: pkg.rust_version ?? undefined });\r\n const floor = requirementFloor(literal);\r\n if (!chosen.version) {\r\n if (chosen.blockedByMsrv && floor) {\r\n const { version, requires } = chosen.blockedByMsrv;\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'incompatible-rust-version', detail: ` (${version} needs Rust ${requires})` } };\r\n }\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'lookup-failed', detail: 'no usable version in the registry' } };\r\n }\r\n\r\n const latest = chosen.version;\r\n if (!floor || !semver.gt(latest, floor)) {\r\n // Nothing usable is newer, but a release held back by the project's Rust version is worth a note.\r\n const held = chosen.blockedByMsrv;\r\n if (floor && held && semver.gt(held.version, floor)) {\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'incompatible-rust-version', detail: ` (${held.version} needs Rust ${held.requires})` } };\r\n }\r\n return yankedLock(dep, literal, origin, versions, locks);\r\n }\r\n const newRange = rewriteRequirement(literal, latest);\r\n // The requirement already allows the newest release: only the lock file can be behind.\r\n if (newRange === literal) return lockOutcome(dep, literal, origin, versions, pkg, metadata, locks, common, context);\r\n\r\n const tag = semver.prerelease(latest) ? (extractPreReleaseTag(latest) ?? 'PRE') : undefined;\r\n const diff = cargoDiff(floor, latest);\r\n const candidate: UpdateCandidate = {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'cargo', ...(dep.registry ? { registry: dep.registry } : {}) },\r\n currentRange: literal,\r\n currentClean: floor,\r\n latest,\r\n newRange,\r\n diff,\r\n scope: common.scope,\r\n selected: diff !== 'major',\r\n origin,\r\n action: 'update',\r\n declaration: located.declaration,\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n ...(common.qualifier ? { qualifier: common.qualifier } : {}),\r\n ...(located.inherited ? { sharedWith: sharersOf(metadata, pkg, dep.rename ?? dep.name) } : {}),\r\n };\r\n return { candidate };\r\n }\r\n}\r\n\r\n/**\r\n * The lock file holds an older version than the requirement allows. Offered only when the\r\n * requirement itself needs no change, so a crate never appears twice.\r\n */\r\nfunction lockOutcome(\r\n dep: MetadataDependency,\r\n requirement: string,\r\n origin: DependencyOrigin,\r\n versions: IndexVersion[],\r\n pkg: MetadataPackage,\r\n metadata: CargoMetadata,\r\n locks: Map<string, string[]>,\r\n common: { scope: 'prod' | 'dev'; qualifier: string | undefined },\r\n context: ScanContext,\r\n): Outcome {\r\n const locked = (locks.get(dep.name) ?? []).filter((v) => satisfiesRequirement(requirement, v)).sort(semver.rcompare)[0];\r\n if (!locked) return null;\r\n\r\n const options = { channel: context.channel, rustVersion: pkg.rust_version ?? undefined };\r\n const allowed = versions.filter((v) => satisfiesRequirement(requirement, v.version));\r\n const newer = eligibleVersions(allowed, options).filter((v) => semver.gt(v, locked));\r\n const latest = newer[0];\r\n if (!latest) return yankedLock(dep, requirement, origin, versions, locks);\r\n\r\n const lockFile = join(metadata.workspace_root, 'Cargo.lock');\r\n return {\r\n candidate: {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'cargo', ...(dep.registry ? { registry: dep.registry } : {}) },\r\n currentRange: locked,\r\n currentClean: locked,\r\n latest,\r\n newRange: latest,\r\n diff: cargoDiff(locked, latest),\r\n scope: common.scope,\r\n // A release the requirement allows is compatible by definition, so it is safe to preselect.\r\n selected: true,\r\n origin,\r\n action: 'lock',\r\n declaration: { file: lockFile, kind: 'lockfile', displayPath: display(context.rootDir, lockFile) },\r\n availableVersions: newer,\r\n ...(common.qualifier ? { qualifier: common.qualifier } : {}),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * The locked release was yanked and nothing the requirement allows can replace it. Cargo still\r\n * builds from the lock file, so this is a warning rather than an update.\r\n */\r\nfunction yankedLock(\r\n dep: MetadataDependency,\r\n requirement: string,\r\n origin: DependencyOrigin,\r\n versions: IndexVersion[],\r\n locks: Map<string, string[]>,\r\n): Outcome {\r\n const locked = (locks.get(dep.name) ?? []).filter((v) => satisfiesRequirement(requirement, v)).sort(semver.rcompare)[0];\r\n if (!locked || !versions.some((v) => v.yanked && v.version === locked)) return null;\r\n return { skipped: { identifier: dep.name, origin: origin.kind, reason: 'locked-version-yanked', detail: locked } };\r\n}\r\n\r\ninterface Located {\r\n version: { value: string; start: number; end: number };\r\n declaration: VersionDeclaration;\r\n inherited: boolean;\r\n}\r\n\r\nfunction alignment(\r\n dep: MetadataDependency,\r\n target: ProjectModule,\r\n located: Located | undefined,\r\n common: { scope: 'prod' | 'dev'; qualifier: string | undefined },\r\n): Outcome {\r\n const local = target.version;\r\n if (!located || !local || !semver.valid(local)) return null;\r\n const literal = located.version.value;\r\n if (!isUpgradableRequirement(literal) || satisfiesRequirement(literal, local)) return null;\r\n\r\n const floor = requirementFloor(literal) ?? '0.0.0';\r\n const diff = cargoDiff(floor, local);\r\n const tag = semver.prerelease(local) ? (extractPreReleaseTag(local) ?? 'PRE') : undefined;\r\n return {\r\n candidate: {\r\n coordinate: { identifier: dep.name, artifact: dep.name, ecosystem: 'cargo' },\r\n currentRange: literal,\r\n currentClean: floor,\r\n latest: local,\r\n newRange: rewriteRequirement(literal, local),\r\n diff,\r\n scope: common.scope,\r\n selected: diff !== 'major',\r\n origin: { kind: 'workspace', moduleId: target.id, moduleRelPath: target.relPath },\r\n action: 'align',\r\n declaration: located.declaration,\r\n availableVersions: [local],\r\n isPreRelease: tag !== undefined,\r\n preReleaseTag: tag,\r\n ...(common.qualifier ? { qualifier: common.qualifier } : {}),\r\n },\r\n };\r\n}\r\n\r\nfunction groupDependencies(deps: MetadataDependency[]): MetadataDependency[][] {\r\n const groups = new Map<string, MetadataDependency[]>();\r\n for (const dep of deps) {\r\n const id = `${dep.rename ?? dep.name}`;\r\n groups.set(id, [...(groups.get(id) ?? []), dep]);\r\n }\r\n return [...groups.values()];\r\n}\r\n\r\nfunction readDeclarations(manifestPath: string): DependencyDeclaration[] {\r\n try {\r\n return parseCargoManifest(readFileSync(manifestPath, 'utf8'));\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nconst sectionOf = (dep: MetadataDependency): DependencySection =>\r\n dep.kind === 'dev' ? 'dev-dependencies' : dep.kind === 'build' ? 'build-dependencies' : 'dependencies';\r\n\r\nfunction findDeclaration(decls: DependencyDeclaration[], key: string, dep: MetadataDependency) {\r\n const candidates = decls.filter((d) => !d.inWorkspace && d.key === key);\r\n return (\r\n candidates.find((d) => d.section === sectionOf(dep) && (d.target ?? null) === dep.target) ?? candidates[0]\r\n );\r\n}\r\n\r\nfunction locate(\r\n decl: DependencyDeclaration | undefined,\r\n root: DependencyDeclaration[],\r\n key: string,\r\n repoRoot: string,\r\n manifestPath: string,\r\n rootManifest: string,\r\n): Located | undefined {\r\n if (!decl) return undefined;\r\n if (decl.inherited) {\r\n const shared = root.find((d) => d.inWorkspace && d.key === key);\r\n if (!shared?.version) return undefined;\r\n return {\r\n version: shared.version,\r\n inherited: true,\r\n declaration: { file: rootManifest, kind: 'dependency-management', displayPath: display(repoRoot, rootManifest) },\r\n };\r\n }\r\n if (!decl.version) return undefined;\r\n return {\r\n version: decl.version,\r\n inherited: false,\r\n declaration: { file: manifestPath, kind: 'dependency', displayPath: display(repoRoot, manifestPath) },\r\n };\r\n}\r\n\r\n/** Other members that inherit the same workspace dependency. */\r\nfunction sharersOf(metadata: CargoMetadata, self: MetadataPackage, key: string): string[] {\r\n return metadata.packages\r\n .filter((p) => p !== self)\r\n .filter((p) => readDeclarations(p.manifest_path).some((d) => d.key === key && d.inherited))\r\n .map((p) => p.name);\r\n}\r\n\r\nconst display = (repoRoot: string, file: string) => relative(repoRoot, file).replace(/\\\\/g, '/');\r\nconst samePath = (a: string, b: string) => relative(a, b) === '';\r\n\r\nfunction sameRequirement(literal: string, req: string): boolean {\r\n const a = toSemverRange(literal);\r\n const b = toSemverRange(req);\r\n return a !== null && b !== null && semver.validRange(a) === semver.validRange(b);\r\n}\r\n","/**\r\n * Elevate â Cargo.toml dependency declarations.\r\n *\r\n * Finds, for every dependency of a manifest, where its version is written.\r\n * The parser reports exact source ranges, so an update can replace just the\r\n * characters inside the quotes and leave comments, quote style and line\r\n * endings alone.\r\n */\r\n\r\nimport { parseTOML } from 'toml-eslint-parser';\r\n\r\nexport type DependencySection = 'dependencies' | 'dev-dependencies' | 'build-dependencies';\r\n\r\nexport interface VersionLiteral {\r\n value: string;\r\n /** Offsets of the text between the quotes. */\r\n start: number;\r\n end: number;\r\n}\r\n\r\nexport interface DependencyDeclaration {\r\n /** Table key: the crate name, or its rename when `package = \"âĶ\"` is used. */\r\n key: string;\r\n section: DependencySection;\r\n /** `cfg(âĶ)` or target triple of a `[target.*]` table. */\r\n target?: string;\r\n /** Declared in `[workspace.dependencies]`. */\r\n inWorkspace: boolean;\r\n /** `workspace = true`: the version lives in the workspace root. */\r\n inherited: boolean;\r\n /** `package = \"âĶ\"`: the real crate name behind a rename. */\r\n package?: string;\r\n version?: VersionLiteral;\r\n}\r\n\r\nconst SECTIONS: Record<string, DependencySection> = {\r\n dependencies: 'dependencies',\r\n 'dev-dependencies': 'dev-dependencies',\r\n dev_dependencies: 'dev-dependencies',\r\n 'build-dependencies': 'build-dependencies',\r\n build_dependencies: 'build-dependencies',\r\n};\r\n\r\ninterface Leaf {\r\n path: string[];\r\n node: any;\r\n}\r\n\r\nexport function parseCargoManifest(source: string): DependencyDeclaration[] {\r\n const root = parseTOML(source).body[0] as any;\r\n const leaves: Leaf[] = [];\r\n\r\n const keyPath = (key: any): string[] => key.keys.map((k: any) => (k.type === 'TOMLBare' ? k.name : k.value));\r\n const visitPair = (prefix: string[], pair: any): void => {\r\n const path = [...prefix, ...keyPath(pair.key)];\r\n leaves.push({ path, node: pair.value });\r\n if (pair.value.type === 'TOMLInlineTable') for (const inner of pair.value.body) visitPair(path, inner);\r\n };\r\n\r\n for (const element of root.body) {\r\n if (element.type === 'TOMLKeyValue') visitPair([], element);\r\n else if (element.type === 'TOMLTable') {\r\n const header = keyPath(element.key);\r\n for (const pair of element.body) visitPair(header, pair);\r\n leaves.push({ path: header, node: element });\r\n }\r\n }\r\n\r\n const byKey = new Map<string, DependencyDeclaration>();\r\n for (const { path, node } of leaves) {\r\n const located = locateSection(path);\r\n if (!located || located.rest.length === 0) continue;\r\n const [key, field] = located.rest;\r\n const id = `${located.inWorkspace}|${located.target ?? ''}|${located.section}|${key}`;\r\n let decl = byKey.get(id);\r\n if (!decl) {\r\n decl = { key: key!, section: located.section, target: located.target, inWorkspace: located.inWorkspace, inherited: false };\r\n byKey.set(id, decl);\r\n }\r\n if (located.rest.length === 1 && node.type === 'TOMLValue' && node.kind === 'string') {\r\n decl.version = literalOf(node);\r\n } else if (field === 'version' && located.rest.length === 2 && node.type === 'TOMLValue' && node.kind === 'string') {\r\n decl.version = literalOf(node);\r\n } else if (field === 'workspace' && located.rest.length === 2 && node.value === true) {\r\n decl.inherited = true;\r\n } else if (field === 'package' && located.rest.length === 2 && node.type === 'TOMLValue') {\r\n decl.package = String(node.value);\r\n }\r\n }\r\n return [...byKey.values()];\r\n}\r\n\r\nfunction literalOf(node: any): VersionLiteral {\r\n return { value: node.value, start: node.range[0] + 1, end: node.range[1] - 1 };\r\n}\r\n\r\n/** Splits a table path into dependency section, target and the keys below it. */\r\nfunction locateSection(path: string[]) {\r\n let i = 0;\r\n let target: string | undefined;\r\n let inWorkspace = false;\r\n if (path[0] === 'workspace' && path[1] === 'dependencies') {\r\n return { section: 'dependencies' as const, inWorkspace: true, target, rest: path.slice(2) };\r\n }\r\n if (path[0] === 'target' && path.length >= 3) {\r\n target = path[1];\r\n i = 2;\r\n }\r\n const section = SECTIONS[path[i] ?? ''];\r\n if (!section) return undefined;\r\n return { section, inWorkspace, target, rest: path.slice(i + 1) };\r\n}\r\n","/**\r\n * Elevate â Cargo.lock reader.\r\n *\r\n * Only the locked versions per crate are needed. A crate can be locked in\r\n * several versions at once, which makes a bare `-p name` ambiguous.\r\n */\r\n\r\nimport { existsSync, readFileSync } from 'node:fs';\r\nimport { getStaticTOMLValue, parseTOML } from 'toml-eslint-parser';\r\n\r\n/** Locked versions per crate name; empty when the file is missing or unreadable. */\r\nexport function readLockedVersions(lockFile: string): Map<string, string[]> {\r\n const locked = new Map<string, string[]>();\r\n if (!existsSync(lockFile)) return locked;\r\n try {\r\n const data = getStaticTOMLValue(parseTOML(readFileSync(lockFile, 'utf8'))) as { package?: { name: string; version: string }[] };\r\n for (const pkg of data.package ?? []) locked.set(pkg.name, [...(locked.get(pkg.name) ?? []), pkg.version]);\r\n } catch {\r\n // An unreadable lockfile is left for cargo to complain about.\r\n }\r\n return locked;\r\n}\r\n","/**\r\n * Elevate â Cargo updater.\r\n *\r\n * Writes each new requirement to the literal that declares it â in the\r\n * member's Cargo.toml or, for `workspace = true`, in the workspace root â\r\n * splicing only the version text. Then it brings Cargo.lock in line:\r\n *\r\n * 1. `cargo update -p name@old` re-resolves to the newest allowed version\r\n * 2. `cargo update -p name@new --precise <target>` only if the chosen version is older\r\n *\r\n * Step 2 is needed because `--precise` is ignored while the old lock entry no\r\n * longer fits the manifest (verified with Cargo 1.97). A repository without a\r\n * Cargo.lock gets none.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport semver from 'semver';\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 { applyRangeEdits } from '../shared/text-edit.js';\r\nimport type { RangeEdit } from '../shared/text-edit.js';\r\nimport { StaleEditError } from '../shared/xml.js';\r\nimport { readLockedVersions } from './cargo-lockfile.js';\r\nimport { satisfiesRequirement } from './cargo-requirement.js';\r\nimport { parseCargoManifest } from './cargo-toml.js';\r\n\r\nconst UPDATE_TIMEOUT_MS = 10 * 60_000;\r\n\r\nconst workspaceDir = (module: ProjectModule, rootDir: string) => module.aggregatorDir ?? module.path ?? rootDir;\r\n\r\nexport class CargoUpdaterAdapter 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, 'Cargo.toml'))));\r\n files.add(join(workspaceDir(module, rootDir), 'Cargo.lock'));\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 dir = workspaceDir(module, rootDir);\r\n const lockFile = join(dir, 'Cargo.lock');\r\n const lockedBefore = readLockedVersions(lockFile);\r\n\r\n // Updates of the lock file alone leave every manifest as it is. They are checked first, so a\r\n // missing or changed lock file stops the run before anything is written.\r\n const lockUpdates = updates.filter((u) => u.action === 'lock');\r\n updates = updates.filter((u) => u.action !== 'lock');\r\n this.checkLockUpdates(lockUpdates, lockFile, lockedBefore);\r\n\r\n // Every edit is computed before the first write, so a stale file leaves nothing half-updated.\r\n const byFile = new Map<string, UpdateCandidate[]>();\r\n for (const update of updates) {\r\n const file = resolve(update.declaration?.file ?? join(module.path, 'Cargo.toml'));\r\n byFile.set(file, [...(byFile.get(file) ?? []), update]);\r\n }\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 ${file}âĶ`);\r\n const source = readFileSync(file, 'utf8');\r\n const decls = parseCargoManifest(source);\r\n const edits: RangeEdit[] = [];\r\n for (const update of fileUpdates) {\r\n const inWorkspace = update.declaration?.kind === 'dependency-management';\r\n const name = update.coordinate.identifier;\r\n const found = decls.filter(\r\n (d) => d.inWorkspace === inWorkspace && (d.package ?? d.key) === name && d.version?.value === update.currentRange,\r\n );\r\n if (found.length === 0) {\r\n throw new InstallError(`${file}: cannot find the version of ${name} (${update.currentRange}) any more; rescan the module.`);\r\n }\r\n for (const d of found) {\r\n edits.push({ start: d.version!.start, end: d.version!.end, expected: d.version!.value, replacement: update.newRange });\r\n }\r\n }\r\n try {\r\n writes.push({ file, content: applyRangeEdits(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 onProgress('Writing Cargo.toml filesâĶ');\r\n for (const write of writes) writeFileSync(write.file, write.content, 'utf8');\r\n\r\n const registryUpdates = updates.filter((u) => u.action === 'update');\r\n if (existsSync(lockFile) && registryUpdates.length > 0) {\r\n await this.refreshLock(dir, lockFile, lockedBefore, registryUpdates, onProgress);\r\n }\r\n\r\n for (const update of lockUpdates) {\r\n const name = update.coordinate.identifier;\r\n onProgress(`Locking ${name} at ${update.latest}âĶ`);\r\n await this.cargoUpdate(dir, ['-p', `${name}@${update.currentClean}`, '--precise', update.latest]);\r\n }\r\n\r\n const parts: string[] = [];\r\n if (updates.length > 0) {\r\n parts.push(`Updated ${updates.length} requirement(s) in ${writes.length} Cargo.toml file(s)${existsSync(lockFile) ? '; Cargo.lock refreshed' : ''}`);\r\n }\r\n if (lockUpdates.length > 0) parts.push(`locked ${lockUpdates.length} crate(s) at a newer version in Cargo.lock`);\r\n const message = parts.join('; ');\r\n\r\n return {\r\n updatedCount: updates.length + lockUpdates.length,\r\n auditMessage: `${message.charAt(0).toUpperCase()}${message.slice(1)}.`,\r\n auditSeverity: 'clean',\r\n integrityViolations: [],\r\n };\r\n }\r\n\r\n /** A lock-only update needs a lock file that still holds the version the scan saw. */\r\n private checkLockUpdates(lockUpdates: UpdateCandidate[], lockFile: string, locked: Map<string, string[]>): void {\r\n if (lockUpdates.length === 0) return;\r\n if (!existsSync(lockFile)) {\r\n throw new InstallError(`${lockFile} does not exist any more; rescan the module.`);\r\n }\r\n for (const update of lockUpdates) {\r\n const name = update.coordinate.identifier;\r\n if (!(locked.get(name) ?? []).includes(update.currentClean)) {\r\n throw new InstallError(`Cargo.lock no longer locks ${name} at ${update.currentClean}; rescan the module.`);\r\n }\r\n }\r\n }\r\n\r\n async resync(): Promise<void> {\r\n // Cargo keeps no installed state next to the manifests; restoring them and Cargo.lock suffices.\r\n }\r\n\r\n private async refreshLock(\r\n dir: string,\r\n lockFile: string,\r\n before: Map<string, string[]>,\r\n updates: UpdateCandidate[],\r\n onProgress: (stepMessage: string) => void,\r\n ): Promise<void> {\r\n const specs: string[] = [];\r\n for (const update of updates) {\r\n const name = update.coordinate.identifier;\r\n const versions = before.get(name) ?? [];\r\n // The entry the old requirement resolved to; a crate locked twice is told apart by that.\r\n const old = versions.find((v) => satisfiesRequirement(update.currentRange, v)) ?? versions[0];\r\n if (old) specs.push(`${name}@${old}`);\r\n }\r\n if (specs.length === 0) return;\r\n\r\n onProgress('Updating Cargo.lockâĶ');\r\n await this.cargoUpdate(dir, specs.flatMap((s) => ['-p', s]));\r\n\r\n const after = readLockedVersions(lockFile);\r\n for (const update of updates) {\r\n const name = update.coordinate.identifier;\r\n const locked = (after.get(name) ?? []).find((v) => satisfiesRequirement(update.newRange, v));\r\n if (locked && semver.valid(update.latest) && locked !== update.latest) {\r\n onProgress(`Pinning ${name} to ${update.latest}âĶ`);\r\n await this.cargoUpdate(dir, ['-p', `${name}@${locked}`, '--precise', update.latest]);\r\n }\r\n }\r\n }\r\n\r\n private async cargoUpdate(dir: string, args: string[]): Promise<void> {\r\n const result = await runCommand('cargo', ['update', ...args], { cwd: dir, timeoutMs: UPDATE_TIMEOUT_MS });\r\n if (result.exitCode !== 0) {\r\n const reason = result.timedOut ? 'cargo update timed out' : 'cargo update failed';\r\n throw new InstallError(reason, tail(result.stderr || result.stdout));\r\n }\r\n }\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, '&').replace(/</g, '<').replace(/>/g, '>');\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, '"')}\"`)\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 â range based text edits.\r\n *\r\n * Replaces exact character ranges of a source text, so everything around them\r\n * (comments, quotes, indentation, line endings) stays byte-identical. Every\r\n * edit states the text it expects to replace; a mismatch means the file\r\n * changed since it was scanned.\r\n */\r\n\r\nimport { StaleEditError } from './xml.js';\r\n\r\nexport interface RangeEdit {\r\n start: number;\r\n end: number;\r\n /** The text currently at `start..end`. */\r\n expected: string;\r\n replacement: string;\r\n}\r\n\r\nexport function applyRangeEdits(source: string, edits: readonly RangeEdit[]): string {\r\n for (const edit of edits) {\r\n const found = source.slice(edit.start, edit.end);\r\n if (found !== edit.expected) {\r\n throw new StaleEditError(`Found '${found}', expected '${edit.expected}'. The file changed since it was scanned.`);\r\n }\r\n }\r\n const ordered = [...edits].sort((a, b) => b.start - a.start);\r\n for (let i = 1; i < ordered.length; i++) {\r\n if (ordered[i]!.end > ordered[i - 1]!.start) throw new StaleEditError('Overlapping edits on the same text.');\r\n }\r\n let result = source;\r\n for (const edit of ordered) result = result.slice(0, edit.start) + edit.replacement + result.slice(edit.end);\r\n return result;\r\n}\r\n","/**\r\n * Elevate â Cargo verification.\r\n *\r\n * `cargo check --all-targets` type-checks libraries, binaries, tests, benches\r\n * and examples without generating code â the counterpart of `mvn test-compile`.\r\n * It covers the members whose manifests changed plus every member that depends\r\n * on them by path, because a change in a library breaks its consumers. A\r\n * changed workspace root manifest (shared `[workspace.dependencies]`) checks\r\n * the whole workspace, and so does a change to Cargo.lock alone (a lock-only\r\n * update reaches every crate that uses the dependency).\r\n *\r\n * Doctests, non-default features and other targets are not covered; a\r\n * `postUpdateScript` is the way to add them.\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { 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, tail } from '../shared/process.js';\r\nimport { cargoErrors, runCargo } from './cargo-command.js';\r\nimport { loadMetadata } from './cargo-metadata.js';\r\nimport type { CargoMetadata } from './cargo-metadata.js';\r\n\r\nconst VERIFY_TIMEOUT_MS = 30 * 60_000;\r\n\r\nconst same = (a: string, b: string) => relative(resolve(a), resolve(b)) === '';\r\n\r\n/** The arguments of the `cargo check` that covers the change. */\r\nexport function planCheck(metadata: CargoMetadata, module: ProjectModule, changedFiles: readonly string[], locked: boolean): string[] {\r\n const args = ['check', '--all-targets', ...(locked ? ['--locked'] : [])];\r\n const rootManifest = join(metadata.workspace_root, 'Cargo.toml');\r\n const lockFile = join(metadata.workspace_root, 'Cargo.lock');\r\n const memberManifests = new Set(metadata.packages.map((p) => resolve(p.manifest_path)));\r\n\r\n if (changedFiles.some((f) => same(f, rootManifest))) {\r\n // A root manifest that is itself a member only matters when it holds workspace-wide settings.\r\n const isVirtualRoot = !memberManifests.has(resolve(rootManifest));\r\n if (isVirtualRoot || metadata.packages.length > 1) return [...args, '--workspace'];\r\n }\r\n\r\n // A new version in Cargo.lock reaches every crate that uses the dependency, and no manifest says which.\r\n if (changedFiles.length > 0 && changedFiles.every((f) => same(f, lockFile))) return [...args, '--workspace'];\r\n\r\n const changed = new Set(\r\n metadata.packages.filter((p) => changedFiles.some((f) => same(f, p.manifest_path))).map((p) => p.name),\r\n );\r\n if (changed.size === 0) changed.add(module.id);\r\n\r\n // Everything that reaches a changed member through path dependencies.\r\n for (let grew = true; grew; ) {\r\n grew = false;\r\n for (const p of metadata.packages) {\r\n if (changed.has(p.name)) continue;\r\n if (p.dependencies.some((d) => d.source === null && d.path && changed.has(d.name))) {\r\n changed.add(p.name);\r\n grew = true;\r\n }\r\n }\r\n }\r\n const ordered = metadata.packages.filter((p) => changed.has(p.name)).map((p) => p.name);\r\n return [...args, ...ordered.flatMap((name) => ['-p', name])];\r\n}\r\n\r\nexport interface CargoVerifierDeps {\r\n loadMetadata(dir: string): Promise<CargoMetadata>;\r\n hasLock(dir: string): boolean;\r\n}\r\n\r\nexport class CargoVerificationAdapter implements VerificationPort {\r\n constructor(\r\n private readonly deps: CargoVerifierDeps = { loadMetadata, hasLock: (dir) => existsSync(join(dir, 'Cargo.lock')) },\r\n ) {}\r\n\r\n async verify(module: ProjectModule, rootDir: string, options: VerificationOptions = {}): Promise<VerificationResult> {\r\n const dir = module.aggregatorDir ?? module.path ?? rootDir;\r\n\r\n if (options.customScript) {\r\n const label = options.customLabel || options.customScript;\r\n const result = await runShellScript(options.customScript, { cwd: dir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n return result.exitCode === 0\r\n ? { status: 'clean', details: 'Verification script succeeded.', label }\r\n : { status: 'warn', details: tail(result.stderr || result.stdout), label };\r\n }\r\n\r\n const metadata = await this.deps.loadMetadata(dir);\r\n const args = planCheck(metadata, module, options.changedFiles ?? [], this.deps.hasLock(dir));\r\n const label = `Cargo build (cargo ${args.join(' ')})`;\r\n const result = await runCargo(args, { cwd: dir, timeoutMs: VERIFY_TIMEOUT_MS });\r\n if (result.exitCode === 0) return { status: 'clean', details: 'All affected crates type-check, including tests.', label };\r\n return {\r\n status: 'warn',\r\n details: result.timedOut ? 'cargo check timed out.' : cargoErrors(`${result.stderr}\\n${result.stdout}`),\r\n label,\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 â 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 { mavenVersionPolicy } from '../../domain/version-policy.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 readonly versioning = mavenVersionPolicy;\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, Java/Maven and Rust/Cargo.\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 { CargoEcosystemStrategy } from '../adapters/cargo/cargo-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 if (ecosystem === 'cargo') {\r\n strategy = new CargoEcosystemStrategy();\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', 'cargo'];\r\n }\r\n\r\n /** The ecosystem after `current`, for the dashboard's ecosystem switch. */\r\n static next(current: Ecosystem): Ecosystem {\r\n const all = this.getAvailableEcosystems();\r\n return all[(all.indexOf(current) + 1) % all.length]!;\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 â Cargo 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 = EcosystemFactory.next(ecosystem);\r\n const nextStrategy = useMemo(() => EcosystemFactory.getStrategy(nextEcosystem), [nextEcosystem]);\r\n\r\n const toggleEcosystem = useCallback(() => {\r\n setEcosystem((prev) => EcosystemFactory.next(prev));\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 rootDir={config.rootDir}\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 diagnostics={ws.diagnostics}\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 'not-linked': 'Workspace-Paket, das pnpm ohne das workspace:-Protokoll nicht verlinkt',\r\n 'catalog-unresolved': 'Catalog-Eintrag konnte nicht aufgelÃķst werden',\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 lock: '[Lock]',\r\n shared: (count) => `[+${count} Crates]`,\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 alsoChanges: (names) => `Ãndert auch: ${names.join(', ')}`,\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 cargoChirps: ['*krabbel* ðĶ', 'cargo check lÃĪuft durch!', 'Borrow Checker nickt!', 'furchtlose Updates!'],\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 'not-linked': 'workspace package that pnpm does not link without the workspace: protocol',\r\n 'catalog-unresolved': 'catalog entry could not be resolved',\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 lock: '[Lock]',\r\n shared: (count) => `[+${count} crates]`,\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 alsoChanges: (names) => `Also changes: ${names.join(', ')}`,\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 cargoChirps: ['*crab walk* ðĶ', 'cargo check passes!', 'borrow checker approves!', 'fearless updates!'],\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 { discoverModules } from '../application/scan.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 const [diagnostics, setDiagnostics] = useState<string[]>([]);\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 setDiagnostics([]);\r\n try {\r\n const found = await discoverModules(strategy, rootDir);\r\n setModules(found.modules);\r\n setDiagnostics(found.diagnostics);\r\n } catch (err) {\r\n // A failed discovery is shown, not mistaken for \"no modules\".\r\n setModules([]);\r\n setDiagnostics([err instanceof Error ? err.message : String(err)]);\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 diagnostics,\r\n reload,\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/** Discovers the modules of an ecosystem together with the problems that did not stop discovery. */\r\nexport async function discoverModules(\r\n strategy: EcosystemStrategy,\r\n rootDir: string,\r\n): Promise<{ modules: ProjectModule[]; diagnostics: string[] }> {\r\n const modules = await strategy.discovery.discover(rootDir);\r\n return { modules, diagnostics: strategy.discovery.diagnostics?.() ?? [] };\r\n}\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 ? {\r\n file: u.declaration.displayPath,\r\n kind: u.declaration.kind,\r\n property: u.declaration.propertyName,\r\n catalog: u.declaration.catalogName,\r\n }\r\n : undefined,\r\n sharedWith: u.sharedWith,\r\n };\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 type {\r\n UpdateCandidate,\r\n Tab,\r\n SelectionCounts,\r\n ProjectModule,\r\n ReleaseChannel,\r\n SkippedDependency,\r\n} from '../domain/models.js';\r\nimport type { EcosystemStrategy } from '../domain/ecosystem-strategy.js';\r\nimport type { ElevateConfig } from '../config.js';\r\nimport { extractPreReleaseTag, isPreReleaseVersion } 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 policy = strategy.versioning;\r\n const diff = c.currentClean ? policy.diff(c.currentClean, chosenVersion) : 'minor';\r\n\r\n const isPre = isPreReleaseVersion(chosenVersion);\r\n return {\r\n ...c,\r\n newRange: policy.rewrite(c.currentRange, 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 }, [strategy]);\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 â 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 /** Repository root, so the label can name the package manager. */\r\n rootDir?: string;\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 rootDir,\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} {(rootDir && strategy.displayNameFor?.(rootDir)) || 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 /** What discovery could not load; shown so a missing module is explained. */\r\n diagnostics?: string[];\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, diagnostics = [] }) => {\r\n const scopeHint =\r\n internalScopes.length > 0 ? t.status.internalScopes(internalScopes) : t.status.noInternalScopes;\r\n\r\n return (\r\n <Box flexDirection=\"column\">\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 {diagnostics.slice(0, 2).map((d) => (\r\n <Text key={d} color={theme.colors.danger} wrap=\"truncate-end\">â {d.split('\\n')[0]}</Text>\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 { 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 // Where the dependency applies (build, cfg(unix)) and who shares its declaration go into the\r\n // name column, so the row keeps its width. A long name is cut, the hints are not.\r\n const shared = item.sharedWith && item.sharedWith.length > 0 ? ` ${t.badges.shared(item.sharedWith.length)}` : '';\r\n const label = item.qualifier ? `${item.coordinate.identifier} (${item.qualifier})` : item.coordinate.identifier;\r\n const displayName = label.slice(0, 42 - shared.length) + shared;\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.action === 'lock' && (\r\n <Text bold color={theme.colors.brandLight}>\r\n {t.badges.lock}{' '}\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 : ecosystem === 'cargo'\r\n ? [...t.mascot.idleChirps, ...t.mascot.cargoChirps]\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 {candidate.sharedWith && candidate.sharedWith.length > 0 && (\r\n <Box marginBottom={1}>\r\n <Text color={theme.colors.warning}>{t.versionModal.alsoChanges(candidate.sharedWith)}</Text>\r\n </Box>\r\n )}\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\nimport type { Ecosystem } from '../domain/models.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.js';\r\n\r\nconst isEcosystem = (v: string | undefined): v is Ecosystem => EcosystemFactory.getAvailableEcosystems().includes(v as Ecosystem);\r\n\r\nexport interface CliOptions {\r\n subcommand?: 'modules' | 'scan' | 'versions' | 'update' | 'init' | 'mcp' | 'help';\r\n ecosystem?: Ecosystem;\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 (isEcosystem(val)) result.ecosystem = val;\r\n } else if (arg === '-e' || arg === '--ecosystem') {\r\n const val = remaining[++i];\r\n if (isEcosystem(val)) 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|cargo> 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 { discoverModules } from '../application/scan.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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n const displayName = strategy.displayNameFor?.(config.rootDir) ?? strategy.displayName;\r\n const packageManager = strategy.packageManagerFor?.(config.rootDir);\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify({ ecosystem, ...(packageManager ? { packageManager } : {}), count: modules.length, modules, diagnostics }, null, 2));\r\n return 0;\r\n }\r\n\r\n console.log(`\\nðŠķ Discovered ${strategy.icon} ${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 for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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 case 'not-linked':\r\n return `workspace package that pnpm does not link unless it is declared with the workspace: protocol${detail}`;\r\n case 'catalog-unresolved':\r\n return `catalog entry could not be resolved${detail}`;\r\n case 'incompatible-rust-version':\r\n return `newer versions need a newer Rust than the project's rust-version${detail}`;\r\n case 'locked-version-yanked':\r\n return `Cargo.lock pins a yanked release and no allowed release can replace it${detail}`;\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, discoverModules, 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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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.action === 'lock' ? '[LOCK] ' : 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 } from '../domain/models.js';\r\nimport { extractPreReleaseTag, isPreReleaseVersion } from '../domain/versions.js';\r\nimport { EcosystemFactory } from '../domain/ecosystem-factory.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 (!policyOf(options).allowsManualTargets) {\r\n throw new UpdateSelectionError(\r\n `'${request.identifier}' has no pending update. 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 (!policyOf(options).allowsManualTargets && 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 = policyOf(options).diff(found.currentClean, target);\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 // A lock update pins exactly the version that was picked.\r\n ...(found.action === 'lock' ? { latest: target } : {}),\r\n newRange: policyOf(options).rewrite(found.currentRange, 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 policyOf(options: SelectionOptions) {\r\n return EcosystemFactory.getStrategy(options.ecosystem).versioning;\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, discoverModules, 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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n for (const problem of diagnostics) console.error(`â ïļ ${problem}`);\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 { Ecosystem, 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, discoverModules, 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 { VERSION } from '../version.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: EcosystemFactory.getAvailableEcosystems(),\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: VERSION,\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), Java/Maven (pom.xml) or Rust/Cargo (Cargo.toml).',\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, cargo: serde)',\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 Ecosystem) || '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, diagnostics } = await discoverModules(strategy, config.rootDir);\r\n const packageManager = strategy.packageManagerFor?.(config.rootDir);\r\n return reply({\r\n ecosystem,\r\n ...(packageManager ? { packageManager } : {}),\r\n count: modules.length,\r\n diagnostics,\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","semver","semver","existsSync","dirname","join","resolve","resolve","child","resolve","dirname","existsSync","join","readFileSync","dirname","join","resolve","readFileSync","join","readFileSync","resolve","join","dirname","semver","semver","readFileSync","join","semver","readFileSync","join","semver","readFileSync","join","relative","message","existsSync","readFileSync","join","existsSync","readFileSync","join","parse","join","readFileSync","audit","relative","semver","existsSync","readFileSync","dirname","join","relative","resolve","message","resolve","entries","join","readFileSync","dirname","existsSync","relative","existsSync","readFileSync","dirname","join","resolve","home","semver","semver","semver","semver","readFileSync","join","relative","semver","parseTOML","SECTIONS","existsSync","readFileSync","getStaticTOMLValue","parseTOML","CONCURRENCY","DIFF_ORDER","join","semver","readFileSync","relative","existsSync","readFileSync","writeFileSync","join","resolve","semver","message","resolve","join","readFileSync","writeFileSync","existsSync","message","semver","existsSync","join","relative","resolve","VERIFY_TIMEOUT_MS","relative","resolve","join","existsSync","label","result","semver","existsSync","dirname","join","relative","resolve","existsSync","readdirSync","statSync","join","resolve","existsSync","readFileSync","dirname","join","resolve","readFileSync","dirname","resolve","existsSync","join","resolve","join","existsSync","entries","readdirSync","statSync","resolve","existsSync","join","relative","dirname","existsSync","join","existsSync","dirname","isAbsolute","join","relative","resolve","message","IS_WINDOWS","resolve","join","existsSync","relative","dirname","isAbsolute","existsSync","readFileSync","readdirSync","writeFileSync","join","join","existsSync","readdirSync","readFileSync","merge","entries","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","failureDetails","join","resolve","dirname","relative","resolve","existsSync","join","dirname","message","loadConfig","readFileSync","useState","useMemo","useCallback","Box","useInput","message","message","useState","useCallback","useState","useCallback","useState","useEffect","useMemo","useCallback","useState","useCallback","useEffect","useMemo","useState","useCallback","existsSync","relative","existsSync","readFileSync","rmSync","writeFileSync","entries","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","homedir","join","resolve","jsx","loadConfig"]}
|