@vibgrate/cli 2026.711.2 → 2026.717.1
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/DOCS.md +55 -2
- package/README.md +2 -2
- package/dist/baseline-YWGSHCKW.js +6 -0
- package/dist/{baseline-SRVG4ZAD.js.map → baseline-YWGSHCKW.js.map} +1 -1
- package/dist/{chunk-75ZJYYJE.js → chunk-L42NVMD6.js} +268 -111
- package/dist/chunk-L42NVMD6.js.map +1 -0
- package/dist/{chunk-NNU2PW2H.js → chunk-M62BGJMK.js} +274 -56
- package/dist/chunk-M62BGJMK.js.map +1 -0
- package/dist/{chunk-X5YT263H.js → chunk-VFO5UDAT.js} +21 -2
- package/dist/chunk-VFO5UDAT.js.map +1 -0
- package/dist/{chunk-4IHO6VUL.js → chunk-WZNIDXZP.js} +628 -4
- package/dist/chunk-WZNIDXZP.js.map +1 -0
- package/dist/cli.js +1426 -169
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +29 -6
- package/dist/index.js +3 -3
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +2 -1
- package/dist/parse-worker.js.map +1 -1
- package/dist/{types-CXnp1uGj.d.ts → types-BgNa-FZQ.d.ts} +8 -0
- package/package.json +2 -2
- package/dist/baseline-SRVG4ZAD.js +0 -6
- package/dist/chunk-4IHO6VUL.js.map +0 -1
- package/dist/chunk-75ZJYYJE.js.map +0 -1
- package/dist/chunk-NNU2PW2H.js.map +0 -1
- package/dist/chunk-X5YT263H.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/core-open/scanners/npm-lockfile.ts","../src/core-open/utils/timeout.ts","../src/core-open/package-version-manifest.ts","../src/core-open/scanners/npm-cache.ts","../src/core-open/licenses/spdx-catalog.ts","../src/core-open/licenses/spdx-aliases.ts","../src/core-open/licenses/spdx-expression.ts","../src/core-open/licenses/normalize.ts","../src/core-open/licenses/dependency-license.ts","../src/core-open/scoring/libyear.ts","../src/core-open/runtimes/catalog.ts","../src/core-open/runtimes/snapshot.ts","../src/core-open/scanners/node-scanner.ts","../src/core-open/scanners/dotnet-scanner.ts","../src/core-open/utils/toml.ts","../src/core-open/scanners/python-lockfile.ts","../src/core-open/scanners/python-scanner.ts","../src/core-open/scanners/gradle-lockfile.ts","../src/core-open/scanners/java-scanner.ts","../src/core-open/scanners/gemfile-lock.ts","../src/core-open/scanners/ruby-scanner.ts","../src/core-open/scanners/swift-scanner.ts","../src/core-open/scanners/go-scanner.ts","../src/core-open/scanners/cargo-lockfile.ts","../src/core-open/scanners/rust-scanner.ts","../src/core-open/scanners/php-scanner.ts","../src/core-open/scanners/dart-scanner.ts","../src/core-open/scanners/hex-cache.ts","../src/core-open/scanners/elixir-scanner.ts","../src/core-open/scanners/docker-cache.ts","../src/core-open/scanners/docker-scanner.ts","../src/core-open/scanners/helm-cache.ts","../src/core-open/scanners/helm-scanner.ts","../src/core-open/scanners/terraform-cache.ts","../src/core-open/scanners/terraform-scanner.ts","../src/core-open/scanners/polyglot-scanner.ts","../src/core-open/runtimes/client.ts","../src/core-open/scanners/nuget-cache.ts","../src/core-open/scanners/pypi-cache.ts","../src/core-open/scanners/maven-cache.ts","../src/core-open/scanners/rubygems-cache.ts","../src/core-open/scanners/swift-cache.ts","../src/core-open/scanners/go-cache.ts","../src/core-open/scanners/cargo-cache.ts","../src/core-open/scanners/composer-cache.ts","../src/core-open/scanners/pub-cache.ts","../src/core-open/scoring/dependency-drift-v3.ts","../src/core-open/scoring/drift-score.ts","../src/core-open/ui/bar.ts","../src/core-open/ui/box.ts","../src/core-open/formatters/text.ts","../src/core-open/formatters/sarif.ts","../src/core-open/formatters/markdown.ts","../src/core-open/config.ts","../src/core-open/utils/vcs.ts","../src/core-open/utils/repository-name.ts","../src/core-open/ui/trace.ts","../src/core-open/ui/progress.ts","../src/core-open/ui/scan-history.ts","../src/core-open/utils/dsn.ts","../src/core-open/utils/mermaid.ts","../src/core-open/scanners/project-classification.ts","../src/core-open/scoring/cvss.ts","../src/core-open/scanners/vulnerability-scanner.ts","../src/core-open/utils/git-history.ts","../src/core-open/utils/version-timeline.ts","../src/core-open/scoring/vuln-attribution.ts","../src/core-open/run-core-scan.ts","../src/core-open/scanners/upgrade-impact.ts","../src/core-open/scanners/changelog-signals.ts","../src/core-open/utils/version-bisect.ts","../src/core-open/utils/update-check.ts","../src/core-open/utils/compact-evidence.ts","../src/core-open/utils/compact-artifact.ts","../src/core-open/utils/scan-preflight.ts","../src/core-open/utils/symbols-preflight.ts","../src/core-open/utils/repo-fingerprint.ts","../src/reporting/utils/fs.ts"],"names":["clean","path","parseYaml","resolve","path2","os","semver","record","spawn","latestStable","MS_PER_DAY","path3","semver2","path4","major","semver3","parse","path5","semver4","path6","findFiles","path7","parser","XMLParser","path8","semver5","path9","semver6","path10","path11","semver7","path12","semver8","valid","semver9","path13","path14","semver10","path15","semver11","path16","semver12","KNOWN_FRAMEWORKS","minVersion","validRange","gt","path17","REQUEST_TIMEOUT","CONCURRENT_REQUESTS","SemVer","calculateDrift","path18","versionMatch","path19","path20","path21","path22","os3","readFile","semver13","pep440ToSemver","semver14","mavenToSemver","semver15","key","rubyVersionToSemver","semver16","semver17","semver18","semver19","semver20","semver21","rank","clamp","fs","health","chalk","formatBillable","path23","txt","existing","merged","path24","stat","path25","basename","dirname","path26","fs3","semver22","path27","semver23","sep","parseComposerLock","parseGemfileLock","parseGoMod","parsePipfileLock","parsePubspecLock","parseMixLock","fs4","path28","semver24","emptySeverityCounts","path30","semver25","FETCH_TIMEOUT_MS","fetchJson","semver27","path31","os4","gzip","SKIP_DIRS","fs7","path32","crypto2","promisify","execFile","readJsonFile","fs8","pathExists","ensureDir","writeJsonFile","path34","writeTextFile"],"mappings":"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","file":"chunk-M62BGJMK.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.717.1';\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * npm lockfile resolution (clean-room).\n *\n * The scanner resolves each direct dependency's version from the registry's best match for the\n * declared range. A lockfile carries the EXACT installed version — which is more accurate for\n * \"what's current\", and is the only source of a resolved version in `--offline` mode (no registry).\n * This module parses the npm-family lockfiles into a name → installed-version index the node scanner\n * prefers over the registry guess.\n *\n * Clean-room: formats are read from their public, documented shapes (npm package-lock v1/v2/v3 JSON;\n * Yarn classic + Berry text; pnpm-lock v5/v6/v9 YAML) — no third-party (AGPL or otherwise) parser is\n * used or ported. The only dependency is the `yaml` package, for the genuinely-YAML pnpm lockfile.\n */\nimport * as path from 'node:path';\nimport { parse as parseYaml } from 'yaml';\n\nexport type NpmLockSource = 'package-lock' | 'yarn' | 'pnpm';\n\nexport interface NpmLockIndex {\n source: NpmLockSource;\n /** Distinct packages with a resolved version. */\n size: number;\n /** Installed version for a direct dependency by name (disambiguated by the declared spec when possible). */\n resolve(name: string, spec?: string): string | null;\n}\n\ninterface PackageLockShape {\n packages?: Record<string, { version?: string } | null>;\n dependencies?: Record<string, { version?: string } | null>;\n}\n\n// A top-level install lives at exactly `node_modules/<name>` (name may be scoped: `node_modules/@scope/pkg`).\nconst TOP_LEVEL_NODE_MODULES = /^node_modules\\/((?:@[^/]+\\/)?[^/]+)$/;\n\n/** name → top-level installed version from a package-lock.json (v2/v3 `packages`, falling back to v1 `dependencies`). */\nexport function parsePackageLock(json: unknown): Map<string, string> {\n const out = new Map<string, string>();\n if (!json || typeof json !== 'object') return out;\n const lock = json as PackageLockShape;\n\n if (lock.packages && typeof lock.packages === 'object') {\n for (const [p, entry] of Object.entries(lock.packages)) {\n const version = entry?.version;\n if (!version) continue;\n const m = TOP_LEVEL_NODE_MODULES.exec(p);\n if (m) out.set(m[1], version);\n }\n }\n // v1 lockfiles have no `packages`; the top-level install tree is `dependencies`.\n if (out.size === 0 && lock.dependencies && typeof lock.dependencies === 'object') {\n for (const [name, entry] of Object.entries(lock.dependencies)) {\n const version = entry?.version;\n if (version) out.set(name, version);\n }\n }\n return out;\n}\n\nexport interface YarnLockIndex {\n /** Full `name@range` → version (precise). */\n bySpec: Map<string, string>;\n /** name → version, last-wins (fallback when the exact spec key isn't found, e.g. Berry's `name@npm:range`). */\n byName: Map<string, string>;\n}\n\n/** Split a `name@range` key into its package name (handles scoped names and Berry's `@npm:` protocol). */\nfunction specName(spec: string): string | null {\n // Skip the leading '@' of a scope, then find the separator '@'.\n const at = spec.indexOf('@', spec.startsWith('@') ? 1 : 0);\n return at > 0 ? spec.slice(0, at) : null;\n}\n\n/**\n * Parse a yarn.lock (classic v1 or Berry v2+). Entry headers are one or more comma-separated quoted\n * specs ending in `:`, followed by an indented `version: x.y.z`. Returns both a precise `name@range`\n * map and a name fallback.\n */\nexport function parseYarnLock(text: string): YarnLockIndex {\n const bySpec = new Map<string, string>();\n const byName = new Map<string, string>();\n let currentSpecs: string[] = [];\n for (const raw of text.split('\\n')) {\n if (!raw.trim() || raw.trimStart().startsWith('#')) continue;\n if (!/^\\s/.test(raw)) {\n // Header line: `\"a@^1\", b@^2:` → the specs for the block that follows.\n currentSpecs = raw\n .replace(/:\\s*$/, '')\n .split(',')\n .map((s) => s.trim().replace(/^\"|\"$/g, ''))\n .filter(Boolean);\n } else {\n const vm = /^\\s+version:?\\s+\"?([^\"\\s]+)\"?/.exec(raw);\n if (vm && currentSpecs.length) {\n const version = vm[1];\n for (const spec of currentSpecs) {\n const name = specName(spec);\n if (!name) continue;\n bySpec.set(spec, version);\n byName.set(name, version);\n }\n currentSpecs = [];\n }\n }\n }\n return { bySpec, byName };\n}\n\n/** Strip a pnpm version descriptor down to a bare semver: drop the peer suffix `(…)`, any leading\n * slash, and a `name@` prefix. Returns null for non-version values (link:/file:/workspace refs). */\nfunction cleanPnpmVersion(v: string): string | null {\n let s = v.split('(')[0].trim().replace(/^\\/+/, '');\n const at = s.lastIndexOf('@');\n if (at > 0 && /^\\d/.test(s.slice(at + 1))) s = s.slice(at + 1);\n return /^\\d/.test(s) ? s : null;\n}\n\n/**\n * name → installed version from a parsed pnpm-lock.yaml. Reads the importer dependency blocks (v9)\n * and the top-level `dependencies`/`devDependencies`/`optionalDependencies` (v5/v6), whose values are\n * either a version string or `{ specifier, version }`. First occurrence wins (the root importer).\n */\nexport function parsePnpmLock(doc: unknown): Map<string, string> {\n const out = new Map<string, string>();\n if (!doc || typeof doc !== 'object') return out;\n const d = doc as Record<string, unknown>;\n const collect = (deps: unknown): void => {\n if (!deps || typeof deps !== 'object') return;\n for (const [name, val] of Object.entries(deps as Record<string, unknown>)) {\n const v = val && typeof val === 'object' ? (val as Record<string, unknown>).version : val;\n if (typeof v !== 'string') continue;\n const clean = cleanPnpmVersion(v);\n if (clean && !out.has(name)) out.set(name, clean);\n }\n };\n if (d.importers && typeof d.importers === 'object') {\n for (const imp of Object.values(d.importers as Record<string, unknown>)) {\n const i = imp as Record<string, unknown> | null;\n collect(i?.dependencies);\n collect(i?.devDependencies);\n collect(i?.optionalDependencies);\n }\n }\n collect(d.dependencies);\n collect(d.devDependencies);\n collect(d.optionalDependencies);\n return out;\n}\n\n/** Minimal file IO the loader needs — wired to the cache-backed readers in production, fakes in tests. */\nexport interface LockfileIo {\n exists(p: string): Promise<boolean>;\n readText(p: string): Promise<string>;\n readJson<T>(p: string): Promise<T>;\n}\n\n/**\n * Build the lockfile index for a directory. Prefers the lockfile that matches the resolved package\n * manager (npm → package-lock, yarn → yarn) but falls back to whichever is present. Returns null when\n * no supported lockfile exists (the scanner then keeps using the registry-resolved version).\n */\nexport async function loadNpmLockIndex(dir: string, io: LockfileIo): Promise<NpmLockIndex | null> {\n const pnpmPath = path.join(dir, 'pnpm-lock.yaml');\n const yarnPath = path.join(dir, 'yarn.lock');\n const lockPath = path.join(dir, 'package-lock.json');\n\n // pnpm first (its lockfile is the most explicit about installed versions).\n if (await io.exists(pnpmPath).catch(() => false)) {\n try {\n const map = parsePnpmLock(parseYaml(await io.readText(pnpmPath)));\n if (map.size) return { source: 'pnpm', size: map.size, resolve: (name) => map.get(name) ?? null };\n } catch {\n /* fall through */\n }\n }\n // package-lock next: structured JSON and unambiguous.\n if (await io.exists(lockPath).catch(() => false)) {\n try {\n const map = parsePackageLock(await io.readJson<unknown>(lockPath));\n if (map.size) return { source: 'package-lock', size: map.size, resolve: (name) => map.get(name) ?? null };\n } catch {\n /* fall through to yarn */\n }\n }\n if (await io.exists(yarnPath).catch(() => false)) {\n try {\n const { bySpec, byName } = parseYarnLock(await io.readText(yarnPath));\n if (byName.size) {\n return {\n source: 'yarn',\n size: byName.size,\n resolve: (name, spec) => (spec ? bySpec.get(`${name}@${spec}`) : undefined) ?? byName.get(name) ?? null,\n };\n }\n } catch {\n /* none usable */\n }\n }\n return null;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Race a promise against a timeout. If the promise doesn't resolve within\n * `ms` milliseconds the result is `{ ok: false }`.\n *\n * The underlying promise is NOT cancelled — callers should treat a timeout\n * as \"skip and move on\".\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n): Promise<{ ok: true; value: T } | { ok: false }> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<{ ok: false }>((resolve) => {\n timer = setTimeout(() => resolve({ ok: false }), ms);\n });\n try {\n const result = await Promise.race([\n promise.then((value) => ({ ok: true as const, value })),\n timeout,\n ]);\n return result;\n } finally {\n clearTimeout(timer);\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport type { RuntimeCatalog } from './runtimes/types.js';\n\n/**\n * An advisory entry as carried by an offline package-version manifest, used for\n * air-gapped vulnerability scanning. Mirrors the affected-range shape of an OSV\n * advisory so the same version-matching logic applies online and offline.\n */\nexport interface ManifestAdvisory {\n id: string;\n aliases?: string[];\n summary?: string;\n severity?: 'low' | 'moderate' | 'high' | 'critical' | 'unknown';\n cvss?: number;\n cvssVector?: string;\n /** Affected semver ranges as [introduced, fixed) pairs (either bound optional). */\n ranges?: Array<{ introduced?: string; fixed?: string }>;\n /** Explicit affected versions, as an alternative/complement to `ranges`. */\n versions?: string[];\n published?: string;\n withdrawn?: string;\n references?: string[];\n}\n\nexport interface EcosystemVersionEntry {\n latest?: string;\n versions?: string[];\n /** Declared license (SPDX id/expression) for the package, when known. */\n license?: string;\n /**\n * Optional map of version → ISO-8601 publish date. When present, enables\n * libyear-based dependency-freshness scoring fully offline (no registry or\n * Vibgrate server-side call). Producers of offline manifests should populate\n * this from `npm view <pkg> time` (or the equivalent per ecosystem).\n */\n releaseDates?: Record<string, string>;\n /**\n * Optional known-vulnerability advisories for this package, enabling air-gapped\n * vulnerability scanning. Each advisory carries its own affected ranges so the\n * matcher decides applicability against the installed version.\n */\n vulns?: ManifestAdvisory[];\n}\n\nexport interface PackageVersionManifest {\n /**\n * Optional Runtime Catalog (Node/Python/Java/.NET/Go/Ruby latest, LTS, and EOL\n * dates). Lets `--package-manifest`/`--offline` users supply or refresh runtime\n * currency data the same way they supply package data.\n */\n runtimes?: RuntimeCatalog;\n npm?: Record<string, EcosystemVersionEntry>;\n nuget?: Record<string, EcosystemVersionEntry>;\n pypi?: Record<string, EcosystemVersionEntry>;\n maven?: Record<string, EcosystemVersionEntry>;\n rubygems?: Record<string, EcosystemVersionEntry>;\n swift?: Record<string, EcosystemVersionEntry>;\n go?: Record<string, EcosystemVersionEntry>;\n cargo?: Record<string, EcosystemVersionEntry>;\n composer?: Record<string, EcosystemVersionEntry>;\n pub?: Record<string, EcosystemVersionEntry>;\n hex?: Record<string, EcosystemVersionEntry>;\n docker?: Record<string, EcosystemVersionEntry>;\n helm?: Record<string, EcosystemVersionEntry>;\n terraform?: Record<string, EcosystemVersionEntry>;\n}\n\nfunction runCommand(cmd: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n let out = '';\n let err = '';\n child.stdout.on('data', (d: Buffer) => (out += String(d)));\n child.stderr.on('data', (d: Buffer) => (err += String(d)));\n child.on('error', reject);\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`${cmd} ${args.join(' ')} failed (code=${code}): ${err.trim()}`));\n return;\n }\n resolve(out);\n });\n });\n}\n\nasync function parseManifestText(text: string, source: string): Promise<PackageVersionManifest> {\n try {\n return JSON.parse(text) as PackageVersionManifest;\n } catch {\n throw new Error(`Invalid JSON in package version manifest: ${source}`);\n }\n}\n\nasync function loadManifestFromZip(zipPath: string): Promise<PackageVersionManifest> {\n const tmpDir = await mkdtemp(path.join(os.tmpdir(), 'vibgrate-manifest-'));\n try {\n await runCommand('unzip', ['-qq', zipPath, '-d', tmpDir]);\n const candidates = [\n path.join(tmpDir, 'package-versions.json'),\n path.join(tmpDir, 'manifest.json'),\n path.join(tmpDir, 'index.json'),\n ];\n\n for (const candidate of candidates) {\n try {\n const text = await readFile(candidate, 'utf8');\n return await parseManifestText(text, candidate);\n } catch {\n // keep searching\n }\n }\n\n throw new Error('Zip must contain package-versions.json, manifest.json, or index.json');\n } finally {\n await rm(tmpDir, { recursive: true, force: true });\n }\n}\n\nexport async function loadPackageVersionManifest(filePath: string): Promise<PackageVersionManifest> {\n const resolved = path.resolve(filePath);\n if (resolved.toLowerCase().endsWith('.zip')) {\n return loadManifestFromZip(resolved);\n }\n const text = await readFile(resolved, 'utf8');\n return parseManifestText(text, resolved);\n}\n\n/** Package ecosystems in the manifest (everything except the runtime catalog). */\nexport type ManifestEcosystem = Exclude<keyof PackageVersionManifest, 'runtimes'>;\n\nexport function getManifestEntry(\n manifest: PackageVersionManifest | undefined,\n ecosystem: ManifestEcosystem,\n packageName: string,\n): EcosystemVersionEntry | undefined {\n if (!manifest) return undefined;\n const table = manifest[ecosystem];\n if (!table) return undefined;\n if (ecosystem === 'nuget') {\n return table[packageName.toLowerCase()] ?? table[packageName];\n }\n return table[packageName];\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { spawn } from 'node:child_process';\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport type { NpmMeta } from '../types.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nfunction stableOnly(versions: string[]): string[] {\n return versions.filter((v) => semver.valid(v) && semver.prerelease(v) === null);\n}\n\nfunction maxStable(versions: string[]): string | null {\n const stable = stableOnly(versions);\n if (stable.length === 0) return null;\n return stable.sort(semver.rcompare)[0] ?? null;\n}\n\n/** Extract a version → ISO-date map from an npm `time` object, dropping the\n * non-version `created` / `modified` keys. */\nfunction parseReleaseDates(time: unknown): Record<string, string> | undefined {\n if (!time || typeof time !== 'object') return undefined;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(time as Record<string, unknown>)) {\n if (key === 'created' || key === 'modified') continue;\n if (typeof value === 'string') out[key] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction parseNpmMetaPayload(data: unknown): NpmMeta {\n let latest: string | null = null;\n let versions: string[] = [];\n let license: string | null = null;\n let releaseDates: Record<string, string> | undefined;\n\n if (data && typeof data === 'object') {\n const record = data as Record<string, unknown>;\n const dtLatest = record['dist-tags.latest'];\n if (typeof dtLatest === 'string') latest = dtLatest;\n\n const distTags = record['dist-tags'];\n if (!latest && distTags && typeof distTags === 'object' && typeof (distTags as Record<string, unknown>).latest === 'string') {\n latest = (distTags as Record<string, string>).latest;\n }\n\n const v = record.versions;\n if (Array.isArray(v)) versions = v.map(String);\n else if (typeof v === 'string') versions = [v];\n\n license = parseLicenseField(record.license ?? record.licenses);\n releaseDates = parseReleaseDates(record.time);\n }\n\n const stable = stableOnly(versions);\n const latestStableOverall = maxStable(stable);\n if (!latest && latestStableOverall) latest = latestStableOverall;\n\n return { latest, stableVersions: stable, latestStableOverall, license, ...(releaseDates ? { releaseDates } : {}) };\n}\n\n/**\n * npm's `license` field is usually a string, but legacy packages use an object\n * ({ type }) or an array of such objects under `licenses`. Reduce any of these\n * to a single declared string (an SPDX expression for the array form).\n */\nfunction parseLicenseField(value: unknown): string | null {\n if (!value) return null;\n if (typeof value === 'string') return value.trim() || null;\n if (Array.isArray(value)) {\n const parts = value.map(parseLicenseField).filter((s): s is string => Boolean(s));\n if (parts.length === 0) return null;\n return parts.length === 1 ? parts[0]! : `(${parts.join(' OR ')})`;\n }\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (typeof obj.type === 'string') return obj.type.trim() || null;\n if (typeof obj.spdx === 'string') return obj.spdx.trim() || null;\n }\n return null;\n}\n\n\n\nconst BATCH_SIZE = 24;\nconst WINDOWS_MAX_COMMAND_CHARS = 7_000;\nconst POSIX_MAX_COMMAND_CHARS = 30_000;\nconst NPM_COMMAND = process.platform === 'win32' ? 'npm.cmd' : 'npm';\n\nexport function buildNpmViewChunks(pkgs: readonly string[], platform: NodeJS.Platform = process.platform): string[][] {\n const maxCommandChars = platform === 'win32' ? WINDOWS_MAX_COMMAND_CHARS : POSIX_MAX_COMMAND_CHARS;\n const chunks: string[][] = [];\n let current: string[] = [];\n let currentChars = 0;\n\n for (const pkg of pkgs) {\n const pkgChars = pkg.length + 1; // plus a spacer\n if (current.length >= BATCH_SIZE || (current.length > 0 && currentChars + pkgChars > maxCommandChars)) {\n chunks.push(current);\n current = [];\n currentChars = 0;\n }\n current.push(pkg);\n currentChars += pkgChars;\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nasync function npmViewJson(args: string[], cwd: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const child = spawn(NPM_COMMAND, ['view', ...args, '--json'], {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let out = '';\n let err = '';\n child.stdout.on('data', (d: Buffer) => (out += String(d)));\n child.stderr.on('data', (d: Buffer) => (err += String(d)));\n\n child.on('error', reject);\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`npm view ${args.join(' ')} failed (code=${code}): ${err.trim()}`));\n return;\n }\n const trimmed = out.trim();\n if (!trimmed) {\n resolve(null);\n return;\n }\n try {\n resolve(JSON.parse(trimmed));\n } catch {\n resolve(trimmed.replace(/^\"|\"$/g, ''));\n }\n });\n });\n}\n\n/** Cache npm metadata lookups with concurrency control */\nexport class NpmCache {\n private meta = new Map<string, Promise<NpmMeta>>();\n\n constructor(\n private cwd: string,\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n async prefetch(pkgs: readonly string[]): Promise<void> {\n const unique = [...new Set(pkgs.filter(Boolean))];\n const pending = unique.filter((pkg) => !this.meta.has(pkg));\n if (pending.length === 0) return;\n\n const batchPromise = this.sem.run(() => this.fetchBatch(pending));\n\n for (const pkg of pending) {\n const promise = batchPromise.then((batch) => batch.get(pkg) ?? { latest: null, stableVersions: [], latestStableOverall: null, license: null });\n this.meta.set(pkg, promise);\n }\n\n await batchPromise;\n }\n\n get(pkg: string): Promise<NpmMeta> {\n const existing = this.meta.get(pkg);\n if (existing) return existing;\n\n const p = this.sem.run(() => this.fetchOne(pkg));\n this.meta.set(pkg, p);\n return p;\n }\n\n private async fetchBatch(pkgs: readonly string[]): Promise<Map<string, NpmMeta>> {\n const out = new Map<string, NpmMeta>();\n const remote: string[] = [];\n\n for (const pkg of pkgs) {\n const manifestEntry = getManifestEntry(this.manifest, 'npm', pkg);\n if (manifestEntry) {\n const stable = stableOnly(manifestEntry.versions ?? []);\n const latestStableOverall = maxStable(stable);\n out.set(pkg, {\n latest: manifestEntry.latest ?? latestStableOverall,\n stableVersions: stable,\n latestStableOverall,\n license: manifestEntry.license ?? null,\n ...(manifestEntry.releaseDates ? { releaseDates: manifestEntry.releaseDates } : {}),\n });\n } else if (this.offline) {\n out.set(pkg, { latest: null, stableVersions: [], latestStableOverall: null, license: null });\n } else {\n remote.push(pkg);\n }\n }\n\n if (remote.length === 0) return out;\n\n for (const chunk of buildNpmViewChunks(remote)) {\n const chunkResults = await this.fetchRemoteChunk(chunk);\n for (const [pkg, meta] of chunkResults) {\n out.set(pkg, meta);\n }\n }\n\n return out;\n }\n\n private async fetchRemoteChunk(pkgs: readonly string[]): Promise<Map<string, NpmMeta>> {\n const out = new Map<string, NpmMeta>();\n\n if (pkgs.length === 1) {\n out.set(pkgs[0]!, await this.fetchOneRemote(pkgs[0]!));\n return out;\n }\n\n try {\n const data = await npmViewJson([...pkgs, 'dist-tags.latest', 'versions', 'license', 'licenses', 'time'], this.cwd);\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length && i < pkgs.length; i++) {\n out.set(pkgs[i]!, parseNpmMetaPayload(data[i]));\n }\n } else if (data && typeof data === 'object') {\n const record = data as Record<string, unknown>;\n let keyedByPkg = 0;\n for (const pkg of pkgs) {\n if (pkg in record) {\n out.set(pkg, parseNpmMetaPayload(record[pkg]));\n keyedByPkg++;\n }\n }\n\n if (keyedByPkg === 0 && pkgs.length === 1) {\n out.set(pkgs[0]!, parseNpmMetaPayload(record));\n }\n }\n } catch {\n // Fall through to one-by-one fetch below.\n }\n\n for (const pkg of pkgs) {\n if (!out.has(pkg)) {\n out.set(pkg, await this.fetchOneRemote(pkg));\n }\n }\n\n return out;\n }\n\n private async fetchOne(pkg: string): Promise<NpmMeta> {\n const manifestEntry = getManifestEntry(this.manifest, 'npm', pkg);\n if (manifestEntry) {\n const stable = stableOnly(manifestEntry.versions ?? []);\n const latestStableOverall = maxStable(stable);\n return {\n latest: manifestEntry.latest ?? latestStableOverall,\n stableVersions: stable,\n latestStableOverall,\n license: manifestEntry.license ?? null,\n ...(manifestEntry.releaseDates ? { releaseDates: manifestEntry.releaseDates } : {}),\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null, license: null };\n }\n\n return this.fetchOneRemote(pkg);\n }\n\n private async fetchOneRemote(pkg: string): Promise<NpmMeta> {\n try {\n const data = await npmViewJson([pkg, 'dist-tags.latest', 'versions', 'license', 'licenses', 'time'], this.cwd);\n return parseNpmMetaPayload(data);\n } catch {\n // package may be private or unavailable — fall back to separate calls\n let latest: string | null = null;\n let versions: string[] = [];\n\n try {\n const dist = (await npmViewJson([pkg, 'dist-tags'], this.cwd)) as Record<string, string> | null;\n if (dist && typeof dist === 'object' && typeof dist.latest === 'string') {\n latest = dist.latest;\n }\n } catch { /* private / unavailable */ }\n\n try {\n const v = await npmViewJson([pkg, 'versions'], this.cwd);\n if (Array.isArray(v)) versions = v.map(String);\n else if (typeof v === 'string') versions = [v];\n } catch { /* ignore */ }\n\n const stable = stableOnly(versions);\n const latestStableOverall = maxStable(stable);\n if (!latest && latestStableOverall) latest = latestStableOverall;\n return { latest, stableVersions: stable, latestStableOverall, license: null };\n }\n }\n}\n\n/**\n * Quick connectivity check — pings the npm registry via HTTP HEAD.\n * Falls back to `npm view` if fetch is unavailable.\n * Returns true if the registry is reachable, false otherwise.\n */\nexport async function checkRegistryAccess(cwd: string): Promise<boolean> {\n try {\n // Prefer a direct HTTP check to avoid npm CLI cache-permission issues\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5_000);\n const res = await fetch('https://registry.npmjs.org/npm/latest', {\n method: 'HEAD',\n signal: controller.signal,\n });\n clearTimeout(timer);\n return res.ok;\n } catch {\n // Fallback to npm CLI\n try {\n const result = await npmViewJson(['npm', 'dist-tags.latest'], cwd);\n return typeof result === 'string' && result.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function isSemverSpec(spec: string): boolean {\n const s = spec.trim();\n if (!s) return false;\n if (s.startsWith('workspace:')) return false;\n if (s.startsWith('file:')) return false;\n if (s.startsWith('link:')) return false;\n if (s.startsWith('git+')) return false;\n if (s.includes('://')) return false;\n if (s.startsWith('github:')) return false;\n if (s === '*' || s.toLowerCase() === 'latest') return true;\n return semver.validRange(s) !== null;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * SPDX license catalog — the canonical, in-code seed for Vibgrate's license\n * library. The persistent \"growing library\" lives in D1 (see API\n * license_catalog / license_aliases tables); this catalog seeds it and acts as\n * the offline fallback for normalization in the CLI and API.\n *\n * This module is intentionally dependency-free (no Node built-ins) so it can be\n * shared verbatim with the Cloudflare-Worker API package.\n */\n\nexport type LicenseCategory =\n | 'public-domain'\n | 'permissive'\n | 'weak-copyleft'\n | 'copyleft'\n | 'network-copyleft'\n | 'proprietary'\n | 'unknown';\n\nexport type RiskLevel = 'low' | 'medium' | 'high';\n\nexport interface LicenseObligations {\n /** Must preserve copyright / license notices. */\n attribution: boolean;\n /** Derivative works must be licensed under the same terms. */\n copyleft: boolean;\n /** Network/SaaS use triggers source-disclosure obligations (AGPL/SSPL). */\n networkCopyleft: boolean;\n /** Must make corresponding source available. */\n discloseSource: boolean;\n /** Includes an explicit patent grant. */\n patentGrant: boolean;\n /** Restricts commercial use or imposes field-of-use limits. */\n commercialRestriction: boolean;\n}\n\nexport interface LicenseRecord {\n spdxId: string;\n name: string;\n family: string;\n category: LicenseCategory;\n osiApproved: boolean;\n fsfLibre: boolean;\n deprecated: boolean;\n referenceUrl: string;\n riskLevel: RiskLevel;\n obligations: LicenseObligations;\n}\n\n/** Default risk level implied by a category, used when seeding records. */\nexport function riskForCategory(category: LicenseCategory): RiskLevel {\n switch (category) {\n case 'public-domain':\n case 'permissive':\n return 'low';\n case 'weak-copyleft':\n return 'medium';\n case 'copyleft':\n case 'network-copyleft':\n case 'proprietary':\n return 'high';\n case 'unknown':\n default:\n return 'medium';\n }\n}\n\nconst NO_OBLIGATIONS: LicenseObligations = {\n attribution: false,\n copyleft: false,\n networkCopyleft: false,\n discloseSource: false,\n patentGrant: false,\n commercialRestriction: false,\n};\n\ninterface Seed {\n id: string;\n name: string;\n family: string;\n category: LicenseCategory;\n osi?: boolean;\n fsf?: boolean;\n deprecated?: boolean;\n url?: string;\n obligations?: Partial<LicenseObligations>;\n}\n\nfunction record(seed: Seed): LicenseRecord {\n return {\n spdxId: seed.id,\n name: seed.name,\n family: seed.family,\n category: seed.category,\n osiApproved: seed.osi ?? false,\n fsfLibre: seed.fsf ?? false,\n deprecated: seed.deprecated ?? false,\n referenceUrl: seed.url ?? `https://spdx.org/licenses/${seed.id}.html`,\n riskLevel: riskForCategory(seed.category),\n obligations: { ...NO_OBLIGATIONS, ...(seed.obligations ?? {}) },\n };\n}\n\n// Common obligation presets ---------------------------------------------------\nconst ATTRIB: Partial<LicenseObligations> = { attribution: true };\nconst ATTRIB_PATENT: Partial<LicenseObligations> = { attribution: true, patentGrant: true };\nconst WEAK: Partial<LicenseObligations> = { attribution: true, copyleft: true, discloseSource: true };\nconst STRONG: Partial<LicenseObligations> = { attribution: true, copyleft: true, discloseSource: true };\nconst NETWORK: Partial<LicenseObligations> = {\n attribution: true,\n copyleft: true,\n networkCopyleft: true,\n discloseSource: true,\n};\n\nconst SEEDS: Seed[] = [\n // ── Public domain / unlicensed ──\n { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', family: 'CC', category: 'public-domain', fsf: true },\n { id: 'Unlicense', name: 'The Unlicense', family: 'Public Domain', category: 'public-domain', osi: true, fsf: true },\n { id: '0BSD', name: 'BSD Zero Clause License', family: 'BSD', category: 'permissive', osi: true },\n { id: 'WTFPL', name: 'Do What The F*ck You Want To Public License', family: 'WTFPL', category: 'permissive', fsf: true },\n\n // ── Permissive ──\n { id: 'MIT', name: 'MIT License', family: 'MIT', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'MIT-0', name: 'MIT No Attribution', family: 'MIT', category: 'permissive', osi: true },\n { id: 'ISC', name: 'ISC License', family: 'ISC', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'BSD-2-Clause', name: 'BSD 2-Clause \"Simplified\" License', family: 'BSD', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'BSD-3-Clause', name: 'BSD 3-Clause \"New\" or \"Revised\" License', family: 'BSD', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'BSD-3-Clause-Clear', name: 'BSD 3-Clause Clear License', family: 'BSD', category: 'permissive', osi: true, obligations: ATTRIB },\n { id: 'Apache-2.0', name: 'Apache License 2.0', family: 'Apache', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB_PATENT },\n { id: 'Apache-1.1', name: 'Apache Software License 1.1', family: 'Apache', category: 'permissive', osi: true, obligations: ATTRIB },\n { id: 'Zlib', name: 'zlib License', family: 'Zlib', category: 'permissive', osi: true, fsf: true },\n { id: 'BSL-1.0', name: 'Boost Software License 1.0', family: 'Boost', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'PostgreSQL', name: 'PostgreSQL License', family: 'BSD', category: 'permissive', osi: true, obligations: ATTRIB },\n { id: 'Python-2.0', name: 'Python License 2.0', family: 'Python', category: 'permissive', osi: true, obligations: ATTRIB },\n { id: 'PSF-2.0', name: 'Python Software Foundation License 2.0', family: 'Python', category: 'permissive', obligations: ATTRIB },\n { id: 'Artistic-2.0', name: 'Artistic License 2.0', family: 'Artistic', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'NCSA', name: 'University of Illinois/NCSA Open Source License', family: 'NCSA', category: 'permissive', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'Unicode-DFS-2016', name: 'Unicode License Agreement - Data Files and Software (2016)', family: 'Unicode', category: 'permissive', osi: true, obligations: ATTRIB },\n { id: 'BlueOak-1.0.0', name: 'Blue Oak Model License 1.0.0', family: 'BlueOak', category: 'permissive', obligations: ATTRIB },\n\n // ── Weak / file-level copyleft ──\n { id: 'LGPL-2.0-only', name: 'GNU Library General Public License v2 only', family: 'LGPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'LGPL-2.1-only', name: 'GNU Lesser General Public License v2.1 only', family: 'LGPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'LGPL-2.1-or-later', name: 'GNU Lesser General Public License v2.1 or later', family: 'LGPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'LGPL-3.0-only', name: 'GNU Lesser General Public License v3.0 only', family: 'LGPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: { ...WEAK, patentGrant: true } },\n { id: 'LGPL-3.0-or-later', name: 'GNU Lesser General Public License v3.0 or later', family: 'LGPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: { ...WEAK, patentGrant: true } },\n { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', family: 'MPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: { ...WEAK, patentGrant: true } },\n { id: 'MPL-1.1', name: 'Mozilla Public License 1.1', family: 'MPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'EPL-1.0', name: 'Eclipse Public License 1.0', family: 'EPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: { ...WEAK, patentGrant: true } },\n { id: 'EPL-2.0', name: 'Eclipse Public License 2.0', family: 'EPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: { ...WEAK, patentGrant: true } },\n { id: 'CDDL-1.0', name: 'Common Development and Distribution License 1.0', family: 'CDDL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'CDDL-1.1', name: 'Common Development and Distribution License 1.1', family: 'CDDL', category: 'weak-copyleft', obligations: WEAK },\n { id: 'CPL-1.0', name: 'Common Public License 1.0', family: 'CPL', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n { id: 'MS-PL', name: 'Microsoft Public License', family: 'Microsoft', category: 'weak-copyleft', osi: true, fsf: true, obligations: ATTRIB },\n { id: 'MS-RL', name: 'Microsoft Reciprocal License', family: 'Microsoft', category: 'weak-copyleft', osi: true, fsf: true, obligations: WEAK },\n\n // ── Strong copyleft ──\n { id: 'GPL-2.0-only', name: 'GNU General Public License v2.0 only', family: 'GPL', category: 'copyleft', osi: true, fsf: true, obligations: STRONG },\n { id: 'GPL-2.0-or-later', name: 'GNU General Public License v2.0 or later', family: 'GPL', category: 'copyleft', osi: true, fsf: true, obligations: STRONG },\n { id: 'GPL-3.0-only', name: 'GNU General Public License v3.0 only', family: 'GPL', category: 'copyleft', osi: true, fsf: true, obligations: { ...STRONG, patentGrant: true } },\n { id: 'GPL-3.0-or-later', name: 'GNU General Public License v3.0 or later', family: 'GPL', category: 'copyleft', osi: true, fsf: true, obligations: { ...STRONG, patentGrant: true } },\n { id: 'EUPL-1.1', name: 'European Union Public License 1.1', family: 'EUPL', category: 'copyleft', osi: true, fsf: true, obligations: STRONG },\n { id: 'EUPL-1.2', name: 'European Union Public License 1.2', family: 'EUPL', category: 'copyleft', osi: true, fsf: true, obligations: STRONG },\n { id: 'OSL-3.0', name: 'Open Software License 3.0', family: 'OSL', category: 'copyleft', osi: true, fsf: true, obligations: { ...STRONG, patentGrant: true } },\n { id: 'CECILL-2.1', name: 'CeCILL Free Software License Agreement v2.1', family: 'CeCILL', category: 'copyleft', osi: true, fsf: true, obligations: STRONG },\n { id: 'CC-BY-SA-4.0', name: 'Creative Commons Attribution Share Alike 4.0 International', family: 'CC', category: 'copyleft', obligations: { attribution: true, copyleft: true } },\n\n // ── Network copyleft ──\n { id: 'AGPL-3.0-only', name: 'GNU Affero General Public License v3.0 only', family: 'AGPL', category: 'network-copyleft', osi: true, fsf: true, obligations: { ...NETWORK, patentGrant: true } },\n { id: 'AGPL-3.0-or-later', name: 'GNU Affero General Public License v3.0 or later', family: 'AGPL', category: 'network-copyleft', osi: true, fsf: true, obligations: { ...NETWORK, patentGrant: true } },\n\n // ── Source-available / proprietary (non-OSI) ──\n { id: 'SSPL-1.0', name: 'Server Side Public License 1.0', family: 'SSPL', category: 'network-copyleft', obligations: NETWORK },\n { id: 'BUSL-1.1', name: 'Business Source License 1.1', family: 'BUSL', category: 'proprietary', obligations: { commercialRestriction: true, discloseSource: true } },\n { id: 'Elastic-2.0', name: 'Elastic License 2.0', family: 'Elastic', category: 'proprietary', obligations: { commercialRestriction: true } },\n { id: 'RPL-1.5', name: 'Reciprocal Public License 1.5', family: 'RPL', category: 'network-copyleft', osi: true, obligations: NETWORK },\n { id: 'Commons-Clause', name: 'Commons Clause License Condition v1.0', family: 'Commons-Clause', category: 'proprietary', obligations: { commercialRestriction: true } },\n { id: 'LicenseRef-Proprietary', name: 'Proprietary / Commercial', family: 'Proprietary', category: 'proprietary', obligations: { commercialRestriction: true } },\n\n // ── Non-commercial Creative Commons (restrictive) ──\n { id: 'CC-BY-NC-4.0', name: 'Creative Commons Attribution Non Commercial 4.0 International', family: 'CC', category: 'proprietary', obligations: { attribution: true, commercialRestriction: true } },\n { id: 'CC-BY-4.0', name: 'Creative Commons Attribution 4.0 International', family: 'CC', category: 'permissive', obligations: ATTRIB },\n];\n\nconst RECORDS: LicenseRecord[] = SEEDS.map(record);\n\nconst BY_ID = new Map<string, LicenseRecord>();\nfor (const rec of RECORDS) {\n BY_ID.set(rec.spdxId.toLowerCase(), rec);\n}\n\n/** All seeded canonical license records. */\nexport function allLicenseRecords(): readonly LicenseRecord[] {\n return RECORDS;\n}\n\n/** Look up a canonical record by exact (case-insensitive) SPDX id. */\nexport function getLicenseRecord(spdxId: string): LicenseRecord | undefined {\n return BY_ID.get(spdxId.trim().toLowerCase());\n}\n\n/** A synthetic record for licenses we cannot identify. */\nexport function unknownLicenseRecord(name = 'Unknown'): LicenseRecord {\n return {\n spdxId: 'NOASSERTION',\n name,\n family: 'Unknown',\n category: 'unknown',\n osiApproved: false,\n fsfLibre: false,\n deprecated: false,\n referenceUrl: '',\n riskLevel: 'medium',\n obligations: { ...NO_OBLIGATIONS },\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Alias map: maps non-canonical, legacy, and free-text license strings to their\n * canonical SPDX identifier. Seeds the D1 license_aliases table (state=trusted).\n *\n * Keys are normalized (see normalizeAliasKey) so that case, spacing, and common\n * punctuation differences collapse to a single lookup.\n */\n\n/** Normalize a raw license token for alias lookup. */\nexport function normalizeAliasKey(raw: string): string {\n return raw\n .trim()\n .toLowerCase()\n .replace(/^\\(+|\\)+$/g, '')\n .replace(/[._]/g, '-')\n .replace(/\\s+/g, ' ')\n .replace(/\\s*-\\s*/g, '-')\n .replace(/\\bversion\\b/g, 'v')\n .replace(/\\blicen[sc]e\\b/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n// raw alias (human form) → canonical SPDX id. Normalized at module load.\nconst RAW_ALIASES: Record<string, string> = {\n // MIT\n 'mit': 'MIT',\n 'mit license': 'MIT',\n 'the mit license': 'MIT',\n 'expat': 'MIT',\n\n // ISC\n 'isc': 'ISC',\n\n // Apache\n 'apache': 'Apache-2.0',\n 'apache 2': 'Apache-2.0',\n 'apache2': 'Apache-2.0',\n 'apache 2.0': 'Apache-2.0',\n 'apache-2': 'Apache-2.0',\n 'apache license 2.0': 'Apache-2.0',\n 'apache license version 2.0': 'Apache-2.0',\n 'asl 2.0': 'Apache-2.0',\n 'al2': 'Apache-2.0',\n\n // BSD\n 'bsd': 'BSD-3-Clause',\n 'bsd license': 'BSD-3-Clause',\n 'bsd-2': 'BSD-2-Clause',\n 'bsd 2-clause': 'BSD-2-Clause',\n 'simplified bsd': 'BSD-2-Clause',\n 'freebsd': 'BSD-2-Clause',\n 'bsd-3': 'BSD-3-Clause',\n 'bsd 3-clause': 'BSD-3-Clause',\n 'new bsd': 'BSD-3-Clause',\n 'modified bsd': 'BSD-3-Clause',\n 'revised bsd': 'BSD-3-Clause',\n\n // GPL\n 'gpl': 'GPL-3.0-or-later',\n 'gplv2': 'GPL-2.0-only',\n 'gpl2': 'GPL-2.0-only',\n 'gpl-2': 'GPL-2.0-only',\n 'gpl 2.0': 'GPL-2.0-only',\n 'gpl-2.0': 'GPL-2.0-only',\n 'gpl-2.0+': 'GPL-2.0-or-later',\n 'gnu gpl v2': 'GPL-2.0-only',\n 'gplv3': 'GPL-3.0-only',\n 'gpl3': 'GPL-3.0-only',\n 'gpl-3': 'GPL-3.0-only',\n 'gpl 3.0': 'GPL-3.0-only',\n 'gpl-3.0': 'GPL-3.0-only',\n 'gpl-3.0+': 'GPL-3.0-or-later',\n 'gnu gpl v3': 'GPL-3.0-only',\n 'gnu general public v3': 'GPL-3.0-only',\n\n // LGPL\n 'lgpl': 'LGPL-3.0-or-later',\n 'lgplv2.1': 'LGPL-2.1-only',\n 'lgpl-2.1': 'LGPL-2.1-only',\n 'lgpl 2.1': 'LGPL-2.1-only',\n 'lgplv3': 'LGPL-3.0-only',\n 'lgpl-3': 'LGPL-3.0-only',\n 'lgpl-3.0': 'LGPL-3.0-only',\n 'lgpl 3.0': 'LGPL-3.0-only',\n\n // AGPL\n 'agpl': 'AGPL-3.0-or-later',\n 'agplv3': 'AGPL-3.0-only',\n 'agpl-3': 'AGPL-3.0-only',\n 'agpl-3.0': 'AGPL-3.0-only',\n 'agpl 3.0': 'AGPL-3.0-only',\n 'gnu agpl v3': 'AGPL-3.0-only',\n\n // MPL\n 'mpl': 'MPL-2.0',\n 'mpl 2.0': 'MPL-2.0',\n 'mpl-2': 'MPL-2.0',\n 'mozilla public 2.0': 'MPL-2.0',\n\n // EPL\n 'epl': 'EPL-2.0',\n 'eclipse public 2.0': 'EPL-2.0',\n 'epl-2': 'EPL-2.0',\n\n // Source-available / proprietary\n 'sspl': 'SSPL-1.0',\n 'server side public': 'SSPL-1.0',\n 'busl': 'BUSL-1.1',\n 'business source': 'BUSL-1.1',\n 'elastic': 'Elastic-2.0',\n 'elastic-2': 'Elastic-2.0',\n 'commons clause': 'Commons-Clause',\n 'proprietary': 'LicenseRef-Proprietary',\n 'commercial': 'LicenseRef-Proprietary',\n 'see license in license': 'LicenseRef-Proprietary',\n 'unlicensed': 'LicenseRef-Proprietary',\n 'all rights reserved': 'LicenseRef-Proprietary',\n\n // Public domain\n 'cc0': 'CC0-1.0',\n 'cc0 1.0': 'CC0-1.0',\n 'public domain': 'CC0-1.0',\n 'the unlicense': 'Unlicense',\n 'wtfpl': 'WTFPL',\n\n // Boost / zlib / others\n 'boost': 'BSL-1.0',\n 'bsl': 'BSL-1.0',\n 'zlib/libpng': 'Zlib',\n 'python': 'Python-2.0',\n 'psf': 'PSF-2.0',\n 'artistic': 'Artistic-2.0',\n};\n\nconst ALIASES = new Map<string, string>();\nfor (const [raw, spdx] of Object.entries(RAW_ALIASES)) {\n ALIASES.set(normalizeAliasKey(raw), spdx);\n}\n\n/** Resolve a normalized alias key to a canonical SPDX id, if known. */\nexport function resolveAlias(raw: string): string | undefined {\n return ALIASES.get(normalizeAliasKey(raw));\n}\n\n/** Export the seed pairs (raw → spdx) for D1 seeding. */\nexport function aliasSeedPairs(): Array<{ alias: string; spdxId: string }> {\n return Object.entries(RAW_ALIASES).map(([alias, spdxId]) => ({ alias, spdxId }));\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Minimal SPDX license-expression parser.\n *\n * Handles the subset of the SPDX expression grammar seen in real-world\n * manifests: compound expressions with OR / AND, exceptions via WITH, the\n * \"or later\" `+` operator, and parenthesised grouping. The goal is not full\n * grammar conformance but reliable extraction of the constituent license ids\n * and the operator that joins them so downstream risk logic can reason about\n * choice (OR) vs. conjunction (AND).\n */\n\nexport interface ParsedLicenseExpression {\n /** All distinct license ids referenced (without the trailing `+`). */\n licenseIds: string[];\n /** Exceptions referenced via WITH. */\n exceptions: string[];\n /** Dominant join operator: OR when the user may choose, AND when all apply. */\n operator: 'OR' | 'AND' | 'SINGLE';\n /** True when any term used the `+` (\"or later\") operator. */\n orLater: boolean;\n /** The normalized, re-serialised expression. */\n normalized: string;\n}\n\nconst TOKEN_RE = /\\(|\\)|\\bWITH\\b|\\bAND\\b|\\bOR\\b|[^\\s()]+/gi;\n\n/**\n * Parse an SPDX expression into its parts. Tolerant of malformed input —\n * returns whatever license-like tokens it can find.\n */\nexport function parseLicenseExpression(raw: string): ParsedLicenseExpression {\n const input = (raw ?? '').trim();\n const licenseIds: string[] = [];\n const exceptions: string[] = [];\n let hasOr = false;\n let hasAnd = false;\n let orLater = false;\n let expectException = false;\n\n const tokens = input.match(TOKEN_RE) ?? [];\n for (const token of tokens) {\n const upper = token.toUpperCase();\n if (token === '(' || token === ')') continue;\n if (upper === 'OR') {\n hasOr = true;\n expectException = false;\n continue;\n }\n if (upper === 'AND') {\n hasAnd = true;\n expectException = false;\n continue;\n }\n if (upper === 'WITH') {\n expectException = true;\n continue;\n }\n if (expectException) {\n if (!exceptions.includes(token)) exceptions.push(token);\n expectException = false;\n continue;\n }\n // License id term\n let id = token;\n if (id.endsWith('+')) {\n orLater = true;\n id = id.slice(0, -1);\n }\n if (id && !licenseIds.includes(id)) licenseIds.push(id);\n }\n\n const operator: ParsedLicenseExpression['operator'] = hasOr\n ? 'OR'\n : hasAnd\n ? 'AND'\n : 'SINGLE';\n\n return {\n licenseIds,\n exceptions,\n operator,\n orLater,\n normalized: serialise(licenseIds, exceptions, operator, orLater, input),\n };\n}\n\nfunction serialise(\n ids: string[],\n exceptions: string[],\n operator: ParsedLicenseExpression['operator'],\n orLater: boolean,\n original: string,\n): string {\n if (ids.length === 0) return original.trim();\n if (ids.length === 1) {\n let out = ids[0]!;\n if (orLater && !out.endsWith('+')) out += '+';\n if (exceptions.length > 0) out += ` WITH ${exceptions.join(' WITH ')}`;\n return out;\n }\n const joiner = operator === 'AND' ? ' AND ' : ' OR ';\n return ids.join(joiner);\n}\n\n/** True when the string looks like a compound SPDX expression. */\nexport function isCompoundExpression(raw: string): boolean {\n return /\\b(?:AND|OR|WITH)\\b|\\+\\s*$|\\(/i.test(raw);\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * License normalization — the single entry point that turns an arbitrary\n * declared license string into a canonical, classified verdict.\n *\n * Resolution order (deterministic-first):\n * 1. Exact SPDX id match against the catalog.\n * 2. Compound SPDX expression (OR / AND / WITH).\n * 3. Alias map (legacy / free-text forms).\n * 4. Fuzzy family detection (last deterministic resort).\n * 5. Unknown (explicit — never silently bucketed).\n */\n\nimport {\n getLicenseRecord,\n unknownLicenseRecord,\n riskForCategory,\n type LicenseRecord,\n type LicenseCategory,\n type RiskLevel,\n type LicenseObligations,\n} from './spdx-catalog.js';\nimport { resolveAlias } from './spdx-aliases.js';\nimport { parseLicenseExpression, isCompoundExpression } from './spdx-expression.js';\n\nexport type LicenseMatchStatus =\n | 'exact'\n | 'expression'\n | 'alias'\n | 'fuzzy'\n | 'unknown';\n\nexport interface LicenseVerdict {\n /** Canonical SPDX id (or NOASSERTION when unknown). For OR expressions this\n * is the least-restrictive choice; for AND, the most-restrictive. */\n spdxId: string;\n /** Display name. */\n name: string;\n /** Full normalized expression when compound, else the single id. */\n expression: string;\n family: string;\n category: LicenseCategory;\n riskLevel: RiskLevel;\n osiApproved: boolean;\n fsfLibre: boolean;\n obligations: LicenseObligations;\n matchStatus: LicenseMatchStatus;\n /** 0–1 confidence in the identification. */\n confidence: number;\n /** All constituent SPDX ids when compound. */\n components: string[];\n}\n\nconst CATEGORY_RESTRICTIVENESS: Record<LicenseCategory, number> = {\n 'public-domain': 0,\n permissive: 1,\n 'weak-copyleft': 2,\n copyleft: 3,\n 'network-copyleft': 4,\n proprietary: 5,\n unknown: 2,\n};\n\nfunction verdictFromRecord(\n rec: LicenseRecord,\n matchStatus: LicenseMatchStatus,\n confidence: number,\n expression?: string,\n components?: string[],\n): LicenseVerdict {\n return {\n spdxId: rec.spdxId,\n name: rec.name,\n expression: expression ?? rec.spdxId,\n family: rec.family,\n category: rec.category,\n riskLevel: rec.riskLevel,\n osiApproved: rec.osiApproved,\n fsfLibre: rec.fsfLibre,\n obligations: rec.obligations,\n matchStatus,\n confidence,\n components: components ?? [rec.spdxId],\n };\n}\n\n/** Fuzzy family detection for strings the catalog/aliases miss. */\nfunction fuzzyMatch(raw: string): LicenseRecord | undefined {\n const s = raw.toLowerCase();\n // Order matters: most specific / most restrictive first.\n if (/\\bagpl/.test(s)) return getLicenseRecord('AGPL-3.0-or-later');\n if (/\\bsspl/.test(s)) return getLicenseRecord('SSPL-1.0');\n if (/\\bbusl|business source/.test(s)) return getLicenseRecord('BUSL-1.1');\n if (/\\blgpl/.test(s)) return getLicenseRecord('LGPL-3.0-or-later');\n if (/\\bgpl/.test(s)) return getLicenseRecord('GPL-3.0-or-later');\n if (/\\bmpl|mozilla/.test(s)) return getLicenseRecord('MPL-2.0');\n if (/\\bepl|eclipse/.test(s)) return getLicenseRecord('EPL-2.0');\n if (/\\bapache/.test(s)) return getLicenseRecord('Apache-2.0');\n if (/\\bbsd/.test(s)) return getLicenseRecord('BSD-3-Clause');\n if (/\\bmit\\b/.test(s)) return getLicenseRecord('MIT');\n if (/\\bisc\\b/.test(s)) return getLicenseRecord('ISC');\n if (/commons clause/.test(s)) return getLicenseRecord('Commons-Clause');\n if (/proprietary|commercial|all rights reserved/.test(s)) return getLicenseRecord('LicenseRef-Proprietary');\n if (/public domain|cc0/.test(s)) return getLicenseRecord('CC0-1.0');\n return undefined;\n}\n\n/**\n * Normalize a single (possibly compound) license string into a verdict.\n */\nexport function normalizeLicense(raw: string | null | undefined): LicenseVerdict {\n const input = (raw ?? '').trim();\n if (!input || /^(unknown|noassertion|none|n\\/a)$/i.test(input)) {\n return verdictFromRecord(unknownLicenseRecord(), 'unknown', 0);\n }\n\n // 1. Exact SPDX id\n const exact = getLicenseRecord(input);\n if (exact) return verdictFromRecord(exact, 'exact', 1);\n\n // 2. Compound expression\n if (isCompoundExpression(input)) {\n return resolveExpression(input);\n }\n\n // 3. Alias\n const aliasId = resolveAlias(input);\n if (aliasId) {\n const rec = getLicenseRecord(aliasId);\n if (rec) return verdictFromRecord(rec, 'alias', 0.95);\n }\n\n // 4. Fuzzy family\n const fuzzy = fuzzyMatch(input);\n if (fuzzy) {\n return { ...verdictFromRecord(fuzzy, 'fuzzy', 0.6), name: input.slice(0, 120) };\n }\n\n // 5. Unknown\n return verdictFromRecord(unknownLicenseRecord(input.slice(0, 120)), 'unknown', 0);\n}\n\nfunction resolveExpression(input: string): LicenseVerdict {\n const parsed = parseLicenseExpression(input);\n if (parsed.licenseIds.length === 0) {\n return verdictFromRecord(unknownLicenseRecord(input.slice(0, 120)), 'unknown', 0);\n }\n\n // Resolve each constituent id to a verdict (via recursion through the\n // single-id path: exact → alias → fuzzy).\n const componentVerdicts = parsed.licenseIds.map((id) => {\n const exact = getLicenseRecord(id);\n if (exact) return verdictFromRecord(exact, 'exact', 1);\n const aliasId = resolveAlias(id);\n if (aliasId) {\n const rec = getLicenseRecord(aliasId);\n if (rec) return verdictFromRecord(rec, 'alias', 0.95);\n }\n const fuzzy = fuzzyMatch(id);\n if (fuzzy) return verdictFromRecord(fuzzy, 'fuzzy', 0.6);\n return verdictFromRecord(unknownLicenseRecord(id), 'unknown', 0);\n });\n\n // For OR the consumer may pick the least-restrictive; for AND all apply, so\n // the most-restrictive governs.\n const pickMostRestrictive = parsed.operator !== 'OR';\n let chosen = componentVerdicts[0]!;\n for (const v of componentVerdicts) {\n const more = CATEGORY_RESTRICTIVENESS[v.category] > CATEGORY_RESTRICTIVENESS[chosen.category];\n if (pickMostRestrictive ? more : !more) chosen = v;\n }\n\n // Union of obligations across all components that actually apply.\n const obligations = unionObligations(\n pickMostRestrictive ? componentVerdicts : [chosen],\n );\n const components = componentVerdicts.map((v) => v.spdxId);\n const category = chosen.category;\n\n return {\n spdxId: chosen.spdxId,\n name: parsed.normalized,\n expression: parsed.normalized,\n family: chosen.family,\n category,\n riskLevel: riskForCategory(category),\n osiApproved: componentVerdicts.every((v) => v.osiApproved),\n fsfLibre: componentVerdicts.every((v) => v.fsfLibre),\n obligations,\n matchStatus: 'expression',\n confidence: Math.min(...componentVerdicts.map((v) => v.confidence)) || 0.5,\n components,\n };\n}\n\nfunction unionObligations(verdicts: LicenseVerdict[]): LicenseObligations {\n const out: LicenseObligations = {\n attribution: false,\n copyleft: false,\n networkCopyleft: false,\n discloseSource: false,\n patentGrant: false,\n commercialRestriction: false,\n };\n for (const v of verdicts) {\n out.attribution ||= v.obligations.attribution;\n out.copyleft ||= v.obligations.copyleft;\n out.networkCopyleft ||= v.obligations.networkCopyleft;\n out.discloseSource ||= v.obligations.discloseSource;\n out.patentGrant ||= v.obligations.patentGrant;\n out.commercialRestriction ||= v.obligations.commercialRestriction;\n }\n return out;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Helper for ecosystem scanners: turn a declared license string into the\n * compact DependencyLicense carrier stored on each DependencyRow.\n *\n * The scanner records the raw declared string plus a best-effort canonical\n * SPDX id; full classification (category / obligations / risk) and the growing\n * library lookup happen during API enrichment.\n */\nimport type { DependencyLicense } from '../types.js';\nimport { normalizeLicense } from './normalize.js';\n\nexport function buildDependencyLicense(\n raw: string | null | undefined,\n source: DependencyLicense['source'],\n): DependencyLicense {\n const trimmed = (raw ?? '').trim();\n if (!trimmed) {\n return { raw: null, spdxId: null, source: 'none', confidence: 0 };\n }\n const verdict = normalizeLicense(trimmed);\n return {\n raw: trimmed.slice(0, 200),\n spdxId: verdict.matchStatus === 'unknown' ? null : verdict.spdxId,\n source,\n confidence: verdict.confidence,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Libyear-based dependency-freshness helpers.\n *\n * A \"libyear\" is the calendar time between the version a project uses and the\n * latest available stable release (Cox et al., \"Measuring Dependency Freshness\n * in Software Systems\", ICSE 2015; https://libyear.com/). It expresses drift in\n * *time* rather than in *major-version count*, which is more comparable across\n * ecosystems with different release cadences.\n *\n * These functions are pure and offline-safe. They operate on release-date data\n * that is sourced from the package registry (online) or an offline\n * package-version manifest — never from a Vibgrate server-side service. When no\n * dates are available the helpers return null and the freshness signal is simply\n * omitted, so DriftScore remains fully computable offline.\n */\n\nconst MS_PER_DAY = 86_400_000;\nconst DAYS_PER_YEAR = 365.25;\n\n/**\n * Compute the calendar age, in days, between the resolved version and the latest\n * stable version, using a version → ISO-date map. Returns null when either date\n * is missing or unparseable. Negative results (clock skew / resolved newer than\n * \"latest\") are clamped to 0.\n */\nexport function ageDaysBetween(\n resolvedVersion: string | null,\n latestStable: string | null,\n releaseDates: Record<string, string> | undefined,\n): number | null {\n if (!resolvedVersion || !latestStable || !releaseDates) return null;\n const resolvedIso = releaseDates[resolvedVersion];\n const latestIso = releaseDates[latestStable];\n if (!resolvedIso || !latestIso) return null;\n\n const resolvedMs = Date.parse(resolvedIso);\n const latestMs = Date.parse(latestIso);\n if (Number.isNaN(resolvedMs) || Number.isNaN(latestMs)) return null;\n\n const days = (latestMs - resolvedMs) / MS_PER_DAY;\n return days > 0 ? days : 0;\n}\n\n/** Convert a day-count to libyears. */\nexport function daysToLibyears(days: number | null): number | null {\n if (days === null) return null;\n return days / DAYS_PER_YEAR;\n}\n\nexport interface LibyearAggregate {\n /** Sum of per-dependency libyears. */\n total: number;\n /** Worst single-dependency libyears. */\n max: number;\n /** Number of dependencies that had computable release-date data. */\n measured: number;\n}\n\n/** Aggregate a list of per-dependency libyear values (nulls ignored). */\nexport function aggregateLibyears(values: (number | null | undefined)[]): LibyearAggregate | null {\n let total = 0;\n let max = 0;\n let measured = 0;\n for (const v of values) {\n if (v === null || v === undefined || Number.isNaN(v)) continue;\n total += v;\n if (v > max) max = v;\n measured++;\n }\n if (measured === 0) return null;\n return { total, max, measured };\n}\n\n/**\n * Map a libyear aggregate to a 0–100 freshness sub-score (higher = fresher).\n *\n * Blends the average staleness (weighted 0.7) with the worst single dependency\n * (weighted 0.3) so that a single very-stale dependency is surfaced rather than\n * hidden by a healthy average — mirroring the framework-component design.\n *\n * Calibration constants are intentionally simple expert weights; they are part\n * of the published methodology's \"expert-weighted\" tier (not empirically\n * anchored), and are versioned with the DriftScore methodology.\n */\nexport function freshnessScoreFromLibyears(agg: LibyearAggregate | null): number | null {\n if (!agg || agg.measured === 0) return null;\n const avg = agg.total / agg.measured;\n const avgPenalty = Math.min(avg * 20, 100); // ~5 avg libyears => fully penalised\n const maxPenalty = Math.min(agg.max * 10, 100); // ~10 worst libyears => fully penalised\n const score = 100 - (avgPenalty * 0.7 + maxPenalty * 0.3);\n return Math.max(0, Math.min(100, Math.round(score)));\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Pure accessors over a {@link RuntimeCatalog}. No Node or network imports — this\n * module is the shared \"brain\" imported by both `@vibgrate/core` (DriftScore) and\n * `@vibgrate/api` (RiskScore / `/v1/reference/runtimes`).\n *\n * The `productForType` / `extractCycle` / `cycleEolStatus` helpers are the\n * canonical versions previously duplicated in `vibgrate-api/src/lib/eol.ts`.\n */\nimport type { RuntimeCatalog, RuntimeCycle, RuntimeVersion } from './types.js';\n\n/** Map a Vibgrate project type to an endoflife.date product slug. */\nexport function productForType(type: string): string | null {\n switch (type) {\n case 'node': return 'nodejs';\n case 'python': return 'python';\n case 'dotnet': return 'dotnet';\n case 'java': return 'java';\n case 'php': return 'php';\n case 'ruby': return 'ruby';\n case 'go': return 'go';\n default: return null;\n }\n}\n\n/** Extract the endoflife.date \"cycle\" key for a product from a runtime string. */\nexport function extractCycle(type: string, runtime: string | undefined | null): string | null {\n if (!runtime) return null;\n switch (type) {\n case 'python':\n case 'php':\n case 'ruby':\n case 'go': {\n // major.minor cycles, e.g. \"3.11\"\n const m = runtime.match(/(\\d+)\\.(\\d+)/);\n return m ? `${m[1]}.${m[2]}` : null;\n }\n case 'dotnet': {\n // \"net8.0\" → \"8.0\"\n const m = runtime.match(/(\\d+)\\.(\\d+)/) ?? runtime.match(/(\\d+)/);\n if (!m) return null;\n return m[2] !== undefined ? `${m[1]}.${m[2]}` : `${m[1]}.0`;\n }\n case 'node': {\n // major cycles, e.g. \"20\"\n const m = runtime.match(/(\\d+)/);\n return m ? m[1] : null;\n }\n case 'java': {\n // \"1.8\" → \"8\"; \"17\" → \"17\"\n const legacy = runtime.match(/1\\.(\\d+)/);\n if (legacy) return legacy[1];\n const m = runtime.match(/(\\d+)/);\n return m ? m[1] : null;\n }\n default:\n return null;\n }\n}\n\n/** Minimal cycle shape needed for EOL evaluation (compatible with RuntimeCycle). */\nexport interface EolCycle {\n cycle: string;\n eol: string | boolean;\n}\n\n/**\n * Decide whether `cycle` is EOL given a product's cycle data.\n * Returns true (EOL), false (supported), or null (cycle not found / unknown).\n */\nexport function cycleEolStatus(\n cycle: string,\n cycles: readonly EolCycle[],\n now: number = Date.now(),\n): boolean | null {\n const entry = cycles.find((c) => String(c.cycle) === cycle);\n if (!entry) return null;\n if (typeof entry.eol === 'boolean') return entry.eol;\n const eolMs = Date.parse(entry.eol);\n if (Number.isNaN(eolMs)) return null;\n return eolMs <= now;\n}\n\n/** Parse a cycle string (\"22\", \"3.13\", \"8.0\") into a comparable version. */\nexport function parseCycle(cycle: string): RuntimeVersion | null {\n const m = String(cycle).match(/^(\\d+)(?:\\.(\\d+))?/);\n if (!m) return null;\n return { major: parseInt(m[1]!, 10), minor: m[2] ? parseInt(m[2], 10) : 0 };\n}\n\nfunction rank(v: RuntimeVersion): number {\n return v.major * 1000 + v.minor;\n}\n\n/** A cycle is released if it has no release date or one already in the past. */\nfunction isReleased(cycle: RuntimeCycle, now: number): boolean {\n if (typeof cycle.releaseDate !== 'string') return true;\n const ts = Date.parse(cycle.releaseDate);\n return Number.isNaN(ts) ? true : ts <= now;\n}\n\n/** A cycle is LTS if `lts` is `true` or an LTS-start date already in the past. */\nfunction isLts(cycle: RuntimeCycle, now: number): boolean {\n if (cycle.lts === true) return true;\n if (typeof cycle.lts === 'string') {\n const ts = Date.parse(cycle.lts);\n return !Number.isNaN(ts) && ts <= now;\n }\n return false;\n}\n\nfunction cyclesFor(catalog: RuntimeCatalog, product: string): RuntimeCycle[] {\n return catalog.products[product]?.cycles ?? [];\n}\n\n/** The newest released cycle for a product (max cycle). */\nexport function latestStable(\n catalog: RuntimeCatalog,\n product: string,\n now: number = Date.now(),\n): RuntimeVersion | null {\n let best: RuntimeVersion | null = null;\n for (const cycle of cyclesFor(catalog, product)) {\n if (!isReleased(cycle, now)) continue;\n const v = parseCycle(cycle.cycle);\n if (v && (!best || rank(v) > rank(best))) best = v;\n }\n return best;\n}\n\n/** The newest released LTS cycle for a product (Node/Java). */\nexport function latestLts(\n catalog: RuntimeCatalog,\n product: string,\n now: number = Date.now(),\n): RuntimeVersion | null {\n let best: RuntimeVersion | null = null;\n for (const cycle of cyclesFor(catalog, product)) {\n if (!isReleased(cycle, now) || !isLts(cycle, now)) continue;\n const v = parseCycle(cycle.cycle);\n if (v && (!best || rank(v) > rank(best))) best = v;\n }\n return best;\n}\n\n/** The ISO EOL date for a specific cycle, when it is a real date. */\nexport function eolDate(\n catalog: RuntimeCatalog,\n product: string,\n cycle: string,\n): string | undefined {\n const entry = cyclesFor(catalog, product).find((c) => String(c.cycle) === cycle);\n return entry && typeof entry.eol === 'string' ? entry.eol : undefined;\n}\n\n/** EOL status of a project's own cycle within the catalog (true/false/null). */\nexport function runtimeEolStatus(\n catalog: RuntimeCatalog,\n type: string,\n runtime: string | undefined | null,\n now: number = Date.now(),\n): boolean | null {\n const product = productForType(type);\n if (!product) return null;\n const cycle = extractCycle(type, runtime);\n if (!cycle) return null;\n return cycleEolStatus(cycle, cyclesFor(catalog, product), now);\n}\n\n/** Build a catalog from raw endoflife.date payloads keyed by product slug. */\nexport function buildCatalog(\n rawByProduct: Record<string, unknown>,\n generatedAt: string = new Date().toISOString(),\n): RuntimeCatalog {\n const products: Record<string, { product: string; cycles: RuntimeCycle[] }> = {};\n for (const [product, raw] of Object.entries(rawByProduct)) {\n if (!Array.isArray(raw)) continue;\n const cycles: RuntimeCycle[] = [];\n for (const item of raw as Array<Record<string, unknown>>) {\n if (!item || (typeof item.cycle !== 'string' && typeof item.cycle !== 'number')) continue;\n const eol = typeof item.eol === 'string' || typeof item.eol === 'boolean' ? item.eol : false;\n const cycle: RuntimeCycle = { cycle: String(item.cycle), eol };\n if (typeof item.releaseDate === 'string') cycle.releaseDate = item.releaseDate;\n if (typeof item.lts === 'string' || typeof item.lts === 'boolean') cycle.lts = item.lts;\n if (typeof item.latest === 'string') cycle.latestPatch = item.latest;\n cycles.push(cycle);\n }\n products[product] = { product, cycles };\n }\n return { generatedAt, source: 'endoflife.date', products };\n}\n\n/** Products the catalog is expected to carry. */\nexport const RUNTIME_PRODUCTS = ['nodejs', 'python', 'dotnet', 'java', 'php', 'ruby', 'go'] as const;\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { RuntimeCatalog } from './types.js';\n\n/**\n * Bundled Runtime Catalog snapshot — the offline/air-gapped floor and the\n * fallback when the live `/v1/reference/runtimes` lookup is unavailable.\n *\n * This is *generated*, not authored: run `node scripts/refresh-runtimes.mjs`\n * (which hits endoflife.date) to regenerate it on every release so the offline\n * floor never drifts more than a release cycle. The values below are a\n * hand-seeded baseline as of `generatedAt`; the live catalog supersedes them\n * whenever it is reachable.\n */\nexport const BUNDLED_RUNTIME_CATALOG: RuntimeCatalog = {\n generatedAt: '2026-06-01',\n source: 'endoflife.date',\n products: {\n nodejs: {\n product: 'nodejs',\n cycles: [\n { cycle: '24', releaseDate: '2025-05-06', lts: '2025-10-28', eol: '2028-04-30' },\n { cycle: '23', releaseDate: '2024-10-16', lts: false, eol: '2025-06-01' },\n { cycle: '22', releaseDate: '2024-04-24', lts: '2024-10-29', eol: '2027-04-30' },\n { cycle: '20', releaseDate: '2023-04-18', lts: '2023-10-24', eol: '2026-04-30' },\n { cycle: '18', releaseDate: '2022-04-19', lts: '2022-10-25', eol: '2025-04-30' },\n ],\n },\n python: {\n product: 'python',\n cycles: [\n { cycle: '3.14', releaseDate: '2025-10-07', eol: '2030-10-01' },\n { cycle: '3.13', releaseDate: '2024-10-07', eol: '2029-10-01' },\n { cycle: '3.12', releaseDate: '2023-10-02', eol: '2028-10-01' },\n { cycle: '3.11', releaseDate: '2022-10-24', eol: '2027-10-01' },\n { cycle: '3.10', releaseDate: '2021-10-04', eol: '2026-10-01' },\n { cycle: '3.9', releaseDate: '2020-10-05', eol: '2025-10-01' },\n { cycle: '3.8', releaseDate: '2019-10-14', eol: '2024-10-07' },\n ],\n },\n dotnet: {\n product: 'dotnet',\n cycles: [\n { cycle: '10.0', releaseDate: '2025-11-11', lts: true, eol: '2028-11-10' },\n { cycle: '9.0', releaseDate: '2024-11-12', lts: false, eol: '2026-05-12' },\n { cycle: '8.0', releaseDate: '2023-11-14', lts: true, eol: '2026-11-10' },\n { cycle: '7.0', releaseDate: '2022-11-08', lts: false, eol: '2024-05-14' },\n { cycle: '6.0', releaseDate: '2021-11-08', lts: true, eol: '2024-11-12' },\n ],\n },\n java: {\n product: 'java',\n cycles: [\n { cycle: '25', releaseDate: '2025-09-16', lts: true, eol: '2033-09-01' },\n { cycle: '21', releaseDate: '2023-09-19', lts: true, eol: '2031-09-01' },\n { cycle: '17', releaseDate: '2021-09-14', lts: true, eol: '2029-09-01' },\n { cycle: '11', releaseDate: '2018-09-25', lts: true, eol: '2026-09-01' },\n { cycle: '8', releaseDate: '2014-03-18', lts: true, eol: '2030-12-01' },\n ],\n },\n php: {\n product: 'php',\n cycles: [\n { cycle: '8.4', releaseDate: '2024-11-21', eol: '2028-12-31' },\n { cycle: '8.3', releaseDate: '2023-11-23', eol: '2027-12-31' },\n { cycle: '8.2', releaseDate: '2022-12-08', eol: '2026-12-31' },\n { cycle: '8.1', releaseDate: '2021-11-25', eol: '2025-12-31' },\n { cycle: '8.0', releaseDate: '2020-11-26', eol: '2023-11-26' },\n ],\n },\n ruby: {\n product: 'ruby',\n cycles: [\n { cycle: '3.5', releaseDate: '2025-12-25', eol: '2029-03-31' },\n { cycle: '3.4', releaseDate: '2024-12-25', eol: '2028-03-31' },\n { cycle: '3.3', releaseDate: '2023-12-25', eol: '2027-03-31' },\n { cycle: '3.2', releaseDate: '2022-12-25', eol: '2026-03-31' },\n { cycle: '3.1', releaseDate: '2021-12-25', eol: '2025-03-31' },\n ],\n },\n go: {\n product: 'go',\n cycles: [\n { cycle: '1.25', releaseDate: '2025-08-13', eol: false },\n { cycle: '1.24', releaseDate: '2025-02-11', eol: false },\n { cycle: '1.23', releaseDate: '2024-08-13', eol: true },\n { cycle: '1.22', releaseDate: '2024-02-06', eol: true },\n ],\n },\n },\n};\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { findPackageJsonFiles, readJsonFile, readTextFile, pathExists, FileCache } from '../utils/fs.js';\nimport { loadNpmLockIndex, type NpmLockIndex, type LockfileIo } from './npm-lockfile.js';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { NpmCache, isSemverSpec } from './npm-cache.js';\nimport { buildDependencyLicense } from '../licenses/dependency-license.js';\nimport { ageDaysBetween, daysToLibyears, aggregateLibyears } from '../scoring/libyear.js';\nimport { latestLts, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type {\n PackageJson,\n ProjectScan,\n DependencyRow,\n DepSection,\n DetectedFramework,\n ProjectReference,\n} from '../types.js';\n\nconst MS_PER_DAY = 86_400_000;\n/** A package whose latest release is older than this is \"abandoned\" (no pulse) —\n * driftscore-3.0 §2.1. ~24 months. */\nconst ABANDONED_MAX_DAYS = 730;\n\n/** Well-known frameworks we detect and track */\nconst KNOWN_FRAMEWORKS: Record<string, string> = {\n // ── Frontend ──\n 'react': 'React',\n 'react-dom': 'React DOM',\n 'vue': 'Vue',\n '@angular/core': 'Angular',\n 'svelte': 'Svelte',\n 'solid-js': 'Solid',\n 'preact': 'Preact',\n 'lit': 'Lit',\n 'qwik': 'Qwik',\n 'htmx.org': 'htmx',\n 'alpinejs': 'Alpine.js',\n 'stimulus': 'Stimulus',\n\n // ── Meta-frameworks ──\n 'next': 'Next.js',\n 'nuxt': 'Nuxt',\n '@remix-run/react': 'Remix',\n '@remix-run/node': 'Remix (Node)',\n 'gatsby': 'Gatsby',\n 'astro': 'Astro',\n '@sveltejs/kit': 'SvelteKit',\n '@analogjs/platform': 'Analog',\n '@tanstack/start': 'TanStack Start',\n\n // ── Backend ──\n 'express': 'Express',\n 'fastify': 'Fastify',\n '@nestjs/core': 'NestJS',\n 'hono': 'Hono',\n 'koa': 'Koa',\n '@hapi/hapi': 'Hapi',\n 'restify': 'Restify',\n '@elysiajs/eden': 'Elysia',\n 'elysia': 'Elysia',\n '@adonisjs/core': 'AdonisJS',\n 'moleculer': 'Moleculer',\n '@feathersjs/feathers': 'Feathers',\n 'sails': 'Sails',\n\n // ── Language & Runtime ──\n 'typescript': 'TypeScript',\n\n // ── State Management ──\n 'redux': 'Redux',\n '@reduxjs/toolkit': 'Redux Toolkit',\n 'zustand': 'Zustand',\n 'mobx': 'MobX',\n 'jotai': 'Jotai',\n 'recoil': 'Recoil',\n 'pinia': 'Pinia',\n 'vuex': 'Vuex',\n '@tanstack/react-query': 'TanStack Query',\n 'swr': 'SWR',\n 'xstate': 'XState',\n '@ngrx/store': 'NgRx',\n\n // ── ORM & Database ──\n 'prisma': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n 'typeorm': 'TypeORM',\n 'sequelize': 'Sequelize',\n '@mikro-orm/core': 'MikroORM',\n 'mongoose': 'Mongoose',\n 'knex': 'Knex',\n 'kysely': 'Kysely',\n 'objection': 'Objection.js',\n\n // ── Bundlers ──\n 'vite': 'Vite',\n 'webpack': 'webpack',\n 'rollup': 'Rollup',\n 'esbuild': 'esbuild',\n 'parcel': 'Parcel',\n 'turbo': 'Turbo',\n 'tsup': 'tsup',\n '@swc/core': 'SWC',\n 'bun': 'Bun',\n\n // ── Testing ──\n 'vitest': 'Vitest',\n 'jest': 'Jest',\n '@playwright/test': 'Playwright',\n 'cypress': 'Cypress',\n 'mocha': 'Mocha',\n 'ava': 'AVA',\n 'storybook': 'Storybook',\n '@storybook/react': 'Storybook',\n};\n\nexport async function scanNodeProjects(\n rootDir: string,\n npmCache: NpmCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG,\n): Promise<ProjectScan[]> {\n const packageJsonFiles = cache\n ? await cache.findPackageJsonFiles(rootDir)\n : await findPackageJsonFiles(rootDir);\n const results: ProjectScan[] = [];\n\n // Build a map of package names to paths for workspace dependency resolution\n const packageNameToPath = new Map<string, string>();\n\n // ── Detect root-level package manager ──\n // Priority: 1) corepack `packageManager` field, 2) workspace config file, 3) lockfile\n let detectedPackageManager: string | undefined;\n try {\n const _pathExists = cache ? (p: string) => cache.pathExists(p) : pathExists;\n\n // 1. Check corepack field in root package.json\n const rootPkgPath = path.join(rootDir, 'package.json');\n if (await _pathExists(rootPkgPath)) {\n try {\n const rootPkg: PackageJson = cache\n ? await cache.readJsonFile<PackageJson>(rootPkgPath)\n : await readJsonFile<PackageJson>(rootPkgPath);\n if (rootPkg.packageManager) {\n const pm = rootPkg.packageManager.split('@')[0]?.toLowerCase();\n if (pm && ['pnpm', 'yarn', 'npm', 'bun'].includes(pm)) {\n detectedPackageManager = pm;\n }\n }\n } catch { /* ignore */ }\n }\n\n // 2. Workspace config file (pnpm-workspace.yaml → pnpm)\n if (!detectedPackageManager) {\n if (await _pathExists(path.join(rootDir, 'pnpm-workspace.yaml'))) {\n detectedPackageManager = 'pnpm';\n }\n }\n\n // 3. Lockfile presence\n if (!detectedPackageManager) {\n if (await _pathExists(path.join(rootDir, 'pnpm-lock.yaml'))) {\n detectedPackageManager = 'pnpm';\n } else if (await _pathExists(path.join(rootDir, 'yarn.lock'))) {\n detectedPackageManager = 'yarn';\n } else if (await _pathExists(path.join(rootDir, 'package-lock.json'))) {\n detectedPackageManager = 'npm';\n } else if (await _pathExists(path.join(rootDir, 'bun.lockb'))) {\n detectedPackageManager = 'bun';\n }\n }\n } catch { /* detection is best-effort */ }\n\n // ── Parse the root lockfile once ──\n // A lockfile gives each dependency's EXACT installed version, which is more accurate than the\n // registry's best-match for the declared range and is the only source of a resolved version when\n // offline. One root lockfile covers a whole (mono)repo, so parse it once and share it.\n const lockIo: LockfileIo = {\n exists: (p) => (cache ? cache.pathExists(p) : pathExists(p)),\n readText: (p) => (cache ? cache.readTextFile(p) : readTextFile(p)),\n readJson: <T>(p: string) => (cache ? cache.readJsonFile<T>(p) : readJsonFile<T>(p)),\n };\n const lockIndex = await loadNpmLockIndex(rootDir, lockIo).catch(() => null);\n\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const projectConcurrency = Math.max(2, Math.min(16, cores * 2));\n const projectSem = new Semaphore(projectConcurrency);\n\n // ── Pre-warm npm cache ──\n // Collect ALL npm package names across every package.json up-front and\n // prefetch their registry metadata in bulk *before* entering the\n // per-project timeout loop. Without this, projects with many deps\n // (e.g. 70+ packages) can spend the entire timeout budget on `npm view`\n // network calls and get auto-excluded even though they aren't stuck.\n const allNpmPkgs = new Set<string>();\n await Promise.all(packageJsonFiles.map(async (pjPath) => {\n try {\n const pj: PackageJson = cache\n ? await cache.readJsonFile<PackageJson>(pjPath)\n : await readJsonFile<PackageJson>(pjPath);\n const depSections = [pj.dependencies, pj.devDependencies, pj.peerDependencies, pj.optionalDependencies];\n for (const deps of depSections) {\n if (!deps) continue;\n for (const [pkg, spec] of Object.entries(deps)) {\n if (isSemverSpec(spec)) allNpmPkgs.add(pkg);\n }\n }\n } catch {\n // Ignore unreadable package.json — scanOnePackageJson will handle errors\n }\n }));\n\n if (allNpmPkgs.size > 0) {\n try {\n await npmCache.prefetch([...allNpmPkgs]);\n } catch {\n // Best-effort — per-project scans will retry individually\n }\n }\n\n const scannedProjects = await Promise.all(packageJsonFiles.map(async (pjPath) => projectSem.run(async () => {\n try {\n const scanPromise = scanOnePackageJson(pjPath, rootDir, npmCache, cache, catalog, lockIndex);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n return result.value;\n }\n\n // Timed out — record stuck path for auto-exclude\n const relPath = path.relative(rootDir, path.dirname(pjPath));\n if (cache) {\n cache.addStuckPath(relPath || '.');\n }\n console.error(`Timeout scanning ${pjPath} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n return null;\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning ${pjPath}: ${msg}`);\n return null;\n }\n })));\n\n for (const project of scannedProjects) {\n if (!project) continue;\n results.push(project);\n packageNameToPath.set(project.name, project.path);\n }\n\n // Resolve workspace dependencies: find dependencies that reference other local packages\n for (const project of results) {\n const workspaceRefs: ProjectReference[] = [];\n\n for (const dep of project.dependencies) {\n // Check if this dependency is another project in the workspace\n const depPath = packageNameToPath.get(dep.package);\n if (depPath && depPath !== project.path) {\n workspaceRefs.push({\n path: depPath,\n name: dep.package,\n refType: 'workspace',\n });\n }\n }\n\n if (workspaceRefs.length > 0) {\n project.projectReferences = workspaceRefs;\n }\n\n // Attach the detected root-level package manager to every project\n if (detectedPackageManager) {\n project.packageManager = detectedPackageManager;\n }\n }\n\n return results;\n}\n\nasync function scanOnePackageJson(\n packageJsonPath: string,\n rootDir: string,\n npmCache: NpmCache,\n cache: FileCache | undefined,\n catalog: RuntimeCatalog,\n lockIndex: NpmLockIndex | null = null,\n): Promise<ProjectScan> {\n const pj = cache\n ? await cache.readJsonFile<PackageJson>(packageJsonPath)\n : await readJsonFile<PackageJson>(packageJsonPath);\n const absProjectPath = path.dirname(packageJsonPath);\n const projectPath = path.relative(rootDir, absProjectPath) || '.';\n\n // Detect Node runtime version\n const nodeEngine = pj.engines?.node ?? undefined;\n let runtimeLatest: string | undefined;\n let runtimeMajorsBehind: number | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n\n if (nodeEngine) {\n const latest = latestLts(catalog, 'nodejs');\n const parsed = semver.minVersion(nodeEngine);\n if (latest && parsed) {\n const currentMajor = semver.major(parsed);\n runtimeLatest = `${latest.major}.0.0`;\n runtimeMajorsBehind = Math.max(0, latest.major - currentMajor);\n }\n runtimeEol = runtimeEolStatus(catalog, 'node', nodeEngine);\n const cycle = extractCycle('node', nodeEngine);\n if (cycle) runtimeEolDate = eolDate(catalog, 'nodejs', cycle);\n }\n\n // Collect dependencies from all sections\n const sections: { name: DepSection; deps?: Record<string, string> }[] = [\n { name: 'dependencies', deps: pj.dependencies },\n { name: 'devDependencies', deps: pj.devDependencies },\n { name: 'peerDependencies', deps: pj.peerDependencies },\n { name: 'optionalDependencies', deps: pj.optionalDependencies },\n ];\n\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Collect all dep promises first for parallel resolution\n const depEntries: { pkg: string; section: DepSection; spec: string }[] = [];\n for (const s of sections) {\n if (!s.deps) continue;\n for (const [pkg, spec] of Object.entries(s.deps)) {\n if (!isSemverSpec(spec)) continue;\n depEntries.push({ pkg, section: s.name, spec });\n }\n }\n\n // Warm cache in batch to reduce npm process/network overhead.\n await npmCache.prefetch(depEntries.map((entry) => entry.pkg));\n\n // Resolve metadata from cache (misses transparently fetch as needed).\n const metaPromises = depEntries.map(async (entry) => {\n const meta = await npmCache.get(entry.pkg);\n return { ...entry, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { pkg, section, spec, meta } of resolved) {\n // Prefer the lockfile's EXACT installed version (authoritative + works offline); otherwise fall\n // back to the registry's best match for the declared range.\n const lockedVersion = lockIndex?.resolve(pkg, spec) ?? null;\n const registryResolved = meta.stableVersions.length > 0\n ? semver.maxSatisfying(meta.stableVersions, spec) ?? null\n : null;\n const resolvedVersion = (lockedVersion && semver.valid(lockedVersion)) ? lockedVersion : registryResolved;\n\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else {\n drift = 'major-behind';\n }\n\n // Bucketise\n if (majorsBehind === 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n const ageDays = ageDaysBetween(resolvedVersion, latestStable, meta.releaseDates);\n const libyears = daysToLibyears(ageDays);\n\n // Abandonment (driftscore-3.0 §6.1): the *latest* release itself is old — the\n // package has stopped moving (\"no pulse\"), even if you're on that latest\n // version. Uses the registry publish dates already fetched for libyears, so\n // there is no extra request. Fires the abandoned floor (drift ≥ 50).\n const latestIso = latestStable ? meta.releaseDates?.[latestStable] : undefined;\n let abandoned = false;\n if (latestIso) {\n const publishedMs = Date.parse(latestIso);\n if (!Number.isNaN(publishedMs)) {\n abandoned = (Date.now() - publishedMs) / MS_PER_DAY > ABANDONED_MAX_DAYS;\n }\n }\n\n dependencies.push({\n package: pkg,\n section,\n currentSpec: spec,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n license: buildDependencyLicense(meta.license, 'registry'),\n ageDays,\n libyears,\n ...(abandoned ? { abandoned: true } : {}),\n });\n\n // Detect known frameworks\n if (pkg in KNOWN_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_FRAMEWORKS[pkg]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Record workspace: protocol dependencies (not resolved via npm registry,\n // but needed so the workspace-reference resolution loop can discover edges)\n for (const s of sections) {\n if (!s.deps) continue;\n for (const [pkg, spec] of Object.entries(s.deps)) {\n if (!spec.trim().startsWith('workspace:')) continue;\n dependencies.push({\n package: pkg,\n section: s.name,\n currentSpec: spec,\n resolvedVersion: null,\n latestStable: null,\n majorsBehind: null,\n drift: 'unknown',\n license: { raw: null, spdxId: null, source: 'none', confidence: 0 },\n });\n buckets.unknown++;\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files in project directory (use cached walk to avoid redundant I/O)\n let fileCount: number | undefined;\n try {\n fileCount = cache\n ? await cache.countFilesUnder(rootDir, absProjectPath)\n : undefined;\n } catch {\n // Ignore file count errors\n }\n\n return {\n type: 'node',\n path: projectPath,\n name: pj.name ?? path.basename(absProjectPath),\n runtime: nodeEngine,\n runtimeLatest,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n libyears: aggregateLibyears(dependencies.map((d) => d.libyears)) ?? undefined,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { XMLParser } from 'fast-xml-parser';\nimport { findFiles, findSolutionFiles, readTextFile, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { NuGetCache } from './nuget-cache.js';\nimport { latestStable, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework, ProjectReference } from '../types.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n});\n\n/** Known .NET framework packages to track */\nconst KNOWN_DOTNET_FRAMEWORKS: Record<string, string> = {\n // ── ASP.NET Core & Web ──\n 'Microsoft.AspNetCore.App': 'ASP.NET Core',\n 'Microsoft.AspNetCore.Mvc': 'ASP.NET Core MVC',\n 'Microsoft.AspNetCore.Components': 'Blazor',\n 'Microsoft.AspNetCore.Components.WebAssembly': 'Blazor WASM',\n 'Microsoft.AspNetCore.SignalR': 'SignalR',\n 'Microsoft.AspNetCore.OData': 'OData',\n 'Microsoft.AspNetCore.Identity': 'ASP.NET Identity',\n 'Microsoft.AspNetCore.Authentication.JwtBearer': 'JWT Bearer Auth',\n 'Microsoft.AspNetCore.Diagnostics.HealthChecks': 'Health Checks',\n 'Swashbuckle.AspNetCore': 'Swashbuckle',\n 'NSwag.AspNetCore': 'NSwag',\n\n // ── Entity Framework & Data Access ──\n 'Microsoft.EntityFrameworkCore': 'EF Core',\n 'Microsoft.EntityFrameworkCore.SqlServer': 'EF Core SQL Server',\n 'Microsoft.EntityFrameworkCore.Sqlite': 'EF Core SQLite',\n 'Microsoft.EntityFrameworkCore.Design': 'EF Core Design',\n 'Microsoft.EntityFrameworkCore.Tools': 'EF Core Tools',\n 'Npgsql.EntityFrameworkCore.PostgreSQL': 'EF Core PostgreSQL',\n 'Pomelo.EntityFrameworkCore.MySql': 'EF Core MySQL (Pomelo)',\n 'MongoDB.EntityFrameworkCore': 'EF Core MongoDB',\n 'Dapper': 'Dapper',\n 'Dapper.Contrib': 'Dapper Contrib',\n 'NHibernate': 'NHibernate',\n 'Npgsql': 'Npgsql',\n 'MySqlConnector': 'MySqlConnector',\n 'MongoDB.Driver': 'MongoDB Driver',\n 'StackExchange.Redis': 'StackExchange.Redis',\n 'Microsoft.Data.SqlClient': 'SqlClient',\n 'Oracle.ManagedDataAccess.Core': 'Oracle (Managed)',\n 'Cassandra': 'Cassandra Driver',\n 'Neo4j.Driver': 'Neo4j Driver',\n 'Marten': 'Marten',\n 'LiteDB': 'LiteDB',\n 'RavenDB.Client': 'RavenDB',\n\n // ── Hosting & Configuration ──\n // All Microsoft.Extensions.* and System.* packages that ship as part of the\n // .NET SDK release train are prefixed with '.NET ' so that the dashboard can\n // group them under a single '.NET X.Y.Z → A.B.C' header when they all move\n // together (e.g. .NET 8 → 10 upgrade).\n 'Microsoft.Extensions.Hosting': '.NET Hosting',\n 'Microsoft.Extensions.Hosting.Abstractions': '.NET Hosting Abstractions',\n 'Microsoft.Extensions.DependencyInjection': '.NET DI',\n 'Microsoft.Extensions.DependencyInjection.Abstractions': '.NET DI Abstractions',\n 'Microsoft.Extensions.Configuration': '.NET Configuration',\n 'Microsoft.Extensions.Configuration.Abstractions': '.NET Configuration Abstractions',\n 'Microsoft.Extensions.Configuration.Binder': '.NET Configuration Binder',\n 'Microsoft.Extensions.Configuration.EnvironmentVariables': '.NET Configuration EnvVars',\n 'Microsoft.Extensions.Configuration.Json': '.NET Configuration JSON',\n 'Microsoft.Extensions.Configuration.UserSecrets': '.NET Configuration UserSecrets',\n 'Microsoft.Extensions.Logging': '.NET Logging',\n 'Microsoft.Extensions.Logging.Abstractions': '.NET Logging Abstractions',\n 'Microsoft.Extensions.Logging.Console': '.NET Logging Console',\n 'Microsoft.Extensions.Logging.Debug': '.NET Logging Debug',\n 'Microsoft.Extensions.Logging.EventSource': '.NET Logging EventSource',\n 'Microsoft.Extensions.Options': '.NET Options',\n 'Microsoft.Extensions.Options.ConfigurationExtensions': '.NET Options Configuration',\n 'Microsoft.Extensions.Options.DataAnnotations': '.NET Options DataAnnotations',\n 'Microsoft.Extensions.Caching.Memory': '.NET Memory Cache',\n 'Microsoft.Extensions.Caching.Abstractions': '.NET Caching Abstractions',\n 'Microsoft.Extensions.Caching.StackExchangeRedis': '.NET Redis Cache',\n 'Microsoft.Extensions.Http': '.NET HttpClientFactory',\n 'Microsoft.Extensions.Http.Resilience': '.NET HttpClient Resilience',\n 'Microsoft.Extensions.Resilience': '.NET Resilience',\n 'Microsoft.Extensions.Diagnostics': '.NET Diagnostics',\n 'Microsoft.Extensions.Diagnostics.HealthChecks': '.NET Health Checks (Extensions)',\n 'Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions': '.NET Health Checks Abstractions',\n 'Microsoft.Extensions.FileProviders.Abstractions': '.NET File Providers',\n 'Microsoft.Extensions.FileProviders.Physical': '.NET File Providers Physical',\n 'Microsoft.Extensions.Localization': '.NET Localization',\n 'Microsoft.Extensions.Localization.Abstractions': '.NET Localization Abstractions',\n 'Microsoft.Extensions.Primitives': '.NET Primitives',\n // System.* packages that ship with the .NET SDK\n 'System.Text.Json': '.NET System.Text.Json',\n 'System.Text.Encodings.Web': '.NET System.Text.Encodings.Web',\n 'System.Net.Http.Json': '.NET System.Net.Http.Json',\n 'System.ComponentModel.Annotations': '.NET ComponentModel Annotations',\n\n // ── CQRS & Mediator ──\n 'MediatR': 'MediatR',\n 'Wolverine': 'Wolverine',\n 'Brighter': 'Brighter',\n\n // ── Mapping ──\n 'AutoMapper': 'AutoMapper',\n 'Mapster': 'Mapster',\n 'Riok.Mapperly': 'Mapperly',\n\n // ── Validation ──\n 'FluentValidation': 'FluentValidation',\n 'FluentValidation.AspNetCore': 'FluentValidation ASP.NET',\n\n // ── Serialization ──\n 'Newtonsoft.Json': 'Newtonsoft.Json',\n // Note: System.Text.Json is defined above under '── Hosting & Configuration ──'\n // as a .NET platform package so it groups with other .NET SDK packages.\n 'MessagePack': 'MessagePack',\n 'protobuf-net': 'protobuf-net',\n 'CsvHelper': 'CsvHelper',\n\n // ── Logging & Observability ──\n 'Serilog': 'Serilog',\n 'Serilog.AspNetCore': 'Serilog ASP.NET',\n 'Serilog.Sinks.Console': 'Serilog Console',\n 'Serilog.Sinks.Seq': 'Serilog Seq',\n 'Serilog.Sinks.File': 'Serilog File',\n 'Serilog.Sinks.Elasticsearch': 'Serilog Elasticsearch',\n 'NLog': 'NLog',\n 'NLog.Web.AspNetCore': 'NLog ASP.NET',\n 'log4net': 'log4net',\n 'OpenTelemetry': 'OpenTelemetry',\n 'OpenTelemetry.Extensions.Hosting': 'OpenTelemetry Hosting',\n 'OpenTelemetry.Instrumentation.AspNetCore': 'OpenTelemetry ASP.NET',\n 'OpenTelemetry.Exporter.Prometheus': 'OpenTelemetry Prometheus',\n 'OpenTelemetry.Exporter.Jaeger': 'OpenTelemetry Jaeger',\n 'OpenTelemetry.Exporter.OpenTelemetryProtocol': 'OpenTelemetry OTLP',\n 'App.Metrics': 'App.Metrics',\n 'prometheus-net': 'Prometheus.NET',\n 'Elastic.Apm': 'Elastic APM',\n\n // ── Testing ──\n 'xunit': 'xUnit',\n 'xunit.runner.visualstudio': 'xUnit Runner',\n 'NUnit': 'NUnit',\n 'NUnit3TestAdapter': 'NUnit Adapter',\n 'MSTest.TestFramework': 'MSTest',\n 'MSTest.TestAdapter': 'MSTest Adapter',\n 'Moq': 'Moq',\n 'NSubstitute': 'NSubstitute',\n 'FakeItEasy': 'FakeItEasy',\n 'FluentAssertions': 'FluentAssertions',\n 'Shouldly': 'Shouldly',\n 'Bogus': 'Bogus',\n 'AutoFixture': 'AutoFixture',\n 'WireMock.Net': 'WireMock.Net',\n 'Testcontainers': 'Testcontainers',\n 'Respawn': 'Respawn',\n 'BenchmarkDotNet': 'BenchmarkDotNet',\n 'coverlet.collector': 'Coverlet',\n 'SpecFlow': 'SpecFlow',\n 'TUnit': 'TUnit',\n 'Verify.Xunit': 'Verify',\n 'Snapshooter': 'Snapshooter',\n\n // ── Messaging & Event Bus ──\n 'MassTransit': 'MassTransit',\n 'MassTransit.RabbitMQ': 'MassTransit RabbitMQ',\n 'MassTransit.Azure.ServiceBus.Core': 'MassTransit Azure SB',\n 'NServiceBus': 'NServiceBus',\n 'RabbitMQ.Client': 'RabbitMQ Client',\n 'Confluent.Kafka': 'Confluent Kafka',\n 'Azure.Messaging.ServiceBus': 'Azure Service Bus',\n 'Azure.Messaging.EventHubs': 'Azure Event Hubs',\n 'Amazon.SQS': 'AWS SQS',\n 'Amazon.SNS': 'AWS SNS',\n 'Rebus': 'Rebus',\n 'EasyNetQ': 'EasyNetQ',\n 'SlimMessageBus': 'SlimMessageBus',\n 'CAP': 'DotNetCore.CAP',\n\n // ── Cloud SDKs ──\n 'AWSSDK.Core': 'AWS SDK Core',\n 'AWSSDK.S3': 'AWS SDK S3',\n 'AWSSDK.SQS': 'AWS SDK SQS',\n 'AWSSDK.DynamoDBv2': 'AWS SDK DynamoDB',\n 'AWSSDK.Lambda': 'AWS SDK Lambda',\n 'AWSSDK.SecretsManager': 'AWS SDK Secrets Manager',\n 'AWSSDK.CloudWatch': 'AWS SDK CloudWatch',\n 'Azure.Storage.Blobs': 'Azure Blob Storage',\n 'Azure.Identity': 'Azure Identity',\n 'Azure.Security.KeyVault.Secrets': 'Azure Key Vault',\n 'Azure.Cosmos': 'Azure Cosmos DB',\n 'Microsoft.Azure.Functions.Worker': 'Azure Functions',\n 'Google.Cloud.Storage.V1': 'GCP Storage',\n 'Google.Cloud.PubSub.V1': 'GCP Pub/Sub',\n 'Google.Cloud.Firestore': 'GCP Firestore',\n\n // ── Auth & Identity ──\n 'Microsoft.Identity.Web': 'Microsoft Identity Web',\n 'Microsoft.Identity.Client': 'MSAL',\n 'IdentityServer4': 'IdentityServer4',\n 'Duende.IdentityServer': 'Duende IdentityServer',\n 'Microsoft.AspNetCore.Authentication.OpenIdConnect': 'OpenID Connect',\n 'IdentityModel': 'IdentityModel',\n\n // ── HTTP & API ──\n 'Refit': 'Refit',\n 'RestSharp': 'RestSharp',\n 'Flurl.Http': 'Flurl',\n 'Polly': 'Polly',\n 'Polly.Extensions.Http': 'Polly HTTP',\n 'Microsoft.Extensions.Http.Polly': 'HttpClient Polly',\n 'Grpc.AspNetCore': 'gRPC ASP.NET',\n 'Grpc.Net.Client': 'gRPC Client',\n 'GraphQL.Server.All': 'GraphQL Server',\n 'HotChocolate.AspNetCore': 'Hot Chocolate (GraphQL)',\n\n // ── Background Processing ──\n 'Hangfire': 'Hangfire',\n 'Hangfire.Core': 'Hangfire Core',\n 'Hangfire.AspNetCore': 'Hangfire ASP.NET',\n 'Quartz': 'Quartz.NET',\n 'Quartz.Extensions.Hosting': 'Quartz.NET Hosting',\n 'Coravel': 'Coravel',\n\n // ── File & Document ──\n 'EPPlus': 'EPPlus',\n 'ClosedXML': 'ClosedXML',\n 'iTextSharp': 'iTextSharp',\n 'QuestPDF': 'QuestPDF',\n 'ImageSharp': 'ImageSharp',\n 'SixLabors.ImageSharp': 'ImageSharp',\n\n // ── Feature Flags & Config ──\n 'LaunchDarkly.ServerSdk': 'LaunchDarkly',\n 'Microsoft.FeatureManagement': 'Feature Management',\n 'Microsoft.FeatureManagement.AspNetCore': 'Feature Management ASP.NET',\n\n // ── Microservices & Distributed ──\n 'Dapr.Client': 'Dapr',\n 'Steeltoe.Discovery.ClientCore': 'Steeltoe',\n 'Ocelot': 'Ocelot (API Gateway)',\n 'Yarp.ReverseProxy': 'YARP',\n\n // ── Real-time ──\n 'Microsoft.AspNetCore.SignalR.Client': 'SignalR Client',\n};\n\n// Latest .NET major version is resolved at scan time — see runtime-baselines.ts\n\n/** Normalize a file system path to always use forward slashes */\nfunction normalizePath(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\n/** Parse target framework moniker to a major version number */\nfunction parseTfmMajor(tfm: string): number | null {\n // net9.0, net8.0, net7.0, net6.0\n const match = tfm.match(/^net(\\d+)\\.\\d+$/);\n if (match?.[1]) return parseInt(match[1], 10);\n\n // netcoreapp3.1, etc\n const coreMatch = tfm.match(/^netcoreapp(\\d+)\\.\\d+$/);\n if (coreMatch?.[1]) return parseInt(coreMatch[1], 10);\n\n // netstandard2.0 → treat as legacy\n if (tfm.startsWith('netstandard')) return null;\n\n // net48, net472 → .NET Framework (legacy)\n const fxMatch = tfm.match(/^net(\\d)(\\d+)?$/);\n if (fxMatch) return null; // Legacy .NET Framework, can't compare to modern\n\n return null;\n}\n\n\n/**\n * `.sqlproj` (SQL Server Database Projects — SSDT) are recognized alongside\n * `.csproj`/`.vbproj` so they are discovered and classified as a project\n * (name, path) like any other .NET-tooling project, giving them at least\n * baseline visibility even though they rarely declare NuGet\n * `<PackageReference>`s the way app projects do (dependency drift naturally\n * reads as zero/unknown for them, which the scanner already handles for any\n * project with no package references). The database-schema scanner\n * separately globs `.sql` table-definition scripts under a `.sqlproj`'s\n * directory tree and parses them structurally.\n */\nfunction isDotnetProjectFile(name: string): boolean {\n return name.endsWith('.csproj') || name.endsWith('.vbproj') || name.endsWith('.sqlproj');\n}\n\nfunction stripDotnetProjectExtension(filePath: string): string {\n return path.basename(filePath).replace(/\\.(cs|vb|sql)proj$/i, '');\n}\n\ninterface CsprojData {\n targetFrameworks: string[];\n packageReferences: { name: string; version: string }[];\n projectReferences: string[];\n projectName: string;\n}\n\nfunction parseDotnetProjectFile(xml: string, filePath: string): CsprojData {\n const parsed = parser.parse(xml);\n const project = parsed?.Project;\n if (!project) {\n return { targetFrameworks: [], packageReferences: [], projectReferences: [], projectName: stripDotnetProjectExtension(filePath) };\n }\n\n // Extract target frameworks\n const propertyGroups = Array.isArray(project.PropertyGroup)\n ? project.PropertyGroup\n : project.PropertyGroup ? [project.PropertyGroup] : [];\n\n const targetFrameworks: string[] = [];\n for (const pg of propertyGroups) {\n if (pg.TargetFramework) {\n targetFrameworks.push(String(pg.TargetFramework));\n }\n if (pg.TargetFrameworks) {\n const tfms = String(pg.TargetFrameworks).split(';').map((s: string) => s.trim()).filter(Boolean);\n targetFrameworks.push(...tfms);\n }\n }\n\n // Extract package references and project references\n const itemGroups = Array.isArray(project.ItemGroup)\n ? project.ItemGroup\n : project.ItemGroup ? [project.ItemGroup] : [];\n\n const packageReferences: { name: string; version: string }[] = [];\n const projectReferences: string[] = [];\n\n for (const ig of itemGroups) {\n // Package references\n const pkgRefs = Array.isArray(ig.PackageReference)\n ? ig.PackageReference\n : ig.PackageReference ? [ig.PackageReference] : [];\n\n for (const ref of pkgRefs) {\n const name = ref['@_Include'] ?? ref['@_include'] ?? '';\n const version = ref['@_Version'] ?? ref['@_version'] ?? ref.Version ?? '';\n if (name && version) {\n packageReferences.push({ name: String(name), version: String(version) });\n }\n }\n\n // Project references (internal dependencies)\n const projRefs = Array.isArray(ig.ProjectReference)\n ? ig.ProjectReference\n : ig.ProjectReference ? [ig.ProjectReference] : [];\n\n for (const ref of projRefs) {\n const include = ref['@_Include'] ?? ref['@_include'] ?? '';\n if (include) {\n // Convert Windows backslashes to forward slashes\n projectReferences.push(String(include).replace(/\\\\/g, '/'));\n }\n }\n }\n\n return {\n targetFrameworks: [...new Set(targetFrameworks)],\n packageReferences,\n projectReferences,\n projectName: stripDotnetProjectExtension(filePath),\n };\n}\n\n/**\n * Parse a legacy `packages.config` (pre-SDK NuGet format) into the same\n * `{ name, version }` shape as SDK-style `<PackageReference>`s.\n *\n * ```xml\n * <packages>\n * <package id=\"EntityFramework\" version=\"6.2.0\" targetFramework=\"net48\" />\n * </packages>\n * ```\n *\n * Non-SDK .csproj/.vbproj projects (WebForms, WCF, classic MVC5, EF6 estates)\n * declare their NuGet dependencies here instead of in the project file, so\n * without this they would surface zero dependencies and escape drift scoring.\n */\nfunction parsePackagesConfig(xml: string): { name: string; version: string }[] {\n const parsed = parser.parse(xml);\n const root = parsed?.packages;\n if (!root) return [];\n\n const pkgs = Array.isArray(root.package) ? root.package : root.package ? [root.package] : [];\n const out: { name: string; version: string }[] = [];\n for (const pkg of pkgs) {\n const name = pkg['@_id'] ?? pkg['@_Id'] ?? '';\n const version = pkg['@_version'] ?? pkg['@_Version'] ?? '';\n if (name && version) {\n out.push({ name: String(name), version: String(version) });\n }\n }\n return out;\n}\n\nexport async function scanDotnetProjects(rootDir: string, nugetCache?: NuGetCache, cache?: FileCache, projectScanTimeout?: number, catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG): Promise<ProjectScan[]> {\n const projectFiles = cache\n ? await cache.findFiles(rootDir, isDotnetProjectFile)\n : await findFiles(rootDir, isDotnetProjectFile);\n // Also check for .sln files to discover associated projects\n const slnFiles = cache\n ? await cache.findSolutionFiles(rootDir)\n : await findSolutionFiles(rootDir);\n\n // If we found .sln files, parse them to find associated .csproj/.vbproj files\n const slnProjectPaths = new Set<string>();\n for (const slnPath of slnFiles) {\n try {\n const slnContent = cache\n ? await cache.readTextFile(slnPath)\n : await readTextFile(slnPath);\n const slnDir = path.dirname(slnPath);\n // Parse .sln for project entries: Project(\"...\") = \"Name\", \"Path.csproj|vbproj|sqlproj\", ...\n const projectRegex = /Project\\(\"[^\"]*\"\\)\\s*=\\s*\"[^\"]*\",\\s*\"([^\"]+\\.(?:cs|vb|sql)proj)\"/g;\n let match;\n while ((match = projectRegex.exec(slnContent)) !== null) {\n if (match[1]) {\n const csprojPath = path.resolve(slnDir, match[1].replace(/\\\\/g, '/'));\n slnProjectPaths.add(csprojPath);\n }\n }\n } catch {\n // ignore unreadable .sln\n }\n }\n\n // Merge discovered dotnet project files\n const allCsprojFiles = new Set([...projectFiles, ...slnProjectPaths]);\n const results: ProjectScan[] = [];\n\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const csprojPath of allCsprojFiles) {\n try {\n const scanPromise = scanOneDotnetProjectFile(csprojPath, rootDir, nugetCache, cache, catalog);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n // Timed out — record stuck path for auto-exclude\n const relPath = normalizePath(path.relative(rootDir, path.dirname(csprojPath)));\n if (cache) {\n cache.addStuckPath(relPath || '.');\n }\n console.error(`Timeout scanning ${csprojPath} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning ${csprojPath}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function scanOneDotnetProjectFile(csprojPath: string, rootDir: string, nugetCache: NuGetCache | undefined, cache: FileCache | undefined, catalog: RuntimeCatalog): Promise<ProjectScan> {\n const xml = cache\n ? await cache.readTextFile(csprojPath)\n : await readTextFile(csprojPath);\n const data = parseDotnetProjectFile(xml, csprojPath);\n const csprojDir = path.dirname(csprojPath);\n\n // Legacy NuGet: non-SDK projects keep their dependencies in a sibling\n // `packages.config` rather than in <PackageReference>. Merge those in so\n // .NET Framework estates are scored for dependency drift too. SDK-style\n // references take precedence on name collisions (rare — projects use one\n // format or the other).\n {\n const packagesConfigPath = path.join(csprojDir, 'packages.config');\n try {\n const cfgXml = cache\n ? await cache.readTextFile(packagesConfigPath)\n : await readTextFile(packagesConfigPath);\n const seen = new Set(data.packageReferences.map((r) => r.name.toLowerCase()));\n for (const ref of parsePackagesConfig(cfgXml)) {\n if (!seen.has(ref.name.toLowerCase())) {\n data.packageReferences.push(ref);\n seen.add(ref.name.toLowerCase());\n }\n }\n } catch {\n // No packages.config (the common SDK-style case) — nothing to merge.\n }\n }\n\n // Determine target framework lag\n const primaryTfm = data.targetFrameworks[0];\n const dotnetLatest = latestStable(catalog, 'dotnet')?.major;\n let runtimeMajorsBehind: number | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n let targetFramework = primaryTfm;\n\n if (primaryTfm) {\n const major = parseTfmMajor(primaryTfm);\n if (major !== null && dotnetLatest !== undefined) {\n runtimeMajorsBehind = Math.max(0, dotnetLatest - major);\n }\n runtimeEol = runtimeEolStatus(catalog, 'dotnet', primaryTfm);\n const cycle = extractCycle('dotnet', primaryTfm);\n if (cycle) runtimeEolDate = eolDate(catalog, 'dotnet', cycle);\n }\n\n // Build dependency rows — query NuGet registry for latest versions when available\n const dependencies: DependencyRow[] = [];\n const bucketsMut = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n if (nugetCache) {\n // Fetch all NuGet metadata in parallel\n const metaPromises = data.packageReferences.map(async (ref) => {\n const meta = await nugetCache.get(ref.name);\n return { ref, meta };\n });\n const resolved = await Promise.all(metaPromises);\n\n for (const { ref, meta } of resolved) {\n const resolvedVersion = semver.valid(ref.version) ? ref.version : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current';\n }\n\n if (majorsBehind <= 0) bucketsMut.current++;\n else if (majorsBehind === 1) bucketsMut.oneBehind++;\n else bucketsMut.twoPlusBehind++;\n } else {\n bucketsMut.unknown++;\n }\n\n dependencies.push({\n package: ref.name,\n section: 'dependencies',\n currentSpec: ref.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n }\n } else {\n // No NuGet cache — fallback to unknown drift (offline mode)\n for (const ref of data.packageReferences) {\n dependencies.push({\n package: ref.name,\n section: 'dependencies',\n currentSpec: ref.version,\n resolvedVersion: ref.version,\n latestStable: null,\n majorsBehind: null,\n drift: 'unknown',\n });\n bucketsMut.unknown++;\n }\n }\n\n // Detect known frameworks — use resolved dependency data for version info\n const frameworks: DetectedFramework[] = [];\n const depLookup = new Map(dependencies.map((d) => [d.package, d]));\n for (const ref of data.packageReferences) {\n if (ref.name in KNOWN_DOTNET_FRAMEWORKS) {\n const resolved = depLookup.get(ref.name);\n frameworks.push({\n name: KNOWN_DOTNET_FRAMEWORKS[ref.name]!,\n currentVersion: resolved?.resolvedVersion ?? ref.version,\n latestVersion: resolved?.latestStable ?? null,\n majorsBehind: resolved?.majorsBehind ?? null,\n });\n }\n }\n\n // Resolve project references to relative paths from root\n const projectReferences: ProjectReference[] = data.projectReferences.map((refPath) => {\n // Resolve the reference path relative to the csproj file's directory\n const absRefPath = path.resolve(csprojDir, refPath);\n const relRefPath = normalizePath(path.relative(rootDir, path.dirname(absRefPath)));\n const refName = stripDotnetProjectExtension(absRefPath);\n return {\n path: relRefPath || '.',\n name: refName,\n refType: 'project' as const,\n };\n });\n\n // Count files in project directory (use cached walk to avoid redundant I/O)\n let fileCount: number | undefined;\n try {\n fileCount = cache\n ? await cache.countFilesUnder(rootDir, csprojDir)\n : undefined;\n } catch {\n // Ignore file count errors\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n const buckets = bucketsMut;\n\n return {\n type: 'dotnet',\n path: normalizePath(path.relative(rootDir, csprojDir)) || '.',\n name: data.projectName,\n targetFramework,\n runtime: primaryTfm,\n runtimeLatest: dotnetLatest !== undefined ? `net${dotnetLatest}.0` : undefined,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n projectReferences: projectReferences.length > 0 ? projectReferences : undefined,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Thin, safe wrapper over the `smol-toml` parser (BSD-3-Clause, pure ESM, zero dependencies).\n *\n * Centralizes the single TOML dependency so lockfile/manifest parsers don't each import it, and never\n * throws: a malformed file yields `null` so callers can fall back gracefully instead of crashing a\n * scan. Returns the parsed document as a plain object.\n */\nimport { parse } from 'smol-toml';\n\nexport function parseToml(text: string): Record<string, unknown> | null {\n if (!text) return null;\n try {\n const doc = parse(text);\n return doc && typeof doc === 'object' ? (doc as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Python lockfile resolution (clean-room, zero-dependency).\n *\n * Python manifests (`requirements.txt`, `pyproject.toml`, `Pipfile`) mostly declare version *ranges*,\n * so the scanner can only resolve a version when a dependency is pinned with `==`. The exact resolved\n * environment lives in a lockfile. This module reads the common ones into a name → installed-version\n * index the Python scanner prefers over the declared spec:\n *\n * - poetry.lock / uv.lock / pdm.lock — TOML `[[package]]` array-of-tables (`name`, `version`).\n * - Pipfile.lock — JSON with `default` / `develop` maps of `{ \"version\": \"==x.y.z\" }`.\n *\n * Names are matched after PEP 503 normalization (lowercase; runs of `-`, `_`, `.` collapse to `-`),\n * so `Foo.Bar` in a manifest resolves against `foo-bar` in the lock.\n *\n * Clean-room: parsed from each tool's public, documented lockfile shape with a real TOML parser\n * (`smol-toml`, BSD-3-Clause) for the TOML locks and `JSON.parse` for Pipfile.lock — no AGPL library\n * is used. Only the two fields we need are read from each package entry.\n */\nimport * as path from 'node:path';\nimport { parseToml } from '../utils/toml.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nexport type { LockfileIo } from './npm-lockfile.js';\n\nexport interface PythonLockIndex {\n source: 'poetry' | 'uv' | 'pdm' | 'pipfile';\n /** Distinct packages with a resolved version. */\n size: number;\n /** Installed version for a dependency by name (PEP 503 normalized). */\n resolve(name: string): string | null;\n}\n\n/** PEP 503 name normalization: lowercase, runs of `-` `_` `.` → a single `-`. */\nexport function normalizePyName(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Strip a Pipfile/PEP 440 version marker down to the bare version: `==2.31.0` → `2.31.0`. */\nfunction bareVersion(v: string): string | null {\n const s = v.trim().replace(/^[=~^><!]+\\s*/, '').split(/[,;\\s]/)[0];\n return /^\\d/.test(s) ? s : null;\n}\n\n/**\n * name → version from a TOML lockfile of `[[package]]` tables (poetry / uv / pdm). First occurrence\n * wins. Keys are PEP 503 normalized.\n */\nexport function parsePyTomlLock(text: string): Map<string, string> {\n const out = new Map<string, string>();\n const doc = parseToml(text);\n const packages = doc?.package;\n if (!Array.isArray(packages)) return out;\n for (const entry of packages) {\n if (!entry || typeof entry !== 'object') continue;\n const { name, version } = entry as Record<string, unknown>;\n if (typeof name !== 'string' || typeof version !== 'string') continue;\n const key = normalizePyName(name);\n if (!out.has(key)) out.set(key, version);\n }\n return out;\n}\n\n/** name → version from a Pipfile.lock (JSON `default` + `develop` maps). Keys are PEP 503 normalized. */\nexport function parsePipfileLock(json: unknown): Map<string, string> {\n const out = new Map<string, string>();\n if (!json || typeof json !== 'object') return out;\n const doc = json as Record<string, unknown>;\n for (const group of ['default', 'develop']) {\n const deps = doc[group];\n if (!deps || typeof deps !== 'object') continue;\n for (const [name, entry] of Object.entries(deps as Record<string, unknown>)) {\n const v = entry && typeof entry === 'object' ? (entry as Record<string, unknown>).version : undefined;\n if (typeof v !== 'string') continue;\n const bare = bareVersion(v);\n const key = normalizePyName(name);\n if (bare && !out.has(key)) out.set(key, bare);\n }\n }\n return out;\n}\n\nconst TOML_LOCKS: ReadonlyArray<['poetry' | 'uv' | 'pdm', string]> = [\n ['poetry', 'poetry.lock'],\n ['uv', 'uv.lock'],\n ['pdm', 'pdm.lock'],\n];\n\n/** Build a Python lockfile index for a directory, or null when no supported lockfile is present. */\nexport async function loadPythonLockIndex(dir: string, io: LockfileIo): Promise<PythonLockIndex | null> {\n for (const [source, file] of TOML_LOCKS) {\n const p = path.join(dir, file);\n if (!(await io.exists(p).catch(() => false))) continue;\n try {\n const map = parsePyTomlLock(await io.readText(p));\n if (map.size) return { source, size: map.size, resolve: (n) => map.get(normalizePyName(n)) ?? null };\n } catch {\n /* try the next */\n }\n }\n const pipfile = path.join(dir, 'Pipfile.lock');\n if (await io.exists(pipfile).catch(() => false)) {\n try {\n const map = parsePipfileLock(await io.readJson<unknown>(pipfile));\n if (map.size) return { source: 'pipfile', size: map.size, resolve: (n) => map.get(normalizePyName(n)) ?? null };\n } catch {\n /* none usable */\n }\n }\n return null;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, readJsonFile, pathExists, FileCache } from '../utils/fs.js';\nimport { loadPythonLockIndex, type PythonLockIndex } from './python-lockfile.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { PyPICache } from './pypi-cache.js';\nimport { latestStable, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Python frameworks / libraries to track */\nconst KNOWN_PYTHON_FRAMEWORKS: Record<string, string> = {\n // ── Web Frameworks ──\n 'django': 'Django',\n 'flask': 'Flask',\n 'fastapi': 'FastAPI',\n 'starlette': 'Starlette',\n 'tornado': 'Tornado',\n 'bottle': 'Bottle',\n 'sanic': 'Sanic',\n 'falcon': 'Falcon',\n 'aiohttp': 'aiohttp',\n 'quart': 'Quart',\n 'litestar': 'Litestar',\n 'robyn': 'Robyn',\n\n // ── ORM & Database ──\n 'sqlalchemy': 'SQLAlchemy',\n 'django-rest-framework': 'DRF',\n 'djangorestframework': 'DRF',\n 'peewee': 'Peewee',\n 'tortoise-orm': 'Tortoise ORM',\n 'sqlmodel': 'SQLModel',\n 'pony': 'Pony ORM',\n 'alembic': 'Alembic',\n 'psycopg2': 'psycopg2',\n 'psycopg2-binary': 'psycopg2',\n 'psycopg': 'psycopg3',\n 'asyncpg': 'asyncpg',\n 'pymongo': 'PyMongo',\n 'motor': 'Motor',\n 'redis': 'redis-py',\n 'celery': 'Celery',\n 'boto3': 'AWS SDK (boto3)',\n 'botocore': 'AWS SDK (botocore)',\n\n // ── Data Science & ML ──\n 'numpy': 'NumPy',\n 'pandas': 'pandas',\n 'scipy': 'SciPy',\n 'scikit-learn': 'scikit-learn',\n 'tensorflow': 'TensorFlow',\n 'torch': 'PyTorch',\n 'keras': 'Keras',\n 'matplotlib': 'Matplotlib',\n 'seaborn': 'Seaborn',\n 'plotly': 'Plotly',\n 'polars': 'Polars',\n 'dask': 'Dask',\n 'xgboost': 'XGBoost',\n 'lightgbm': 'LightGBM',\n 'transformers': 'Transformers (HF)',\n 'langchain': 'LangChain',\n 'openai': 'OpenAI SDK',\n\n // ── Testing ──\n 'pytest': 'pytest',\n 'unittest2': 'unittest2',\n 'nose2': 'nose2',\n 'tox': 'tox',\n 'hypothesis': 'Hypothesis',\n 'factory-boy': 'factory_boy',\n 'faker': 'Faker',\n 'coverage': 'Coverage.py',\n 'responses': 'responses',\n 'httpx': 'HTTPX',\n\n // ── Async & Tasks ──\n 'uvicorn': 'Uvicorn',\n 'gunicorn': 'Gunicorn',\n 'hypercorn': 'Hypercorn',\n 'dramatiq': 'Dramatiq',\n 'rq': 'RQ',\n 'huey': 'Huey',\n\n // ── Auth & Security ──\n 'pyjwt': 'PyJWT',\n 'authlib': 'Authlib',\n 'python-jose': 'python-jose',\n 'passlib': 'Passlib',\n 'cryptography': 'cryptography',\n\n // ── Serialization & Validation ──\n 'pydantic': 'Pydantic',\n 'marshmallow': 'Marshmallow',\n 'attrs': 'attrs',\n 'cerberus': 'Cerberus',\n 'msgpack': 'msgpack',\n 'protobuf': 'protobuf',\n\n // ── HTTP Clients ──\n 'requests': 'Requests',\n 'urllib3': 'urllib3',\n\n // ── DevOps & Infrastructure ──\n 'ansible': 'Ansible',\n 'fabric': 'Fabric',\n 'invoke': 'Invoke',\n 'paramiko': 'Paramiko',\n\n // ── Linting & Formatting ──\n 'black': 'Black',\n 'ruff': 'Ruff',\n 'flake8': 'Flake8',\n 'mypy': 'mypy',\n 'pylint': 'Pylint',\n 'isort': 'isort',\n 'bandit': 'Bandit',\n\n // ── Logging & Observability ──\n 'structlog': 'structlog',\n 'loguru': 'Loguru',\n 'sentry-sdk': 'Sentry SDK',\n 'opentelemetry-api': 'OpenTelemetry',\n 'prometheus-client': 'prometheus-client',\n};\n\n// Latest Python major.minor is resolved at scan time — see runtime-baselines.ts\n\ninterface PythonDependency {\n name: string;\n spec: string;\n /** Normalised name for PyPI lookup (lowercase, hyphens) */\n normalisedName: string;\n}\n\n/**\n * Parse a PEP 508 requirement line:\n * package==1.0.0\n * package>=1.0,<2.0\n * package~=1.0\n * package[extras]==1.0\n * package ; python_version >= \"3.8\"\n */\nfunction parseRequirementLine(line: string): PythonDependency | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-')) return null;\n\n // Strip environment markers (after ;)\n const withoutMarkers = trimmed.split(';')[0]!.trim();\n\n // Match package name (possibly with extras), then version spec\n const match = withoutMarkers.match(/^([A-Za-z0-9][-A-Za-z0-9_.]*[A-Za-z0-9]?)(?:\\[.*?\\])?\\s*(.*)?$/);\n if (!match) return null;\n\n const rawName = match[1]!;\n const spec = (match[2] ?? '').trim();\n\n // Normalise: PEP 503 — lowercase, replace underscores/dots with hyphens\n const normalisedName = rawName.toLowerCase().replace(/[_.]+/g, '-');\n\n return { name: rawName, spec, normalisedName };\n}\n\n/**\n * Extract a pinned version from a PEP 508 spec.\n * Returns the version if pinned (==), or null otherwise.\n */\nfunction extractPinnedVersion(spec: string): string | null {\n const match = spec.match(/^==\\s*([^\\s,;]+)/);\n return match?.[1] ?? null;\n}\n\n/**\n * Convert a PEP 440 version to semver where possible (best-effort).\n */\nfunction pep440ToSemver(ver: string): string | null {\n let v = ver.replace(/^[vV]/, '').trim();\n if (/(?:a\\d|b\\d|rc\\d|alpha|beta|dev|post)/i.test(v)) return null;\n const parts = v.split('.');\n while (parts.length < 3) parts.push('0');\n v = parts.slice(0, 3).join('.');\n return semver.valid(v);\n}\n\n// ── File parsers ──\n\nfunction parseRequirementsTxt(content: string): PythonDependency[] {\n const deps: PythonDependency[] = [];\n for (const line of content.split('\\n')) {\n const dep = parseRequirementLine(line);\n if (dep) deps.push(dep);\n }\n return deps;\n}\n\ninterface PyProjectToml {\n pythonVersion?: string;\n dependencies: PythonDependency[];\n projectName?: string;\n}\n\n/**\n * Very lightweight TOML parser — handles the subset we care about:\n * [project] name, requires-python, dependencies array,\n * [tool.poetry.dependencies] table.\n *\n * We don't pull in a full TOML parser to keep deps minimal.\n */\nfunction parsePyprojectToml(content: string): PyProjectToml {\n const result: PyProjectToml = { dependencies: [] };\n\n // Extract project name\n const nameMatch = content.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n if (nameMatch) result.projectName = nameMatch[1];\n\n // Extract requires-python\n const pyVerMatch = content.match(/^\\s*requires-python\\s*=\\s*\"([^\"]+)\"/m);\n if (pyVerMatch) result.pythonVersion = pyVerMatch[1];\n\n // Parse [project] dependencies = [...]\n const depsBlockMatch = content.match(/^\\s*dependencies\\s*=\\s*\\[([\\s\\S]*?)\\]/m);\n if (depsBlockMatch) {\n const block = depsBlockMatch[1]!;\n // Each line is a quoted string\n const lineRegex = /\"([^\"]+)\"/g;\n let m: RegExpExecArray | null;\n while ((m = lineRegex.exec(block)) !== null) {\n const dep = parseRequirementLine(m[1]!);\n if (dep) result.dependencies.push(dep);\n }\n }\n\n // Parse [tool.poetry.dependencies] section\n const poetrySection = content.match(/\\[tool\\.poetry\\.dependencies\\]([\\s\\S]*?)(?=\\n\\s*\\[|\\n*$)/);\n if (poetrySection) {\n const lines = poetrySection[1]!.split('\\n');\n for (const line of lines) {\n const kv = line.match(/^\\s*([A-Za-z0-9][-A-Za-z0-9_.]*)\\s*=\\s*(?:\"([^\"]+)\"|{.*?version\\s*=\\s*\"([^\"]+)\".*?})/);\n if (kv) {\n const name = kv[1]!;\n if (name.toLowerCase() === 'python') {\n result.pythonVersion = kv[2] ?? kv[3] ?? undefined;\n continue;\n }\n const ver = kv[2] ?? kv[3] ?? '';\n const normalisedName = name.toLowerCase().replace(/[_.]+/g, '-');\n result.dependencies.push({ name, spec: ver ? `==${ver}` : '', normalisedName });\n }\n }\n }\n\n return result;\n}\n\nfunction parsePipfile(content: string): PythonDependency[] {\n const deps: PythonDependency[] = [];\n // Find [packages] section\n const packagesMatch = content.match(/\\[packages\\]([\\s\\S]*?)(?=\\n\\s*\\[|\\n*$)/);\n if (packagesMatch) {\n const lines = packagesMatch[1]!.split('\\n');\n for (const line of lines) {\n const kv = line.match(/^\\s*([A-Za-z0-9][-A-Za-z0-9_.]*)\\s*=\\s*(?:\"([^\"]+)\"|{.*?version\\s*=\\s*\"([^\"]+)\".*?}|\\*|\"[*]\")/);\n if (kv) {\n const name = kv[1]!;\n const ver = kv[2] ?? kv[3] ?? '';\n const normalisedName = name.toLowerCase().replace(/[_.]+/g, '-');\n deps.push({ name, spec: ver || '*', normalisedName });\n }\n }\n }\n\n // Find [dev-packages] section\n const devMatch = content.match(/\\[dev-packages\\]([\\s\\S]*?)(?=\\n\\s*\\[|\\n*$)/);\n if (devMatch) {\n const lines = devMatch[1]!.split('\\n');\n for (const line of lines) {\n const kv = line.match(/^\\s*([A-Za-z0-9][-A-Za-z0-9_.]*)\\s*=\\s*(?:\"([^\"]+)\"|{.*?version\\s*=\\s*\"([^\"]+)\".*?}|\\*|\"[*]\")/);\n if (kv) {\n const name = kv[1]!;\n const ver = kv[2] ?? kv[3] ?? '';\n const normalisedName = name.toLowerCase().replace(/[_.]+/g, '-');\n deps.push({ name, spec: ver || '*', normalisedName });\n }\n }\n }\n\n return deps;\n}\n\nfunction parseSetupCfg(content: string): { deps: PythonDependency[]; pythonVersion?: string; name?: string } {\n const result: { deps: PythonDependency[]; pythonVersion?: string; name?: string } = { deps: [] };\n\n // Extract name from [metadata] section\n const metadataSection = content.match(/\\[metadata\\]([\\s\\S]*?)(?=\\n\\s*\\[|\\n*$)/);\n if (metadataSection) {\n const nameMatch = metadataSection[1]!.match(/^\\s*name\\s*=\\s*(.+)$/m);\n if (nameMatch) result.name = nameMatch[1]!.trim();\n }\n\n // Extract python_requires from [options] section\n const optionsSection = content.match(/\\[options\\]([\\s\\S]*?)(?=\\n\\s*\\[|\\n*$)/);\n if (optionsSection) {\n const pyReqMatch = optionsSection[1]!.match(/^\\s*python_requires\\s*=\\s*(.+)$/m);\n if (pyReqMatch) result.pythonVersion = pyReqMatch[1]!.trim();\n\n // Parse install_requires — multiline continuation with indented lines\n const installReqMatch = optionsSection[1]!.match(/install_requires\\s*=\\s*\\n((?:\\s+.*\\n?)*)/);\n if (installReqMatch) {\n const block = installReqMatch[1]!;\n for (const line of block.split('\\n')) {\n const dep = parseRequirementLine(line);\n if (dep) result.deps.push(dep);\n }\n }\n }\n\n return result;\n}\n\n// ── Python project file names ──\n\nconst PYTHON_MANIFEST_FILES = new Set([\n 'requirements.txt',\n 'requirements-dev.txt',\n 'requirements_dev.txt',\n 'requirements-test.txt',\n 'dev-requirements.txt',\n 'pyproject.toml',\n 'setup.py',\n 'setup.cfg',\n 'Pipfile',\n]);\n\n/**\n * Discover and scan all Python projects in the workspace.\n */\nexport async function scanPythonProjects(\n rootDir: string,\n pypiCache: PyPICache,\n cache?: FileCache,\n projectScanTimeout?: number,\n catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG,\n): Promise<ProjectScan[]> {\n // Find Python manifest files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => PYTHON_MANIFEST_FILES.has(name) || /^requirements.*\\.txt$/.test(name))\n : await findPythonManifests(rootDir);\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const [dir, files] of projectDirs) {\n try {\n const scanPromise = scanOnePythonProject(dir, files, rootDir, pypiCache, cache, catalog);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Python project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Python project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findPythonManifests(rootDir: string): Promise<string[]> {\n // Import findFiles dynamically to avoid circular deps\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => PYTHON_MANIFEST_FILES.has(name) || /^requirements.*\\.txt$/.test(name));\n}\n\nasync function scanOnePythonProject(\n dir: string,\n manifestFiles: string[],\n rootDir: string,\n pypiCache: PyPICache,\n cache: FileCache | undefined,\n catalog: RuntimeCatalog,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n let projectName = path.basename(dir === rootDir ? rootDir : dir);\n let pythonVersion: string | undefined;\n const allDeps = new Map<string, PythonDependency>();\n\n // Parse each manifest file, preferring pyproject.toml > setup.cfg > requirements.txt\n for (const f of manifestFiles) {\n const fileName = path.basename(f);\n const content = cache ? await cache.readTextFile(f) : await readTextFile(f);\n\n if (fileName === 'pyproject.toml') {\n const parsed = parsePyprojectToml(content);\n if (parsed.projectName) projectName = parsed.projectName;\n if (parsed.pythonVersion) pythonVersion = parsed.pythonVersion;\n for (const dep of parsed.dependencies) {\n if (!allDeps.has(dep.normalisedName)) allDeps.set(dep.normalisedName, dep);\n }\n } else if (fileName === 'setup.cfg') {\n const parsed = parseSetupCfg(content);\n if (parsed.name) projectName = parsed.name;\n if (parsed.pythonVersion && !pythonVersion) pythonVersion = parsed.pythonVersion;\n for (const dep of parsed.deps) {\n if (!allDeps.has(dep.normalisedName)) allDeps.set(dep.normalisedName, dep);\n }\n } else if (fileName === 'Pipfile') {\n for (const dep of parsePipfile(content)) {\n if (!allDeps.has(dep.normalisedName)) allDeps.set(dep.normalisedName, dep);\n }\n } else if (fileName.startsWith('requirements') && fileName.endsWith('.txt')) {\n for (const dep of parseRequirementsTxt(content)) {\n if (!allDeps.has(dep.normalisedName)) allDeps.set(dep.normalisedName, dep);\n }\n }\n }\n\n // Determine Python runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n\n if (pythonVersion) {\n // Extract minimum required version from specifier (e.g. \">=3.9\" → 3.9)\n const verMatch = pythonVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n const LATEST_PYTHON_MINOR = latestStable(catalog, 'python');\n if (LATEST_PYTHON_MINOR) {\n if (reqMajor === LATEST_PYTHON_MINOR.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_PYTHON_MINOR.minor - reqMinor);\n } else if (reqMajor < LATEST_PYTHON_MINOR.major) {\n // Python 2 is very behind\n runtimeMajorsBehind = LATEST_PYTHON_MINOR.minor + (LATEST_PYTHON_MINOR.major - reqMajor) * 10;\n }\n runtimeLatest = `${LATEST_PYTHON_MINOR.major}.${LATEST_PYTHON_MINOR.minor}`;\n }\n }\n runtimeEol = runtimeEolStatus(catalog, 'python', pythonVersion);\n const cycle = extractCycle('python', pythonVersion);\n if (cycle) runtimeEolDate = eolDate(catalog, 'python', cycle);\n }\n\n // A lockfile (poetry.lock / uv.lock / pdm.lock / Pipfile.lock) pins the exact resolved version of\n // every dependency — the only source of a resolved version when the manifest declares a range\n // rather than `==`. It sits beside the manifest, so load it from this project's directory.\n const lockIo: LockfileIo = {\n exists: (p) => (cache ? cache.pathExists(p) : pathExists(p)),\n readText: (p) => (cache ? cache.readTextFile(p) : readTextFile(p)),\n readJson: <T>(p: string) => (cache ? cache.readJsonFile<T>(p) : readJsonFile<T>(p)),\n };\n const lockIndex: PythonLockIndex | null = await loadPythonLockIndex(dir, lockIo).catch(() => null);\n\n // Resolve dependencies against PyPI\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const depEntries = [...allDeps.values()];\n const metaPromises = depEntries.map(async (dep) => {\n const meta = await pypiCache.get(dep.normalisedName);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Prefer the lockfile's exact version; otherwise fall back to a `==`-pinned spec.\n const locked = lockIndex?.resolve(dep.normalisedName) ?? null;\n const pinnedVersion = locked ?? extractPinnedVersion(dep.spec);\n const resolvedVersion = pinnedVersion ? pep440ToSemver(pinnedVersion) : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n dependencies.push({\n package: dep.name,\n section: 'dependencies',\n currentSpec: dep.spec || '*',\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.normalisedName in KNOWN_PYTHON_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_PYTHON_FRAMEWORKS[dep.normalisedName]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files (use cached walk to avoid redundant I/O)\n let fileCount: number | undefined;\n try {\n fileCount = cache\n ? await cache.countFilesUnder(rootDir, dir)\n : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'python',\n path: relDir,\n name: projectName,\n runtime: pythonVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Gradle dependency-lock resolution (clean-room, zero-dependency).\n *\n * Gradle's optional dependency locking writes a `gradle.lockfile` pinning the exact resolved version\n * of every dependency, one per line as `group:artifact:version=<configurations>`. This module reads\n * it into a `group:artifact` → version index the Java scanner prefers over the version declared in\n * `build.gradle` (which is often a dynamic version like `1.+` or supplied by a BOM/platform).\n *\n * Maven has no comparable standard lockfile, so this applies to Gradle projects only; a pom.xml-only\n * project simply has no `gradle.lockfile` and the loader returns null.\n *\n * Clean-room: parsed from Gradle's public, documented lockfile line format — no third-party parser or\n * AGPL library is used.\n */\nimport * as path from 'node:path';\nimport type { LockfileIo } from './npm-lockfile.js';\nexport type { LockfileIo } from './npm-lockfile.js';\n\nexport interface GradleLockIndex {\n /** Distinct `group:artifact` coordinates with a resolved version. */\n size: number;\n /** Installed version for a `group:artifact` coordinate. */\n resolve(coordinate: string): string | null;\n}\n\n// `group:artifact:version=conf1,conf2`. group/artifact may contain `.` and `-` but not `:` or `=`.\nconst LINE = /^([^:=\\s]+):([^:=\\s]+):([^=\\s]+)=/;\n\n/** `group:artifact` → resolved version from a gradle.lockfile. */\nexport function parseGradleLockfile(text: string): Map<string, string> {\n const out = new Map<string, string>();\n if (!text) return out;\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (!line || line.startsWith('#') || line.startsWith('empty=')) continue;\n const m = LINE.exec(line);\n if (!m) continue;\n const coordinate = `${m[1]}:${m[2]}`;\n if (!out.has(coordinate)) out.set(coordinate, m[3]);\n }\n return out;\n}\n\n/** Build a gradle.lockfile index for a directory, or null when none is present/usable. */\nexport async function loadGradleLockIndex(dir: string, io: LockfileIo): Promise<GradleLockIndex | null> {\n const lockPath = path.join(dir, 'gradle.lockfile');\n if (!(await io.exists(lockPath).catch(() => false))) return null;\n try {\n const map = parseGradleLockfile(await io.readText(lockPath));\n if (!map.size) return null;\n return { size: map.size, resolve: (coordinate) => map.get(coordinate) ?? null };\n } catch {\n return null;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { XMLParser } from 'fast-xml-parser';\nimport { readTextFile, readJsonFile, pathExists, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { MavenCache } from './maven-cache.js';\nimport { loadGradleLockIndex, type GradleLockIndex } from './gradle-lockfile.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nimport { latestLts, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework, ProjectReference } from '../types.js';\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n});\n\n/** Well-known Java frameworks and libraries to track */\nconst KNOWN_JAVA_FRAMEWORKS: Record<string, string> = {\n // ── Spring ──\n 'org.springframework.boot:spring-boot-starter-web': 'Spring Boot Web',\n 'org.springframework.boot:spring-boot-starter': 'Spring Boot',\n 'org.springframework.boot:spring-boot-starter-data-jpa': 'Spring Data JPA',\n 'org.springframework.boot:spring-boot-starter-security': 'Spring Security',\n 'org.springframework.boot:spring-boot-starter-webflux': 'Spring WebFlux',\n 'org.springframework.boot:spring-boot-starter-actuator': 'Spring Actuator',\n 'org.springframework.boot:spring-boot-starter-test': 'Spring Boot Test',\n 'org.springframework:spring-core': 'Spring Framework',\n 'org.springframework:spring-web': 'Spring Web',\n 'org.springframework:spring-webmvc': 'Spring MVC',\n 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client': 'Spring Cloud Eureka',\n 'org.springframework.cloud:spring-cloud-starter-gateway': 'Spring Cloud Gateway',\n 'org.springframework.kafka:spring-kafka': 'Spring Kafka',\n\n // ── Jakarta / Java EE ──\n 'jakarta.platform:jakarta.jakartaee-api': 'Jakarta EE',\n 'jakarta.servlet:jakarta.servlet-api': 'Jakarta Servlet',\n 'javax.servlet:javax.servlet-api': 'Java Servlet (Legacy)',\n\n // ── Micronaut ──\n 'io.micronaut:micronaut-core': 'Micronaut',\n 'io.micronaut:micronaut-http-server-netty': 'Micronaut HTTP',\n\n // ── Quarkus ──\n 'io.quarkus:quarkus-core': 'Quarkus',\n 'io.quarkus:quarkus-resteasy': 'Quarkus RESTEasy',\n 'io.quarkus:quarkus-resteasy-reactive': 'Quarkus RESTEasy Reactive',\n\n // ── Vert.x ──\n 'io.vertx:vertx-core': 'Vert.x',\n 'io.vertx:vertx-web': 'Vert.x Web',\n\n // ── ORM & Database ──\n 'org.hibernate.orm:hibernate-core': 'Hibernate',\n 'org.hibernate:hibernate-core': 'Hibernate',\n 'org.mybatis:mybatis': 'MyBatis',\n 'org.mybatis.spring.boot:mybatis-spring-boot-starter': 'MyBatis Spring Boot',\n 'org.jooq:jooq': 'jOOQ',\n 'org.flywaydb:flyway-core': 'Flyway',\n 'org.liquibase:liquibase-core': 'Liquibase',\n 'com.zaxxer:HikariCP': 'HikariCP',\n 'org.postgresql:postgresql': 'PostgreSQL JDBC',\n 'com.mysql:mysql-connector-j': 'MySQL Connector',\n 'mysql:mysql-connector-java': 'MySQL Connector (Legacy)',\n 'com.oracle.database.jdbc:ojdbc11': 'Oracle JDBC',\n 'org.mongodb:mongodb-driver-sync': 'MongoDB Driver',\n 'io.lettuce:lettuce-core': 'Lettuce (Redis)',\n 'redis.clients:jedis': 'Jedis (Redis)',\n\n // ── Messaging ──\n 'org.apache.kafka:kafka-clients': 'Apache Kafka',\n 'com.rabbitmq:amqp-client': 'RabbitMQ Client',\n 'software.amazon.awssdk:sqs': 'AWS SQS',\n 'software.amazon.awssdk:sns': 'AWS SNS',\n\n // ── HTTP & API ──\n 'com.squareup.okhttp3:okhttp': 'OkHttp',\n 'com.squareup.retrofit2:retrofit': 'Retrofit',\n 'org.apache.httpcomponents.client5:httpclient5': 'Apache HttpClient 5',\n 'io.grpc:grpc-netty': 'gRPC',\n 'com.graphql-java:graphql-java': 'GraphQL Java',\n 'com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter': 'Netflix DGS',\n\n // ── JSON ──\n 'com.fasterxml.jackson.core:jackson-databind': 'Jackson',\n 'com.google.code.gson:gson': 'Gson',\n\n // ── Testing ──\n 'junit:junit': 'JUnit 4',\n 'org.junit.jupiter:junit-jupiter': 'JUnit 5',\n 'org.junit.jupiter:junit-jupiter-api': 'JUnit 5',\n 'org.mockito:mockito-core': 'Mockito',\n 'org.assertj:assertj-core': 'AssertJ',\n 'org.testcontainers:testcontainers': 'Testcontainers',\n 'io.rest-assured:rest-assured': 'REST Assured',\n 'org.awaitility:awaitility': 'Awaitility',\n 'com.tngtech.archunit:archunit-junit5': 'ArchUnit',\n 'org.hamcrest:hamcrest': 'Hamcrest',\n\n // ── Logging ──\n 'org.slf4j:slf4j-api': 'SLF4J',\n 'ch.qos.logback:logback-classic': 'Logback',\n 'org.apache.logging.log4j:log4j-core': 'Log4j2',\n\n // ── Build Plugins (tracked as frameworks) ──\n 'org.projectlombok:lombok': 'Lombok',\n 'org.mapstruct:mapstruct': 'MapStruct',\n\n // ── Cloud SDKs ──\n 'software.amazon.awssdk:bom': 'AWS SDK v2',\n 'com.google.cloud:google-cloud-bom': 'Google Cloud SDK',\n 'com.azure:azure-sdk-bom': 'Azure SDK',\n\n // ── Security ──\n 'io.jsonwebtoken:jjwt-api': 'JJWT',\n 'com.nimbusds:nimbus-jose-jwt': 'Nimbus JOSE+JWT',\n\n // ── Observability ──\n 'io.micrometer:micrometer-core': 'Micrometer',\n 'io.opentelemetry:opentelemetry-api': 'OpenTelemetry',\n 'io.prometheus:simpleclient': 'Prometheus Client',\n\n // ── Reactive ──\n 'io.projectreactor:reactor-core': 'Project Reactor',\n 'io.reactivex.rxjava3:rxjava': 'RxJava 3',\n};\n\n// Latest Java LTS is resolved at scan time — see runtime-baselines.ts\n\n// ── POM parsing ──\n\ninterface PomDependency {\n groupId: string;\n artifactId: string;\n version: string;\n scope?: string;\n}\n\ninterface PomData {\n groupId?: string;\n artifactId: string;\n version?: string;\n packaging?: string;\n javaVersion?: string;\n dependencies: PomDependency[];\n modules: string[];\n parent?: { groupId: string; artifactId: string; version: string };\n properties: Record<string, string>;\n}\n\nfunction parsePom(xml: string, filePath: string): PomData {\n const parsed = parser.parse(xml);\n const project = parsed?.project;\n if (!project) {\n return {\n artifactId: path.basename(path.dirname(filePath)),\n dependencies: [],\n modules: [],\n properties: {},\n };\n }\n\n const properties: Record<string, string> = {};\n if (project.properties && typeof project.properties === 'object') {\n for (const [key, val] of Object.entries(project.properties)) {\n if (typeof val === 'string' || typeof val === 'number') {\n properties[key] = String(val);\n }\n }\n }\n\n // Extract Java version from properties\n let javaVersion: string | undefined;\n const javaProps = [\n 'java.version', 'maven.compiler.source', 'maven.compiler.target',\n 'maven.compiler.release', 'java.source.version',\n ];\n for (const prop of javaProps) {\n if (properties[prop]) {\n javaVersion = String(properties[prop]);\n break;\n }\n }\n\n // Extract dependencies\n const depContainer = project.dependencies;\n const rawDeps = depContainer?.dependency\n ? (Array.isArray(depContainer.dependency) ? depContainer.dependency : [depContainer.dependency])\n : [];\n\n const dependencies: PomDependency[] = rawDeps\n .filter((d: Record<string, unknown>) => d.groupId && d.artifactId)\n .map((d: Record<string, unknown>) => ({\n groupId: resolveProperty(String(d.groupId ?? ''), properties),\n artifactId: resolveProperty(String(d.artifactId ?? ''), properties),\n version: resolveProperty(String(d.version ?? ''), properties),\n scope: d.scope ? String(d.scope) : undefined,\n }));\n\n // Also get dependencyManagement dependencies\n const mgmt = project.dependencyManagement?.dependencies;\n const mgmtDeps = mgmt?.dependency\n ? (Array.isArray(mgmt.dependency) ? mgmt.dependency : [mgmt.dependency])\n : [];\n\n for (const d of mgmtDeps) {\n if (d.groupId && d.artifactId && d.version) {\n dependencies.push({\n groupId: resolveProperty(String(d.groupId), properties),\n artifactId: resolveProperty(String(d.artifactId), properties),\n version: resolveProperty(String(d.version), properties),\n scope: d.scope ? String(d.scope) : undefined,\n });\n }\n }\n\n // Modules\n const rawModules = project.modules?.module\n ? (Array.isArray(project.modules.module) ? project.modules.module : [project.modules.module])\n : [];\n const modules = rawModules.map(String);\n\n // Parent\n let parent: PomData['parent'];\n if (project.parent?.groupId && project.parent?.artifactId) {\n parent = {\n groupId: String(project.parent.groupId),\n artifactId: String(project.parent.artifactId),\n version: String(project.parent.version ?? ''),\n };\n }\n\n return {\n groupId: project.groupId ? String(project.groupId) : parent?.groupId,\n artifactId: String(project.artifactId ?? path.basename(path.dirname(filePath))),\n version: project.version ? String(project.version) : parent?.version,\n packaging: project.packaging ? String(project.packaging) : undefined,\n javaVersion,\n dependencies,\n modules,\n parent,\n properties,\n };\n}\n\nfunction resolveProperty(value: string, properties: Record<string, string>): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => properties[key] ?? `\\${${key}}`);\n}\n\n// ── Gradle parsing ──\n\ninterface GradleDependency {\n groupId: string;\n artifactId: string;\n version: string;\n configuration: string;\n}\n\ninterface GradleData {\n javaVersion?: string;\n dependencies: GradleDependency[];\n projectName: string;\n}\n\nfunction parseGradleBuild(content: string, filePath: string): GradleData {\n const deps: GradleDependency[] = [];\n const projectName = path.basename(path.dirname(filePath));\n\n // Detect Java/JVM version\n let javaVersion: string | undefined;\n\n // sourceCompatibility/targetCompatibility = '17'\n const compatMatch = content.match(/(?:sourceCompatibility|targetCompatibility|javaVersion)\\s*[=:]\\s*['\"]?(?:JavaVersion\\.VERSION_)?(\\d+)['\"]?/);\n if (compatMatch) javaVersion = compatMatch[1];\n\n // java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }\n const toolchainMatch = content.match(/JavaLanguageVersion\\.of\\((\\d+)\\)/);\n if (toolchainMatch) javaVersion = toolchainMatch[1];\n\n // Parse dependencies: implementation 'group:artifact:version'\n const depRegex = /(?:implementation|api|compileOnly|runtimeOnly|testImplementation|testRuntimeOnly|annotationProcessor|kapt)\\s*(?:\\(?\\s*)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n while ((match = depRegex.exec(content)) !== null) {\n const parts = match[1]!.split(':');\n if (parts.length >= 2) {\n deps.push({\n groupId: parts[0]!,\n artifactId: parts[1]!,\n version: parts[2] ?? '',\n configuration: match[0]!.split(/\\s/)[0]!,\n });\n }\n }\n\n // Parse Kotlin DSL: implementation(\"group:artifact:version\")\n const kotlinDepRegex = /(?:implementation|api|compileOnly|runtimeOnly|testImplementation|testRuntimeOnly|annotationProcessor|kapt)\\s*\\(\\s*\"([^\"]+)\"\\s*\\)/g;\n while ((match = kotlinDepRegex.exec(content)) !== null) {\n const parts = match[1]!.split(':');\n if (parts.length >= 2) {\n // Only add if not already captured\n const key = `${parts[0]}:${parts[1]}`;\n if (!deps.some((d) => `${d.groupId}:${d.artifactId}` === key)) {\n deps.push({\n groupId: parts[0]!,\n artifactId: parts[1]!,\n version: parts[2] ?? '',\n configuration: match[0]!.split(/\\s/)[0]!,\n });\n }\n }\n }\n\n // Parse platform/BOM dependencies\n const platformRegex = /(?:implementation|api)\\s*(?:\\(?\\s*)?platform\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n while ((match = platformRegex.exec(content)) !== null) {\n const parts = match[1]!.split(':');\n if (parts.length >= 2) {\n deps.push({\n groupId: parts[0]!,\n artifactId: parts[1]!,\n version: parts[2] ?? '',\n configuration: 'platform',\n });\n }\n }\n\n return { javaVersion, dependencies: deps, projectName };\n}\n\n/**\n * Convert a Maven version string to semver where possible.\n */\nfunction mavenToSemver(ver: string): string | null {\n let v = ver.trim();\n if (!v || v.includes('$')) return null;\n // Maven pre-release markers — both hyphen (-alpha, -rc) and dot (.Beta1, .RC1) forms\n if (/(?:[-.](?:SNAPSHOT|alpha|beta|rc|M\\d+|CR\\d+))/i.test(v)) return null;\n v = v.replace(/\\.(?:RELEASE|Final|GA)$/i, '');\n const parts = v.split('.');\n while (parts.length < 3) parts.push('0');\n v = parts.slice(0, 3).join('.');\n return semver.valid(v);\n}\n\n// ── Main scanner ──\n\nconst JAVA_MANIFEST_FILES = new Set(['pom.xml', 'build.gradle', 'build.gradle.kts']);\n\nexport async function scanJavaProjects(\n rootDir: string,\n mavenCache: MavenCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG,\n): Promise<ProjectScan[]> {\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => JAVA_MANIFEST_FILES.has(name))\n : await findJavaManifests(rootDir);\n\n // Group by directory\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const [dir, files] of projectDirs) {\n try {\n const scanPromise = scanOneJavaProject(dir, files, rootDir, mavenCache, cache, catalog);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Java project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Java project ${dir}: ${msg}`);\n }\n }\n\n // Resolve module references between projects\n const projectPathMap = new Map<string, string>();\n for (const p of results) {\n projectPathMap.set(p.name, p.path);\n }\n\n return results;\n}\n\nasync function findJavaManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => JAVA_MANIFEST_FILES.has(name));\n}\n\nasync function scanOneJavaProject(\n dir: string,\n manifestFiles: string[],\n rootDir: string,\n mavenCache: MavenCache,\n cache: FileCache | undefined,\n catalog: RuntimeCatalog,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n let projectName = path.basename(dir === rootDir ? rootDir : dir);\n let javaVersion: string | undefined;\n const allDeps = new Map<string, { groupId: string; artifactId: string; version: string }>();\n const projectReferences: ProjectReference[] = [];\n\n // Parse manifests — prefer pom.xml over Gradle\n for (const f of manifestFiles) {\n const fileName = path.basename(f);\n const content = cache ? await cache.readTextFile(f) : await readTextFile(f);\n\n if (fileName === 'pom.xml') {\n const pom = parsePom(content, f);\n if (pom.artifactId) projectName = pom.artifactId;\n if (pom.javaVersion) javaVersion = pom.javaVersion;\n\n for (const dep of pom.dependencies) {\n const key = `${dep.groupId}:${dep.artifactId}`;\n if (!allDeps.has(key) && dep.version && !dep.version.includes('${')) {\n allDeps.set(key, dep);\n }\n }\n\n // Module references\n for (const mod of pom.modules) {\n projectReferences.push({\n path: path.join(relDir, mod),\n name: mod,\n refType: 'project',\n });\n }\n } else if (fileName === 'build.gradle' || fileName === 'build.gradle.kts') {\n const gradle = parseGradleBuild(content, f);\n if (gradle.projectName) projectName = gradle.projectName;\n if (gradle.javaVersion) javaVersion = gradle.javaVersion;\n\n for (const dep of gradle.dependencies) {\n const key = `${dep.groupId}:${dep.artifactId}`;\n if (!allDeps.has(key) && dep.version) {\n allDeps.set(key, dep);\n }\n }\n }\n }\n\n // Determine Java runtime lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n const javaLts = latestLts(catalog, 'java')?.major;\n const runtimeLatest = javaLts !== undefined ? String(javaLts) : undefined;\n\n if (javaVersion) {\n const jvMatch = javaVersion.match(/^(1\\.)?(\\d+)/);\n if (jvMatch) {\n // Handle \"1.8\" → 8, \"11\" → 11, \"17\" → 17\n const major = jvMatch[1] ? parseInt(jvMatch[2]!, 10) : parseInt(jvMatch[2]!, 10);\n if (javaLts !== undefined) runtimeMajorsBehind = Math.max(0, javaLts - major);\n }\n runtimeEol = runtimeEolStatus(catalog, 'java', javaVersion);\n const cycle = extractCycle('java', javaVersion);\n if (cycle) runtimeEolDate = eolDate(catalog, 'java', cycle);\n }\n\n // Gradle's optional dependency locking pins exact resolved versions in gradle.lockfile (beside\n // build.gradle). Prefer it over the declared/BOM-supplied version. Maven projects have no such\n // file, so this is a no-op there.\n const lockIo: LockfileIo = {\n exists: (p) => (cache ? cache.pathExists(p) : pathExists(p)),\n readText: (p) => (cache ? cache.readTextFile(p) : readTextFile(p)),\n readJson: <T>(p: string) => (cache ? cache.readJsonFile<T>(p) : readJsonFile<T>(p)),\n };\n const lockIndex: GradleLockIndex | null = await loadGradleLockIndex(dir, lockIo).catch(() => null);\n\n // Resolve dependencies against Maven Central\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n const depEntries = [...allDeps.entries()];\n const metaPromises = depEntries.map(async ([key, dep]) => {\n const meta = await mavenCache.get(dep.groupId, dep.artifactId);\n return { key, dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { key, dep, meta } of resolved) {\n // Prefer the lockfile's exact version for this coordinate; else the declared version.\n const lockedVersion = lockIndex?.resolve(key) ?? null;\n const resolvedVersion = mavenToSemver(lockedVersion ?? dep.version);\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current';\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n dependencies.push({\n package: key,\n section: 'dependencies',\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (key in KNOWN_JAVA_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_JAVA_FRAMEWORKS[key]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files (use cached walk to avoid redundant I/O)\n let fileCount: number | undefined;\n try {\n fileCount = cache\n ? await cache.countFilesUnder(rootDir, dir)\n : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'java',\n path: relDir,\n name: projectName,\n runtime: javaVersion ? `Java ${javaVersion}` : undefined,\n runtimeLatest,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n targetFramework: javaVersion ? `Java ${javaVersion}` : undefined,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n projectReferences: projectReferences.length > 0 ? projectReferences : undefined,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Gemfile.lock resolution (clean-room, zero-dependency).\n *\n * A `Gemfile` declares version *constraints* (`gem \"rails\", \"~> 7.1\"`); the exact resolved versions\n * live in `Gemfile.lock`. Bundler writes each resolved gem under a `specs:` block as `name (version)`\n * at four-space indent, with that gem's own dependency *constraints* nested one level deeper (six\n * spaces) — those are NOT resolved versions and must be ignored. This module reads the resolved gems\n * into a name → installed-version index the Ruby scanner prefers over the declared constraint.\n *\n * Clean-room: parsed from Bundler's public, documented lockfile layout — no third-party parser or\n * AGPL library is used.\n */\nimport * as path from 'node:path';\nimport type { LockfileIo } from './npm-lockfile.js';\nexport type { LockfileIo } from './npm-lockfile.js';\n\nexport interface GemfileLockIndex {\n /** Distinct gems with a resolved version. */\n size: number;\n /** Installed version for a gem by name. */\n resolve(name: string): string | null;\n}\n\n// A resolved gem line: exactly four leading spaces, `name (version)`. Six-space sub-dependency lines\n// (whose versions look like `= 7.1.2` / `>= 1.0`) fail the four-space anchor and the digit check.\nconst SPEC_LINE = /^ {4}([A-Za-z0-9._-]+) \\(([^()]+)\\)\\s*$/;\n\n/** name → resolved version from a Gemfile.lock, across all GEM/GIT/PATH `specs:` blocks. */\nexport function parseGemfileLock(text: string): Map<string, string> {\n const out = new Map<string, string>();\n if (!text) return out;\n for (const raw of text.split('\\n')) {\n const m = SPEC_LINE.exec(raw);\n if (!m) continue;\n const name = m[1];\n // Drop a platform suffix (`1.15.5-x86_64-linux` → `1.15.5`); a constraint (`= 7.1.2`) starts\n // with a non-digit and is rejected.\n const version = m[2].split('-')[0].trim();\n if (!/^\\d/.test(version)) continue;\n if (!out.has(name)) out.set(name, version);\n }\n return out;\n}\n\n/** Build a Gemfile.lock index for a directory, or null when none is present/usable. */\nexport async function loadGemfileLockIndex(dir: string, io: LockfileIo): Promise<GemfileLockIndex | null> {\n const lockPath = path.join(dir, 'Gemfile.lock');\n if (!(await io.exists(lockPath).catch(() => false))) return null;\n try {\n const map = parseGemfileLock(await io.readText(lockPath));\n if (!map.size) return null;\n return { size: map.size, resolve: (name) => map.get(name) ?? null };\n } catch {\n return null;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, readJsonFile, pathExists, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { RubyGemsCache } from './rubygems-cache.js';\nimport { loadGemfileLockIndex, type GemfileLockIndex } from './gemfile-lock.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nimport { latestStable, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Ruby frameworks / libraries to track */\nconst KNOWN_RUBY_FRAMEWORKS: Record<string, string> = {\n // ── Web Frameworks ──\n 'rails': 'Ruby on Rails',\n 'sinatra': 'Sinatra',\n 'hanami': 'Hanami',\n 'padrino': 'Padrino',\n 'roda': 'Roda',\n 'grape': 'Grape',\n 'cuba': 'Cuba',\n 'camping': 'Camping',\n 'ramaze': 'Ramaze',\n\n // ── API & Serialization ──\n 'jsonapi-resources': 'JSONAPI::Resources',\n 'active_model_serializers': 'AMS',\n 'blueprinter': 'Blueprinter',\n 'alba': 'Alba',\n 'grape-entity': 'Grape Entity',\n 'jbuilder': 'Jbuilder',\n 'graphql': 'GraphQL Ruby',\n\n // ── ORM & Database ──\n 'activerecord': 'ActiveRecord',\n 'sequel': 'Sequel',\n 'rom-rb': 'ROM',\n 'mongoid': 'Mongoid',\n 'redis': 'redis-rb',\n 'pg': 'pg (PostgreSQL)',\n 'mysql2': 'mysql2',\n 'sqlite3': 'sqlite3',\n\n // ── Background Jobs ──\n 'sidekiq': 'Sidekiq',\n 'resque': 'Resque',\n 'delayed_job': 'Delayed Job',\n 'good_job': 'GoodJob',\n 'solid_queue': 'Solid Queue',\n 'que': 'Que',\n\n // ── Testing ──\n 'rspec': 'RSpec',\n 'rspec-rails': 'RSpec Rails',\n 'minitest': 'Minitest',\n 'capybara': 'Capybara',\n 'factory_bot': 'FactoryBot',\n 'factory_bot_rails': 'FactoryBot Rails',\n 'faker': 'Faker',\n 'shoulda-matchers': 'Shoulda Matchers',\n 'vcr': 'VCR',\n 'webmock': 'WebMock',\n 'simplecov': 'SimpleCov',\n 'cucumber': 'Cucumber',\n\n // ── Authentication & Authorization ──\n 'devise': 'Devise',\n 'omniauth': 'OmniAuth',\n 'pundit': 'Pundit',\n 'cancancan': 'CanCanCan',\n 'rodauth': 'Rodauth',\n 'jwt': 'JWT',\n 'doorkeeper': 'Doorkeeper',\n\n // ── Frontend & Assets ──\n 'turbo-rails': 'Turbo',\n 'stimulus-rails': 'Stimulus',\n 'importmap-rails': 'Importmap Rails',\n 'sprockets': 'Sprockets',\n 'webpacker': 'Webpacker',\n 'cssbundling-rails': 'CSS Bundling',\n 'jsbundling-rails': 'JS Bundling',\n 'tailwindcss-rails': 'Tailwind CSS Rails',\n 'propshaft': 'Propshaft',\n\n // ── HTTP Clients ──\n 'faraday': 'Faraday',\n 'httparty': 'HTTParty',\n 'rest-client': 'REST Client',\n 'typhoeus': 'Typhoeus',\n 'httpx': 'HTTPX',\n\n // ── Server ──\n 'puma': 'Puma',\n 'unicorn': 'Unicorn',\n 'thin': 'Thin',\n 'passenger': 'Passenger',\n 'falcon': 'Falcon',\n\n // ── DevOps & Deployment ──\n 'capistrano': 'Capistrano',\n 'kamal': 'Kamal',\n 'mina': 'Mina',\n\n // ── Monitoring & Logging ──\n 'sentry-ruby': 'Sentry',\n 'sentry-rails': 'Sentry Rails',\n 'newrelic_rpm': 'New Relic',\n 'datadog': 'Datadog',\n 'lograge': 'Lograge',\n\n // ── Linting & Code Quality ──\n 'rubocop': 'RuboCop',\n 'rubocop-rails': 'RuboCop Rails',\n 'rubocop-rspec': 'RuboCop RSpec',\n 'rubocop-performance': 'RuboCop Performance',\n 'brakeman': 'Brakeman',\n 'bundler-audit': 'Bundler Audit',\n 'standard': 'Standard',\n\n // ── Pagination & Search ──\n 'kaminari': 'Kaminari',\n 'pagy': 'Pagy',\n 'ransack': 'Ransack',\n 'searchkick': 'Searchkick',\n 'elasticsearch-rails': 'Elasticsearch Rails',\n\n // ── File Uploads ──\n 'carrierwave': 'CarrierWave',\n 'shrine': 'Shrine',\n 'active_storage': 'Active Storage',\n\n // ── Admin & CMS ──\n 'activeadmin': 'ActiveAdmin',\n 'administrate': 'Administrate',\n 'avo': 'Avo',\n\n // ── State Machine ──\n 'aasm': 'AASM',\n 'statesman': 'Statesman',\n\n // ── Configuration & Environment ──\n 'dotenv': 'dotenv',\n 'figaro': 'Figaro',\n};\n\n// Latest Ruby major.minor is resolved at scan time — see runtime-baselines.ts\n\ninterface RubyDependency {\n name: string;\n spec: string;\n /** Group: :default, :development, :test */\n group: 'default' | 'development' | 'test';\n}\n\n/**\n * Parse a Gemfile line to extract gem name and version constraint.\n *\n * Handles:\n * gem 'rails', '~> 7.1'\n * gem 'pg', '>= 0.18', '< 2.0'\n * gem \"puma\", \"~> 6.0\"\n * gem 'sidekiq'\n * gem 'rspec-rails', group: :development\n */\nfunction parseGemfileLine(line: string): { name: string; spec: string } | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n // Match gem 'name' or gem \"name\" possibly followed by version constraints\n const match = trimmed.match(\n /^\\s*gem\\s+['\"]([^'\"]+)['\"]\\s*(?:,\\s*['\"]([^'\"]+)['\"])?/,\n );\n if (!match) return null;\n\n const name = match[1]!;\n const spec = match[2] ?? '*';\n\n return { name, spec };\n}\n\n/**\n * Extract pinned or minimum version from a Ruby version constraint.\n * Examples:\n * '~> 7.1' → '7.1.0'\n * '~> 7.1.3' → '7.1.3'\n * '>= 3.0.0' → '3.0.0'\n * '= 7.0.8' → '7.0.8'\n * '2.0.0' → '2.0.0'\n * Returns null if no version can be extracted.\n */\nfunction extractGemVersion(spec: string): string | null {\n if (spec === '*') return null;\n\n // Match version number after optional operator\n const match = spec.match(/(?:~>|>=|>|=|<=|<)?\\s*(\\d+(?:\\.\\d+)*)/);\n if (!match) return null;\n\n return match[1]!;\n}\n\n/**\n * Convert a Ruby gem version string to semver.\n */\nfunction rubyVersionToSemver(ver: string): string | null {\n const v = ver.trim();\n if (/(?:\\.pre|\\.rc|\\.beta|\\.alpha|\\.dev)/i.test(v)) return null;\n\n const parts = v.split('.');\n if (parts.length < 2) return null;\n while (parts.length < 3) parts.push('0');\n const semverStr = parts.slice(0, 3).join('.');\n return semver.valid(semverStr);\n}\n\n/**\n * Parse a Gemfile to extract dependencies.\n */\nfunction parseGemfile(content: string): RubyDependency[] {\n const deps: RubyDependency[] = [];\n let currentGroup: 'default' | 'development' | 'test' = 'default';\n const groupStack: Array<'default' | 'development' | 'test'> = [];\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Track group blocks\n const groupMatch = trimmed.match(/^\\s*group\\s+:(\\w+)/);\n if (groupMatch) {\n groupStack.push(currentGroup);\n const g = groupMatch[1]!.toLowerCase();\n if (g === 'development' || g === 'dev') currentGroup = 'development';\n else if (g === 'test') currentGroup = 'test';\n }\n\n if (trimmed === 'end' && groupStack.length > 0) {\n currentGroup = groupStack.pop()!;\n continue;\n }\n\n const parsed = parseGemfileLine(trimmed);\n if (!parsed) continue;\n\n // Check for inline group specification\n let group = currentGroup;\n const inlineGroupMatch = trimmed.match(/group:\\s*(?::(\\w+)|\\[([^\\]]+)\\])/);\n if (inlineGroupMatch) {\n const g = (inlineGroupMatch[1] ?? inlineGroupMatch[2] ?? '').toLowerCase();\n if (g.includes('development') || g.includes('dev')) group = 'development';\n else if (g.includes('test')) group = 'test';\n }\n\n deps.push({\n name: parsed.name,\n spec: parsed.spec,\n group,\n });\n }\n\n return deps;\n}\n\n/**\n * Parse a .gemspec file to extract dependencies.\n *\n * Handles:\n * spec.add_dependency 'rails', '~> 7.1'\n * spec.add_development_dependency 'rspec', '~> 3.12'\n * s.add_runtime_dependency \"pg\"\n */\nfunction parseGemspec(content: string): RubyDependency[] {\n const deps: RubyDependency[] = [];\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Match add_dependency, add_runtime_dependency, add_development_dependency\n const match = trimmed.match(\n /\\.add_(runtime_|development_)?dependency\\s+['\"]([^'\"]+)['\"]\\s*(?:,\\s*['\"]([^'\"]+)['\"])?/,\n );\n if (!match) continue;\n\n const depType = match[1] ?? 'runtime_';\n const name = match[2]!;\n const spec = match[3] ?? '*';\n\n deps.push({\n name,\n spec,\n group: depType.startsWith('development') ? 'development' : 'default',\n });\n }\n\n return deps;\n}\n\n/**\n * Extract Ruby version from a Gemfile.\n *\n * Handles:\n * ruby '3.2.2'\n * ruby \"3.3.0\"\n * ruby \">= 3.1\"\n */\nfunction extractRubyVersion(content: string): string | undefined {\n const match = content.match(/^\\s*ruby\\s+['\"]([^'\"]+)['\"]/m);\n return match?.[1];\n}\n\n// ── Ruby project file names ──\n\nconst RUBY_MANIFEST_FILES = new Set([\n 'Gemfile',\n]);\n\n/**\n * Check if a filename is a .gemspec file.\n */\nfunction isGemspec(name: string): boolean {\n return name.endsWith('.gemspec');\n}\n\n/**\n * Discover and scan all Ruby projects in the workspace.\n */\nexport async function scanRubyProjects(\n rootDir: string,\n rubygemsCache: RubyGemsCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG,\n): Promise<ProjectScan[]> {\n // Find Ruby manifest files (Gemfile and .gemspec)\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => RUBY_MANIFEST_FILES.has(name) || isGemspec(name))\n : await findRubyManifests(rootDir);\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const [dir, files] of projectDirs) {\n try {\n const scanPromise = scanOneRubyProject(dir, files, rootDir, rubygemsCache, cache, catalog);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Ruby project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Ruby project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findRubyManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => RUBY_MANIFEST_FILES.has(name) || isGemspec(name));\n}\n\nasync function scanOneRubyProject(\n dir: string,\n manifestFiles: string[],\n rootDir: string,\n rubygemsCache: RubyGemsCache,\n cache: FileCache | undefined,\n catalog: RuntimeCatalog,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n let projectName = path.basename(dir === rootDir ? rootDir : dir);\n let rubyVersion: string | undefined;\n const allDeps = new Map<string, RubyDependency>();\n\n // Parse each manifest file, preferring Gemfile > .gemspec\n for (const f of manifestFiles) {\n const fileName = path.basename(f);\n const content = cache ? await cache.readTextFile(f) : await readTextFile(f);\n\n if (fileName === 'Gemfile') {\n const parsedVersion = extractRubyVersion(content);\n if (parsedVersion) rubyVersion = parsedVersion;\n\n for (const dep of parseGemfile(content)) {\n if (!allDeps.has(dep.name)) allDeps.set(dep.name, dep);\n }\n } else if (isGemspec(fileName)) {\n // Use gemspec name as project name\n const gemName = fileName.replace(/\\.gemspec$/, '');\n if (gemName) projectName = gemName;\n\n for (const dep of parseGemspec(content)) {\n if (!allDeps.has(dep.name)) allDeps.set(dep.name, dep);\n }\n }\n }\n\n // Determine Ruby runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n\n if (rubyVersion) {\n // Extract version number (e.g. \"3.2.2\" → { major: 3, minor: 2 }, \">= 3.1\" → { major: 3, minor: 1 })\n const verMatch = rubyVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n const LATEST_RUBY_MINOR = latestStable(catalog, 'ruby');\n if (LATEST_RUBY_MINOR) {\n if (reqMajor === LATEST_RUBY_MINOR.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_RUBY_MINOR.minor - reqMinor);\n } else if (reqMajor < LATEST_RUBY_MINOR.major) {\n runtimeMajorsBehind = LATEST_RUBY_MINOR.minor + (LATEST_RUBY_MINOR.major - reqMajor) * 10;\n }\n runtimeLatest = `${LATEST_RUBY_MINOR.major}.${LATEST_RUBY_MINOR.minor}`;\n }\n }\n runtimeEol = runtimeEolStatus(catalog, 'ruby', rubyVersion);\n const cycle = extractCycle('ruby', rubyVersion);\n if (cycle) runtimeEolDate = eolDate(catalog, 'ruby', cycle);\n }\n\n // Gemfile.lock pins the exact resolved version of every gem — more accurate than the declared\n // constraint and the only resolved version available offline. It sits beside the Gemfile.\n const lockIo: LockfileIo = {\n exists: (p) => (cache ? cache.pathExists(p) : pathExists(p)),\n readText: (p) => (cache ? cache.readTextFile(p) : readTextFile(p)),\n readJson: <T>(p: string) => (cache ? cache.readJsonFile<T>(p) : readJsonFile<T>(p)),\n };\n const lockIndex: GemfileLockIndex | null = await loadGemfileLockIndex(dir, lockIo).catch(() => null);\n\n // Resolve dependencies against RubyGems\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const depEntries = [...allDeps.values()];\n const metaPromises = depEntries.map(async (dep) => {\n const meta = await rubygemsCache.get(dep.name);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Prefer the lockfile's exact version; otherwise extract from the declared constraint.\n const locked = lockIndex?.resolve(dep.name) ?? null;\n const rawVersion = locked ?? extractGemVersion(dep.spec);\n const resolvedVersion = rawVersion ? rubyVersionToSemver(rawVersion) : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n const section = dep.group === 'development' || dep.group === 'test'\n ? 'devDependencies' as const\n : 'dependencies' as const;\n\n dependencies.push({\n package: dep.name,\n section,\n currentSpec: dep.spec,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.name in KNOWN_RUBY_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_RUBY_FRAMEWORKS[dep.name]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files (use cached walk to avoid redundant I/O)\n let fileCount: number | undefined;\n try {\n fileCount = cache\n ? await cache.countFilesUnder(rootDir, dir)\n : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'ruby',\n path: relDir,\n name: projectName,\n runtime: rubyVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { SwiftCache } from './swift-cache.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Swift frameworks / libraries to track */\nconst KNOWN_SWIFT_FRAMEWORKS: Record<string, string> = {\n // ── Server-Side Frameworks ──\n 'vapor': 'Vapor',\n 'hummingbird': 'Hummingbird',\n 'perfect': 'Perfect',\n 'kitura': 'Kitura',\n\n // ── Networking ──\n 'alamofire': 'Alamofire',\n 'moya': 'Moya',\n 'apollo-ios': 'Apollo iOS',\n\n // ── Database & ORM ──\n 'fluent': 'Fluent',\n 'sqlite.swift': 'SQLite.swift',\n 'realm-swift': 'Realm Swift',\n 'grdb.swift': 'GRDB.swift',\n\n // ── UI & SwiftUI ──\n 'kingfisher': 'Kingfisher',\n 'snapkit': 'SnapKit',\n 'sdwebimage': 'SDWebImage',\n\n // ── Reactive ──\n 'rxswift': 'RxSwift',\n 'combine': 'Combine',\n 'reactiveswift': 'ReactiveSwift',\n\n // ── Testing ──\n 'quick': 'Quick',\n 'nimble': 'Nimble',\n 'snapshotTesting': 'SnapshotTesting',\n\n // ── Logging ──\n 'swiftlog': 'SwiftLog',\n 'cocoalumberjack': 'CocoaLumberjack',\n\n // ── Dependency Injection ──\n 'swinject': 'Swinject',\n 'needle': 'Needle',\n\n // ── Utilities ──\n 'swiftyjson': 'SwiftyJSON',\n 'promisekit': 'PromiseKit',\n 'then': 'Then',\n};\n\n/** Latest Swift version (as of 2026) */\nconst LATEST_SWIFT = { major: 6, minor: 0 };\n\ninterface SwiftDependency {\n name: string;\n url: string;\n version: string;\n type: 'exact' | 'range' | 'branch' | 'revision';\n}\n\n/**\n * Parse Package.swift to extract dependencies.\n * \n * Example:\n * .package(url: \"https://github.com/vapor/vapor.git\", from: \"4.0.0\")\n * .package(url: \"https://github.com/apple/swift-nio.git\", .upToNextMajor(from: \"2.0.0\"))\n * .package(url: \"https://github.com/realm/realm-swift.git\", exact: \"10.0.0\")\n */\nfunction parsePackageSwift(content: string): SwiftDependency[] {\n const deps: SwiftDependency[] = [];\n \n // Match .package(url: \"...\", ...)\n const packageRegex = /\\.package\\s*\\(\\s*url:\\s*\"([^\"]+)\"[^)]*?(from|exact|upToNextMajor|revision|branch):\\s*\"([^\"]+)\"/g;\n \n let match: RegExpExecArray | null;\n while ((match = packageRegex.exec(content)) !== null) {\n const url = match[1]!;\n const versionType = match[2]!;\n const versionValue = match[3]!;\n \n // Extract package name from URL\n const nameMatch = url.match(/\\/([^/]+?)(\\.git)?$/);\n const name = nameMatch?.[1] ?? url;\n \n let type: SwiftDependency['type'] = 'range';\n let version = versionValue;\n \n if (versionType === 'exact') {\n type = 'exact';\n } else if (versionType === 'branch') {\n type = 'branch';\n } else if (versionType === 'revision') {\n type = 'revision';\n }\n \n deps.push({ name, url, version, type });\n }\n \n return deps;\n}\n\n/**\n * Parse Package.resolved to get exact resolved versions.\n * \n * Example JSON structure:\n * {\n * \"pins\": [\n * {\n * \"identity\": \"vapor\",\n * \"location\": \"https://github.com/vapor/vapor.git\",\n * \"state\": {\n * \"version\": \"4.89.0\"\n * }\n * }\n * ]\n * }\n */\nfunction parsePackageResolved(content: string): Map<string, string> {\n const resolved = new Map<string, string>();\n \n try {\n const data = JSON.parse(content) as {\n pins?: Array<{\n identity?: string;\n state?: {\n version?: string;\n };\n }>;\n };\n \n if (!data.pins) return resolved;\n \n for (const pin of data.pins) {\n if (!pin.identity || !pin.state?.version) continue;\n resolved.set(pin.identity.toLowerCase(), pin.state.version);\n }\n } catch {\n // Invalid JSON\n }\n \n return resolved;\n}\n\n/**\n * Extract Swift version from Package.swift.\n * \n * Example:\n * // swift-tools-version:5.9\n * // swift-tools-version: 6.0\n */\nfunction extractSwiftVersion(content: string): string | undefined {\n const match = content.match(/\\/\\/\\s*swift-tools-version:\\s*(\\d+\\.\\d+)/i);\n return match?.[1];\n}\n\n// ── Swift project file names ──\n\nconst SWIFT_MANIFEST_FILES = new Set([\n 'Package.swift',\n]);\n\n/**\n * Discover and scan all Swift projects in the workspace.\n */\nexport async function scanSwiftProjects(\n rootDir: string,\n swiftCache: SwiftCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n): Promise<ProjectScan[]> {\n // Find Package.swift files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => SWIFT_MANIFEST_FILES.has(name))\n : await findSwiftManifests(rootDir);\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const manifestFile of manifestFiles) {\n const dir = path.dirname(manifestFile);\n try {\n const scanPromise = scanOneSwiftProject(dir, manifestFile, rootDir, swiftCache, cache);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Swift project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Swift project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findSwiftManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => SWIFT_MANIFEST_FILES.has(name));\n}\n\nasync function scanOneSwiftProject(\n dir: string,\n manifestFile: string,\n rootDir: string,\n swiftCache: SwiftCache,\n cache?: FileCache,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n const projectName = path.basename(dir === rootDir ? rootDir : dir);\n \n const content = cache ? await cache.readTextFile(manifestFile) : await readTextFile(manifestFile);\n const swiftVersion = extractSwiftVersion(content);\n const allDeps = parsePackageSwift(content);\n \n // Try to read Package.resolved for exact versions\n const resolvedPath = path.join(dir, 'Package.resolved');\n let resolvedVersions = new Map<string, string>();\n try {\n const resolvedContent = cache ? await cache.readTextFile(resolvedPath) : await readTextFile(resolvedPath);\n resolvedVersions = parsePackageResolved(resolvedContent);\n } catch {\n // No Package.resolved or can't read it\n }\n \n // Determine Swift runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n\n if (swiftVersion) {\n const verMatch = swiftVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n if (reqMajor === LATEST_SWIFT.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_SWIFT.minor - reqMinor);\n } else if (reqMajor < LATEST_SWIFT.major) {\n runtimeMajorsBehind = (LATEST_SWIFT.major - reqMajor) * 10 + LATEST_SWIFT.minor;\n }\n runtimeLatest = `${LATEST_SWIFT.major}.${LATEST_SWIFT.minor}`;\n }\n }\n\n // Resolve dependencies\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const metaPromises = allDeps.map(async (dep) => {\n const meta = await swiftCache.get(dep.url);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Use resolved version if available, otherwise use specified version\n const resolvedVersionStr = resolvedVersions.get(dep.name.toLowerCase()) ?? \n (dep.type === 'exact' ? dep.version : null);\n const resolvedVersion = resolvedVersionStr ? semver.valid(semver.clean(resolvedVersionStr)) : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n dependencies.push({\n package: dep.name,\n section: 'dependencies',\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n const lowerName = dep.name.toLowerCase();\n if (lowerName in KNOWN_SWIFT_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_SWIFT_FRAMEWORKS[lowerName]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files\n let fileCount: number | undefined;\n try {\n fileCount = cache ? await cache.countFilesUnder(rootDir, dir) : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'swift',\n path: relDir,\n name: projectName,\n runtime: swiftVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { GoCache } from './go-cache.js';\nimport { latestStable, runtimeEolStatus, extractCycle, eolDate } from '../runtimes/catalog.js';\nimport { BUNDLED_RUNTIME_CATALOG } from '../runtimes/snapshot.js';\nimport type { RuntimeCatalog } from '../runtimes/types.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Go frameworks / libraries to track */\nconst KNOWN_GO_FRAMEWORKS: Record<string, string> = {\n // ── Web Frameworks ──\n 'github.com/gin-gonic/gin': 'Gin',\n 'github.com/labstack/echo': 'Echo',\n 'github.com/gofiber/fiber': 'Fiber',\n 'github.com/gorilla/mux': 'Gorilla Mux',\n 'github.com/go-chi/chi': 'Chi',\n 'github.com/beego/beego': 'Beego',\n 'github.com/revel/revel': 'Revel',\n\n // ── Kubernetes & Cloud Native ──\n 'k8s.io/kubernetes': 'Kubernetes',\n 'k8s.io/client-go': 'Kubernetes Client',\n 'github.com/prometheus/prometheus': 'Prometheus',\n 'github.com/prometheus/client_golang': 'Prometheus Client',\n 'go.etcd.io/etcd': 'etcd',\n 'github.com/hashicorp/consul': 'Consul',\n 'github.com/hashicorp/vault': 'Vault',\n 'github.com/traefik/traefik': 'Traefik',\n 'github.com/istio/istio': 'Istio',\n\n // ── Database & ORM ──\n 'gorm.io/gorm': 'GORM',\n 'github.com/jmoiron/sqlx': 'sqlx',\n 'github.com/go-sql-driver/mysql': 'MySQL Driver',\n 'github.com/lib/pq': 'PostgreSQL Driver',\n 'go.mongodb.org/mongo-driver': 'MongoDB Driver',\n 'github.com/redis/go-redis': 'Redis Client',\n 'github.com/go-redis/redis': 'go-redis',\n\n // ── gRPC & Protobuf ──\n 'google.golang.org/grpc': 'gRPC',\n 'google.golang.org/protobuf': 'Protobuf',\n 'github.com/grpc-ecosystem/grpc-gateway': 'gRPC Gateway',\n\n // ── Testing ──\n 'github.com/stretchr/testify': 'Testify',\n 'github.com/onsi/ginkgo': 'Ginkgo',\n 'github.com/onsi/gomega': 'Gomega',\n 'github.com/golang/mock': 'GoMock',\n\n // ── Logging ──\n 'go.uber.org/zap': 'Zap',\n 'github.com/sirupsen/logrus': 'Logrus',\n 'github.com/rs/zerolog': 'Zerolog',\n\n // ── Configuration ──\n 'github.com/spf13/viper': 'Viper',\n 'github.com/spf13/cobra': 'Cobra',\n 'github.com/urfave/cli': 'urfave/cli',\n\n // ── HTTP Client ──\n 'github.com/go-resty/resty': 'Resty',\n\n // ── Serialization ──\n 'github.com/json-iterator/go': 'jsoniter',\n 'gopkg.in/yaml.v3': 'YAML v3',\n\n // ── Message Queue ──\n 'github.com/segmentio/kafka-go': 'kafka-go',\n 'github.com/rabbitmq/amqp091-go': 'RabbitMQ',\n 'github.com/nats-io/nats.go': 'NATS',\n\n // ── Utilities ──\n 'github.com/google/uuid': 'UUID',\n 'github.com/spf13/cast': 'Cast',\n 'github.com/pkg/errors': 'pkg/errors',\n};\n\n// Latest Go major.minor is resolved at scan time — see runtime-baselines.ts\n\ninterface GoDependency {\n path: string;\n version: string;\n indirect: boolean;\n}\n\n/**\n * Parse go.mod to extract dependencies and Go version.\n * \n * Example:\n * module github.com/example/project\n * go 1.21\n * require (\n * github.com/gin-gonic/gin v1.9.1\n * github.com/stretchr/testify v1.8.4 // indirect\n * )\n */\nfunction parseGoMod(content: string): { goVersion?: string; deps: GoDependency[] } {\n const deps: GoDependency[] = [];\n let goVersion: string | undefined;\n let inRequireBlock = false;\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Extract Go version\n if (trimmed.startsWith('go ')) {\n const match = trimmed.match(/^go\\s+(\\d+\\.\\d+)/);\n if (match) goVersion = match[1];\n continue;\n }\n\n // Track require blocks\n if (trimmed.startsWith('require (')) {\n inRequireBlock = true;\n continue;\n }\n\n if (trimmed === ')' && inRequireBlock) {\n inRequireBlock = false;\n continue;\n }\n\n // Parse dependency lines\n // Format: github.com/gin-gonic/gin v1.9.1\n // Format: github.com/gin-gonic/gin v1.9.1 // indirect\n let depLine = trimmed;\n if (inRequireBlock) {\n depLine = trimmed;\n } else if (trimmed.startsWith('require ')) {\n depLine = trimmed.substring(8);\n } else {\n continue;\n }\n\n const indirect = depLine.includes('// indirect');\n depLine = depLine.replace(/\\/\\/.*$/, '').trim();\n\n const parts = depLine.split(/\\s+/);\n if (parts.length >= 2) {\n const [modulePath, version] = parts;\n if (modulePath && version) {\n deps.push({\n path: modulePath,\n version,\n indirect,\n });\n }\n }\n }\n\n return { goVersion, deps };\n}\n\n// ── Go project file names ──\n\nconst GO_MANIFEST_FILES = new Set([\n 'go.mod',\n]);\n\n/**\n * Discover and scan all Go projects in the workspace.\n */\nexport async function scanGoProjects(\n rootDir: string,\n goCache: GoCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n catalog: RuntimeCatalog = BUNDLED_RUNTIME_CATALOG,\n): Promise<ProjectScan[]> {\n // Find go.mod files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => GO_MANIFEST_FILES.has(name))\n : await findGoManifests(rootDir);\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const manifestFile of manifestFiles) {\n const dir = path.dirname(manifestFile);\n try {\n const scanPromise = scanOneGoProject(dir, manifestFile, rootDir, goCache, cache, catalog);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Go project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Go project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findGoManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => GO_MANIFEST_FILES.has(name));\n}\n\nasync function scanOneGoProject(\n dir: string,\n manifestFile: string,\n rootDir: string,\n goCache: GoCache,\n cache: FileCache | undefined,\n catalog: RuntimeCatalog,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n const projectName = path.basename(dir === rootDir ? rootDir : dir);\n \n const content = cache ? await cache.readTextFile(manifestFile) : await readTextFile(manifestFile);\n const { goVersion, deps: allDeps } = parseGoMod(content);\n \n // Filter out indirect dependencies for main analysis\n const directDeps = allDeps.filter(d => !d.indirect);\n \n // Determine Go runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n let runtimeEol: boolean | null | undefined;\n let runtimeEolDate: string | undefined;\n\n if (goVersion) {\n const verMatch = goVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n const LATEST_GO_MINOR = latestStable(catalog, 'go');\n if (LATEST_GO_MINOR) {\n if (reqMajor === LATEST_GO_MINOR.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_GO_MINOR.minor - reqMinor);\n } else if (reqMajor < LATEST_GO_MINOR.major) {\n runtimeMajorsBehind = LATEST_GO_MINOR.minor + (LATEST_GO_MINOR.major - reqMajor) * 100;\n }\n runtimeLatest = `${LATEST_GO_MINOR.major}.${LATEST_GO_MINOR.minor}`;\n }\n }\n runtimeEol = runtimeEolStatus(catalog, 'go', goVersion);\n const cycle = extractCycle('go', goVersion);\n if (cycle) runtimeEolDate = eolDate(catalog, 'go', cycle);\n }\n\n // Resolve dependencies\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const metaPromises = directDeps.map(async (dep) => {\n const meta = await goCache.get(dep.path);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n const resolvedVersion = semver.valid(semver.clean(dep.version));\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n dependencies.push({\n package: dep.path,\n section: 'dependencies',\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.path in KNOWN_GO_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_GO_FRAMEWORKS[dep.path]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files\n let fileCount: number | undefined;\n try {\n fileCount = cache ? await cache.countFilesUnder(rootDir, dir) : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'go',\n path: relDir,\n name: projectName,\n runtime: goVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n runtimeEol,\n runtimeEolDate,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Cargo.lock resolution (clean-room).\n *\n * `Cargo.toml` declares version *requirements* (`serde = \"1.0\"`), not the exact build. The resolved\n * version lives in `Cargo.lock` — a TOML file of `[[package]]` array-of-tables, each with a `name`\n * and the exact `version` Cargo selected. This module reads that file into a name → installed-version\n * index the Rust scanner prefers over coercing the declared requirement.\n *\n * Clean-room: parsed from Cargo's public, documented lockfile shape with a real TOML parser\n * (`smol-toml`, BSD-3-Clause) — no AGPL parser is used.\n */\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { parseToml } from '../utils/toml.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nexport type { LockfileIo } from './npm-lockfile.js';\n\nexport interface CargoLockIndex {\n /** Distinct crates with at least one locked version. */\n size: number;\n /** Installed version for a crate by name; when several majors are locked, the best match for `spec`. */\n resolve(name: string, spec?: string): string | null;\n}\n\n/**\n * Parse a Cargo.lock into name → locked versions. A crate may appear more than once (multiple\n * incompatible majors in the tree), so versions accumulate into a list per name.\n */\nexport function parseCargoLock(text: string): Map<string, string[]> {\n const out = new Map<string, string[]>();\n const doc = parseToml(text);\n const packages = doc?.package;\n if (!Array.isArray(packages)) return out;\n for (const entry of packages) {\n if (!entry || typeof entry !== 'object') continue;\n const { name, version } = entry as Record<string, unknown>;\n if (typeof name !== 'string' || typeof version !== 'string') continue;\n const list = out.get(name) ?? [];\n if (!list.includes(version)) list.push(version);\n out.set(name, list);\n }\n return out;\n}\n\n/** Pick the installed version for a name: the best match for the declared spec, else the highest locked. */\nexport function pickLockedVersion(versions: string[] | undefined, spec?: string): string | null {\n if (!versions || versions.length === 0) return null;\n const valid = versions.filter((v) => semver.valid(v));\n if (valid.length === 0) return null;\n if (valid.length === 1) return valid[0];\n if (spec) {\n // Cargo specs are semver-ish (`1.0`, `^1.2`, `~1`, `>=1,<2`). Try as-is, then as a caret default.\n const range = semver.validRange(spec) ?? semver.validRange(`^${spec}`);\n if (range) {\n const best = semver.maxSatisfying(valid, range);\n if (best) return best;\n }\n }\n return semver.maxSatisfying(valid, '*') ?? valid[0];\n}\n\n/** Build a Cargo.lock index for a directory, or null when no Cargo.lock is present/usable. */\nexport async function loadCargoLockIndex(dir: string, io: LockfileIo): Promise<CargoLockIndex | null> {\n const lockPath = path.join(dir, 'Cargo.lock');\n if (!(await io.exists(lockPath).catch(() => false))) return null;\n try {\n const map = parseCargoLock(await io.readText(lockPath));\n if (!map.size) return null;\n return { size: map.size, resolve: (name, spec) => pickLockedVersion(map.get(name), spec) };\n } catch {\n return null;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, readJsonFile, pathExists, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { CargoCache } from './cargo-cache.js';\nimport { loadCargoLockIndex, type CargoLockIndex } from './cargo-lockfile.js';\nimport type { LockfileIo } from './npm-lockfile.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Rust frameworks / libraries to track */\nconst KNOWN_RUST_FRAMEWORKS: Record<string, string> = {\n // ── Web Frameworks ──\n 'actix-web': 'Actix Web',\n 'rocket': 'Rocket',\n 'axum': 'Axum',\n 'warp': 'Warp',\n 'tide': 'Tide',\n 'poem': 'Poem',\n\n // ── Async Runtime ──\n 'tokio': 'Tokio',\n 'async-std': 'async-std',\n 'smol': 'smol',\n\n // ── Serialization ──\n 'serde': 'Serde',\n 'serde_json': 'Serde JSON',\n 'bincode': 'Bincode',\n 'toml': 'TOML',\n\n // ── Database & ORM ──\n 'diesel': 'Diesel',\n 'sqlx': 'SQLx',\n 'sea-orm': 'SeaORM',\n\n // ── HTTP Client ──\n 'reqwest': 'reqwest',\n 'hyper': 'hyper',\n 'ureq': 'ureq',\n\n // ── CLI ──\n 'clap': 'clap',\n 'structopt': 'structopt',\n\n // ── Logging ──\n 'log': 'log',\n 'env_logger': 'env_logger',\n 'tracing': 'tracing',\n 'tracing-subscriber': 'tracing-subscriber',\n\n // ── Error Handling ──\n 'anyhow': 'anyhow',\n 'thiserror': 'thiserror',\n 'eyre': 'eyre',\n\n // ── Testing ──\n 'criterion': 'Criterion',\n 'proptest': 'proptest',\n 'mockall': 'mockall',\n\n // ── Cryptography ──\n 'ring': 'ring',\n 'rustls': 'rustls',\n 'webpki': 'webpki',\n\n // ── Graphics & Game Dev ──\n 'bevy': 'Bevy',\n 'wgpu': 'wgpu',\n 'winit': 'winit',\n\n // ── WebAssembly ──\n 'wasm-bindgen': 'wasm-bindgen',\n 'wasm-pack': 'wasm-pack',\n\n // ── Blockchain ──\n 'substrate': 'Substrate',\n 'ethers': 'ethers-rs',\n};\n\ninterface RustDependency {\n name: string;\n version: string;\n optional: boolean;\n features: string[];\n isDev: boolean;\n}\n\n/**\n * Parse Cargo.toml to extract dependencies.\n * \n * Example:\n * [dependencies]\n * serde = { version = \"1.0\", features = [\"derive\"] }\n * tokio = \"1.35\"\n * \n * [dev-dependencies]\n * criterion = \"0.5\"\n */\nfunction parseCargoToml(content: string): RustDependency[] {\n const deps: RustDependency[] = [];\n let currentSection: 'dependencies' | 'dev-dependencies' | null = null;\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Track sections\n if (trimmed === '[dependencies]') {\n currentSection = 'dependencies';\n continue;\n } else if (trimmed === '[dev-dependencies]') {\n currentSection = 'dev-dependencies';\n continue;\n } else if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n currentSection = null;\n continue;\n }\n\n if (!currentSection) continue;\n\n // Parse dependency lines\n // Simple: serde = \"1.0\"\n // Complex: serde = { version = \"1.0\", features = [\"derive\"], optional = true }\n \n const simpleMatch = trimmed.match(/^([\\w-]+)\\s*=\\s*\"([^\"]+)\"/);\n if (simpleMatch) {\n deps.push({\n name: simpleMatch[1]!,\n version: simpleMatch[2]!,\n optional: false,\n features: [],\n isDev: currentSection === 'dev-dependencies',\n });\n continue;\n }\n\n const complexMatch = trimmed.match(/^([\\w-]+)\\s*=\\s*\\{([^}]+)\\}/);\n if (complexMatch) {\n const name = complexMatch[1]!;\n const attrs = complexMatch[2]!;\n \n const versionMatch = attrs.match(/version\\s*=\\s*\"([^\"]+)\"/);\n const version = versionMatch?.[1] ?? '*';\n \n const optionalMatch = attrs.match(/optional\\s*=\\s*true/);\n const optional = !!optionalMatch;\n \n const featuresMatch = attrs.match(/features\\s*=\\s*\\[([^\\]]*)\\]/);\n const features = featuresMatch \n ? featuresMatch[1]!.split(',').map(f => f.trim().replace(/\"/g, ''))\n : [];\n \n deps.push({\n name,\n version,\n optional,\n features,\n isDev: currentSection === 'dev-dependencies',\n });\n }\n }\n\n return deps;\n}\n\n/**\n * Extract Rust edition from Cargo.toml.\n * \n * Example:\n * [package]\n * edition = \"2021\"\n */\nfunction extractRustEdition(content: string): string | undefined {\n const match = content.match(/^\\s*edition\\s*=\\s*\"(\\d+)\"/m);\n return match?.[1];\n}\n\n// ── Rust project file names ──\n\nconst RUST_MANIFEST_FILES = new Set([\n 'Cargo.toml',\n]);\n\n/**\n * Discover and scan all Rust projects in the workspace.\n */\nexport async function scanRustProjects(\n rootDir: string,\n cargoCache: CargoCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n): Promise<ProjectScan[]> {\n // Find Cargo.toml files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => RUST_MANIFEST_FILES.has(name))\n : await findRustManifests(rootDir);\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const manifestFile of manifestFiles) {\n const dir = path.dirname(manifestFile);\n try {\n const scanPromise = scanOneRustProject(dir, manifestFile, rootDir, cargoCache, cache);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Rust project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Rust project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findRustManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => RUST_MANIFEST_FILES.has(name));\n}\n\nasync function scanOneRustProject(\n dir: string,\n manifestFile: string,\n rootDir: string,\n cargoCache: CargoCache,\n cache?: FileCache,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n const projectName = path.basename(dir === rootDir ? rootDir : dir);\n \n const content = cache ? await cache.readTextFile(manifestFile) : await readTextFile(manifestFile);\n const rustEdition = extractRustEdition(content);\n const allDeps = parseCargoToml(content);\n\n // Cargo.lock pins the exact resolved version of every crate. There is one per workspace, normally\n // beside this Cargo.toml; for a workspace member it lives at the root — so try the project dir then\n // the root. Prefer it over coercing the declared requirement.\n const lockIo: LockfileIo = {\n exists: (p) => (cache ? cache.pathExists(p) : pathExists(p)),\n readText: (p) => (cache ? cache.readTextFile(p) : readTextFile(p)),\n readJson: <T>(p: string) => (cache ? cache.readJsonFile<T>(p) : readJsonFile<T>(p)),\n };\n let lockIndex: CargoLockIndex | null = await loadCargoLockIndex(dir, lockIo).catch(() => null);\n if (!lockIndex && dir !== rootDir) lockIndex = await loadCargoLockIndex(rootDir, lockIo).catch(() => null);\n \n // Filter out dev dependencies for main analysis\n const prodDeps = allDeps.filter(d => !d.isDev);\n \n // Determine Rust edition lag (edition is different from version)\n // Rust uses editions: 2015, 2018, 2021, 2024\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n\n if (rustEdition) {\n const editionYear = parseInt(rustEdition, 10);\n const latestEdition = 2024; // As of 2026\n runtimeMajorsBehind = Math.max(0, Math.floor((latestEdition - editionYear) / 3));\n runtimeLatest = latestEdition.toString();\n }\n\n // Resolve dependencies\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const metaPromises = prodDeps.map(async (dep) => {\n const meta = await cargoCache.get(dep.name);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Prefer the lockfile's exact version; otherwise coerce the declared spec (e.g. \"1.0\" → 1.0.0).\n const locked = lockIndex?.resolve(dep.name, dep.version) ?? null;\n const resolvedVersion = (locked && semver.valid(locked)) ? locked : semver.valid(semver.coerce(dep.version));\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n const section = dep.isDev ? 'devDependencies' as const : 'dependencies' as const;\n\n dependencies.push({\n package: dep.name,\n section,\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.name in KNOWN_RUST_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_RUST_FRAMEWORKS[dep.name]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files\n let fileCount: number | undefined;\n try {\n fileCount = cache ? await cache.countFilesUnder(rootDir, dir) : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'rust',\n path: relDir,\n name: projectName,\n runtime: rustEdition,\n runtimeLatest,\n runtimeMajorsBehind,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { FileCache, readJsonFile } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { ComposerCache } from './composer-cache.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known PHP frameworks / libraries to track */\nconst KNOWN_PHP_FRAMEWORKS: Record<string, string> = {\n // ── Web Frameworks ──\n 'laravel/framework': 'Laravel',\n 'symfony/symfony': 'Symfony',\n 'symfony/http-foundation': 'Symfony HttpFoundation',\n 'cakephp/cakephp': 'CakePHP',\n 'yiisoft/yii2': 'Yii 2',\n 'codeigniter4/framework': 'CodeIgniter',\n 'slim/slim': 'Slim',\n 'laminas/laminas-mvc': 'Laminas',\n\n // ── WordPress ──\n 'roots/wordpress': 'WordPress',\n 'johnpbloch/wordpress': 'WordPress Core',\n\n // ── Database & ORM ──\n 'doctrine/orm': 'Doctrine ORM',\n 'doctrine/dbal': 'Doctrine DBAL',\n 'illuminate/database': 'Laravel Eloquent',\n 'propel/propel': 'Propel',\n\n // ── Testing ──\n 'phpunit/phpunit': 'PHPUnit',\n 'pestphp/pest': 'Pest',\n 'behat/behat': 'Behat',\n 'codeception/codeception': 'Codeception',\n 'mockery/mockery': 'Mockery',\n\n // ── HTTP Client ──\n 'guzzlehttp/guzzle': 'Guzzle',\n 'symfony/http-client': 'Symfony HttpClient',\n\n // ── Templating ──\n 'twig/twig': 'Twig',\n 'smarty/smarty': 'Smarty',\n 'league/plates': 'Plates',\n\n // ── Authentication ──\n 'firebase/php-jwt': 'PHP-JWT',\n 'lcobucci/jwt': 'JWT',\n\n // ── API ──\n 'league/fractal': 'Fractal',\n 'api-platform/core': 'API Platform',\n\n // ── CLI ──\n 'symfony/console': 'Symfony Console',\n\n // ── Logging ──\n 'monolog/monolog': 'Monolog',\n\n // ── Utilities ──\n 'nesbot/carbon': 'Carbon',\n 'ramsey/uuid': 'UUID',\n 'vlucas/phpdotenv': 'PHP dotenv',\n\n // ── Code Quality ──\n 'phpstan/phpstan': 'PHPStan',\n 'vimeo/psalm': 'Psalm',\n 'friendsofphp/php-cs-fixer': 'PHP CS Fixer',\n 'squizlabs/php_codesniffer': 'PHP_CodeSniffer',\n};\n\n/** Latest PHP major.minor (as of 2026) */\nconst LATEST_PHP = { major: 8, minor: 4 };\n\ninterface PhpDependency {\n name: string;\n version: string;\n isDev: boolean;\n}\n\n/**\n * Parse composer.json to extract dependencies.\n */\nasync function parseComposerJson(filePath: string, cache?: FileCache): Promise<{\n phpVersion?: string;\n deps: PhpDependency[];\n}> {\n const data = cache \n ? await cache.readJsonFile(filePath)\n : await readJsonFile(filePath) as any;\n \n const deps: PhpDependency[] = [];\n let phpVersion: string | undefined;\n\n // Extract PHP version requirement\n if (data.require?.php) {\n phpVersion = data.require.php;\n }\n\n // Extract dependencies\n if (data.require && typeof data.require === 'object') {\n for (const [name, version] of Object.entries(data.require)) {\n if (name === 'php' || name.startsWith('ext-')) continue;\n deps.push({\n name,\n version: String(version),\n isDev: false,\n });\n }\n }\n\n // Extract dev dependencies\n if (data['require-dev'] && typeof data['require-dev'] === 'object') {\n for (const [name, version] of Object.entries(data['require-dev'])) {\n if (name === 'php' || name.startsWith('ext-')) continue;\n deps.push({\n name,\n version: String(version),\n isDev: true,\n });\n }\n }\n\n return { phpVersion, deps };\n}\n\n/**\n * Parse composer.lock to get exact resolved versions.\n */\nasync function parseComposerLock(filePath: string, cache?: FileCache): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n \n try {\n const data = cache \n ? await cache.readJsonFile(filePath)\n : await readJsonFile(filePath) as any;\n \n // Parse packages\n for (const pkg of (data.packages ?? []) as Array<{ name?: string; version?: string }>) {\n if (pkg.name && pkg.version) {\n resolved.set(pkg.name, pkg.version);\n }\n }\n \n // Parse dev packages\n for (const pkg of (data['packages-dev'] ?? []) as Array<{ name?: string; version?: string }>) {\n if (pkg.name && pkg.version) {\n resolved.set(pkg.name, pkg.version);\n }\n }\n } catch {\n // Invalid JSON or file doesn't exist\n }\n \n return resolved;\n}\n\n/**\n * Extract PHP version number from constraint string.\n * Examples:\n * \"^8.2\" → \"8.2\"\n * \">=8.1\" → \"8.1\"\n * \"8.3.*\" → \"8.3\"\n */\nfunction extractPhpVersion(constraint: string): string | undefined {\n const match = constraint.match(/(\\d+)\\.(\\d+)/);\n return match?.[0];\n}\n\n// ── PHP project file names ──\n\nconst PHP_MANIFEST_FILES = new Set([\n 'composer.json',\n]);\n\n/**\n * Discover and scan all PHP projects in the workspace.\n */\nexport async function scanPhpProjects(\n rootDir: string,\n composerCache: ComposerCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n): Promise<ProjectScan[]> {\n // Find composer.json files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => PHP_MANIFEST_FILES.has(name))\n : await findPhpManifests(rootDir);\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const manifestFile of manifestFiles) {\n const dir = path.dirname(manifestFile);\n try {\n const scanPromise = scanOnePhpProject(dir, manifestFile, rootDir, composerCache, cache);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning PHP project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning PHP project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findPhpManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => PHP_MANIFEST_FILES.has(name));\n}\n\nasync function scanOnePhpProject(\n dir: string,\n manifestFile: string,\n rootDir: string,\n composerCache: ComposerCache,\n cache?: FileCache,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n const projectName = path.basename(dir === rootDir ? rootDir : dir);\n \n const { phpVersion: phpVersionConstraint, deps: allDeps } = await parseComposerJson(manifestFile, cache);\n \n // Try to read composer.lock for exact versions\n const lockPath = path.join(dir, 'composer.lock');\n let resolvedVersions = new Map<string, string>();\n try {\n resolvedVersions = await parseComposerLock(lockPath, cache);\n } catch {\n // No composer.lock or can't read it\n }\n \n // Filter out dev dependencies for main analysis\n const prodDeps = allDeps.filter(d => !d.isDev);\n \n // Determine PHP runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n let phpVersion: string | undefined;\n\n if (phpVersionConstraint) {\n phpVersion = extractPhpVersion(phpVersionConstraint);\n if (phpVersion) {\n const verMatch = phpVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n if (reqMajor === LATEST_PHP.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_PHP.minor - reqMinor);\n } else if (reqMajor < LATEST_PHP.major) {\n runtimeMajorsBehind = LATEST_PHP.minor + (LATEST_PHP.major - reqMajor) * 10;\n }\n runtimeLatest = `${LATEST_PHP.major}.${LATEST_PHP.minor}`;\n }\n }\n }\n\n // Resolve dependencies\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const metaPromises = prodDeps.map(async (dep) => {\n const meta = await composerCache.get(dep.name);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Use resolved version if available\n const resolvedVersionStr = resolvedVersions.get(dep.name);\n const resolvedVersion = resolvedVersionStr ? semver.valid(semver.clean(resolvedVersionStr)) : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n const section = dep.isDev ? 'devDependencies' as const : 'dependencies' as const;\n\n dependencies.push({\n package: dep.name,\n section,\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.name in KNOWN_PHP_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_PHP_FRAMEWORKS[dep.name]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files\n let fileCount: number | undefined;\n try {\n fileCount = cache ? await cache.countFilesUnder(rootDir, dir) : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'php',\n path: relDir,\n name: projectName,\n runtime: phpVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { readTextFile, FileCache } from '../utils/fs.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { PubCache } from './pub-cache.js';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\n\n/** Well-known Dart/Flutter frameworks / libraries to track */\nconst KNOWN_DART_FRAMEWORKS: Record<string, string> = {\n // ── Flutter ──\n 'flutter': 'Flutter SDK',\n 'flutter_test': 'Flutter Test',\n\n // ── State Management ──\n 'provider': 'Provider',\n 'riverpod': 'Riverpod',\n 'flutter_riverpod': 'Flutter Riverpod',\n 'bloc': 'BLoC',\n 'flutter_bloc': 'Flutter BLoC',\n 'get': 'GetX',\n 'mobx': 'MobX',\n 'redux': 'Redux',\n\n // ── Navigation ──\n 'go_router': 'GoRouter',\n 'auto_route': 'AutoRoute',\n\n // ── HTTP & Networking ──\n 'http': 'http',\n 'dio': 'Dio',\n 'retrofit': 'Retrofit',\n 'graphql_flutter': 'GraphQL Flutter',\n\n // ── Database ──\n 'sqflite': 'SQFlite',\n 'hive': 'Hive',\n 'isar': 'Isar',\n 'drift': 'Drift',\n 'firebase_core': 'Firebase Core',\n 'cloud_firestore': 'Cloud Firestore',\n\n // ── UI Components ──\n 'flutter_svg': 'Flutter SVG',\n 'cached_network_image': 'Cached Network Image',\n 'shimmer': 'Shimmer',\n 'lottie': 'Lottie',\n 'flutter_staggered_grid_view': 'Staggered Grid View',\n\n // ── Testing ──\n 'mockito': 'Mockito',\n 'mocktail': 'Mocktail',\n 'integration_test': 'Integration Test',\n 'test': 'Test',\n\n // ── Utilities ──\n 'intl': 'Intl',\n 'shared_preferences': 'Shared Preferences',\n 'path_provider': 'Path Provider',\n 'package_info_plus': 'Package Info Plus',\n 'url_launcher': 'URL Launcher',\n 'image_picker': 'Image Picker',\n\n // ── Serialization ──\n 'json_serializable': 'JSON Serializable',\n 'freezed': 'Freezed',\n 'built_value': 'Built Value',\n\n // ── Logging & Error Tracking ──\n 'logger': 'Logger',\n 'sentry_flutter': 'Sentry Flutter',\n 'firebase_crashlytics': 'Firebase Crashlytics',\n\n // ── Code Generation ──\n 'build_runner': 'Build Runner',\n 'injectable': 'Injectable',\n\n // ── Linting ──\n 'flutter_lints': 'Flutter Lints',\n 'lint': 'Lint',\n};\n\n/** Latest Dart major.minor (as of 2026) */\nconst LATEST_DART = { major: 3, minor: 6 };\n\ninterface DartDependency {\n name: string;\n version: string;\n isDev: boolean;\n}\n\n/**\n * Parse pubspec.yaml to extract dependencies.\n * \n * Example YAML:\n * name: my_app\n * environment:\n * sdk: '>=3.0.0 <4.0.0'\n * dependencies:\n * flutter:\n * sdk: flutter\n * provider: ^6.1.0\n * dev_dependencies:\n * flutter_test:\n * sdk: flutter\n * mockito: ^5.4.0\n */\nfunction parsePubspecYaml(content: string): {\n dartVersion?: string;\n deps: DartDependency[];\n} {\n const deps: DartDependency[] = [];\n let dartVersion: string | undefined;\n let currentSection: 'dependencies' | 'dev_dependencies' | null = null;\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Extract Dart SDK version. Require a digit so `sdk: flutter` lines\n // (SDK dependencies inside dependency sections) cannot clobber the\n // environment constraint.\n if (trimmed.startsWith('sdk:')) {\n const match = trimmed.match(/sdk:\\s*['\"]?>?=?\\s*(\\d[^<'\"]*)/);\n if (match) dartVersion = match[1]!.trim();\n continue;\n }\n\n // Track sections. Only an unindented key ends the current section —\n // testing the trimmed line here would match every indented dependency\n // line and reset the section before the dependency is captured.\n if (trimmed === 'dependencies:') {\n currentSection = 'dependencies';\n continue;\n } else if (trimmed === 'dev_dependencies:') {\n currentSection = 'dev_dependencies';\n continue;\n } else if (/^\\w+:/.test(line)) {\n currentSection = null;\n continue;\n }\n\n if (!currentSection) continue;\n\n // Parse dependency lines\n // Simple: provider: ^6.1.0\n // SDK: flutter: { sdk: flutter }\n \n const simpleMatch = trimmed.match(/^([\\w_]+):\\s*([^\\s{]+)/);\n if (simpleMatch) {\n const name = simpleMatch[1]!;\n const version = simpleMatch[2]!;\n \n // Skip SDK dependencies (flutter, flutter_test from SDK)\n if (version === 'sdk:' || trimmed.includes('sdk: flutter')) {\n continue;\n }\n \n deps.push({\n name,\n version,\n isDev: currentSection === 'dev_dependencies',\n });\n }\n }\n\n return { dartVersion, deps };\n}\n\n/**\n * Parse pubspec.lock to get exact resolved versions.\n */\nasync function parsePubspecLock(filePath: string, cache?: FileCache): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n \n try {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n let currentPackage: string | null = null;\n\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n\n // Match package name — exactly two-space indented bare key\n // (\" provider:\"). Deeper keys like the four-space \"description:\"\n // nested map are entry fields, not packages, and must not steal\n // the current-package slot before \"version:\" is read.\n const pkgMatch = line.match(/^ {2}(\\w+):$/);\n if (pkgMatch) {\n currentPackage = pkgMatch[1]!;\n continue;\n }\n \n // Match version (e.g., \" version: 6.1.2\")\n if (currentPackage && trimmed.startsWith('version:')) {\n const verMatch = trimmed.match(/version:\\s*\"?([^\"]+)\"?/);\n if (verMatch) {\n resolved.set(currentPackage, verMatch[1]!);\n currentPackage = null;\n }\n }\n }\n } catch {\n // File doesn't exist or can't read it\n }\n \n return resolved;\n}\n\n/**\n * Extract Dart version number from constraint string.\n * Examples:\n * \">=3.0.0 <4.0.0\" → \"3.0.0\"\n * \"^3.2.0\" → \"3.2.0\"\n */\nfunction extractDartVersion(constraint: string): string | undefined {\n const match = constraint.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match?.[0];\n}\n\n// ── Dart project file names ──\n\nconst DART_MANIFEST_FILES = new Set([\n 'pubspec.yaml',\n]);\n\n/**\n * Discover and scan all Dart/Flutter projects in the workspace.\n */\nexport async function scanDartProjects(\n rootDir: string,\n pubCache: PubCache,\n cache?: FileCache,\n projectScanTimeout?: number,\n): Promise<ProjectScan[]> {\n // Find pubspec.yaml files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => DART_MANIFEST_FILES.has(name))\n : await findDartManifests(rootDir);\n\n const results: ProjectScan[] = [];\n const STUCK_TIMEOUT_MS = projectScanTimeout ?? cache?.projectScanTimeout ?? 180_000;\n\n for (const manifestFile of manifestFiles) {\n const dir = path.dirname(manifestFile);\n try {\n const scanPromise = scanOneDartProject(dir, manifestFile, rootDir, pubCache, cache);\n const result = await withTimeout(scanPromise, STUCK_TIMEOUT_MS);\n if (result.ok) {\n results.push(result.value);\n } else {\n const relPath = path.relative(rootDir, dir);\n if (cache) cache.addStuckPath(relPath || '.');\n console.error(`Timeout scanning Dart project ${dir} (>${STUCK_TIMEOUT_MS / 1000}s) — skipped`);\n if (cache?.shouldShowTimeoutHint()) {\n console.error(` Tip: increase projectScanTimeout in vibgrate.config.ts (or --project-scan-timeout <seconds>) for large projects`);\n }\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error scanning Dart project ${dir}: ${msg}`);\n }\n }\n\n return results;\n}\n\nasync function findDartManifests(rootDir: string): Promise<string[]> {\n const { findFiles } = await import('../utils/fs.js');\n return findFiles(rootDir, (name) => DART_MANIFEST_FILES.has(name));\n}\n\nasync function scanOneDartProject(\n dir: string,\n manifestFile: string,\n rootDir: string,\n pubCache: PubCache,\n cache?: FileCache,\n): Promise<ProjectScan> {\n const relDir = path.relative(rootDir, dir) || '.';\n const projectName = path.basename(dir === rootDir ? rootDir : dir);\n \n const content = cache ? await cache.readTextFile(manifestFile) : await readTextFile(manifestFile);\n const { dartVersion: dartVersionConstraint, deps: allDeps } = parsePubspecYaml(content);\n \n // Try to read pubspec.lock for exact versions\n const lockPath = path.join(dir, 'pubspec.lock');\n let resolvedVersions = new Map<string, string>();\n try {\n resolvedVersions = await parsePubspecLock(lockPath, cache);\n } catch {\n // No pubspec.lock or can't read it\n }\n \n // Filter out dev dependencies for main analysis\n const prodDeps = allDeps.filter(d => !d.isDev);\n \n // Determine Dart runtime version lag\n let runtimeMajorsBehind: number | undefined;\n let runtimeLatest: string | undefined;\n let dartVersion: string | undefined;\n\n if (dartVersionConstraint) {\n dartVersion = extractDartVersion(dartVersionConstraint);\n if (dartVersion) {\n const verMatch = dartVersion.match(/(\\d+)\\.(\\d+)/);\n if (verMatch) {\n const reqMajor = parseInt(verMatch[1]!, 10);\n const reqMinor = parseInt(verMatch[2]!, 10);\n if (reqMajor === LATEST_DART.major) {\n runtimeMajorsBehind = Math.max(0, LATEST_DART.minor - reqMinor);\n } else if (reqMajor < LATEST_DART.major) {\n runtimeMajorsBehind = LATEST_DART.minor + (LATEST_DART.major - reqMajor) * 10;\n }\n runtimeLatest = `${LATEST_DART.major}.${LATEST_DART.minor}`;\n }\n }\n }\n\n // Resolve dependencies\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n // Fetch all metadata in parallel\n const metaPromises = prodDeps.map(async (dep) => {\n const meta = await pubCache.get(dep.name);\n return { dep, meta };\n });\n\n const resolved = await Promise.all(metaPromises);\n\n for (const { dep, meta } of resolved) {\n // Use resolved version if available\n const resolvedVersionStr = resolvedVersions.get(dep.name);\n const resolvedVersion = resolvedVersionStr ? semver.valid(semver.clean(resolvedVersionStr)) : null;\n const latestStable = meta.latestStableOverall;\n\n let majorsBehind: number | null = null;\n let drift: DependencyRow['drift'] = 'unknown';\n\n if (resolvedVersion && latestStable) {\n const currentMajor = semver.major(resolvedVersion);\n const latestMajor = semver.major(latestStable);\n majorsBehind = latestMajor - currentMajor;\n\n if (majorsBehind === 0) {\n drift = semver.eq(resolvedVersion, latestStable) ? 'current' : 'minor-behind';\n } else if (majorsBehind > 0) {\n drift = 'major-behind';\n } else {\n drift = 'current'; // somehow ahead\n }\n\n if (majorsBehind <= 0) buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else buckets.twoPlusBehind++;\n } else {\n buckets.unknown++;\n }\n\n const section = dep.isDev ? 'devDependencies' as const : 'dependencies' as const;\n\n dependencies.push({\n package: dep.name,\n section,\n currentSpec: dep.version,\n resolvedVersion,\n latestStable,\n majorsBehind,\n drift,\n });\n\n // Detect known frameworks\n if (dep.name in KNOWN_DART_FRAMEWORKS) {\n frameworks.push({\n name: KNOWN_DART_FRAMEWORKS[dep.name]!,\n currentVersion: resolvedVersion,\n latestVersion: latestStable,\n majorsBehind,\n });\n }\n }\n\n // Sort: worst drift first\n dependencies.sort((a, b) => {\n const order = { 'major-behind': 0, 'minor-behind': 1, 'current': 2, 'unknown': 3 };\n const diff = (order[a.drift] ?? 9) - (order[b.drift] ?? 9);\n if (diff !== 0) return diff;\n return a.package.localeCompare(b.package);\n });\n\n // Count files\n let fileCount: number | undefined;\n try {\n fileCount = cache ? await cache.countFilesUnder(rootDir, dir) : undefined;\n } catch { /* ignore */ }\n\n return {\n type: 'dart',\n path: relDir,\n name: projectName,\n runtime: dartVersion,\n runtimeLatest,\n runtimeMajorsBehind,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n fileCount,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { Semaphore } from '../utils/semaphore.js';\nimport { SemVer, gt } from 'semver';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nconst HEX_API_BASE = 'https://hex.pm/api';\nconst REQUEST_TIMEOUT = 10000;\nconst CONCURRENT_REQUESTS = 10;\n\n/**\n * Fetch the latest stable version of an Elixir package from hex.pm.\n */\nexport async function fetchHexLatestVersion(\n packageName: string,\n manifest?: PackageVersionManifest,\n semaphore?: Semaphore,\n offline = false,\n): Promise<string | null> {\n // Check manifest first\n const manifestEntry = getManifestEntry(manifest, 'hex', packageName);\n if (manifestEntry?.latest) {\n return manifestEntry.latest;\n }\n\n if (offline) {\n return null;\n }\n\n const task = async () => {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n\n const url = `${HEX_API_BASE}/packages/${packageName}`;\n const response = await fetch(url, {\n signal: controller.signal,\n headers: { 'User-Agent': 'vibgrate-cli' },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as any;\n const releases = data.releases as Array<{ version: string; retired?: any }>;\n\n if (!releases || releases.length === 0) {\n return null;\n }\n\n // Filter out retired versions and pre-releases\n const stableVersions = releases\n .filter(r => !r.retired)\n .map(r => r.version)\n .filter(v => {\n try {\n const semver = new SemVer(v);\n return semver.prerelease.length === 0;\n } catch {\n return false;\n }\n });\n\n if (stableVersions.length === 0) {\n return null;\n }\n\n // Sort and return the latest\n stableVersions.sort((a, b) => {\n try {\n return gt(a, b) ? -1 : 1;\n } catch {\n return 0;\n }\n });\n\n return stableVersions[0];\n } catch (error: any) {\n if (error?.name === 'AbortError') {\n return null;\n }\n return null;\n }\n };\n\n if (semaphore) {\n return semaphore.run(task);\n }\n\n return task();\n}\n\n/**\n * Bulk fetch latest versions for multiple Elixir packages.\n */\nexport async function fetchHexVersionsBulk(\n packageNames: string[],\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n const semaphore = new Semaphore(CONCURRENT_REQUESTS);\n\n const promises = packageNames.map(async (name) => {\n const version = await fetchHexLatestVersion(name, manifest, semaphore, offline);\n if (version) {\n results.set(name, version);\n }\n });\n\n await Promise.all(promises);\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { fetchHexVersionsBulk } from './hex-cache.js';\nimport { gt, minVersion, validRange } from 'semver';\nimport type { ProjectScan, DependencyRow, DetectedFramework } from '../types.js';\nimport { readTextFile, pathExists, FileCache } from '../utils/fs.js';\nimport type { PackageVersionManifest } from '../package-version-manifest.js';\nimport * as path from 'node:path';\n\ninterface ElixirDependency {\n name: string;\n version: string;\n isDev: boolean;\n}\n\nconst ELIXIR_MANIFEST_FILES = new Set(['mix.exs']);\n\n/**\n * Known Elixir frameworks/libraries to detect during scanning.\n */\nconst KNOWN_FRAMEWORKS = new Set([\n 'phoenix',\n 'phoenix_live_view',\n 'phoenix_html',\n 'phoenix_ecto',\n 'phoenix_pubsub',\n 'ecto',\n 'ecto_sql',\n 'plug',\n 'plug_cowboy',\n 'cowboy',\n 'ranch',\n 'absinthe',\n 'absinthe_plug',\n 'guardian',\n 'comeonin',\n 'bcrypt_elixir',\n 'argon2_elixir',\n 'pbkdf2_elixir',\n 'ex_machina',\n 'mock',\n 'mox',\n 'excoveralls',\n 'credo',\n 'dialyxir',\n 'ex_doc',\n 'jason',\n 'poison',\n 'httpoison',\n 'tesla',\n 'finch',\n 'mint',\n 'hackney',\n 'timex',\n 'quantum',\n 'oban',\n 'broadway',\n 'gen_stage',\n 'flow',\n 'bamboo',\n 'swoosh',\n 'ex_aws',\n 'ex_aws_s3',\n 'redix',\n 'cachex',\n 'nebulex',\n 'floki',\n 'wallaby',\n 'hound',\n]);\n\n/**\n * Parse mix.exs to extract dependencies.\n */\nasync function parseMixExs(filePath: string, cache?: FileCache): Promise<{\n elixirVersion?: string;\n deps: ElixirDependency[];\n}> {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n const deps: ElixirDependency[] = [];\n let elixirVersion: string | undefined;\n\n // Extract Elixir version requirement\n const elixirMatch = content.match(/elixir:\\s*\"([^\"]+)\"/);\n if (elixirMatch) {\n elixirVersion = elixirMatch[1];\n }\n\n // Parse dependencies - they appear in deps() function\n // Format: {:package_name, \"~> 1.0.0\"} or {:package_name, \"~> 1.0.0\", only: :dev}\n const depsRegex = /\\{\\s*:(\\w+)\\s*,\\s*\"([^\"]+)\"(?:,\\s*(?:only|optional|runtime):\\s*:(\\w+))?\\s*\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = depsRegex.exec(content)) !== null) {\n const name = match[1];\n const version = match[2];\n const scope = match[3]; // dev, test, prod, etc.\n\n deps.push({\n name,\n version,\n isDev: scope === 'dev' || scope === 'test',\n });\n }\n\n // Also handle git dependencies (for awareness, though we can't fetch versions)\n // {:dep, git: \"https://github.com/user/repo.git\", tag: \"v1.0.0\"}\n const gitDepsRegex = /\\{\\s*:(\\w+)\\s*,\\s*git:\\s*\"[^\"]+\"/g;\n while ((match = gitDepsRegex.exec(content)) !== null) {\n // Skip git dependencies for version checking\n }\n\n return { elixirVersion, deps };\n}\n\n/**\n * Parse mix.lock to get exact resolved versions.\n */\nasync function parseMixLock(filePath: string, cache?: FileCache): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n \n try {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n // mix.lock format: \"package_name\": {:hex, :package_name, \"1.0.0\", ...}\n const lockRegex = /\"(\\w+)\":\\s*\\{\\s*:hex\\s*,\\s*:\\w+\\s*,\\s*\"([^\"]+)\"/g;\n let match: RegExpExecArray | null;\n\n while ((match = lockRegex.exec(content)) !== null) {\n const name = match[1];\n const version = match[2];\n resolved.set(name, version);\n }\n } catch {\n // Lock file doesn't exist or is invalid\n }\n \n return resolved;\n}\n\n/**\n * Calculate version drift for a dependency.\n */\nfunction calculateDrift(\n currentVersion: string,\n latestVersion: string,\n): 'current' | 'minor-behind' | 'major-behind' | 'unknown' {\n try {\n // Remove version prefixes like ~>, >=, etc.\n const cleaned = currentVersion.replace(/^[~><=\\s]+/, '');\n \n const current = minVersion(validRange(cleaned) || cleaned);\n if (!current) {\n return 'unknown';\n }\n\n if (!gt(latestVersion, current.version)) {\n return 'current';\n }\n\n const latestParsed = minVersion(latestVersion);\n if (!latestParsed) {\n return 'unknown';\n }\n\n // Check if major version differs\n if (latestParsed.major > current.major) {\n return 'major-behind';\n }\n\n // Check if minor version differs (includes patch)\n return 'minor-behind';\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Scan a directory for Elixir projects.\n */\nexport async function scanElixir(\n projectPath: string,\n cache?: FileCache,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<ProjectScan | null> {\n const mixExsPath = `${projectPath}/mix.exs`;\n \n // Check if mix.exs exists\n const hasMixExs = cache \n ? await cache.pathExists(mixExsPath)\n : await pathExists(mixExsPath);\n\n if (!hasMixExs) {\n return null;\n }\n\n const { elixirVersion, deps } = await parseMixExs(mixExsPath, cache);\n\n // Read mix.lock for exact versions\n const mixLockPath = `${projectPath}/mix.lock`;\n const resolvedVersions = await parseMixLock(mixLockPath, cache);\n\n // Use resolved versions if available, otherwise parse from constraints\n const depsToCheck = deps.filter(d => !d.isDev);\n const packageNames = depsToCheck.map(d => d.name);\n\n // Fetch latest versions\n const latestVersions = await fetchHexVersionsBulk(packageNames, manifest, offline);\n\n // Build dependency list with drift analysis\n const dependencies: DependencyRow[] = [];\n const frameworks: DetectedFramework[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n for (const dep of depsToCheck) {\n const resolvedVersion = resolvedVersions.get(dep.name);\n const currentVersion = resolvedVersion || dep.version;\n const latestVersion = latestVersions.get(dep.name);\n const drift = latestVersion ? calculateDrift(currentVersion, latestVersion) : 'unknown';\n \n let majorsBehind: number | null = null;\n \n if (resolvedVersion && latestVersion) {\n try {\n const currentParsed = minVersion(validRange(currentVersion) || currentVersion);\n const latestParsed = minVersion(validRange(latestVersion) || latestVersion);\n if (currentParsed && latestParsed) {\n majorsBehind = latestParsed.major - currentParsed.major;\n }\n } catch { /* ignore parse errors */ }\n }\n\n dependencies.push({\n package: dep.name,\n section: dep.isDev ? 'devDependencies' : 'dependencies',\n currentSpec: dep.version,\n resolvedVersion: resolvedVersion || null,\n latestStable: latestVersion || null,\n majorsBehind,\n drift,\n });\n\n // Update buckets\n if (drift === 'current') buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else if (majorsBehind && majorsBehind > 1) buckets.twoPlusBehind++;\n else buckets.unknown++;\n\n // Detect frameworks\n if (KNOWN_FRAMEWORKS.has(dep.name)) {\n frameworks.push({\n name: dep.name,\n currentVersion: resolvedVersion || null,\n latestVersion: latestVersion || null,\n majorsBehind,\n });\n }\n }\n\n return {\n type: 'elixir',\n path: path.relative(projectPath.includes('/') ? projectPath.split('/').slice(0, -1).join('/') : '.', projectPath) || '.',\n name: path.basename(projectPath),\n runtime: elixirVersion,\n frameworks,\n dependencies,\n dependencyAgeBuckets: buckets,\n };\n}\n\n/**\n * Check if a file is an Elixir manifest file.\n */\nexport function isElixirManifest(fileName: string): boolean {\n return ELIXIR_MANIFEST_FILES.has(fileName);\n}\n\n/**\n * Scan for Elixir projects in a directory tree.\n */\nexport async function scanElixirProjects(\n rootDir: string,\n manifest?: PackageVersionManifest,\n cache?: FileCache,\n projectScanTimeout?: number,\n offline = false,\n): Promise<ProjectScan[]> {\n // Find Elixir manifest files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => ELIXIR_MANIFEST_FILES.has(name))\n : [];\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n\n for (const [dir] of projectDirs) {\n try {\n const scan = await scanElixir(dir, cache, manifest, offline);\n if (scan) {\n // Report the repo-relative directory, not the basename: the project\n // dedupe in run-scan keys on path, so a basename here makes the same\n // mix.exs appear twice (once via this scanner, once via the polyglot\n // scanner's repo-relative entry).\n scan.path = path.relative(rootDir, dir) || '.';\n results.push(scan);\n }\n } catch (error) {\n // Skip projects that fail to scan\n console.error(`Error scanning Elixir project at ${dir}:`, error);\n }\n }\n\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { Semaphore } from '../utils/semaphore.js';\nimport { gt, SemVer } from 'semver';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nconst DOCKER_HUB_API = 'https://hub.docker.com/v2';\nconst REQUEST_TIMEOUT = 10000;\nconst CONCURRENT_REQUESTS = 10;\n\ninterface DockerImageRef {\n registry?: string;\n namespace?: string;\n image: string;\n tag?: string;\n}\n\n/**\n * Parse a Docker image reference into components.\n * Examples:\n * - \"nginx:1.21\" -> {image: \"nginx\", tag: \"1.21\"}\n * - \"node:18-alpine\" -> {image: \"node\", tag: \"18-alpine\"}\n * - \"ghcr.io/owner/repo:latest\" -> {registry: \"ghcr.io\", namespace: \"owner\", image: \"repo\", tag: \"latest\"}\n */\nexport function parseDockerImage(imageRef: string): DockerImageRef {\n let registry: string | undefined;\n let namespace: string | undefined;\n let image: string;\n let tag: string | undefined;\n\n // Split by tag separator\n const [imagePart, tagPart] = imageRef.split(':');\n tag = tagPart;\n\n // Check for registry (contains dot or localhost)\n const parts = imagePart.split('/');\n if (parts.length > 1 && (parts[0].includes('.') || parts[0] === 'localhost')) {\n registry = parts[0];\n if (parts.length === 3) {\n namespace = parts[1];\n image = parts[2];\n } else {\n image = parts[1];\n }\n } else if (parts.length === 2) {\n // Docker Hub with namespace (e.g., \"library/nginx\")\n namespace = parts[0];\n image = parts[1];\n } else {\n image = imagePart;\n }\n\n return { registry, namespace, image, tag };\n}\n\n/**\n * Fetch available tags for a Docker Hub image.\n */\nasync function fetchDockerHubTags(\n namespace: string,\n image: string,\n semaphore?: Semaphore,\n): Promise<string[]> {\n const task = async () => {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n\n const url = `${DOCKER_HUB_API}/repositories/${namespace}/${image}/tags?page_size=100`;\n const response = await fetch(url, {\n signal: controller.signal,\n headers: { 'User-Agent': 'vibgrate-cli' },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return [];\n }\n\n const data = await response.json() as any;\n const tags = (data.results || []) as Array<{ name: string }>;\n\n return tags.map(t => t.name);\n } catch (error: any) {\n if (error?.name === 'AbortError') {\n return [];\n }\n return [];\n }\n };\n\n if (semaphore) {\n return semaphore.run(task);\n }\n\n return task();\n}\n\n/**\n * Find the latest semver-compatible tag from a list of tags.\n */\nfunction findLatestSemverTag(tags: string[]): string | null {\n const semverTags: SemVer[] = [];\n\n for (const tag of tags) {\n // Skip common non-version tags\n if (['latest', 'master', 'main', 'stable', 'edge', 'dev'].includes(tag)) {\n continue;\n }\n\n // Try to parse as semver (may have prefixes like \"v\" or suffixes like \"-alpine\")\n let cleaned = tag.replace(/^v/, ''); // Remove leading v\n const dashIndex = cleaned.indexOf('-');\n if (dashIndex > 0) {\n cleaned = cleaned.substring(0, dashIndex); // Remove suffixes like -alpine\n }\n\n try {\n const semver = new SemVer(cleaned);\n if (semver.prerelease.length === 0) { // Exclude pre-releases\n semverTags.push(semver);\n }\n } catch {\n // Not a valid semver\n }\n }\n\n if (semverTags.length === 0) {\n return null;\n }\n\n // Sort descending\n semverTags.sort((a, b) => (gt(a.version, b.version) ? -1 : 1));\n\n return semverTags[0].version;\n}\n\n/**\n * Fetch the latest stable version of a Docker image.\n */\nexport async function fetchDockerLatestVersion(\n imageRef: string,\n manifest?: PackageVersionManifest,\n semaphore?: Semaphore,\n offline = false,\n): Promise<string | null> {\n const parsed = parseDockerImage(imageRef);\n const key = `${parsed.namespace || 'library'}/${parsed.image}`;\n\n // Check manifest first\n const manifestEntry = getManifestEntry(manifest, 'docker', key);\n if (manifestEntry?.latest) {\n return manifestEntry.latest;\n }\n\n if (offline) {\n return null;\n }\n\n // Only support Docker Hub for now (GHCR and ECR require auth)\n if (parsed.registry && parsed.registry !== 'docker.io') {\n return null;\n }\n\n const namespace = parsed.namespace || 'library';\n const tags = await fetchDockerHubTags(namespace, parsed.image, semaphore);\n\n return findLatestSemverTag(tags);\n}\n\n/**\n * Bulk fetch latest versions for multiple Docker images.\n */\nexport async function fetchDockerVersionsBulk(\n imageRefs: string[],\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n const semaphore = new Semaphore(CONCURRENT_REQUESTS);\n\n const promises = imageRefs.map(async (ref) => {\n const version = await fetchDockerLatestVersion(ref, manifest, semaphore, offline);\n if (version) {\n results.set(ref, version);\n }\n });\n\n await Promise.all(promises);\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { fetchDockerVersionsBulk, parseDockerImage } from './docker-cache.js';\nimport { gt, SemVer } from 'semver';\nimport type { ProjectScan, DependencyRow } from '../types.js';\nimport { readTextFile, pathExists, FileCache } from '../utils/fs.js';\nimport type { PackageVersionManifest } from '../package-version-manifest.js';\nimport * as path from 'node:path';\n\ninterface DockerImage {\n name: string;\n currentTag: string;\n}\n\nconst DOCKER_MANIFEST_FILES = new Set(['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml']);\n\n/**\n * Parse Dockerfile to extract base images from FROM statements.\n */\nasync function parseDockerfile(filePath: string, cache?: FileCache): Promise<DockerImage[]> {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n const images: DockerImage[] = [];\n \n // Match FROM statements (including multi-stage builds)\n // FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]\n const fromRegex = /^FROM\\s+(?:--platform=[^\\s]+\\s+)?([^\\s]+)/gm;\n let match: RegExpExecArray | null;\n\n while ((match = fromRegex.exec(content)) !== null) {\n const imageRef = match[1];\n \n // Skip scratch\n if (imageRef === 'scratch') {\n continue;\n }\n\n const parsed = parseDockerImage(imageRef);\n images.push({\n name: `${parsed.namespace || 'library'}/${parsed.image}`,\n currentTag: parsed.tag || 'latest',\n });\n }\n\n return images;\n}\n\n/**\n * Parse docker-compose.yml to extract image references.\n */\nasync function parseDockerCompose(filePath: string, cache?: FileCache): Promise<DockerImage[]> {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n const images: DockerImage[] = [];\n \n // Simple regex-based parsing (not full YAML parser)\n // Matches: image: <image-ref>\n const imageRegex = /^\\s*image:\\s*([^\\s#]+)/gm;\n let match: RegExpExecArray | null;\n\n while ((match = imageRegex.exec(content)) !== null) {\n const imageRef = match[1].trim().replace(/[\"']/g, ''); // Remove quotes\n \n const parsed = parseDockerImage(imageRef);\n images.push({\n name: `${parsed.namespace || 'library'}/${parsed.image}`,\n currentTag: parsed.tag || 'latest',\n });\n }\n\n return images;\n}\n\n/**\n * Calculate version drift for a Docker image.\n */\nfunction calculateDrift(\n currentTag: string,\n latestVersion: string,\n): 'current' | 'minor-behind' | 'major-behind' | 'unknown' {\n try {\n // Handle special tags\n if (currentTag === 'latest' || currentTag === 'stable') {\n return 'current';\n }\n\n // Try to extract semver from tag (remove prefixes/suffixes like \"18-alpine\" -> \"18\")\n let currentCleaned = currentTag.replace(/^v/, '');\n const dashIndex = currentCleaned.indexOf('-');\n if (dashIndex > 0) {\n currentCleaned = currentCleaned.substring(0, dashIndex);\n }\n\n const current = new SemVer(currentCleaned);\n const latest = new SemVer(latestVersion);\n\n if (!gt(latest.version, current.version)) {\n return 'current';\n }\n\n // Check if major version differs\n if (latest.major > current.major) {\n return 'major-behind';\n }\n\n // Check if minor version differs (includes patch)\n return 'minor-behind';\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Scan a directory for Docker manifests.\n */\nexport async function scanDocker(\n projectPath: string,\n cache?: FileCache,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<ProjectScan | null> {\n const allImages: DockerImage[] = [];\n\n // Check for Dockerfile\n const dockerfilePath = `${projectPath}/Dockerfile`;\n const hasDockerfile = cache \n ? await cache.pathExists(dockerfilePath)\n : await pathExists(dockerfilePath);\n\n if (hasDockerfile) {\n const images = await parseDockerfile(dockerfilePath, cache);\n allImages.push(...images);\n }\n\n // Check for docker-compose files\n const composeFiles = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\n for (const file of composeFiles) {\n const composePath = `${projectPath}/${file}`;\n const hasCompose = cache \n ? await cache.pathExists(composePath)\n : await pathExists(composePath);\n\n if (hasCompose) {\n const images = await parseDockerCompose(composePath, cache);\n allImages.push(...images);\n break; // Only parse one compose file\n }\n }\n\n if (allImages.length === 0) {\n return null;\n }\n\n // Deduplicate images by name\n const uniqueImages = new Map<string, string>();\n for (const img of allImages) {\n if (!uniqueImages.has(img.name)) {\n uniqueImages.set(img.name, img.currentTag);\n }\n }\n\n // Fetch latest versions\n const imageRefs = Array.from(uniqueImages.keys());\n const latestVersions = await fetchDockerVersionsBulk(imageRefs, manifest, offline);\n\n // Build dependency list with drift analysis\n const dependencies: DependencyRow[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n for (const name of imageRefs) {\n const currentTag = uniqueImages.get(name)!;\n const latestVersion = latestVersions.get(name);\n const drift = latestVersion ? calculateDrift(currentTag, latestVersion) : 'unknown';\n \n let majorsBehind: number | null = null;\n \n if (latestVersion) {\n try {\n const currentCleaned = currentTag.replace(/^v/, '').split('-')[0];\n const currentParsed = new SemVer(currentCleaned);\n const latestParsed = new SemVer(latestVersion);\n majorsBehind = latestParsed.major - currentParsed.major;\n } catch { /* ignore parse errors */ }\n }\n\n dependencies.push({\n package: name,\n section: 'dependencies',\n currentSpec: currentTag,\n resolvedVersion: currentTag,\n latestStable: latestVersion || null,\n majorsBehind,\n drift,\n });\n\n // Update buckets\n if (drift === 'current') buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else if (majorsBehind && majorsBehind > 1) buckets.twoPlusBehind++;\n else buckets.unknown++;\n }\n\n return {\n type: 'docker' as any, // Docker not in ProjectType yet\n path: path.relative(projectPath.includes('/') ? projectPath.split('/').slice(0, -1).join('/') : '.', projectPath) || '.',\n name: path.basename(projectPath),\n frameworks: [],\n dependencies,\n dependencyAgeBuckets: buckets,\n };\n}\n\n/**\n * Check if a file is a Docker manifest file.\n */\nexport function isDockerManifest(fileName: string): boolean {\n return DOCKER_MANIFEST_FILES.has(fileName);\n}\n\n/**\n * Scan for Docker projects in a directory tree.\n */\nexport async function scanDockerProjects(\n rootDir: string,\n manifest?: PackageVersionManifest,\n cache?: FileCache,\n projectScanTimeout?: number,\n offline = false,\n): Promise<ProjectScan[]> {\n // Find Docker manifest files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => DOCKER_MANIFEST_FILES.has(name))\n : [];\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n\n for (const [dir] of projectDirs) {\n try {\n const scan = await scanDocker(dir, cache, manifest, offline);\n if (scan) {\n // Report the repo-relative directory, not the basename: the project\n // dedupe in run-scan keys on path, so basenames silently swallow\n // distinct projects whose directories share a name (e.g. a Helm\n // chart deploy/helm/gateway vs a service services/gateway).\n scan.path = path.relative(rootDir, dir) || '.';\n results.push(scan);\n }\n } catch (error) {\n // Skip projects that fail to scan\n console.error(`Error scanning Docker project at ${dir}:`, error);\n }\n }\n\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nconst ARTIFACT_HUB_API = 'https://artifacthub.io/api/v1';\nconst REQUEST_TIMEOUT = 10000;\nconst CONCURRENT_REQUESTS = 10;\n\n/**\n * Fetch the latest version of a Helm chart from Artifact Hub.\n */\nexport async function fetchHelmLatestVersion(\n chartName: string,\n repo?: string,\n manifest?: PackageVersionManifest,\n semaphore?: Semaphore,\n offline = false,\n): Promise<string | null> {\n const key = repo ? `${repo}/${chartName}` : chartName;\n\n // Check manifest first\n const manifestEntry = getManifestEntry(manifest, 'helm', key);\n if (manifestEntry?.latest) {\n return manifestEntry.latest;\n }\n\n if (offline) {\n return null;\n }\n\n const task = async () => {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n\n // Search for the chart\n const searchUrl = `${ARTIFACT_HUB_API}/packages/search?kind=0&ts_query_web=${encodeURIComponent(chartName)}&limit=10`;\n const response = await fetch(searchUrl, {\n signal: controller.signal,\n headers: { 'User-Agent': 'vibgrate-cli' },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as any;\n const packages = (data.packages || []) as Array<{\n name: string;\n version: string;\n repository?: { name?: string };\n }>;\n\n // Find matching chart\n let matchedPackage = packages.find(p => p.name === chartName);\n\n // If repo specified, try to match by repo too\n if (repo && packages.length > 1) {\n matchedPackage = packages.find(p => \n p.name === chartName && p.repository?.name === repo\n ) || matchedPackage;\n }\n\n if (!matchedPackage) {\n return null;\n }\n\n return matchedPackage.version;\n } catch (error: any) {\n if (error?.name === 'AbortError') {\n return null;\n }\n return null;\n }\n };\n\n if (semaphore) {\n return semaphore.run(task);\n }\n\n return task();\n}\n\n/**\n * Bulk fetch latest versions for multiple Helm charts.\n */\nexport async function fetchHelmVersionsBulk(\n charts: Array<{ name: string; repo?: string }>,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n const semaphore = new Semaphore(CONCURRENT_REQUESTS);\n\n const promises = charts.map(async (chart) => {\n const version = await fetchHelmLatestVersion(chart.name, chart.repo, manifest, semaphore, offline);\n if (version) {\n const key = chart.repo ? `${chart.repo}/${chart.name}` : chart.name;\n results.set(key, version);\n }\n });\n\n await Promise.all(promises);\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { fetchHelmVersionsBulk } from './helm-cache.js';\nimport { gt, minVersion, validRange } from 'semver';\nimport type { ProjectScan, DependencyRow } from '../types.js';\nimport { readTextFile, pathExists, FileCache } from '../utils/fs.js';\nimport type { PackageVersionManifest } from '../package-version-manifest.js';\nimport * as path from 'node:path';\n\ninterface HelmDependency {\n name: string;\n version: string;\n repository?: string;\n condition?: string;\n}\n\nconst HELM_MANIFEST_FILES = new Set(['Chart.yaml', 'Chart.yml']);\n\n/**\n * Parse Chart.yaml to extract chart metadata and dependencies.\n */\nasync function parseChartYaml(filePath: string, cache?: FileCache): Promise<{\n chartName?: string;\n chartVersion?: string;\n appVersion?: string;\n dependencies: HelmDependency[];\n}> {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n const dependencies: HelmDependency[] = [];\n let chartName: string | undefined;\n let chartVersion: string | undefined;\n let appVersion: string | undefined;\n\n // Extract chart name\n const nameMatch = content.match(/^name:\\s*(.+)$/m);\n if (nameMatch) {\n chartName = nameMatch[1].trim().replace(/[\"']/g, '');\n }\n\n // Extract chart version\n const versionMatch = content.match(/^version:\\s*(.+)$/m);\n if (versionMatch) {\n chartVersion = versionMatch[1].trim().replace(/[\"']/g, '');\n }\n\n // Extract app version\n const appVersionMatch = content.match(/^appVersion:\\s*(.+)$/m);\n if (appVersionMatch) {\n appVersion = appVersionMatch[1].trim().replace(/[\"']/g, '');\n }\n\n // Parse dependencies section\n // dependencies:\n // - name: chart-name\n // version: \"~1.0.0\"\n // repository: \"https://...\"\n const depsMatch = content.match(/^dependencies:\\s*$/m);\n if (depsMatch) {\n const depsStart = depsMatch.index! + depsMatch[0].length;\n const remainingContent = content.substring(depsStart);\n \n // Find each dependency block\n const depRegex = /^\\s*-\\s+name:\\s*(.+)$/gm;\n let match: RegExpExecArray | null;\n\n while ((match = depRegex.exec(remainingContent)) !== null) {\n const name = match[1].trim().replace(/[\"']/g, '');\n const blockStart = match.index;\n \n // Find the next dependency or end of file\n const nextMatch = depRegex.exec(remainingContent);\n const blockEnd = nextMatch ? nextMatch.index : remainingContent.length;\n depRegex.lastIndex = blockStart + 1; // Reset for next iteration\n \n const block = remainingContent.substring(blockStart, blockEnd);\n \n // Extract version\n const versionMatch = block.match(/version:\\s*(.+)$/m);\n const version = versionMatch ? versionMatch[1].trim().replace(/[\"']/g, '') : '*';\n \n // Extract repository\n const repoMatch = block.match(/repository:\\s*(.+)$/m);\n const repository = repoMatch ? repoMatch[1].trim().replace(/[\"']/g, '') : undefined;\n \n // Extract condition\n const conditionMatch = block.match(/condition:\\s*(.+)$/m);\n const condition = conditionMatch ? conditionMatch[1].trim().replace(/[\"']/g, '') : undefined;\n \n dependencies.push({ name, version, repository, condition });\n }\n }\n\n return { chartName, chartVersion, appVersion, dependencies };\n}\n\n/**\n * Parse Chart.lock to get exact resolved versions.\n */\nasync function parseChartLock(filePath: string, cache?: FileCache): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n \n try {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n // Chart.lock has dependencies section with name and version\n const depRegex = /^\\s*-\\s+name:\\s*(.+)$/gm;\n let match: RegExpExecArray | null;\n\n while ((match = depRegex.exec(content)) !== null) {\n const name = match[1].trim().replace(/[\"']/g, '');\n const blockStart = match.index;\n \n // Find version in the same block\n const nextMatch = depRegex.exec(content);\n const blockEnd = nextMatch ? nextMatch.index : content.length;\n depRegex.lastIndex = blockStart + 1;\n \n const block = content.substring(blockStart, blockEnd);\n const versionMatch = block.match(/version:\\s*(.+)$/m);\n \n if (versionMatch) {\n const version = versionMatch[1].trim().replace(/[\"']/g, '');\n resolved.set(name, version);\n }\n }\n } catch {\n // Lock file doesn't exist or is invalid\n }\n \n return resolved;\n}\n\n/**\n * Calculate version drift for a chart dependency.\n */\nfunction calculateDrift(\n currentVersion: string,\n latestVersion: string,\n): 'current' | 'minor-behind' | 'major-behind' | 'unknown' {\n try {\n // Remove version prefixes like ~, ^, >=, etc.\n const cleaned = currentVersion.replace(/^[~^><=\\s]+/, '');\n \n const current = minVersion(validRange(cleaned) || cleaned);\n if (!current) {\n return 'unknown';\n }\n\n if (!gt(latestVersion, current.version)) {\n return 'current';\n }\n\n const latestParsed = minVersion(latestVersion);\n if (!latestParsed) {\n return 'unknown';\n }\n\n // Check if major version differs\n if (latestParsed.major > current.major) {\n return 'major-behind';\n }\n\n // Check if minor version differs (includes patch)\n return 'minor-behind';\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Scan a directory for Helm charts.\n */\nexport async function scanHelm(\n projectPath: string,\n cache?: FileCache,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<ProjectScan | null> {\n // Check for Chart.yaml or Chart.yml\n let chartPath: string | null = null;\n for (const file of ['Chart.yaml', 'Chart.yml']) {\n const p = `${projectPath}/${file}`;\n const exists = cache \n ? await cache.pathExists(p)\n : await pathExists(p);\n \n if (exists) {\n chartPath = p;\n break;\n }\n }\n\n if (!chartPath) {\n return null;\n }\n\n const { chartName, appVersion, dependencies } = await parseChartYaml(chartPath, cache);\n\n // Read Chart.lock for exact versions\n const chartLockPath = `${projectPath}/Chart.lock`;\n const resolvedVersions = await parseChartLock(chartLockPath, cache);\n\n // Prepare charts to fetch\n const chartsToCheck = dependencies.map(d => ({\n name: d.name,\n repo: d.repository,\n }));\n\n // Fetch latest versions\n const latestVersions = await fetchHelmVersionsBulk(chartsToCheck, manifest, offline);\n\n // Build dependency list with drift analysis\n const deps: DependencyRow[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n for (const dep of dependencies) {\n const resolvedVersion = resolvedVersions.get(dep.name);\n const currentVersion = resolvedVersion || dep.version;\n const key = dep.repository ? `${dep.repository}/${dep.name}` : dep.name;\n const latestVersion = latestVersions.get(key);\n const drift = latestVersion ? calculateDrift(currentVersion, latestVersion) : 'unknown';\n \n let majorsBehind: number | null = null;\n \n if (latestVersion) {\n try {\n const currentParsed = minVersion(validRange(currentVersion) || currentVersion);\n const latestParsed = minVersion(validRange(latestVersion) || latestVersion);\n if (currentParsed && latestParsed) {\n majorsBehind = latestParsed.major - currentParsed.major;\n }\n } catch { /* ignore parse errors */ }\n }\n\n deps.push({\n package: dep.name,\n section: 'dependencies',\n currentSpec: dep.version,\n resolvedVersion: resolvedVersion || null,\n latestStable: latestVersion || null,\n majorsBehind,\n drift,\n });\n\n // Update buckets\n if (drift === 'current') buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else if (majorsBehind && majorsBehind > 1) buckets.twoPlusBehind++;\n else buckets.unknown++;\n }\n\n return {\n type: 'helm' as any, // helm not in ProjectType yet\n path: path.relative(projectPath.includes('/') ? projectPath.split('/').slice(0, -1).join('/') : '.', projectPath) || '.',\n name: chartName || path.basename(projectPath),\n runtime: appVersion,\n frameworks: [],\n dependencies: deps,\n dependencyAgeBuckets: buckets,\n };\n}\n\n/**\n * Check if a file is a Helm manifest file.\n */\nexport function isHelmManifest(fileName: string): boolean {\n return HELM_MANIFEST_FILES.has(fileName);\n}\n\n/**\n * Scan for Helm charts in a directory tree.\n */\nexport async function scanHelmProjects(\n rootDir: string,\n manifest?: PackageVersionManifest,\n cache?: FileCache,\n projectScanTimeout?: number,\n offline = false,\n): Promise<ProjectScan[]> {\n // Find Helm manifest files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => HELM_MANIFEST_FILES.has(name))\n : [];\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n\n for (const [dir] of projectDirs) {\n try {\n const scan = await scanHelm(dir, cache, manifest, offline);\n if (scan) {\n // Report the repo-relative directory, not the basename: the project\n // dedupe in run-scan keys on path, so basenames silently swallow\n // distinct projects whose directories share a name (e.g. a Helm\n // chart deploy/helm/gateway vs a service services/gateway).\n scan.path = path.relative(rootDir, dir) || '.';\n results.push(scan);\n }\n } catch (error) {\n // Skip projects that fail to scan\n console.error(`Error scanning Helm chart at ${dir}:`, error);\n }\n }\n\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { Semaphore } from '../utils/semaphore.js';\nimport { gt, SemVer } from 'semver';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nconst TERRAFORM_REGISTRY_API = 'https://registry.terraform.io/v1';\nconst REQUEST_TIMEOUT = 10000;\nconst CONCURRENT_REQUESTS = 10;\n\n/**\n * Fetch the latest version of a Terraform provider.\n */\nexport async function fetchTerraformProviderLatestVersion(\n namespace: string,\n name: string,\n manifest?: PackageVersionManifest,\n semaphore?: Semaphore,\n offline = false,\n): Promise<string | null> {\n const key = `${namespace}/${name}`;\n\n // Check manifest first\n const manifestEntry = getManifestEntry(manifest, 'terraform', key);\n if (manifestEntry?.latest) {\n return manifestEntry.latest;\n }\n\n if (offline) {\n return null;\n }\n\n const task = async () => {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n\n const url = `${TERRAFORM_REGISTRY_API}/providers/${namespace}/${name}/versions`;\n const response = await fetch(url, {\n signal: controller.signal,\n headers: { 'User-Agent': 'vibgrate-cli' },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as any;\n const versions = (data.versions || []) as Array<{ version: string }>;\n\n if (versions.length === 0) {\n return null;\n }\n\n // Filter pre-releases and sort\n const stableVersions: SemVer[] = [];\n for (const v of versions) {\n try {\n const semver = new SemVer(v.version);\n if (semver.prerelease.length === 0) {\n stableVersions.push(semver);\n }\n } catch {\n // Invalid semver\n }\n }\n\n if (stableVersions.length === 0) {\n return null;\n }\n\n // Sort descending\n stableVersions.sort((a, b) => (gt(a.version, b.version) ? -1 : 1));\n\n return stableVersions[0].version;\n } catch (error: any) {\n if (error?.name === 'AbortError') {\n return null;\n }\n return null;\n }\n };\n\n if (semaphore) {\n return semaphore.run(task);\n }\n\n return task();\n}\n\n/**\n * Fetch the latest version of a Terraform module.\n */\nexport async function fetchTerraformModuleLatestVersion(\n namespace: string,\n name: string,\n provider: string,\n manifest?: PackageVersionManifest,\n semaphore?: Semaphore,\n offline = false,\n): Promise<string | null> {\n const key = `${namespace}/${name}/${provider}`;\n\n // Check manifest first\n const manifestEntry = getManifestEntry(manifest, 'terraform', key);\n if (manifestEntry?.latest) {\n return manifestEntry.latest;\n }\n\n if (offline) {\n return null;\n }\n\n const task = async () => {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);\n\n const url = `${TERRAFORM_REGISTRY_API}/modules/${namespace}/${name}/${provider}/versions`;\n const response = await fetch(url, {\n signal: controller.signal,\n headers: { 'User-Agent': 'vibgrate-cli' },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as any;\n const modules = (data.modules || []) as Array<{ versions: Array<{ version: string }> }>;\n\n if (modules.length === 0 || !modules[0].versions) {\n return null;\n }\n\n const versions = modules[0].versions;\n\n // Filter pre-releases and sort\n const stableVersions: SemVer[] = [];\n for (const v of versions) {\n try {\n const semver = new SemVer(v.version);\n if (semver.prerelease.length === 0) {\n stableVersions.push(semver);\n }\n } catch {\n // Invalid semver\n }\n }\n\n if (stableVersions.length === 0) {\n return null;\n }\n\n // Sort descending\n stableVersions.sort((a, b) => (gt(a.version, b.version) ? -1 : 1));\n\n return stableVersions[0].version;\n } catch (error: any) {\n if (error?.name === 'AbortError') {\n return null;\n }\n return null;\n }\n };\n\n if (semaphore) {\n return semaphore.run(task);\n }\n\n return task();\n}\n\n/**\n * Bulk fetch latest versions for Terraform providers and modules.\n */\nexport async function fetchTerraformVersionsBulk(\n items: Array<{ type: 'provider' | 'module'; namespace: string; name: string; provider?: string }>,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n const semaphore = new Semaphore(CONCURRENT_REQUESTS);\n\n const promises = items.map(async (item) => {\n let version: string | null = null;\n let key: string;\n\n if (item.type === 'provider') {\n key = `${item.namespace}/${item.name}`;\n version = await fetchTerraformProviderLatestVersion(item.namespace, item.name, manifest, semaphore, offline);\n } else {\n key = `${item.namespace}/${item.name}/${item.provider}`;\n version = await fetchTerraformModuleLatestVersion(item.namespace, item.name, item.provider!, manifest, semaphore, offline);\n }\n\n if (version) {\n results.set(key, version);\n }\n });\n\n await Promise.all(promises);\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { fetchTerraformVersionsBulk } from './terraform-cache.js';\nimport { gt, minVersion, validRange } from 'semver';\nimport type { ProjectScan, DependencyRow } from '../types.js';\nimport { readTextFile, pathExists, FileCache } from '../utils/fs.js';\nimport type { PackageVersionManifest } from '../package-version-manifest.js';\nimport * as path from 'node:path';\n\ninterface TerraformProvider {\n source: string; // e.g., \"hashicorp/aws\"\n version?: string;\n}\n\ninterface TerraformModule {\n source: string; // e.g., \"terraform-aws-modules/vpc/aws\"\n version?: string;\n}\n\n/**\n * Parse Terraform files to extract provider and module requirements.\n */\nasync function parseTerraformFile(filePath: string, cache?: FileCache): Promise<{\n terraformVersion?: string;\n providers: TerraformProvider[];\n modules: TerraformModule[];\n}> {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n const providers: TerraformProvider[] = [];\n const modules: TerraformModule[] = [];\n let terraformVersion: string | undefined;\n\n // Extract required_version from terraform block\n const tfVersionMatch = content.match(/terraform\\s*\\{[^}]*required_version\\s*=\\s*\"([^\"]+)\"/s);\n if (tfVersionMatch) {\n terraformVersion = tfVersionMatch[1];\n }\n\n // Extract required_providers from terraform block\n // terraform {\n // required_providers {\n // aws = {\n // source = \"hashicorp/aws\"\n // version = \"~> 4.0\"\n // }\n // }\n // }\n const requiredProvidersMatch = content.match(/required_providers\\s*\\{([^}]+)\\}/s);\n if (requiredProvidersMatch) {\n const providersBlock = requiredProvidersMatch[1];\n \n // Match each provider block\n const providerRegex = /(\\w+)\\s*=\\s*\\{([^}]+)\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = providerRegex.exec(providersBlock)) !== null) {\n const providerBlock = match[2];\n \n // Extract source\n const sourceMatch = providerBlock.match(/source\\s*=\\s*\"([^\"]+)\"/);\n if (!sourceMatch) continue;\n \n const source = sourceMatch[1];\n \n // Extract version\n const versionMatch = providerBlock.match(/version\\s*=\\s*\"([^\"]+)\"/);\n const version = versionMatch ? versionMatch[1] : undefined;\n \n providers.push({ source, version });\n }\n }\n\n // Also look for provider blocks (older style)\n // provider \"aws\" {\n // version = \"~> 3.0\"\n // }\n const providerBlockRegex = /provider\\s+\"(\\w+)\"\\s*\\{([^}]+)\\}/g;\n let providerMatch: RegExpExecArray | null;\n\n while ((providerMatch = providerBlockRegex.exec(content)) !== null) {\n const providerName = providerMatch[1];\n const block = providerMatch[2];\n \n const versionMatch = block.match(/version\\s*=\\s*\"([^\"]+)\"/);\n if (versionMatch) {\n // Assume hashicorp namespace if not already added\n const existingProvider = providers.find(p => p.source.endsWith(`/${providerName}`));\n if (!existingProvider) {\n providers.push({\n source: `hashicorp/${providerName}`,\n version: versionMatch[1],\n });\n }\n }\n }\n\n // Extract modules\n // module \"vpc\" {\n // source = \"terraform-aws-modules/vpc/aws\"\n // version = \"3.0.0\"\n // }\n const moduleRegex = /module\\s+\"[^\"]+\"\\s*\\{([^}]+)\\}/g;\n let moduleMatch: RegExpExecArray | null;\n\n while ((moduleMatch = moduleRegex.exec(content)) !== null) {\n const block = moduleMatch[1];\n \n // Extract source\n const sourceMatch = block.match(/source\\s*=\\s*\"([^\"]+)\"/);\n if (!sourceMatch) continue;\n \n const source = sourceMatch[1];\n \n // Skip local modules and git sources\n if (source.startsWith('./') || source.startsWith('../') || source.startsWith('git::')) {\n continue;\n }\n \n // Extract version\n const versionMatch = block.match(/version\\s*=\\s*\"([^\"]+)\"/);\n const version = versionMatch ? versionMatch[1] : undefined;\n \n modules.push({ source, version });\n }\n\n return { terraformVersion, providers, modules };\n}\n\n/**\n * Parse .terraform.lock.hcl to get exact versions.\n */\nasync function parseTerraformLock(filePath: string, cache?: FileCache): Promise<Map<string, string>> {\n const resolved = new Map<string, string>();\n \n try {\n const content = cache \n ? await cache.readTextFile(filePath)\n : await readTextFile(filePath);\n \n // provider \"registry.terraform.io/hashicorp/aws\" {\n // version = \"4.0.0\"\n // }\n const providerRegex = /provider\\s+\"[^\"]*\\/([^/\"]+\\/[^/\"]+)\"\\s*\\{([^}]+)\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = providerRegex.exec(content)) !== null) {\n const source = match[1]; // e.g., \"hashicorp/aws\"\n const block = match[2];\n \n const versionMatch = block.match(/version\\s*=\\s*\"([^\"]+)\"/);\n if (versionMatch) {\n resolved.set(source, versionMatch[1]);\n }\n }\n } catch {\n // Lock file doesn't exist or is invalid\n }\n \n return resolved;\n}\n\n/**\n * Calculate version drift.\n */\nfunction calculateDrift(\n currentVersion: string,\n latestVersion: string,\n): 'current' | 'minor-behind' | 'major-behind' | 'unknown' {\n try {\n // Remove version prefixes like ~>, >=, etc.\n const cleaned = currentVersion.replace(/^[~><=\\s]+/, '');\n \n const current = minVersion(validRange(cleaned) || cleaned);\n if (!current) {\n return 'unknown';\n }\n\n if (!gt(latestVersion, current.version)) {\n return 'current';\n }\n\n const latestParsed = minVersion(latestVersion);\n if (!latestParsed) {\n return 'unknown';\n }\n\n // Check if major version differs\n if (latestParsed.major > current.major) {\n return 'major-behind';\n }\n\n // Check if minor version differs (includes patch)\n return 'minor-behind';\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Scan a directory for Terraform configurations.\n */\nexport async function scanTerraform(\n projectPath: string,\n cache?: FileCache,\n manifest?: PackageVersionManifest,\n offline = false,\n): Promise<ProjectScan | null> {\n // Find all .tf files\n const tfFiles: string[] = [];\n \n if (cache) {\n // Use cache to find .tf files\n const allFiles = await cache.findFiles(projectPath, (name) => name.endsWith('.tf'));\n tfFiles.push(...allFiles);\n } else {\n // Fallback: check for common files\n const commonFiles = ['main.tf', 'variables.tf', 'outputs.tf', 'versions.tf', 'providers.tf'];\n for (const file of commonFiles) {\n const p = `${projectPath}/${file}`;\n if (await pathExists(p)) {\n tfFiles.push(p);\n }\n }\n }\n\n if (tfFiles.length === 0) {\n return null;\n }\n\n // Parse all .tf files and aggregate\n let terraformVersion: string | undefined;\n const allProviders: TerraformProvider[] = [];\n const allModules: TerraformModule[] = [];\n\n for (const tfFile of tfFiles) {\n const { terraformVersion: tfVer, providers, modules } = await parseTerraformFile(tfFile, cache);\n \n if (tfVer && !terraformVersion) {\n terraformVersion = tfVer;\n }\n \n allProviders.push(...providers);\n allModules.push(...modules);\n }\n\n // Deduplicate providers and modules\n const uniqueProviders = new Map<string, string | undefined>();\n for (const p of allProviders) {\n if (!uniqueProviders.has(p.source)) {\n uniqueProviders.set(p.source, p.version);\n }\n }\n\n const uniqueModules = new Map<string, string | undefined>();\n for (const m of allModules) {\n if (!uniqueModules.has(m.source)) {\n uniqueModules.set(m.source, m.version);\n }\n }\n\n // Read lock file for exact versions\n const lockPath = `${projectPath}/.terraform.lock.hcl`;\n const resolvedVersions = await parseTerraformLock(lockPath, cache);\n\n // Prepare items to fetch\n const itemsToFetch: Array<{ type: 'provider' | 'module'; namespace: string; name: string; provider?: string }> = [];\n\n for (const [source] of uniqueProviders) {\n const [namespace, name] = source.split('/');\n itemsToFetch.push({ type: 'provider', namespace, name });\n }\n\n for (const [source] of uniqueModules) {\n const parts = source.split('/');\n if (parts.length === 3) {\n const [namespace, name, provider] = parts;\n itemsToFetch.push({ type: 'module', namespace, name, provider });\n }\n }\n\n // Fetch latest versions\n const latestVersions = await fetchTerraformVersionsBulk(itemsToFetch, manifest, offline);\n\n // Build dependency list\n const dependencies: DependencyRow[] = [];\n const buckets = { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 };\n\n for (const [source, constraintVersion] of uniqueProviders) {\n const resolvedVersion = resolvedVersions.get(source);\n const currentVersion = resolvedVersion || constraintVersion || 'unknown';\n const latestVersion = latestVersions.get(source);\n const drift = (latestVersion && currentVersion !== 'unknown') ? calculateDrift(currentVersion, latestVersion) : 'unknown';\n \n let majorsBehind: number | null = null;\n \n if (latestVersion && currentVersion !== 'unknown') {\n try {\n const currentParsed = minVersion(validRange(currentVersion) || currentVersion);\n const latestParsed = minVersion(validRange(latestVersion) || latestVersion);\n if (currentParsed && latestParsed) {\n majorsBehind = latestParsed.major - currentParsed.major;\n }\n } catch { /* ignore parse errors */ }\n }\n\n dependencies.push({\n package: `provider:${source}`,\n section: 'dependencies',\n currentSpec: constraintVersion || 'unknown',\n resolvedVersion: resolvedVersion || null,\n latestStable: latestVersion || null,\n majorsBehind,\n drift,\n });\n\n // Update buckets\n if (drift === 'current') buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else if (majorsBehind && majorsBehind > 1) buckets.twoPlusBehind++;\n else buckets.unknown++;\n }\n\n for (const [source, constraintVersion] of uniqueModules) {\n const currentVersion = constraintVersion || 'unknown';\n const latestVersion = latestVersions.get(source);\n const drift = (latestVersion && currentVersion !== 'unknown') ? calculateDrift(currentVersion, latestVersion) : 'unknown';\n \n let majorsBehind: number | null = null;\n \n if (latestVersion && currentVersion !== 'unknown') {\n try {\n const currentParsed = minVersion(validRange(currentVersion) || currentVersion);\n const latestParsed = minVersion(validRange(latestVersion) || latestVersion);\n if (currentParsed && latestParsed) {\n majorsBehind = latestParsed.major - currentParsed.major;\n }\n } catch { /* ignore parse errors */ }\n }\n\n dependencies.push({\n package: `module:${source}`,\n section: 'dependencies',\n currentSpec: constraintVersion || 'unknown',\n resolvedVersion: null,\n latestStable: latestVersion || null,\n majorsBehind,\n drift,\n });\n\n // Update buckets\n if (drift === 'current') buckets.current++;\n else if (majorsBehind === 1) buckets.oneBehind++;\n else if (majorsBehind && majorsBehind > 1) buckets.twoPlusBehind++;\n else buckets.unknown++;\n }\n\n return {\n type: 'terraform' as any, // terraform not in ProjectType yet\n path: path.relative(projectPath.includes('/') ? projectPath.split('/').slice(0, -1).join('/') : '.', projectPath) || '.',\n name: path.basename(projectPath),\n runtime: terraformVersion,\n frameworks: [],\n dependencies,\n dependencyAgeBuckets: buckets,\n };\n}\n\n/**\n * Check if a file is a Terraform file.\n */\nexport function isTerraformManifest(fileName: string): boolean {\n return fileName.endsWith('.tf');\n}\n\n/**\n * Scan for Terraform configurations in a directory tree.\n */\nexport async function scanTerraformProjects(\n rootDir: string,\n manifest?: PackageVersionManifest,\n cache?: FileCache,\n projectScanTimeout?: number,\n offline = false,\n): Promise<ProjectScan[]> {\n // Find Terraform manifest files\n const manifestFiles = cache\n ? await cache.findFiles(rootDir, (name) => name.endsWith('.tf'))\n : [];\n\n // Group manifests by directory to form \"projects\"\n const projectDirs = new Map<string, string[]>();\n for (const f of manifestFiles) {\n const dir = path.dirname(f);\n if (!projectDirs.has(dir)) projectDirs.set(dir, []);\n projectDirs.get(dir)!.push(f);\n }\n\n const results: ProjectScan[] = [];\n\n for (const [dir] of projectDirs) {\n try {\n const scan = await scanTerraform(dir, cache, manifest, offline);\n if (scan) {\n // Report the repo-relative directory, not the basename: the project\n // dedupe in run-scan keys on path, so basenames silently swallow\n // distinct projects whose directories share a name (e.g. a Helm\n // chart deploy/helm/gateway vs a service services/gateway).\n scan.path = path.relative(rootDir, dir) || '.';\n results.push(scan);\n }\n } catch (error) {\n // Skip projects that fail to scan\n console.error(`Error scanning Terraform project at ${dir}:`, error);\n }\n }\n\n return results;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport { readJsonFile, readTextFile } from '../utils/fs.js';\nimport type { DependencyRow, ProjectScan, ProjectType } from '../types.js';\nimport type { DirEntry, FileCache } from '../utils/fs.js';\n\nconst TOP_25_LANGUAGES: readonly ProjectType[] = [\n 'node',\n 'python',\n 'java',\n 'dotnet',\n 'go',\n 'rust',\n 'php',\n 'typescript',\n 'ruby',\n 'swift',\n 'kotlin',\n 'dart',\n 'scala',\n 'r',\n 'objective-c',\n 'elixir',\n 'haskell',\n 'lua',\n 'perl',\n 'julia',\n 'shell',\n 'clojure',\n 'groovy',\n 'c',\n 'cpp',\n] as const;\n\nconst LEGACY_LANGUAGES: readonly ProjectType[] = [\n 'cobol',\n 'fortran',\n 'visual-basic',\n 'pascal',\n 'ada',\n 'assembly',\n 'rpg',\n] as const;\n\nconst MANIFEST_TO_LANGUAGE: Array<{ name: string; type: ProjectType }> = [\n { name: 'go.mod', type: 'go' },\n { name: 'Cargo.toml', type: 'rust' },\n { name: 'composer.json', type: 'php' },\n { name: 'Package.swift', type: 'swift' },\n { name: 'pubspec.yaml', type: 'dart' },\n { name: 'build.gradle.kts', type: 'kotlin' },\n { name: 'build.sbt', type: 'scala' },\n { name: 'DESCRIPTION', type: 'r' },\n { name: 'Podfile', type: 'objective-c' },\n { name: 'mix.exs', type: 'elixir' },\n { name: 'cpanfile', type: 'perl' },\n { name: 'Project.toml', type: 'julia' },\n { name: 'deps.edn', type: 'clojure' },\n { name: 'build.gradle', type: 'groovy' },\n { name: 'tsconfig.json', type: 'typescript' },\n { name: 'Makefile', type: 'c' },\n { name: 'CMakeLists.txt', type: 'cpp' },\n { name: '*.vbp', type: 'visual-basic' },\n];\n\nconst EXTENSION_TO_LANGUAGE: Array<{ extensions: string[]; type: ProjectType }> = [\n { extensions: ['.m', '.mm'], type: 'objective-c' },\n { extensions: ['.c', '.h'], type: 'c' },\n { extensions: ['.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx'], type: 'cpp' },\n { extensions: ['.cob', '.cbl', '.cpy'], type: 'cobol' },\n { extensions: ['.f', '.for', '.f90', '.f95', '.f03', '.f08'], type: 'fortran' },\n { extensions: ['.pas', '.pp', '.lpr'], type: 'pascal' },\n { extensions: ['.adb', '.ads', '.ada'], type: 'ada' },\n { extensions: ['.asm', '.s', '.s43', '.s65'], type: 'assembly' },\n { extensions: ['.rpg', '.rpgle', '.sqlrpgle'], type: 'rpg' },\n];\n\nfunction makeDep(pkg: string, spec = 'unknown'): DependencyRow {\n return {\n package: pkg,\n section: 'dependencies',\n currentSpec: spec,\n resolvedVersion: null,\n latestStable: null,\n majorsBehind: null,\n drift: 'unknown',\n };\n}\n\nfunction parseLineDependencies(content: string, regex: RegExp, capture = 1): string[] {\n const deps = new Set<string>();\n for (const line of content.split(/\\r?\\n/)) {\n const match = line.match(regex);\n if (match?.[capture]) deps.add(match[capture]);\n }\n return [...deps];\n}\n\nfunction getProjectName(projectPath: string, rootDir: string): string {\n return path.basename(projectPath) || path.basename(rootDir);\n}\n\n/**\n * A Makefile alone is weak evidence of a C project — monorepo roots, IaC\n * repos, and Go/Node projects commonly carry task-runner Makefiles. Only\n * claim the directory for C when the Makefile shows C build signals:\n * compiler variable assignments, gcc/clang invocations, or .c/.o targets.\n */\nfunction makefileHasCSignals(content: string): boolean {\n return (\n /^\\s*(CC|CFLAGS|LDFLAGS)\\s*[:?+]?=/m.test(content) ||\n /\\b(gcc|clang)\\b/.test(content) ||\n /\\.(c|o)\\b/.test(content)\n );\n}\n\nfunction addProject(\n projects: ProjectScan[],\n seen: Set<string>,\n type: ProjectType,\n projectPath: string,\n rootDir: string,\n dependencies: DependencyRow[] = [],\n): void {\n const normalizedPath = projectPath || '.';\n const key = `${type}:${normalizedPath}`;\n if (seen.has(key)) return;\n seen.add(key);\n\n projects.push({\n type,\n path: normalizedPath,\n name: getProjectName(normalizedPath, rootDir),\n frameworks: [],\n dependencies,\n dependencyAgeBuckets: {\n current: 0,\n oneBehind: 0,\n twoPlusBehind: 0,\n unknown: dependencies.length,\n },\n });\n}\n\nasync function parseDepsByManifest(manifestPath: string, cache?: FileCache): Promise<DependencyRow[]> {\n const filename = path.basename(manifestPath);\n const readText = async () => (cache ? cache.readTextFile(manifestPath) : readTextFile(manifestPath));\n\n if (filename === 'composer.json') {\n const content = cache\n ? await cache.readJsonFile<Record<string, unknown>>(manifestPath)\n : await readJsonFile<Record<string, unknown>>(manifestPath);\n if (!content || typeof content !== 'object') return [];\n const deps = new Set<string>();\n for (const key of ['require', 'require-dev']) {\n const section = content[key];\n if (section && typeof section === 'object') {\n for (const dep of Object.keys(section as Record<string, unknown>)) deps.add(dep);\n }\n }\n return [...deps].map((dep) => makeDep(dep));\n }\n\n const text = await readText();\n if (!text) return [];\n\n if (filename === 'go.mod') return parseLineDependencies(text, /^\\s*require\\s+([^\\s]+)\\s+(.+)$/).map((dep) => makeDep(dep));\n if (filename === 'Cargo.toml') return parseLineDependencies(text, /^\\s*([A-Za-z0-9_\\-]+)\\s*=\\s*['\"{]/).map((dep) => makeDep(dep));\n if (filename === 'pubspec.yaml') return parseLineDependencies(text, /^\\s{2,}([A-Za-z0-9_\\-]+):\\s*.+$/).map((dep) => makeDep(dep));\n if (filename === 'mix.exs') return parseLineDependencies(text, /\\{\\s*:([a-zA-Z0-9_]+),/).map((dep) => makeDep(dep));\n if (filename === 'cpanfile') return parseLineDependencies(text, /^\\s*requires\\s+['\"]([^'\"]+)['\"]/).map((dep) => makeDep(dep));\n if (filename === 'build.sbt') return parseLineDependencies(text, /\"([A-Za-z0-9_.\\-]+)\"\\s*%{1,2}\\s*\"([A-Za-z0-9_.\\-]+)\"/, 2).map((dep) => makeDep(dep));\n\n return [];\n}\n\nfunction detectExtensionBackedProjects(entries: DirEntry[]): Map<string, Set<ProjectType>> {\n const byDir = new Map<string, Set<ProjectType>>();\n\n for (const entry of entries) {\n if (!entry.isFile) continue;\n const ext = path.extname(entry.name).toLowerCase();\n if (!ext) continue;\n\n for (const mapping of EXTENSION_TO_LANGUAGE) {\n if (!mapping.extensions.includes(ext)) continue;\n const dir = path.dirname(entry.relPath) || '.';\n if (!byDir.has(dir)) byDir.set(dir, new Set<ProjectType>());\n byDir.get(dir)?.add(mapping.type);\n }\n }\n\n return byDir;\n}\n\nexport async function scanPolyglotProjects(rootDir: string, cache?: FileCache): Promise<ProjectScan[]> {\n const entries = cache ? await cache.walkDir(rootDir) : [];\n\n const candidateFiles = entries.filter((entry) => entry.isFile && MANIFEST_TO_LANGUAGE.some((m) => m.name === entry.name || (m.name.startsWith('*.') && entry.name.endsWith(m.name.slice(1)))));\n\n const shellDirs = new Set(\n entries\n .filter((entry) => entry.isFile && entry.name.endsWith('.sh'))\n .map((entry) => path.dirname(entry.relPath) || '.'),\n );\n\n const projects: ProjectScan[] = [];\n const seen = new Set<string>();\n\n for (const file of candidateFiles) {\n const mapping = MANIFEST_TO_LANGUAGE.find((m) => m.name === file.name || (m.name.startsWith('*.') && file.name.endsWith(m.name.slice(1))));\n if (!mapping) continue;\n\n if (file.name === 'Makefile') {\n const text = cache ? await cache.readTextFile(file.absPath) : await readTextFile(file.absPath);\n if (!makefileHasCSignals(text)) continue;\n }\n\n const projectPath = path.dirname(file.relPath) || '.';\n const dependencies = await parseDepsByManifest(file.absPath, cache);\n addProject(projects, seen, mapping.type, projectPath, rootDir, dependencies);\n }\n\n for (const dir of shellDirs) {\n addProject(projects, seen, 'shell', dir, rootDir);\n }\n\n const extensionProjects = detectExtensionBackedProjects(entries);\n for (const [dir, types] of extensionProjects) {\n for (const type of types) {\n addProject(projects, seen, type, dir, rootDir);\n }\n }\n\n return projects;\n}\n\nexport function getTop25SupportedLanguages(): readonly ProjectType[] {\n return TOP_25_LANGUAGES;\n}\n\nexport function getLegacySupportedLanguages(): readonly ProjectType[] {\n return LEGACY_LANGUAGES;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport type { PackageVersionManifest } from '../package-version-manifest.js';\nimport type { RuntimeCatalog, ResolvedRuntimeCatalog, RuntimeCatalogSource } from './types.js';\nimport { BUNDLED_RUNTIME_CATALOG } from './snapshot.js';\n\n/**\n * Resolves the {@link RuntimeCatalog} for a scan, mirroring how dependency\n * versions are resolved (live with offline fallback). Resolution order:\n *\n * fresh local cache → `/v1/reference/runtimes` (Vibgrate API) →\n * user manifest `runtimes` → bundled snapshot\n *\n * The CLI never hits endoflife.date directly — the API owns the vendor fetch and\n * D1 cache; the CLI consumes the catalog it serves and caches it locally. Every\n * step is best-effort and never throws; the bundled snapshot is the guaranteed\n * floor. The resolved `source` is surfaced as a confidence signal.\n */\n\nconst DEFAULT_API_BASE = 'https://api.vibgrate.com';\nconst CACHE_TTL_MS = 1000 * 60 * 60 * 24; // 24h\nconst FETCH_TIMEOUT_MS = 5_000;\n\nexport interface RuntimeCatalogClientOptions {\n /** Base URL of the Vibgrate API (default `https://api.vibgrate.com`, or `VIBGRATE_API_BASE`). */\n apiBase?: string;\n /** Skip the network entirely; use manifest/bundled only. */\n offline?: boolean;\n /** Offline manifest that may carry a `runtimes` catalog (`--package-manifest`). */\n manifest?: PackageVersionManifest;\n /** Override the on-disk cache directory (testing). */\n cacheDir?: string;\n /** Override the fetch implementation (testing). */\n fetchImpl?: typeof fetch;\n}\n\ninterface CacheEnvelope {\n fetchedAt: string;\n catalog: RuntimeCatalog;\n}\n\nfunction isRuntimeCatalog(value: unknown): value is RuntimeCatalog {\n return (\n !!value &&\n typeof value === 'object' &&\n typeof (value as RuntimeCatalog).generatedAt === 'string' &&\n typeof (value as RuntimeCatalog).products === 'object' &&\n (value as RuntimeCatalog).products !== null\n );\n}\n\nexport class RuntimeCatalogClient {\n private readonly apiBase: string;\n private readonly offline: boolean;\n private readonly manifest?: PackageVersionManifest;\n private readonly cacheDir: string;\n private readonly fetchImpl: typeof fetch;\n private resolution: Promise<ResolvedRuntimeCatalog> | null = null;\n\n constructor(opts: RuntimeCatalogClientOptions = {}) {\n this.apiBase = (opts.apiBase ?? process.env.VIBGRATE_API_BASE ?? DEFAULT_API_BASE).replace(/\\/+$/, '');\n this.offline = opts.offline ?? false;\n this.manifest = opts.manifest;\n this.cacheDir = opts.cacheDir ?? path.join(os.homedir(), '.vibgrate', 'cache');\n this.fetchImpl = opts.fetchImpl ?? (globalThis.fetch as typeof fetch);\n }\n\n /** Resolve the catalog once; concurrent/repeat calls share the result. */\n resolve(): Promise<ResolvedRuntimeCatalog> {\n if (!this.resolution) this.resolution = this.doResolve();\n return this.resolution;\n }\n\n private get cacheFile(): string {\n return path.join(this.cacheDir, 'runtimes.json');\n }\n\n private async doResolve(): Promise<ResolvedRuntimeCatalog> {\n let staleCache: RuntimeCatalog | undefined;\n\n if (!this.offline) {\n const envelope = await this.readCache();\n if (envelope) {\n const fresh = Date.now() - Date.parse(envelope.fetchedAt) < CACHE_TTL_MS;\n if (fresh) return { catalog: envelope.catalog, source: 'cache' };\n staleCache = envelope.catalog;\n }\n\n const fetched = await this.fetchFromApi();\n if (fetched) {\n await this.writeCache(fetched);\n return { catalog: fetched, source: 'api' };\n }\n }\n\n const manifestCatalog = this.manifest?.runtimes;\n if (isRuntimeCatalog(manifestCatalog)) {\n return { catalog: manifestCatalog, source: 'manifest' };\n }\n\n // Prefer a stale cache over the bundled floor when it is genuinely newer.\n if (staleCache && Date.parse(staleCache.generatedAt) > Date.parse(BUNDLED_RUNTIME_CATALOG.generatedAt)) {\n return { catalog: staleCache, source: 'cache' };\n }\n\n return { catalog: BUNDLED_RUNTIME_CATALOG, source: 'bundled' };\n }\n\n private async fetchFromApi(): Promise<RuntimeCatalog | null> {\n if (!this.fetchImpl) return null;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await this.fetchImpl(`${this.apiBase}/v1/reference/runtimes`, {\n signal: controller.signal,\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data: unknown = await res.json();\n return isRuntimeCatalog(data) ? data : null;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async readCache(): Promise<CacheEnvelope | null> {\n try {\n const text = await readFile(this.cacheFile, 'utf8');\n const parsed = JSON.parse(text) as CacheEnvelope;\n if (parsed && typeof parsed.fetchedAt === 'string' && isRuntimeCatalog(parsed.catalog)) {\n return parsed;\n }\n } catch {\n // no/invalid cache — ignore\n }\n return null;\n }\n\n private async writeCache(catalog: RuntimeCatalog): Promise<void> {\n try {\n await mkdir(this.cacheDir, { recursive: true });\n const envelope: CacheEnvelope = { fetchedAt: new Date().toISOString(), catalog };\n await writeFile(this.cacheFile, JSON.stringify(envelope), 'utf8');\n } catch {\n // best-effort cache write\n }\n }\n}\n\nexport type { RuntimeCatalogSource };\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface NuGetMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch package metadata from NuGet V3 API with caching and concurrency control.\n *\n * Uses the NuGet RegistrationBaseUrl to fetch version data for each package.\n * Falls back gracefully when the registry is unreachable.\n */\nexport class NuGetCache {\n private meta = new Map<string, Promise<NuGetMeta>>();\n private baseUrl = 'https://api.nuget.org/v3-flatcontainer';\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(pkg: string): Promise<NuGetMeta> {\n const existing = this.meta.get(pkg);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n const manifestEntry = getManifestEntry(this.manifest, 'nuget', pkg);\n if (manifestEntry) {\n const stableVersions = (manifestEntry.versions ?? []).filter((v) => {\n const parsed = semver.valid(v);\n return parsed && semver.prerelease(v) === null;\n });\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ?? latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // NuGet flat container API: package IDs are lowercase\n const url = `${this.baseUrl}/${pkg.toLowerCase()}/index.json`;\n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as { versions?: string[] };\n const allVersions = data.versions ?? [];\n\n // Filter to stable versions (no pre-release tags)\n const stableVersions = allVersions.filter((v) => {\n const parsed = semver.valid(v);\n return parsed && semver.prerelease(v) === null;\n });\n\n // Find the latest stable version\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(pkg, p);\n return p;\n }\n}\n\n/**\n * Quick connectivity check for NuGet API.\n * Returns true if the registry is reachable.\n */\nexport async function checkNuGetAccess(): Promise<boolean> {\n try {\n const response = await fetch('https://api.nuget.org/v3-flatcontainer/newtonsoft.json/index.json', {\n signal: AbortSignal.timeout(5_000),\n headers: { 'Accept': 'application/json' },\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface PyPIMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Normalise a PEP 440 version into something semver.valid can parse.\n * E.g. \"3.12.1\" → \"3.12.1\", \"2.0.0rc1\" → null (pre-release).\n * Returns null for versions that can't be converted to semver or are pre-release.\n */\nfunction pep440ToSemver(ver: string): string | null {\n // Strip leading \"v\" or \"V\"\n let v = ver.replace(/^[vV]/, '').trim();\n\n // PEP 440 pre-release markers → treat as unstable\n if (/(?:a|b|rc|alpha|beta|dev|post)\\d*/i.test(v)) return null;\n\n // Some Python versions are like \"1.0\" → pad to \"1.0.0\"\n const parts = v.split('.');\n while (parts.length < 3) parts.push('0');\n v = parts.slice(0, 3).join('.');\n\n return semver.valid(v);\n}\n\n/**\n * Fetch package metadata from PyPI JSON API with caching and concurrency control.\n */\nexport class PyPICache {\n private meta = new Map<string, Promise<PyPIMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(pkg: string): Promise<PyPIMeta> {\n const existing = this.meta.get(pkg);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n const manifestEntry = getManifestEntry(this.manifest, 'pypi', pkg);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = pep440ToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? pep440ToSemver(manifestEntry.latest) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // PyPI JSON API: https://pypi.org/pypi/{package}/json\n const url = `https://pypi.org/pypi/${encodeURIComponent(pkg)}/json`;\n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as {\n info?: { version?: string };\n releases?: Record<string, unknown[]>;\n };\n\n const allVersionKeys = Object.keys(data.releases ?? {});\n\n // Convert PEP 440 versions to semver and filter to stable\n const stableVersions: string[] = [];\n for (const ver of allVersionKeys) {\n const sv = pep440ToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n\n // Latest from PyPI info\n const pypiLatest = data.info?.version ?? null;\n const pypiLatestSemver = pypiLatest ? pep440ToSemver(pypiLatest) : null;\n\n // Find the latest stable version via semver sort\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? pypiLatestSemver ?? null;\n\n return {\n latest: pypiLatestSemver ?? latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(pkg, p);\n return p;\n }\n}\n\n/**\n * Quick connectivity check for PyPI API.\n * Returns true if the registry is reachable.\n */\nexport async function checkPyPIAccess(): Promise<boolean> {\n try {\n const response = await fetch('https://pypi.org/pypi/pip/json', {\n signal: AbortSignal.timeout(5_000),\n headers: { 'Accept': 'application/json' },\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface MavenMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Convert a Maven version string to a semver-compatible string.\n * E.g. \"3.2.1\" → \"3.2.1\", \"2.0.0-SNAPSHOT\" → null.\n * Returns null for non-semver or pre-release versions.\n */\nfunction mavenToSemver(ver: string): string | null {\n let v = ver.trim();\n\n // Maven pre-release markers — both hyphen (-alpha, -rc) and dot (.Beta1, .RC1) forms\n if (/(?:[-.](?:SNAPSHOT|alpha|beta|rc|M\\d+|CR\\d+))/i.test(v)) return null;\n\n // Strip \".RELEASE\", \".Final\" suffixes (common in Spring)\n v = v.replace(/\\.(?:RELEASE|Final|GA)$/i, '');\n\n // Some Maven versions are like \"1.0\" → pad to \"1.0.0\"\n const parts = v.split('.');\n while (parts.length < 3) parts.push('0');\n v = parts.slice(0, 3).join('.');\n\n return semver.valid(v);\n}\n\n/**\n * Fetch package metadata from Maven Central Search API with caching and concurrency control.\n *\n * Uses the Maven Central REST API to fetch version data for each package.\n */\nexport class MavenCache {\n private meta = new Map<string, Promise<MavenMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n /**\n * Get metadata for a Maven artifact.\n * @param groupId Maven group ID (e.g. \"org.springframework.boot\")\n * @param artifactId Maven artifact ID (e.g. \"spring-boot-starter-web\")\n */\n get(groupId: string, artifactId: string): Promise<MavenMeta> {\n const key = `${groupId}:${artifactId}`;\n const existing = this.meta.get(key);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n const key = `${groupId}:${artifactId}`;\n const manifestEntry = getManifestEntry(this.manifest, 'maven', key);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = mavenToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? mavenToSemver(manifestEntry.latest) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // Maven Central Search API\n const url = `https://search.maven.org/solrsearch/select?q=g:%22${encodeURIComponent(groupId)}%22+AND+a:%22${encodeURIComponent(artifactId)}%22&core=gav&rows=100&wt=json`;\n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as {\n response?: {\n docs?: Array<{ v?: string }>;\n };\n };\n\n const docs = data.response?.docs ?? [];\n const allVersions = docs.map((d) => d.v).filter((v): v is string => typeof v === 'string');\n\n // Convert to semver, filtering to stable\n const stableVersions: string[] = [];\n for (const ver of allVersions) {\n const sv = mavenToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(key, p);\n return p;\n }\n}\n\n/**\n * Quick connectivity check for Maven Central.\n * Returns true if the registry is reachable.\n */\nexport async function checkMavenAccess(): Promise<boolean> {\n try {\n const response = await fetch(\n 'https://search.maven.org/solrsearch/select?q=g:%22junit%22+AND+a:%22junit%22&rows=1&wt=json',\n {\n signal: AbortSignal.timeout(5_000),\n headers: { 'Accept': 'application/json' },\n },\n );\n return response.ok;\n } catch {\n return false;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface RubyGemsMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Normalise a Ruby gem version into something semver.valid can parse.\n * Ruby uses relaxed semver (e.g. \"3.2.1\", \"7.1.3.4\", \"1.0.0.pre\").\n * Returns null for pre-release versions.\n */\nfunction rubyVersionToSemver(ver: string): string | null {\n const v = ver.trim();\n\n // Pre-release markers in Ruby gems\n if (/(?:\\.pre|\\.rc|\\.beta|\\.alpha|\\.dev)/i.test(v)) return null;\n\n // Split on dots — Ruby sometimes uses 4-segment versions (e.g. 7.1.3.4)\n const parts = v.split('.');\n\n // Need at least major.minor\n if (parts.length < 2) return null;\n\n // Take first 3 parts, pad if needed\n while (parts.length < 3) parts.push('0');\n const semverStr = parts.slice(0, 3).join('.');\n\n return semver.valid(semverStr);\n}\n\n/**\n * Fetch gem metadata from RubyGems.org API with caching and concurrency control.\n */\nexport class RubyGemsCache {\n private meta = new Map<string, Promise<RubyGemsMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(gem: string): Promise<RubyGemsMeta> {\n const existing = this.meta.get(gem);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'rubygems', gem);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = rubyVersionToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? rubyVersionToSemver(manifestEntry.latest) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // RubyGems.org API: https://rubygems.org/api/v1/versions/{gem}.json\n const url = `https://rubygems.org/api/v1/versions/${encodeURIComponent(gem)}.json`;\n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as Array<{\n number?: string;\n prerelease?: boolean;\n }>;\n\n if (!Array.isArray(data)) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n // Convert Ruby versions to semver and filter to stable\n const stableVersions: string[] = [];\n for (const entry of data) {\n if (entry.prerelease) continue;\n const ver = entry.number;\n if (!ver) continue;\n const sv = rubyVersionToSemver(ver);\n if (sv) stableVersions.push(sv);\n }\n\n // Sort descending to find latest\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(gem, p);\n return p;\n }\n}\n\n/**\n * Quick connectivity check for RubyGems.org API.\n * Returns true if the registry is reachable.\n */\nexport async function checkRubyGemsAccess(): Promise<boolean> {\n try {\n const response = await fetch('https://rubygems.org/api/v1/gems/rails.json', {\n signal: AbortSignal.timeout(5_000),\n headers: { 'Accept': 'application/json' },\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface SwiftPackageMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch Swift package metadata from GitHub releases (most SPM packages use Git tags).\n * For packages hosted on GitHub, we'll try to fetch releases.\n */\nexport class SwiftCache {\n private meta = new Map<string, Promise<SwiftPackageMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(packageUrl: string): Promise<SwiftPackageMeta> {\n const existing = this.meta.get(packageUrl);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'swift', packageUrl);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? semver.valid(semver.clean(manifestEntry.latest)) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // Extract GitHub repo from URL (e.g., https://github.com/owner/repo.git → owner/repo)\n const githubMatch = packageUrl.match(/github\\.com[/:]([^/]+\\/[^/]+?)(\\.git)?$/i);\n if (!githubMatch) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const repo = githubMatch[1]!;\n const url = `https://api.github.com/repos/${repo}/releases`;\n \n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { \n 'Accept': 'application/vnd.github+json',\n 'User-Agent': 'vibgrate-cli',\n },\n });\n\n if (!response.ok) {\n // Fallback: try tags API\n return this.fetchFromTags(repo);\n }\n\n const data = await response.json() as Array<{\n tag_name?: string;\n prerelease?: boolean;\n draft?: boolean;\n }>;\n\n if (!Array.isArray(data)) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const stableVersions: string[] = [];\n for (const release of data) {\n if (release.prerelease || release.draft) continue;\n const tag = release.tag_name;\n if (!tag) continue;\n const sv = semver.valid(semver.clean(tag));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(packageUrl, p);\n return p;\n }\n\n private async fetchFromTags(repo: string): Promise<SwiftPackageMeta> {\n try {\n const url = `https://api.github.com/repos/${repo}/tags`;\n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { \n 'Accept': 'application/vnd.github+json',\n 'User-Agent': 'vibgrate-cli',\n },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as Array<{\n name?: string;\n }>;\n\n if (!Array.isArray(data)) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const stableVersions: string[] = [];\n for (const tag of data) {\n const tagName = tag.name;\n if (!tagName) continue;\n // Skip pre-release tags\n if (/(?:alpha|beta|rc|pre|dev)/i.test(tagName)) continue;\n const sv = semver.valid(semver.clean(tagName));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface GoModuleMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch Go module metadata from proxy.golang.org.\n * https://go.dev/ref/mod#goproxy-protocol\n */\nexport class GoCache {\n private meta = new Map<string, Promise<GoModuleMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(modulePath: string): Promise<GoModuleMeta> {\n const existing = this.meta.get(modulePath);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'go', modulePath);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n // Go versions start with 'v' (e.g., v1.2.3)\n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? semver.valid(semver.clean(manifestEntry.latest)) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // Use Go proxy to get available versions\n // https://proxy.golang.org/<module>/@v/list\n const escapedPath = encodeURIComponent(modulePath);\n const url = `https://proxy.golang.org/${escapedPath}/@v/list`;\n \n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'text/plain' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const text = await response.text();\n const versions = text.split('\\n').filter(Boolean);\n\n const stableVersions: string[] = [];\n for (const ver of versions) {\n // Skip pre-release versions (e.g., v1.0.0-beta, v1.0.0-rc1)\n if (/[+-](?:alpha|beta|rc|pre|dev)/i.test(ver)) continue;\n // Skip pseudo-versions (e.g., v0.0.0-20230101000000-abcdef123456)\n if (/v\\d+\\.\\d+\\.\\d+-\\d{14}-[a-f0-9]+/.test(ver)) continue;\n \n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(modulePath, p);\n return p;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface CratesMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch crate metadata from crates.io API.\n * https://crates.io/api/v1/crates/{crate}\n */\nexport class CargoCache {\n private meta = new Map<string, Promise<CratesMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(crateName: string): Promise<CratesMeta> {\n const existing = this.meta.get(crateName);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'cargo', crateName);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? semver.valid(semver.clean(manifestEntry.latest)) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n const url = `https://crates.io/api/v1/crates/${encodeURIComponent(crateName)}`;\n \n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { \n 'Accept': 'application/json',\n 'User-Agent': 'vibgrate-cli (https://github.com/vibgrate/vibgrate-cli)',\n },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as {\n crate?: {\n max_version?: string;\n };\n versions?: Array<{\n num?: string;\n yanked?: boolean;\n }>;\n };\n\n if (!data.versions) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const stableVersions: string[] = [];\n for (const ver of data.versions) {\n if (ver.yanked) continue;\n if (!ver.num) continue;\n \n // Skip pre-release versions\n if (/[+-](?:alpha|beta|rc|pre|dev)/i.test(ver.num)) continue;\n \n const sv = semver.valid(semver.clean(ver.num));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(crateName, p);\n return p;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface PackagistMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch package metadata from Packagist (packagist.org).\n * https://packagist.org/apidoc\n */\nexport class ComposerCache {\n private meta = new Map<string, Promise<PackagistMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(packageName: string): Promise<PackagistMeta> {\n const existing = this.meta.get(packageName);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'composer', packageName);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? semver.valid(semver.clean(manifestEntry.latest)) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n // Packagist API: https://repo.packagist.org/p2/{vendor}/{package}.json\n const url = `https://repo.packagist.org/p2/${encodeURIComponent(packageName)}.json`;\n \n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as {\n packages?: {\n [key: string]: Array<{\n version?: string;\n version_normalized?: string;\n }>;\n };\n };\n\n if (!data.packages) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n // Get the package versions\n const packageVersions = data.packages[packageName];\n if (!packageVersions || !Array.isArray(packageVersions)) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const stableVersions: string[] = [];\n for (const ver of packageVersions) {\n const version = ver.version ?? ver.version_normalized;\n if (!version) continue;\n \n // Skip dev versions\n if (version === 'dev-master' || version.startsWith('dev-')) continue;\n \n // Skip pre-release versions\n if (/[+-](?:alpha|beta|rc|pre|dev)/i.test(version)) continue;\n \n const sv = semver.valid(semver.clean(version));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(packageName, p);\n return p;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { Semaphore } from '../utils/semaphore.js';\nimport { getManifestEntry, type PackageVersionManifest } from '../package-version-manifest.js';\n\nexport interface PubDevMeta {\n latest: string | null;\n stableVersions: string[];\n latestStableOverall: string | null;\n}\n\n/**\n * Fetch package metadata from pub.dev.\n * https://pub.dev/api/packages/{package}\n */\nexport class PubCache {\n private meta = new Map<string, Promise<PubDevMeta>>();\n\n constructor(\n private sem: Semaphore,\n private manifest?: PackageVersionManifest,\n private offline = false,\n ) {}\n\n get(packageName: string): Promise<PubDevMeta> {\n const existing = this.meta.get(packageName);\n if (existing) return existing;\n\n const p = this.sem.run(async () => {\n // Check manifest first (for offline mode)\n const manifestEntry = getManifestEntry(this.manifest, 'pub', packageName);\n if (manifestEntry) {\n const stableVersions: string[] = [];\n for (const ver of manifestEntry.versions ?? []) {\n const sv = semver.valid(semver.clean(ver));\n if (sv) stableVersions.push(sv);\n }\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n return {\n latest: manifestEntry.latest ? semver.valid(semver.clean(manifestEntry.latest)) ?? latestStableOverall : latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n }\n\n if (this.offline) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n try {\n const url = `https://pub.dev/api/packages/${encodeURIComponent(packageName)}`;\n \n const response = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const data = await response.json() as {\n latest?: {\n version?: string;\n };\n versions?: Array<{\n version?: string;\n }>;\n };\n\n if (!data.versions) {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n\n const stableVersions: string[] = [];\n for (const ver of data.versions) {\n if (!ver.version) continue;\n \n // Skip pre-release versions\n if (/[+-](?:alpha|beta|rc|pre|dev)/i.test(ver.version)) continue;\n \n const sv = semver.valid(semver.clean(ver.version));\n if (sv) stableVersions.push(sv);\n }\n\n const sorted = [...stableVersions].sort(semver.rcompare);\n const latestStableOverall = sorted[0] ?? null;\n\n return {\n latest: latestStableOverall,\n stableVersions,\n latestStableOverall,\n };\n } catch {\n return { latest: null, stableVersions: [], latestStableOverall: null };\n }\n });\n\n this.meta.set(packageName, p);\n return p;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * DriftScore v3 — libyear-primary dependency drift (PROTOTYPE).\n *\n * This is the reworked dependency component proposed in\n * `docs/DRIFTSCORE-V3-SPEC.md`. It is intentionally shipped ALONGSIDE the live\n * `dependencyScore` in `drift-score.ts` (methodology `driftscore-2.0`) so the\n * production score and its 43 tests stay untouched while the v3 formula is\n * validated against real-portfolio fixtures. `computeDriftScore` is NOT changed\n * by this file; wiring is a follow-up (see the spec §\"Wiring into v3\").\n *\n * Design (per spec, merging the code-level and live-data analyses):\n * - Per dependency: drift = 0.55·T + 0.45·V, where T is calendar-time drift\n * (libyears, 25 points/libyear) and V is semver-distance drift. Time is the\n * backbone; version is the fallback when release dates are absent.\n * - Floors: an unsupported/EOL major floors drift at 70; an abandoned (\"no\n * pulse\") package floors it at 50 — these cannot be averaged away.\n * - Aggregate: 0.5·mean + 0.3·p95 + 0.2·unsupported_share, with direct/prod\n * dependencies weighted above transitive/dev in the mean, and the p95 term\n * surfacing the tail the current mean-only formula hides.\n * - Data-quality guards for the four real-world breakers observed in\n * production (canary \"latest\", version-scheme jumps, squatted builtin stubs,\n * daily-minor high-cadence packages).\n * - Provenance: every score is Verified (release-date data present, online OR\n * from a vendored dated snapshot) or Estimated (version-only, branded `~NN`).\n * Offline is NOT Estimated when a dated snapshot supplies timestamps.\n *\n * Pure & deterministic; no network, no semver dependency (major parsed by regex\n * so this module runs even where `semver` is not installed).\n */\nimport type { DependencyRow } from '../types.js';\n\n/** Methodology tag for the v3 dependency component + aggregation. */\nexport const DRIFT_SCORE_V3_METHODOLOGY_VERSION = 'driftscore-3.0';\n\n// ── Tunable constants (published methodology; calibration is the proprietary\n// part). These are the live-data-analysis values relayed for the prototype. ──\n\n/** Points of time-drift per libyear. 4 libyears ⇒ fully penalised (100). */\nexport const POINTS_PER_LIBYEAR = 25;\n/** Blend weight on the time (libyear) component. */\nexport const TIME_WEIGHT = 0.55;\n/** Blend weight on the version (semver-distance) component. */\nexport const VERSION_WEIGHT = 0.45;\n/** An unsupported / EOL major floors per-dependency drift here. */\nexport const UNSUPPORTED_FLOOR = 70;\n/** An abandoned (\"no pulse\") package floors per-dependency drift here. */\nexport const ABANDONED_FLOOR = 50;\n\n/** Aggregation weights: 0.5·mean + 0.3·p95 + 0.2·unsupported_share. */\nexport const AGG_MEAN_WEIGHT = 0.5;\nexport const AGG_P95_WEIGHT = 0.3;\nexport const AGG_UNSUPPORTED_SHARE_WEIGHT = 0.2;\n\n/** Mean weighting by dependency kind (blast-radius proxy until the lockfile\n * graph is threaded through — see spec §\"Follow-ups\"). */\nexport const WEIGHT_DIRECT_PROD = 1.0;\nexport const WEIGHT_DIRECT_DEV = 0.5;\nexport const WEIGHT_TRANSITIVE = 0.4;\n\n// ── Data-quality guard thresholds ──\n\n/** A \"latest\" whose major is ≥ this is a canary/placeholder (react-native\n * 1000.0.0), not a real release — the version signal is discarded. */\nexport const CANARY_MAJOR_THRESHOLD = 900;\n/** majorsBehind above this is a version-scheme change (Expo reads 40–57), not\n * 40 breaking majors — the version signal is discarded, time carries. */\nexport const SCHEME_JUMP_MAX_MAJORS = 20;\n/** Time-drift is capped here for high-cadence packages so daily minors\n * (@aws-sdk/*) don't read as severe drift. */\nexport const HIGH_CADENCE_TIME_CAP = 50;\n\n/** Deprecated/squatted builtin stubs that resolve as \"healthy\" but are not real\n * dependencies — excluded from the denominator entirely. */\nexport const PLACEHOLDER_STUBS: ReadonlySet<string> = new Set([\n 'fs', 'crypto', 'path', 'util', 'os', 'events', 'stream', 'http', 'https',\n 'assert', 'buffer', 'punycode', 'querystring', 'url', 'zlib', 'domain',\n]);\n\n/** Prefixes whose packages ship on a very high (≈daily) release cadence. */\nexport const HIGH_CADENCE_PREFIXES: readonly string[] = [\n '@aws-sdk/', 'aws-sdk', '@google-cloud/', '@azure/',\n];\n\n// ── Per-dependency context the DependencyRow does not yet carry ──\n\nexport interface DependencyDriftContext {\n /** True when this is a direct manifest dependency (default true). */\n direct?: boolean;\n /** True when resolved only as a transitive/lockfile dependency. */\n transitive?: boolean;\n /** Resolved major is past vendor support / EOL (floors drift at 70). */\n unsupported?: boolean;\n /** No release in ~24+ months / registry-flagged abandoned (floors at 50). */\n abandoned?: boolean;\n}\n\nexport type DriftProvenance = 'verified' | 'estimated';\n\nexport interface DependencyDriftResult {\n package: string;\n /** 0–100 per-dependency drift (0 = current, 100 = maximally drifted). */\n drift: number;\n /** Verified (had release-date data) or Estimated (version-only). */\n mode: DriftProvenance;\n /** True when this dep hit the unsupported/EOL floor. */\n unsupported: boolean;\n /** Mean-aggregation weight (direct/prod > transitive/dev). */\n weight: number;\n /** Guards that fired, for explainability. */\n flags: string[];\n /** Excluded from scoring entirely (placeholder stub). */\n excluded: boolean;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n\n/** Parse the leading integer major from a version string without semver. */\nfunction majorOf(version: string | null): number | null {\n if (!version) return null;\n const m = /^\\D*(\\d+)/.exec(version);\n return m ? Number(m[1]) : null;\n}\n\nfunction isHighCadence(pkg: string): boolean {\n return HIGH_CADENCE_PREFIXES.some((p) => pkg === p || pkg.startsWith(p));\n}\n\n/**\n * Version-distance sub-score V (0–100) from major lag and drift band.\n *\n * NOTE: `DependencyRow` only carries `majorsBehind`, so minor/patch lag is\n * approximated from the `drift` band. This curve is the published shape; the\n * exact constants are the calibration slot for `driftscore_v2.py`. It corrects\n * the `driftscore-2.0` \"current bucket\" conflation by scoring a minor-behind\n * dependency > 0 rather than folding it into \"current\".\n */\nexport function versionDriftPoints(dep: Pick<DependencyRow, 'majorsBehind' | 'drift'>): number {\n const mb = dep.majorsBehind;\n if (mb === null || mb === undefined) return 0;\n if (mb <= 0) {\n // majorsBehind 0: distinguish truly current from minor-behind (was\n // mis-bucketed as \"current\" in driftscore-2.0).\n return dep.drift === 'current' ? 0 : 15;\n }\n if (mb === 1) return 45;\n if (mb === 2) return 70;\n if (mb === 3) return 85;\n return 100;\n}\n\n/** Time-distance sub-score T (0–100) from libyears. */\nexport function timeDriftPoints(libyears: number | null | undefined): number | null {\n if (libyears === null || libyears === undefined || Number.isNaN(libyears)) return null;\n return clamp(libyears * POINTS_PER_LIBYEAR, 0, 100);\n}\n\n/**\n * Compute drift for a single dependency, applying data-quality guards, the\n * time/version blend, and the unsupported/abandoned floors.\n */\nexport function perDependencyDrift(\n dep: DependencyRow,\n ctx: DependencyDriftContext = {},\n): DependencyDriftResult {\n const flags: string[] = [];\n\n // Guard 3 — squatted / deprecated builtin stub: exclude from the denominator.\n if (PLACEHOLDER_STUBS.has(dep.package)) {\n return {\n package: dep.package, drift: 0, mode: 'estimated', unsupported: false,\n weight: 0, flags: ['placeholder-stub'], excluded: true,\n };\n }\n\n // Guard 1 — canary \"latest\" (e.g. react-native 1000.0.0): the version signal\n // is meaningless; discard it and let time carry.\n const latestMajor = majorOf(dep.latestStable);\n let versionReliable = true;\n if (latestMajor !== null && latestMajor >= CANARY_MAJOR_THRESHOLD) {\n versionReliable = false;\n flags.push('canary-latest');\n }\n\n // Guard 2 — version-scheme jump (e.g. Expo reads 40–57 majors behind): treat\n // as a scheme change, not dozens of breaking majors; discard version signal.\n if (dep.majorsBehind !== null && dep.majorsBehind !== undefined && dep.majorsBehind > SCHEME_JUMP_MAX_MAJORS) {\n versionReliable = false;\n flags.push('scheme-jump');\n }\n\n // Guard 4 — high-cadence packages (@aws-sdk/*): damp version noise (majors\n // only) and cap the time contribution so daily minors don't dominate.\n const highCadence = isHighCadence(dep.package);\n if (highCadence) flags.push('high-cadence-damped');\n\n const V = versionReliable ? versionDriftPoints(dep) : 0;\n let T = timeDriftPoints(dep.libyears);\n if (T !== null && highCadence) T = Math.min(T, HIGH_CADENCE_TIME_CAP);\n\n // Blend. Verified when we had time data; Estimated (version-only) otherwise.\n let base: number;\n let mode: DriftProvenance;\n if (T !== null) {\n mode = 'verified';\n base = versionReliable ? TIME_WEIGHT * T + VERSION_WEIGHT * V : T;\n } else {\n mode = 'estimated';\n base = V; // version-only fallback\n }\n\n // Floors — surfaced, never averaged away.\n const unsupported = ctx.unsupported === true;\n if (unsupported) { base = Math.max(base, UNSUPPORTED_FLOOR); flags.push('unsupported-floor'); }\n if (ctx.abandoned === true) { base = Math.max(base, ABANDONED_FLOOR); flags.push('abandoned-floor'); }\n\n // Mean-aggregation weight (blast-radius proxy).\n const weight = ctx.transitive === true\n ? WEIGHT_TRANSITIVE\n : (dep.section === 'devDependencies' ? WEIGHT_DIRECT_DEV : WEIGHT_DIRECT_PROD);\n\n return {\n package: dep.package,\n drift: clamp(Math.round(base), 0, 100),\n mode,\n unsupported,\n weight,\n flags,\n excluded: false,\n };\n}\n\n/** Nearest-rank percentile (0–1) over a numeric array. Empty ⇒ 0. */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const rank = Math.ceil(p * sorted.length);\n return sorted[clamp(rank - 1, 0, sorted.length - 1)]!;\n}\n\nexport interface DependencyDriftAggregate {\n /** 0–100 portfolio dependency drift. */\n drift: number;\n /** Weighted mean of per-dependency drift. */\n mean: number;\n /** 95th percentile per-dependency drift (tail surfacing). */\n p95: number;\n /** Fraction (0–1) of scored deps that hit the unsupported floor. */\n unsupportedShare: number;\n /** Verified when any dep carried time data; Estimated otherwise. */\n mode: DriftProvenance;\n /** Deps that were scored (placeholder stubs excluded). */\n scored: number;\n /** Placeholder stubs excluded from the denominator. */\n excluded: number;\n /** Fraction (0–1) of scored deps with Verified (time) data — coverage. */\n coverage: number;\n /** Worst offenders, ranked by drift, for explainability. */\n top: DependencyDriftResult[];\n}\n\n/**\n * Aggregate per-dependency drift into a portfolio 0–100 number:\n * 0.5·weightedMean + 0.3·p95 + 0.2·(unsupported_share·100)\n * Returns null when there is nothing scoreable (all excluded / empty).\n */\nexport function aggregateDependencyDrift(\n deps: DependencyRow[],\n ctxOf?: (dep: DependencyRow) => DependencyDriftContext,\n): DependencyDriftAggregate | null {\n const results = deps\n .map((d) => perDependencyDrift(d, ctxOf?.(d)))\n .filter((r) => !r.excluded);\n const excluded = deps.length - results.length;\n if (results.length === 0) return null;\n\n const weightSum = results.reduce((s, r) => s + r.weight, 0) || 1;\n const weightedMean = results.reduce((s, r) => s + r.drift * r.weight, 0) / weightSum;\n const p95 = percentile(results.map((r) => r.drift), 0.95);\n const unsupportedShare = results.filter((r) => r.unsupported).length / results.length;\n const verified = results.filter((r) => r.mode === 'verified').length;\n\n const drift = clamp(\n Math.round(\n AGG_MEAN_WEIGHT * weightedMean +\n AGG_P95_WEIGHT * p95 +\n AGG_UNSUPPORTED_SHARE_WEIGHT * (unsupportedShare * 100),\n ),\n 0, 100,\n );\n\n return {\n drift,\n mean: Math.round(weightedMean),\n p95,\n unsupportedShare,\n mode: verified > 0 ? 'verified' : 'estimated',\n scored: results.length,\n excluded,\n coverage: Math.round((verified / results.length) * 100) / 100,\n top: [...results].sort((a, b) => b.drift - a.drift).slice(0, 10),\n };\n}\n\n/** Brand a score with its provenance: Estimated scores are prefixed `~`. */\nexport function formatDriftV3(score: number, mode: DriftProvenance): string {\n const s = clamp(Math.round(score), 0, 100);\n return mode === 'estimated' ? `~${s}` : String(s);\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as crypto from 'node:crypto';\nimport type { ProjectScan, DriftScore, Finding, RiskLevel, VibgrateConfig } from '../types.js';\nimport { aggregateDependencyDrift } from './dependency-drift-v3.js';\n\n/**\n * Version of the drift-score methodology (weighting + formula). Bump this ONLY\n * when the weighting or calculation changes — never for routine CLI releases —\n * so the dashboard can tell whether two scores are directly comparable and avoid\n * drawing trend lines across a methodology change.\n *\n * driftscore-3.0 (DRIFTSCORE-V3-SPEC): the dependency pillar is the\n * libyear-backbone blend — time-distance primary (0.55·T), semver-distance\n * fallback (0.45·V) — with the four production data-quality guards and p95 tail\n * aggregation (0.5·mean + 0.3·p95 + 0.2·unsupported_share). The former\n * standalone freshness add-on (0.15) is folded into it, so the pillar weighting\n * returns to the four-pillar shape (runtime .25 / framework .25 / dependency\n * .30 / EOL .20). See `dependency-drift-v3.ts`.\n *\n * Not yet threaded (spec §6.1, follow-up): per-dependency unsupported/EOL and\n * abandoned signals that fire the ≥70 / ≥50 floors, and transitive weighting\n * from the lockfile graph — manifest deps default to direct until then.\n */\nexport const DRIFT_SCORE_METHODOLOGY_VERSION = 'driftscore-3.0';\n\n/** Default thresholds per PRD section 15 */\nconst DEFAULT_THRESHOLDS: Required<NonNullable<VibgrateConfig['thresholds']>> = {\n failOnError: {\n eolDays: 180,\n frameworkMajorLag: 3,\n dependencyTwoPlusPercent: 50,\n },\n warn: {\n frameworkMajorLag: 2,\n dependencyTwoPlusPercent: 30,\n },\n};\n\n// ── Score computation ──\n\nfunction clamp(val: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, val));\n}\n\nfunction runtimeScore(projects: ProjectScan[]): number | null {\n if (projects.length === 0) return null;\n\n const lags = projects\n .map((p) => p.runtimeMajorsBehind)\n .filter((v): v is number => v !== undefined);\n\n if (lags.length === 0) return null; // No runtime info — don't score\n\n const maxLag = Math.max(...lags);\n // 0 behind = 100, 1 = 80, 2 = 50, 3 = 20, 4+ = 0\n if (maxLag === 0) return 100;\n if (maxLag === 1) return 80;\n if (maxLag === 2) return 50;\n if (maxLag === 3) return 20;\n return 0;\n}\n\nfunction frameworkScore(projects: ProjectScan[]): number | null {\n const allFrameworks = projects.flatMap((p) => p.frameworks);\n if (allFrameworks.length === 0) return null;\n\n const lags = allFrameworks\n .map((f) => f.majorsBehind)\n .filter((v): v is number => v !== null);\n\n if (lags.length === 0) return null;\n\n const maxLag = Math.max(...lags);\n const avgLag = lags.reduce((a, b) => a + b, 0) / lags.length;\n\n // Blend max and average lag\n const maxPenalty = Math.min(maxLag * 20, 100);\n const avgPenalty = Math.min(avgLag * 15, 100);\n return clamp(100 - (maxPenalty * 0.6 + avgPenalty * 0.4), 0, 100);\n}\n\nconst MONTH_MS = 1000 * 60 * 60 * 24 * 30;\n\nfunction eolScore(projects: ProjectScan[]): number | null {\n // Score from real end-of-life dates (Runtime Catalog) when available, falling\n // back to the major-version-lag proxy when a runtime cycle can't be matched.\n const hasRuntimeData = projects.some(\n (p) => p.runtimeMajorsBehind !== undefined || (p.runtimeEol !== undefined && p.runtimeEol !== null),\n );\n if (!hasRuntimeData) return null; // No runtime info — don't score\n\n let score = 100;\n const now = Date.now();\n\n for (const p of projects) {\n // ── Real EOL (preferred) ──\n if (p.runtimeEol === true) {\n score = Math.min(score, 0); // past vendor end-of-life\n continue;\n }\n if (p.runtimeEol === false) {\n // Supported — graduated penalty as the real EOL date approaches.\n if (p.runtimeEolDate) {\n const remaining = Date.parse(p.runtimeEolDate) - now;\n if (!Number.isNaN(remaining)) {\n if (remaining <= 6 * MONTH_MS) score = Math.min(score, 40);\n else if (remaining <= 12 * MONTH_MS) score = Math.min(score, 75);\n }\n }\n continue;\n }\n\n // ── Lag-proxy fallback (runtimeEol unknown) ──\n if (p.type === 'node' && p.runtimeMajorsBehind !== undefined) {\n // Rough EOL proximity based on major version lag\n if (p.runtimeMajorsBehind >= 3) score = Math.min(score, 0); // Definitely EOL\n else if (p.runtimeMajorsBehind >= 2) score = Math.min(score, 30); // Near EOL\n else if (p.runtimeMajorsBehind >= 1) score = Math.min(score, 70); // Approaching\n }\n if (p.type === 'dotnet' && p.runtimeMajorsBehind !== undefined) {\n if (p.runtimeMajorsBehind >= 3) score = Math.min(score, 0);\n else if (p.runtimeMajorsBehind >= 2) score = Math.min(score, 20);\n else if (p.runtimeMajorsBehind >= 1) score = Math.min(score, 60);\n }\n if (p.type === 'python' && p.runtimeMajorsBehind !== undefined) {\n // For Python, runtimeMajorsBehind counts minor versions (3.9 vs 3.13 = 4 behind)\n if (p.runtimeMajorsBehind >= 6) score = Math.min(score, 0); // Very old (e.g. Python 2.x or 3.7)\n else if (p.runtimeMajorsBehind >= 4) score = Math.min(score, 20); // e.g. 3.9 when 3.13 is current\n else if (p.runtimeMajorsBehind >= 2) score = Math.min(score, 60); // e.g. 3.11 when 3.13 is current\n }\n if (p.type === 'java' && p.runtimeMajorsBehind !== undefined) {\n if (p.runtimeMajorsBehind >= 10) score = Math.min(score, 0); // e.g. Java 8 or 11 when 21 is current\n else if (p.runtimeMajorsBehind >= 4) score = Math.min(score, 30); // e.g. Java 17 when 21 is current\n else if (p.runtimeMajorsBehind >= 1) score = Math.min(score, 70);\n }\n }\n\n return score;\n}\n\n/** Fraction of dependencies whose drift could be resolved (known vs unknown). */\nfunction coverageConfidence(projects: ProjectScan[]): number | null {\n let known = 0;\n let unknown = 0;\n for (const p of projects) {\n known += p.dependencyAgeBuckets.current + p.dependencyAgeBuckets.oneBehind + p.dependencyAgeBuckets.twoPlusBehind;\n unknown += p.dependencyAgeBuckets.unknown;\n }\n const total = known + unknown;\n if (total === 0) return null;\n return Math.round((known / total) * 100) / 100;\n}\n\n/**\n * Compute the workspace DriftScore.\n *\n * Methodology `driftscore-2.0`: the score runs 0–100 where **0 means no drift\n * (fully current, best) and 100 means maximum drift (worst)** — i.e. higher is\n * worse, consistent with RiskScore and the \"drift budget\" mental model. Each\n * component is likewise reported as drift (0 = current). This inverts the\n * pre-2.0 convention where higher meant healthier.\n */\nexport function computeDriftScore(projects: ProjectScan[]): DriftScore {\n // driftscore-3.0 dependency pillar: the libyear-backbone per-dependency blend\n // (`dependency-drift-v3.ts`) with the p95 tail term. Computed once so its\n // provenance (`mode`) and detail (`p95`/`top`/…) can also be surfaced on the\n // score envelope (§6.3). Reported as a HEALTH score here (higher = fresher)\n // so it slots into the health-scale blend below, which inverts to drift at the\n // end. Replaces the driftscore-2.0 age-bucket formula, which counted\n // minor-behind as \"current\" and let one ancient dep average into invisibility.\n // The former standalone freshness pillar folds in here — the time term IS the\n // libyear signal.\n const depAgg = aggregateDependencyDrift(\n projects.flatMap((p) => p.dependencies),\n // Per-dependency context for the v3 floors: an unsupported/deprecated major\n // floors drift at 70, an abandoned (\"no pulse\") package at 50. Threaded from\n // the row where the ecosystem scanner set it; absent → the floor doesn't\n // fire (spec §6.1). Transitive weighting still awaits the lockfile graph, so\n // manifest deps default to direct.\n (dep) => ({ unsupported: dep.unsupported === true, abandoned: dep.abandoned === true }),\n );\n const rs = runtimeScore(projects);\n const fs = frameworkScore(projects);\n const ds = depAgg ? 100 - depAgg.drift : null;\n const es = eolScore(projects);\n\n // Weighted combination — redistribute weight from null (no-data) components.\n // driftscore-3.0 four-pillar weighting: freshness is no longer a separate\n // additive component — its libyear signal is the time term inside the\n // dependency pillar now (see `dependencyScore`).\n const components: { score: number | null; weight: number }[] = [\n { score: rs, weight: 0.25 },\n { score: fs, weight: 0.25 },\n { score: ds, weight: 0.30 },\n { score: es, weight: 0.20 },\n ];\n\n const confidence = coverageConfidence(projects) ?? undefined;\n\n // DriftScore v2 convention: 0 = no drift (best), 100 = maximum drift (worst).\n // Components are computed internally on a \"health\" scale (higher = healthier)\n // and inverted here so every emitted number reads as drift.\n const toDrift = (health: number) => 100 - health;\n\n const buildComponents = (): DriftScore['components'] => {\n const c: DriftScore['components'] = {\n runtimeScore: toDrift(Math.round(rs ?? 100)),\n frameworkScore: toDrift(Math.round(fs ?? 100)),\n dependencyScore: toDrift(Math.round(ds ?? 100)),\n eolScore: toDrift(Math.round(es ?? 100)),\n };\n return c;\n };\n\n // Score envelope (§6.3): the dependency pillar's provenance (`mode`) and its\n // v3 detail (`p95`/`unsupportedShare`/`coverage`/ranked `top`), for\n // explainability, the `~` branding, and the per-package breakdown. Present\n // only when there were scoreable dependencies.\n const envelope: Pick<DriftScore, 'mode' | 'dependencyDrift'> = depAgg\n ? {\n mode: depAgg.mode,\n dependencyDrift: {\n p95: depAgg.p95,\n unsupportedShare: depAgg.unsupportedShare,\n coverage: depAgg.coverage,\n top: depAgg.top.map((t) => ({\n package: t.package,\n drift: t.drift,\n mode: t.mode,\n unsupported: t.unsupported,\n flags: t.flags,\n })),\n },\n }\n : {};\n\n const active = components.filter((c) => c.score !== null);\n if (active.length === 0) {\n // No data at all — neutral score (no measurable drift)\n return {\n score: 0,\n riskLevel: 'low',\n components: buildComponents(),\n methodologyVersion: DRIFT_SCORE_METHODOLOGY_VERSION,\n ...(confidence !== undefined ? { confidence } : {}),\n ...envelope,\n };\n }\n\n // Redistribute weight proportionally across components that have data\n const totalActiveWeight = active.reduce((sum, c) => sum + c.weight, 0);\n let health = 0;\n for (const c of active) {\n health += c.score! * (c.weight / totalActiveWeight);\n }\n const score = toDrift(Math.round(health));\n\n // Risk bands on the drift scale: 0–30 low, 31–60 moderate, 61–100 high.\n let riskLevel: RiskLevel;\n if (score <= 30) riskLevel = 'low';\n else if (score <= 60) riskLevel = 'moderate';\n else riskLevel = 'high';\n\n // Track which components had data\n const measured: ('runtime' | 'framework' | 'dependency' | 'eol' | 'freshness')[] = [];\n if (rs !== null) measured.push('runtime');\n if (fs !== null) measured.push('framework');\n if (ds !== null) measured.push('dependency');\n if (es !== null) measured.push('eol');\n\n return {\n score,\n riskLevel,\n components: buildComponents(),\n measured,\n methodologyVersion: DRIFT_SCORE_METHODOLOGY_VERSION,\n ...(confidence !== undefined ? { confidence } : {}),\n ...envelope,\n };\n}\n\n// ── Findings generation ──\n\nexport function generateFindings(\n projects: ProjectScan[],\n config?: VibgrateConfig,\n): Finding[] {\n const thresholds = {\n failOnError: { ...DEFAULT_THRESHOLDS.failOnError, ...config?.thresholds?.failOnError },\n warn: { ...DEFAULT_THRESHOLDS.warn, ...config?.thresholds?.warn },\n };\n\n const findings: Finding[] = [];\n\n for (const project of projects) {\n const runtimeLabel =\n project.type === 'node' ? 'Node.js' :\n project.type === 'dotnet' ? '.NET' :\n project.type === 'python' ? 'Python' :\n project.type === 'java' ? 'Java' : project.type;\n\n // Runtime EOL check — prefer real end-of-life dates over the lag proxy.\n if (project.runtimeEol === true) {\n const when = project.runtimeEolDate ? ` on ${project.runtimeEolDate}` : '';\n findings.push({\n ruleId: 'vibgrate/runtime-eol',\n level: 'error',\n message: `${runtimeLabel} runtime \"${project.runtime}\" reached end-of-life${when} (latest: ${project.runtimeLatest}).`,\n location: project.path,\n });\n } else if (project.runtimeMajorsBehind !== undefined && project.runtimeMajorsBehind >= 3) {\n findings.push({\n ruleId: 'vibgrate/runtime-eol',\n level: 'error',\n message: `${runtimeLabel} runtime \"${project.runtime}\" is ${project.runtimeMajorsBehind} major versions behind (latest: ${project.runtimeLatest}). Likely at or past EOL.`,\n location: project.path,\n });\n } else if (project.runtimeMajorsBehind !== undefined && project.runtimeMajorsBehind >= 2) {\n findings.push({\n ruleId: 'vibgrate/runtime-lag',\n level: 'warning',\n message: `${runtimeLabel} runtime \"${project.runtime}\" is ${project.runtimeMajorsBehind} major versions behind (latest: ${project.runtimeLatest}).`,\n location: project.path,\n });\n }\n\n // Framework lag check\n for (const fw of project.frameworks) {\n if (fw.majorsBehind !== null && thresholds.failOnError.frameworkMajorLag !== undefined && fw.majorsBehind >= thresholds.failOnError.frameworkMajorLag) {\n findings.push({\n ruleId: 'vibgrate/framework-major-lag',\n level: 'error',\n message: `${fw.name} is ${fw.majorsBehind} major versions behind (current: ${fw.currentVersion}, latest: ${fw.latestVersion}).`,\n location: project.path,\n });\n } else if (fw.majorsBehind !== null && thresholds.warn.frameworkMajorLag !== undefined && fw.majorsBehind >= thresholds.warn.frameworkMajorLag) {\n findings.push({\n ruleId: 'vibgrate/framework-major-lag',\n level: 'warning',\n message: `${fw.name} is ${fw.majorsBehind} major versions behind (current: ${fw.currentVersion}, latest: ${fw.latestVersion}).`,\n location: project.path,\n });\n }\n }\n\n // Dependency rot check\n const totalDeps = project.dependencyAgeBuckets.current +\n project.dependencyAgeBuckets.oneBehind +\n project.dependencyAgeBuckets.twoPlusBehind;\n\n if (totalDeps > 0) {\n const twoPlusPct = (project.dependencyAgeBuckets.twoPlusBehind / totalDeps) * 100;\n\n if (thresholds.failOnError.dependencyTwoPlusPercent !== undefined && twoPlusPct >= thresholds.failOnError.dependencyTwoPlusPercent) {\n findings.push({\n ruleId: 'vibgrate/dependency-rot',\n level: 'error',\n message: `${Math.round(twoPlusPct)}% of dependencies are 2+ major versions behind in ${project.name}.`,\n location: project.path,\n });\n } else if (thresholds.warn.dependencyTwoPlusPercent !== undefined && twoPlusPct >= thresholds.warn.dependencyTwoPlusPercent) {\n findings.push({\n ruleId: 'vibgrate/dependency-rot',\n level: 'warning',\n message: `${Math.round(twoPlusPct)}% of dependencies are 2+ major versions behind in ${project.name}.`,\n location: project.path,\n });\n }\n }\n\n // Individual major-behind dependencies (2+ majors)\n for (const dep of project.dependencies) {\n if (dep.majorsBehind !== null && dep.majorsBehind >= 3) {\n findings.push({\n ruleId: 'vibgrate/dependency-major-lag',\n level: 'error',\n message: `${dep.package} is ${dep.majorsBehind} major versions behind (spec: ${dep.currentSpec}, latest: ${dep.latestStable}).`,\n location: project.path,\n });\n }\n }\n }\n\n return findings;\n}\n\n/**\n * Compute a deterministic project ID.\n * Hash of `${relativePath}:${projectName}:${workspaceId}`.\n * The workspaceId ties the ID to a specific DSN/workspace so the same\n * project scanned under different workspaces gets distinct IDs.\n * If no workspaceId is available (local-only scans), it is omitted from the hash.\n */\nexport function computeProjectId(\n relativePath: string,\n projectName: string,\n workspaceId?: string,\n): string {\n const input = workspaceId\n ? `${relativePath}:${projectName}:${workspaceId}`\n : `${relativePath}:${projectName}`;\n return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);\n}\n\n\n/**\n * Compute a deterministic solution ID.\n * Hash of `${relativePath}:${solutionName}:${workspaceId}`.\n */\nexport function computeSolutionId(\n relativePath: string,\n solutionName: string,\n workspaceId?: string,\n): string {\n const input = workspaceId\n ? `${relativePath}:${solutionName}:${workspaceId}`\n : `${relativePath}:${solutionName}`;\n return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport chalk, { type ChalkInstance } from 'chalk';\n\n/**\n * Smooth horizontal bars for the scanner UI.\n *\n * Two things make a terminal bar read as \"smooth\":\n *\n * 1. **Sub-cell resolution.** A whole-character bar can only be N states wide, so\n * it jumps a full cell at a time. Unicode left-fractional block glyphs\n * (`▏▎▍▌▋▊▉`) fill a cell in eighths, giving ~8× finer motion — the fill\n * glides instead of stepping.\n * 2. **A colour gradient** across the filled region instead of one flat colour.\n *\n * Colour is applied with `chalk.hex`, which downsamples automatically on\n * 256/16-colour terminals and becomes a no-op under `NO_COLOR` / `--no-color`\n * (chalk level 0), so the bar degrades gracefully everywhere.\n */\n\n// Left-fractional block glyphs: index 1..7 fills 1/8..7/8 of a cell from the left.\nconst PARTIAL = ['', '▏', '▎', '▍', '▌', '▋', '▊', '▉'] as const;\nconst FULL = '█'; // █\n\nexport interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction lerpColor(from: Rgb, to: Rgb, t: number): Rgb {\n return { r: lerp(from.r, to.r, t), g: lerp(from.g, to.g, t), b: lerp(from.b, to.b, t) };\n}\n\nfunction toHex({ r, g, b }: Rgb): string {\n const h = (n: number): string => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');\n return `#${h(r)}${h(g)}${h(b)}`;\n}\n\n/**\n * Render a bar at 1/8-cell resolution with a left→right colour gradient across\n * the filled region. `fraction` is clamped to 0..1; `width` is the cell count.\n * The unfilled trough is a dim glyph (default a light shade block).\n */\nexport function gradientBar(\n fraction: number,\n width: number,\n from: Rgb,\n to: Rgb,\n troughGlyph = '░', // ░\n): string {\n const clamped = Number.isFinite(fraction) ? Math.max(0, Math.min(fraction, 1)) : 0;\n const exact = clamped * width;\n const fullCells = Math.min(Math.floor(exact), width);\n const partialIdx = fullCells < width ? Math.floor((exact - fullCells) * 8) : 0;\n\n const colourAt = (cell: number): ChalkInstance =>\n chalk.hex(toHex(lerpColor(from, to, width > 1 ? cell / (width - 1) : 0)));\n\n let out = '';\n for (let i = 0; i < fullCells; i++) {\n out += colourAt(i)(FULL);\n }\n let cells = fullCells;\n if (partialIdx > 0) {\n out += colourAt(fullCells)(PARTIAL[partialIdx]!);\n cells++;\n }\n out += chalk.dim(troughGlyph.repeat(Math.max(width - cells, 0)));\n return out;\n}\n\n// ── Brand colours (docs/design logo bundle) ──\nconst TEAL: Rgb = { r: 0x3f, g: 0xb0, b: 0xa4 }; // #3FB0A4\nconst MINT: Rgb = { r: 0x4f, g: 0xe3, b: 0xc1 }; // #4FE3C1\n\n/**\n * Live scanner progress bar — a smooth teal→mint gradient in the brand colours,\n * advancing at sub-cell resolution so it glides as the scan proceeds.\n */\nexport function brandProgressBar(fraction: number, width: number): string {\n return gradientBar(fraction, width, TEAL, MINT);\n}\n\n// ── Risk ramp for drift/score bars ──\nconst RISK_GREEN: Rgb = { r: 0x3f, g: 0xb0, b: 0x6a };\nconst RISK_AMBER: Rgb = { r: 0xe0, g: 0xa8, b: 0x30 };\nconst RISK_RED: Rgb = { r: 0xe0, g: 0x53, b: 0x53 };\n\n/** Colour along the risk ramp: 0 → green, 50 → amber, 100 → red. */\nexport function riskColorAt(score: number): Rgb {\n const s = Number.isFinite(score) ? Math.max(0, Math.min(score, 100)) : 0;\n return s <= 50\n ? lerpColor(RISK_GREEN, RISK_AMBER, s / 50)\n : lerpColor(RISK_AMBER, RISK_RED, (s - 50) / 50);\n}\n\n/**\n * Drift/score bar: fills to `score`% in a single clean risk colour (green for\n * low, amber for mid, red for high), so a healthy score reads as a short green\n * bar and a bad one as a long red bar. Returns the bar followed by the value.\n */\nexport function driftBar(score: number, width = 20): string {\n const value = Number.isFinite(score) ? Math.max(0, Math.min(score, 100)) : 0;\n // Solid risk colour (green→amber→red by score). Gradient-filling a single bar\n // green→red interpolates through a muddy olive midpoint, which reads as a\n // dirty band; the bar length already encodes the score, so use one clean hue.\n const colour = riskColorAt(value);\n const bar = gradientBar(value / 100, width, colour, colour);\n return `${bar} ${Math.round(value)}`;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport chalk, { type ChalkInstance } from 'chalk';\n\n/**\n * Rounded, single-line section boxes for the report output.\n *\n * Light box-drawing glyphs (`╭─╮ │ ╰─╯`) read smoother than the heavy\n * double-line set (`╔═╗ ║ ╚═╝`), and the rounded corners match the scanner's\n * logo mark. The box keeps the same footprint it replaces — `width` is the\n * interior cell count between the corners, so nothing grows.\n */\n\n// Interior width (cells between the corner glyphs) of the standard report box.\nexport const BOX_WIDTH = 42;\n\n/**\n * A rounded box around a single bold title line. Returns `[top, title, bottom]`.\n * The border takes `color` (default cyan); the title is bold white, indented two\n * cells. Titles are assumed to be plain ASCII (no ANSI, width-1 glyphs).\n */\nexport function titleBox(\n title: string,\n color: ChalkInstance = chalk.cyan,\n width = BOX_WIDTH,\n): string[] {\n const rule = (left: string, right: string): string => color(left + '─'.repeat(width) + right);\n const indent = 2;\n const fill = Math.max(width - indent - title.length, 0);\n const mid =\n color('│') + ' '.repeat(indent) + chalk.bold.white(title) + ' '.repeat(fill) + color('│');\n return [rule('╭', '╮'), mid, rule('╰', '╯')];\n}\n\n// Matches the ANSI SGR escapes chalk emits, so panel padding is computed on the\n// *visible* width of a line rather than its raw length (which includes colour codes).\nconst ANSI_SGR = /\u001b\\[[0-9;]*m/g;\n\n/** Visible (printable) length of a string, ignoring ANSI colour escapes. */\nfunction visibleLength(s: string): number {\n return s.replace(ANSI_SGR, '').length;\n}\n\n/**\n * A rounded, multi-line panel with the title embedded in the top border\n * (`╭─ TITLE ──…──╮`) and each body line boxed to a shared interior width.\n * Body lines may contain ANSI colour (chalk) — padding is computed on their\n * visible width. `minWidth` is a floor, not a ceiling: the interior grows to\n * fit the widest visible body line (plus its indent) so the right border stays\n * aligned even when content overflows — e.g. a long `npx @vibgrate/cli login →\n * npx @vibgrate/cli push` hint in the free-plan upsell. Nothing is truncated.\n */\nexport function panelBox(\n title: string,\n body: string[],\n color: ChalkInstance = chalk.cyan,\n minWidth = BOX_WIDTH,\n): string[] {\n const out: string[] = [];\n const indent = 1;\n const titleSegment = ` ${title} `;\n // Interior cell count between the corners: the floor, the title (with at\n // least two trailing dashes), and every body line's indented visible width.\n const width = body.reduce(\n (w, line) => Math.max(w, visibleLength(line) + indent),\n Math.max(minWidth, titleSegment.length + 2),\n );\n const dashes = Math.max(width - 1 - titleSegment.length, 0);\n out.push(color('╭─') + chalk.bold.white(titleSegment) + color('─'.repeat(dashes) + '╮'));\n for (const line of body) {\n const pad = Math.max(width - indent - visibleLength(line), 0);\n out.push(color('│') + ' '.repeat(indent) + line + ' '.repeat(pad) + color('│'));\n }\n out.push(color('╰' + '─'.repeat(width) + '╯'));\n return out;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport chalk from 'chalk';\nimport type { ScanArtifact, BillingSummary, ExtendedScanResults, InventoryItem, ServiceDependencyItem, ArchitectureResult } from '../types.js';\nimport { driftBar } from '../ui/bar.js';\nimport { titleBox, panelBox } from '../ui/box.js';\n\n/**\n * Format a billable project-equivalent figure to at most 2 decimal places,\n * trimming trailing zeros (0.20 → \"0.2\", 1.50 → \"1.5\", 3.00 → \"3\", 0.24 → \"0.24\").\n * Sub-1 fractions therefore never collapse to \"0\".\n */\nfunction formatBillable(value: number): string {\n return String(Number(value.toFixed(2)));\n}\n\nexport interface FormatTextOptions {\n /**\n * True when the scan ran without a Vibgrate workspace DSN (the free, local\n * path). Drives the \"Keep tracking your DriftScore\" upsell panel. Defaults\n * to false so callers that don't know the auth state never surface it.\n */\n free?: boolean;\n /**\n * Whether the user is signed in to a workspace. Selects the upsell panel's\n * call to action: signed-out users get the `login → push` hint; a signed-in\n * free-plan user (the only signed-in case where `free` is true) gets an\n * upgrade hint instead — telling them to log in again would be wrong.\n */\n authenticated?: boolean;\n /**\n * Command prefix for the upsell panel's `login → push` hint. `vg` when the\n * CLI is installed on PATH, `npx @vibgrate/cli` when the user ran via npx.\n * Defaults to `vg`.\n */\n invocation?: string;\n /**\n * Destination for the signed-in free-plan panel's upgrade link. Defaults to\n * the public dashboard host.\n */\n upgradeUrl?: string;\n}\n\nexport function formatText(artifact: ScanArtifact, opts: FormatTextOptions = {}): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(...titleBox('Vibgrate Drift Report'));\n lines.push('');\n\n // Per-project\n for (const project of artifact.projects) {\n lines.push(chalk.bold(` ── ${project.name} `) + chalk.dim(`(${project.type}) ${project.path}`));\n\n if (project.runtime) {\n const behindStr = project.runtimeMajorsBehind !== undefined && project.runtimeMajorsBehind > 0\n ? chalk.yellow(` (${project.runtimeMajorsBehind} major${project.runtimeMajorsBehind > 1 ? 's' : ''} behind)`)\n : chalk.green(' (current)');\n lines.push(` Runtime: ${project.runtime}${behindStr}`);\n }\n\n if (project.targetFramework) {\n lines.push(` Target: ${project.targetFramework}`);\n }\n\n if (project.frameworks.length > 0) {\n lines.push(' Frameworks:');\n for (const fw of project.frameworks) {\n const lag = fw.majorsBehind !== null\n ? (fw.majorsBehind === 0 ? chalk.green('current') : chalk.yellow(`${fw.majorsBehind} behind`))\n : chalk.dim('unknown');\n lines.push(` ${fw.name}: ${fw.currentVersion ?? '?'} → ${fw.latestVersion ?? '?'} (${lag})`);\n }\n }\n\n // Dependency buckets\n const b = project.dependencyAgeBuckets;\n const total = b.current + b.oneBehind + b.twoPlusBehind + b.unknown;\n if (total > 0) {\n lines.push(' Dependencies:');\n lines.push(` ${chalk.green(`${b.current} current`)} ${chalk.yellow(`${b.oneBehind} 1-behind`)} ${chalk.red(`${b.twoPlusBehind} 2+ behind`)} ${chalk.dim(`${b.unknown} unknown`)}`);\n }\n\n lines.push('');\n }\n\n if (artifact.delta !== undefined) {\n // Drift is \"lower is better\": a negative delta means drift fell (good),\n // a positive delta means drift rose (bad).\n const deltaStr = artifact.delta < 0\n ? chalk.green(`${artifact.delta}`)\n : artifact.delta > 0\n ? chalk.red(`+${artifact.delta}`)\n : chalk.dim('0');\n lines.push(chalk.bold(' Drift Delta: ') + deltaStr + ' (vs baseline)');\n lines.push('');\n }\n\n // Extended scan results\n if (artifact.extended) {\n lines.push(...formatExtended(artifact.extended));\n }\n\n // Findings\n if (artifact.findings.length > 0) {\n const errors = artifact.findings.filter((f) => f.level === 'error');\n const warnings = artifact.findings.filter((f) => f.level === 'warning');\n const notes = artifact.findings.filter((f) => f.level === 'note');\n const summary = [\n errors.length > 0 ? chalk.red(`${errors.length} error${errors.length !== 1 ? 's' : ''}`) : '',\n warnings.length > 0 ? chalk.yellow(`${warnings.length} warning${warnings.length !== 1 ? 's' : ''}`) : '',\n notes.length > 0 ? chalk.blue(`${notes.length} note${notes.length !== 1 ? 's' : ''}`) : '',\n ].filter(Boolean).join(chalk.dim(', '));\n\n lines.push(chalk.bold.underline(` Findings`) + chalk.dim(` (${summary})`));\n for (const f of artifact.findings) {\n const icon = f.level === 'error' ? chalk.red('✖') : f.level === 'warning' ? chalk.yellow('⚠') : chalk.blue('ℹ');\n lines.push(` ${icon} ${f.message}`);\n lines.push(chalk.dim(` ${f.ruleId} in ${f.location}`));\n }\n lines.push('');\n }\n\n // Priority actions\n const actions = generatePriorityActions(artifact);\n if (actions.length > 0) {\n lines.push(...titleBox('Top Priority Actions'));\n lines.push('');\n for (let i = 0; i < actions.length; i++) {\n const a = actions[i];\n const num = chalk.bold.cyan(` ${i + 1}.`);\n lines.push(`${num} ${chalk.bold(a.title)}`);\n lines.push(chalk.dim(` ${a.explanation}`));\n if (a.impact) lines.push(` Impact: ${chalk.green(a.impact)}`);\n lines.push('');\n }\n }\n\n // Architecture Layers (just above drift summary)\n if (artifact.extended?.architecture) {\n lines.push(...formatArchitectureDiagram(artifact.extended.architecture));\n }\n\n // NOTE: Mermaid diagrams (relationshipDiagram) are intentionally not rendered in CLI output.\n // They are still included in JSON output for dashboard/API consumption.\n\n if (artifact.solutions && artifact.solutions.length > 0) {\n lines.push(...titleBox('Solution Drift Summary'));\n lines.push('');\n for (const solution of artifact.solutions) {\n const solScore = solution.drift?.score;\n const color = typeof solScore === 'number' ? (solScore <= 30 ? chalk.green : solScore <= 60 ? chalk.yellow : chalk.red) : chalk.dim;\n lines.push(` • ${solution.name} (${solution.projectPaths.length} projects) — ${typeof solScore === 'number' ? color(`${solScore}/100`) : chalk.dim('n/a')}`);\n }\n lines.push('');\n }\n\n // Score summary\n const scoreColor = artifact.drift.score <= 30 ? chalk.green :\n artifact.drift.score <= 60 ? chalk.yellow : chalk.red;\n\n lines.push(...titleBox('DriftScore Summary'));\n lines.push('');\n lines.push(chalk.bold(' DriftScore: ') + scoreColor.bold(`${artifact.drift.score}/100`));\n lines.push(chalk.bold(' Risk Level: ') + riskBadge(artifact.drift.riskLevel));\n lines.push(chalk.bold(' Projects: ') + `${artifact.projects.length}`);\n\n // Project classification breakdown + billable projects (\"micro-project pricing\").\n // Billing is a commercial signal attached by the full scan; the open base scan omits it.\n const billing = artifact.billing;\n if (billing) {\n // Show each size's billable *contribution* (count ÷ its ratio) to 1–2 dp, and\n // the repository total to 1–2 dp — not the floored integer. A single scan can\n // bill a fraction (e.g. 2 micro projects → 0.2); flooring it to \"0\" would\n // wrongly read as free, when those fractions add up across repositories and\n // are only rounded down after the whole estate is summed.\n const parts: string[] = [];\n if (billing.standardCount > 0)\n parts.push(`${chalk.cyan(formatBillable(billing.standardCount))} standard`);\n if (billing.smallCount > 0)\n parts.push(`${chalk.cyan(formatBillable(billing.smallCount / billing.smallBillingRatio))} small`);\n if (billing.microCount > 0)\n parts.push(`${chalk.cyan(formatBillable(billing.microCount / billing.microBillingRatio))} micro`);\n if (billing.nanoCount > 0)\n parts.push(`${chalk.cyan(formatBillable(billing.nanoCount / billing.nanoBillingRatio))} nano`);\n\n lines.push(\n chalk.bold(' Classified: ') +\n `${chalk.cyan(billing.nanoCount)} nano · ${chalk.cyan(billing.microCount)} micro · ${chalk.cyan(billing.smallCount)} small · ${chalk.cyan(billing.standardCount)} standard`,\n );\n const raw = formatBillable(billing.billableProjectsRaw);\n lines.push(\n chalk.bold(' Billable: ') +\n chalk.bold.white(raw) +\n chalk.dim(\n ` · ${billing.totalScanned} detected → ${raw} billable project${billing.billableProjectsRaw === 1 ? '' : 's'} (micro-project pricing)`,\n ),\n );\n if (parts.length > 0) {\n lines.push(chalk.dim(' ') + parts.join(chalk.dim(' · ')));\n }\n // When the total is fractional, make the \"not free\" point explicit.\n if (billing.billableProjectsRaw !== Math.floor(billing.billableProjectsRaw)) {\n lines.push(\n chalk.dim(' These fractions add up across repositories, then round down to whole billable projects.'),\n );\n }\n }\n\n if (artifact.vcs) {\n const vcsParts: string[] = [artifact.vcs.type];\n if (artifact.vcs.branch) vcsParts.push(artifact.vcs.branch);\n if (artifact.vcs.shortSha) vcsParts.push(chalk.dim(artifact.vcs.shortSha));\n lines.push(chalk.bold(' VCS: ') + vcsParts.join(' '));\n }\n\n lines.push('');\n\n // Score breakdown\n const m = new Set(artifact.drift.measured ?? ['runtime', 'framework', 'dependency', 'eol']);\n lines.push(' ' + chalk.bold.underline('Score Breakdown'));\n lines.push(` Runtime: ${m.has('runtime') ? scoreBar(artifact.drift.components.runtimeScore) : chalk.dim('n/a')}`);\n lines.push(` Frameworks: ${m.has('framework') ? scoreBar(artifact.drift.components.frameworkScore) : chalk.dim('n/a')}`);\n lines.push(` Dependencies: ${m.has('dependency') ? scoreBar(artifact.drift.components.dependencyScore) : chalk.dim('n/a')}`);\n lines.push(` EOL Risk: ${m.has('eol') ? scoreBar(artifact.drift.components.eolScore) : chalk.dim('n/a')}`);\n lines.push('');\n\n const scannedParts: string[] = [`Scanned at ${artifact.timestamp}`];\n if (artifact.durationMs !== undefined) {\n const secs = (artifact.durationMs / 1000).toFixed(1);\n scannedParts.push(`${secs}s`);\n }\n if (artifact.filesScanned !== undefined) {\n scannedParts.push(`${artifact.filesScanned} file${artifact.filesScanned !== 1 ? 's' : ''} scanned`);\n }\n if (artifact.treeSummary) {\n scannedParts.push(`${artifact.treeSummary.totalFiles.toLocaleString()} workspace files`);\n scannedParts.push(`${artifact.treeSummary.totalDirs.toLocaleString()} dirs`);\n }\n lines.push(chalk.dim(` ${scannedParts.join(' · ')}`));\n lines.push('');\n\n // Free-plan upsell: only when the user has no workspace DSN (they scanned\n // locally) and this scan produced a billing roll-up to price against.\n if (opts.free && artifact.billing) {\n lines.push(...renderUpsellPanel(artifact.billing, {\n authenticated: opts.authenticated === true,\n invocation: opts.invocation ?? 'vg',\n upgradeUrl: opts.upgradeUrl ?? 'https://dash.vibgrate.com',\n }));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ── Free-plan upsell (\"Keep tracking your DriftScore\") ──\n\n// Banded, per-billable-project monthly rates, mirrored from the public pricing\n// page (packages/vibgrate-website/components/PricingPage.tsx). The marginal\n// rate drops as an estate grows; a single repo's billable projects sit in the\n// first band. Keep these in sync with the pricing page and llms.txt.\nconst PRICE_EDGES = [0, 25, 100, 300, 500];\nconst PRICE_RATES = {\n team: [6, 5, 4, 3.5],\n business: [15, 12, 10, 8],\n};\n\n/** Monthly cost for `billableProjects` under a banded rate table. */\nfunction estimateMonthly(billableProjects: number, rates: number[]): number {\n let total = 0;\n for (let i = 0; i < 4; i++) {\n const lo = PRICE_EDGES[i];\n const hi = i === 3 ? Infinity : PRICE_EDGES[i + 1];\n if (billableProjects > lo) {\n total += (Math.min(billableProjects, hi) - lo) * rates[i];\n }\n }\n // Round to whole cents to avoid binary-float noise (e.g. 0.1 * 3 = 0.30000004).\n return Math.round(total * 100) / 100;\n}\n\n/** Whole dollars when integral, otherwise two decimal places. */\nfunction formatMoney(value: number): string {\n return value === Math.floor(value) ? `$${value}` : `$${value.toFixed(2)}`;\n}\n\ninterface UpsellPanelOptions {\n /** Signed in on the free plan (upgrade CTA) vs signed out (login CTA). */\n authenticated: boolean;\n /** Command prefix for the signed-out `login → push` hint. */\n invocation: string;\n /** Destination for the signed-in upgrade link. */\n upgradeUrl: string;\n}\n\n/**\n * The teal call-out panel shown after a free-plan scan. Two audiences share the\n * pricing and Cloud-value block but differ in the top line and the call to\n * action: a signed-out user is told their scan is local and pointed at\n * `login → push`; a signed-in free-plan user (already pushing, just capped) is\n * pointed at an upgrade instead — telling them to log in again would be wrong.\n */\nfunction renderUpsellPanel(billing: BillingSummary, opts: UpsellPanelOptions): string[] {\n const raw = billing.billableProjectsRaw;\n const team = estimateMonthly(raw, PRICE_RATES.team);\n const business = estimateMonthly(raw, PRICE_RATES.business);\n const rawLabel = formatBillable(raw);\n\n const intro = opts.authenticated\n ? [\n `You're on Vibgrate Free — your scans are tracked on`,\n `Vibgrate Cloud, capped at the free plan's limits.`,\n ]\n : [\n `You're on Vibgrate Free — this scan ran locally and`,\n `isn't tracked over time.`,\n ];\n\n const costLead = opts.authenticated\n ? `On Team or Business, this repo would cost:`\n : `Tracked monthly on Vibgrate Cloud, this repo would cost:`;\n\n // Signed-in free users already have the tracking basics; the panel sells the\n // paid-only capacity and automation. Signed-out users are sold on Cloud itself.\n const addsLead = opts.authenticated ? `Upgrading adds:` : `Vibgrate Cloud adds:`;\n const adds = opts.authenticated\n ? [\n ` ${chalk.cyan('•')} More repositories and pushed scans`,\n ` ${chalk.cyan('•')} Scheduled scans that run automatically — no CI wiring`,\n ` ${chalk.cyan('•')} Alerts when drift crosses the budget you set`,\n ]\n : [\n ` ${chalk.cyan('•')} DriftScore tracked over time — trends, not snapshots`,\n ` ${chalk.cyan('•')} Scheduled scans that run automatically — no CI wiring`,\n ` ${chalk.cyan('•')} Alerts when drift crosses the budget you set`,\n ];\n\n // Signed-out users keep the original \"Free forever\" framing; signed-in free\n // users see \"Free plan\" (they're already on it). Both end identically.\n const capacityLine = opts.authenticated\n ? `Free plan: 1 repository, 5 pushed scans / month.`\n : `Free forever: 1 repository, 5 pushed scans / month.`;\n\n const cta = opts.authenticated\n ? `${chalk.bold('More on Team or Business:')} ${chalk.cyan(opts.upgradeUrl)}`\n : `${chalk.bold('Start tracking:')} ${chalk.cyan(`${opts.invocation} login`)} → ${chalk.cyan(`${opts.invocation} push`)}`;\n\n const body = [\n ...intro,\n ``,\n chalk.bold(costLead),\n ` ${chalk.bold('Team')} ${chalk.bold.white(formatMoney(team))} / mo`,\n ` ${chalk.bold('Business')} ${chalk.bold.white(formatMoney(business))} / mo`,\n chalk.dim(` (${rawLabel} billable project${raw === 1 ? '' : 's'}, banded per-project pricing)`),\n ``,\n chalk.bold(addsLead),\n ...adds,\n ``,\n chalk.dim(capacityLine),\n cta,\n ];\n\n // Brand teal (#3FB0A4) border so the panel stands out from the cyan report boxes.\n return panelBox('KEEP TRACKING YOUR DRIFTSCORE', body, chalk.hex('#3FB0A4'), 60);\n}\n\nfunction riskBadge(level: string): string {\n switch (level) {\n case 'low': return chalk.bgGreen.black(' LOW ');\n case 'moderate': return chalk.bgYellow.black(' MODERATE ');\n case 'high': return chalk.bgRed.white(' HIGH ');\n default: return level;\n }\n}\n\nfunction scoreBar(score: number): string {\n // Drift bar: the fill shows how much drift exists (0 = empty/best, 100 = full/worst).\n // Sub-cell gradient fill (green → the score's own risk colour) for a smoother read.\n return driftBar(score, 20);\n}\n\n// ── Extended results summary ──\n\nconst CATEGORY_LABELS: Record<string, string> = {\n frontend: 'Frontend',\n metaFrameworks: 'Meta-frameworks',\n bundlers: 'Bundlers',\n css: 'CSS / UI',\n backend: 'Backend',\n orm: 'ORM / Database',\n testing: 'Testing',\n lintFormat: 'Lint & Format',\n apiMessaging: 'API & Messaging',\n observability: 'Observability',\n payment: 'Payment',\n auth: 'Auth',\n email: 'Email',\n cloud: 'Cloud',\n databases: 'Databases',\n messaging: 'Messaging',\n crm: 'CRM & Comms',\n storage: 'Storage',\n search: 'Search & AI',\n};\n\nfunction formatExtended(ext: ExtendedScanResults): string[] {\n const lines: string[] = [];\n\n // ── Tooling Inventory ──\n if (ext.toolingInventory) {\n const inv = ext.toolingInventory;\n const categories = Object.entries(inv).filter(([, items]) => items.length > 0);\n if (categories.length > 0) {\n lines.push(chalk.bold.underline(' Tech Stack'));\n for (const [cat, items] of categories) {\n const label = CATEGORY_LABELS[cat] ?? cat;\n const names = (items as InventoryItem[]).map((i: InventoryItem) => chalk.white(i.name)).join(chalk.dim(', '));\n lines.push(` ${chalk.cyan(label)}: ${names}`);\n }\n lines.push('');\n }\n }\n\n // ── Service Dependencies ──\n if (ext.serviceDependencies) {\n const svc = ext.serviceDependencies;\n const categories = Object.entries(svc).filter(([, items]) => items.length > 0);\n if (categories.length > 0) {\n lines.push(chalk.bold.underline(' Services & Integrations'));\n for (const [cat, items] of categories) {\n const label = CATEGORY_LABELS[cat] ?? cat;\n const names = (items as ServiceDependencyItem[]).map((i: ServiceDependencyItem) => {\n const ver = i.version ? chalk.dim(` ${i.version}`) : '';\n return chalk.white(i.name) + ver;\n }).join(chalk.dim(', '));\n lines.push(` ${chalk.cyan(label)}: ${names}`);\n }\n lines.push('');\n }\n }\n\n // ── Breaking Change Exposure ──\n if (ext.breakingChangeExposure) {\n const bc = ext.breakingChangeExposure;\n if (bc.deprecatedPackages.length > 0 || bc.legacyPolyfills.length > 0) {\n lines.push(chalk.bold.underline(' Breaking Change Exposure'));\n\n const exposureColor = bc.exposureScore >= 40 ? chalk.red :\n bc.exposureScore >= 20 ? chalk.yellow : chalk.green;\n lines.push(` Exposure Score: ${exposureColor.bold(`${bc.exposureScore}/100`)}`);\n\n if (bc.deprecatedPackages.length > 0) {\n lines.push(` ${chalk.red('Deprecated')}: ${bc.deprecatedPackages.map((p) => chalk.dim(p)).join(', ')}`);\n }\n if (bc.legacyPolyfills.length > 0) {\n lines.push(` ${chalk.yellow('Polyfills')}: ${bc.legacyPolyfills.map((p) => chalk.dim(p)).join(', ')}`);\n }\n if (bc.peerConflictsDetected) {\n lines.push(` ${chalk.red('⚠')} Peer dependency conflicts detected`);\n }\n lines.push(` Recommendation: ${chalk.bold(bc.overallRecommendation)}`);\n\n const projectsWithPlans = bc.projectIntelligence.filter((p) => p.packages.length > 0).slice(0, 3);\n if (projectsWithPlans.length > 0) {\n lines.push(' Major Upgrade Intelligence:');\n for (const p of projectsWithPlans) {\n lines.push(` - ${p.project} (${p.recommendation})`);\n for (const pkg of p.packages.slice(0, 2)) {\n lines.push(` · ${pkg.package} ${pkg.currentVersion ?? '?'} → ${pkg.targetVersion ?? '?'} | touched ~${pkg.usage.touchedPercent}% | ${pkg.automatable}`);\n }\n }\n }\n lines.push('');\n }\n }\n\n // ── TypeScript Modernity ──\n if (ext.tsModernity && ext.tsModernity.typescriptVersion) {\n const ts = ext.tsModernity;\n lines.push(chalk.bold.underline(' TypeScript'));\n const parts: string[] = [];\n parts.push(`v${ts.typescriptVersion}`);\n if (ts.strict === true) parts.push(chalk.green('strict ✔'));\n else if (ts.strict === false) parts.push(chalk.yellow('strict ✖'));\n if (ts.moduleType) parts.push(ts.moduleType.toUpperCase());\n if (ts.target) parts.push(`target: ${ts.target}`);\n lines.push(` ${parts.join(chalk.dim(' · '))}`);\n lines.push('');\n }\n\n // ── Build & Deploy ──\n if (ext.buildDeploy) {\n const bd = ext.buildDeploy;\n const hasSomething = bd.ci.length > 0 || bd.docker.dockerfileCount > 0 || bd.packageManagers.length > 0;\n if (hasSomething) {\n lines.push(chalk.bold.underline(' Build & Deploy'));\n if (bd.ci.length > 0) lines.push(` CI: ${bd.ci.join(', ')}`);\n if (bd.docker.dockerfileCount > 0) {\n lines.push(` Docker: ${bd.docker.dockerfileCount} Dockerfile${bd.docker.dockerfileCount !== 1 ? 's' : ''} (${bd.docker.baseImages.join(', ')})`);\n }\n if (bd.packageManagers.length > 0) lines.push(` Package Managers: ${bd.packageManagers.join(', ')}`);\n if (bd.monorepoTools.length > 0) lines.push(` Monorepo: ${bd.monorepoTools.join(', ')}`);\n if (bd.iac.length > 0) lines.push(` IaC: ${bd.iac.join(', ')}`);\n lines.push('');\n }\n }\n\n\n\n // ── Product Purpose Evidence ──\n if (ext.uiPurpose) {\n const up = ext.uiPurpose;\n lines.push(chalk.bold.underline(' Product Purpose Signals'));\n lines.push(` Frameworks: ${up.detectedFrameworks.length > 0 ? up.detectedFrameworks.join(', ') : chalk.dim('unknown')}`);\n lines.push(` Evidence: ${up.topEvidence.length}${up.capped ? chalk.dim(` of ${up.evidenceCount} (capped)`) : ''}`);\n\n const top = up.topEvidence.slice(0, 8);\n if (top.length > 0) {\n lines.push(' Top Signals:');\n for (const item of top) {\n lines.push(` - [${item.kind}] ${item.value} ${chalk.dim(`(${item.file})`)}`);\n }\n }\n\n if (up.unknownSignals.length > 0) {\n lines.push(' Unknowns:');\n for (const u of up.unknownSignals.slice(0, 4)) {\n lines.push(` - ${chalk.yellow(u)}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Security Posture (compact) ──\n if (ext.securityPosture) {\n const sec = ext.securityPosture;\n lines.push(chalk.bold.underline(' Security Posture'));\n const checks: string[] = [];\n checks.push(sec.lockfilePresent ? chalk.green('Lockfile ✔') : chalk.red('Lockfile ✖'));\n checks.push(sec.gitignoreCoversEnv ? chalk.green('.env ✔') : chalk.red('.env ✖'));\n checks.push(sec.gitignoreCoversNodeModules ? chalk.green('node_modules ✔') : chalk.yellow('node_modules ✖'));\n if (sec.multipleLockfileTypes) checks.push(chalk.yellow('Multiple lockfiles ⚠'));\n if (sec.envFilesTracked) checks.push(chalk.red('Env files tracked ✖'));\n lines.push(` ${checks.join(chalk.dim(' · '))}`);\n lines.push('');\n }\n // ── Platform Matrix (compact) ──\n if (ext.platformMatrix) {\n const pm = ext.platformMatrix;\n if (pm.nativeModules.length > 0 || pm.dockerBaseImages.length > 0) {\n lines.push(chalk.bold.underline(' Platform'));\n if (pm.nativeModules.length > 0) {\n lines.push(` Native modules: ${pm.nativeModules.map((m) => chalk.dim(m)).join(', ')}`);\n }\n if (pm.osAssumptions.length > 0) {\n lines.push(` OS assumptions: ${pm.osAssumptions.join(', ')}`);\n }\n lines.push('');\n }\n }\n\n\n // ── Code Quality (compact) ──\n if (ext.codeQuality) {\n const cq = ext.codeQuality;\n lines.push(chalk.bold.underline(' Code Quality'));\n lines.push(` Files: ${chalk.white(`${cq.filesAnalyzed}`)} · Functions: ${chalk.white(`${cq.functionsAnalyzed}`)} · Avg complexity: ${chalk.white(`${cq.avgCyclomaticComplexity}`)} · Avg length: ${chalk.white(`${cq.avgFunctionLength}`)} lines`);\n lines.push(` Max nesting: ${cq.maxNestingDepth} · Circular deps: ${cq.circularDependencies} · Dead code: ${cq.deadCodePercent}%`);\n if (cq.godFiles.length > 0) {\n const preview = cq.godFiles.slice(0, 3).map((f) => `${f.path} (${f.lines} lines)`).join(', ');\n lines.push(` ${chalk.yellow('God files')}: ${preview}`);\n }\n lines.push('');\n }\n // ── Database Schema (compact) ──\n if (ext.databaseSchema) {\n const ds = ext.databaseSchema;\n lines.push(chalk.bold.underline(' Database Schema'));\n const dsHead: string[] = [];\n if (ds.providers.length > 0) dsHead.push(ds.providers.join(', '));\n dsHead.push(`${ds.models.length} model${ds.models.length !== 1 ? 's' : ''}`);\n dsHead.push(`${ds.enums.length} enum${ds.enums.length !== 1 ? 's' : ''}`);\n lines.push(` ${dsHead.join(' · ')}`);\n const bySource = new Map<string, number>();\n for (const m of ds.models) bySource.set(m.source, (bySource.get(m.source) ?? 0) + 1);\n if (bySource.size > 1) {\n const sourceSummary = [...bySource.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([s, n]) => `${s}: ${n}`).join(', ');\n lines.push(` Sources: ${sourceSummary}`);\n }\n if (ds.models.length > 0) {\n const preview = ds.models.slice(0, 5).map((m) => m.name).join(', ');\n lines.push(` Models: ${chalk.white(preview)}${ds.models.length > 5 ? chalk.dim(` (+${ds.models.length - 5} more)`) : ''}`);\n }\n lines.push('');\n }\n // ── Dependency Graph (compact) ──\n if (ext.dependencyGraph) {\n const dg = ext.dependencyGraph;\n if (dg.lockfileType) {\n lines.push(chalk.bold.underline(' Dependency Graph'));\n lines.push(` ${dg.lockfileType}: ${chalk.white(`${dg.totalUnique}`)} unique, ${chalk.white(`${dg.totalInstalled}`)} installed`);\n if (dg.duplicatedPackages.length > 0) {\n lines.push(` ${chalk.yellow(`${dg.duplicatedPackages.length} duplicated`)} packages`);\n }\n if (dg.phantomDependencies.length > 0) {\n lines.push(` ${chalk.red(`${dg.phantomDependencies.length} phantom`)} dependencies`);\n }\n lines.push('');\n }\n }\n\n return lines;\n}\n\n// ── Architecture layer diagram ──\n\ninterface PriorityAction {\n title: string;\n explanation: string;\n impact?: string;\n severity: number;\n}\n\nfunction formatArchitectureDiagram(arch: ArchitectureResult): string[] {\n const lines: string[] = [];\n lines.push(...titleBox('Architecture Layers'));\n lines.push('');\n lines.push(chalk.bold(' Archetype: ') + `${arch.archetype}` + chalk.dim(` (${Math.round(arch.archetypeConfidence * 100)}% confidence)`));\n lines.push(` Files classified: ${arch.totalClassified}` + (arch.unclassified > 0 ? chalk.dim(` (${arch.unclassified} unclassified)`) : ''));\n lines.push('');\n if (arch.layers.length > 0) {\n for (const layer of arch.layers) {\n const risk = layer.riskLevel === 'none' ? chalk.dim('none') : layer.riskLevel === 'low' ? chalk.green('low') : layer.riskLevel === 'moderate' ? chalk.yellow('moderate') : chalk.red('high');\n lines.push(` ${chalk.bold(layer.layer)} ${layer.fileCount} file${layer.fileCount !== 1 ? 's' : ''} drift ${scoreBar(layer.driftScore)} risk ${risk}`);\n }\n lines.push('');\n }\n return lines;\n}\n\nfunction generatePriorityActions(artifact: ScanArtifact): PriorityAction[] {\n const actions: PriorityAction[] = [];\n\n // 1. EOL runtimes (highest priority)\n const eolProjects = artifact.projects.filter(\n (p) => p.runtimeMajorsBehind !== undefined && p.runtimeMajorsBehind >= 3,\n );\n if (eolProjects.length > 0) {\n const names = eolProjects.map((p) => p.name).join(', ');\n let detail = `End-of-life runtimes no longer receive security patches and block ecosystem upgrades.`;\n const fileLines: string[] = [];\n for (const p of eolProjects) {\n fileLines.push(`\\n ./${p.path}`);\n fileLines.push(`\\n ${p.runtime} → ${p.runtimeLatest} (${p.runtimeMajorsBehind} major${p.runtimeMajorsBehind! > 1 ? 's' : ''} behind)`);\n }\n detail += fileLines.join('');\n actions.push({\n title: `Upgrade EOL runtime${eolProjects.length > 1 ? 's' : ''} in ${names}`,\n explanation: detail,\n impact: `−${Math.min(eolProjects.length * 10, 30)} drift points (runtime & EOL)`,\n severity: 100,\n });\n }\n\n // 2. Severely outdated frameworks (3+ majors behind)\n const severeFrameworks: { name: string; fw: string; behind: number; project: string; projectPath: string }[] = [];\n for (const p of artifact.projects) {\n for (const fw of p.frameworks) {\n if (fw.majorsBehind !== null && fw.majorsBehind >= 3) {\n severeFrameworks.push({ name: fw.name, fw: `${fw.currentVersion} → ${fw.latestVersion}`, behind: fw.majorsBehind, project: p.name, projectPath: p.path });\n }\n }\n }\n if (severeFrameworks.length > 0) {\n const worst = severeFrameworks.sort((a, b) => b.behind - a.behind)[0];\n const others = severeFrameworks.length > 1 ? ` (+${severeFrameworks.length - 1} more)` : '';\n let detail = `${worst.behind} major versions behind. Major framework drift increases breaking change risk and blocks access to security fixes and performance improvements.`;\n const fileLines: string[] = [];\n let shown = 0;\n for (const sf of severeFrameworks) {\n if (shown >= 8) break;\n fileLines.push(`\\n ./${sf.projectPath}`);\n fileLines.push(`\\n ${sf.name}: ${sf.fw} (${sf.behind} major${sf.behind > 1 ? 's' : ''} behind)`);\n shown++;\n }\n const remaining = severeFrameworks.length - shown;\n detail += fileLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n actions.push({\n title: `Upgrade ${worst.name} ${worst.fw} in ${worst.project}${others}`,\n explanation: detail,\n impact: `−5–15 drift points`,\n severity: 90,\n });\n }\n\n // 3. High dependency rot (>40% 2+ behind)\n for (const p of artifact.projects) {\n const b = p.dependencyAgeBuckets;\n const total = b.current + b.oneBehind + b.twoPlusBehind;\n if (total === 0) continue;\n const twoPlusPct = Math.round((b.twoPlusBehind / total) * 100);\n if (twoPlusPct >= 40) {\n let detail = `${b.twoPlusBehind} of ${total} dependencies are 2+ majors behind. Run \\`npm outdated\\` and prioritise packages with known CVEs or breaking API changes.`;\n\n // Show the worst offenders with file paths and versions\n const worstDeps = p.dependencies\n .filter((d) => d.majorsBehind !== null && d.majorsBehind >= 2)\n .sort((a, b2) => (b2.majorsBehind ?? 0) - (a.majorsBehind ?? 0));\n if (worstDeps.length > 0) {\n const depLines: string[] = [];\n let shown = 0;\n depLines.push(`\\n ./${p.path}`);\n for (const dep of worstDeps) {\n if (shown >= 8) break;\n const current = dep.resolvedVersion ?? dep.currentSpec;\n const latest = dep.latestStable ?? '?';\n depLines.push(`\\n ${dep.package}: ${current} → ${latest} (${dep.majorsBehind} major${dep.majorsBehind! > 1 ? 's' : ''} behind)`);\n shown++;\n }\n const remaining = worstDeps.length - shown;\n detail += depLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n }\n\n actions.push({\n title: `Reduce dependency rot in ${p.name} (${twoPlusPct}% severely outdated)`,\n explanation: detail,\n impact: `−5–10 drift points`,\n severity: 80 + twoPlusPct / 10,\n });\n }\n }\n\n // 4. Framework 2 majors behind (important but not critical)\n const twoMajorFrameworks: { name: string; project: string; projectPath: string; fw: string }[] = [];\n for (const p of artifact.projects) {\n for (const fw of p.frameworks) {\n if (fw.majorsBehind === 2) {\n twoMajorFrameworks.push({ name: fw.name, project: p.name, projectPath: p.path, fw: `${fw.currentVersion} → ${fw.latestVersion}` });\n }\n }\n }\n // Deduplicate by framework name (same framework across projects)\n const uniqueTwo = [...new Map(twoMajorFrameworks.map((f) => [f.name, f])).values()];\n if (uniqueTwo.length > 0) {\n const list = uniqueTwo.slice(0, 3).map((f) => `${f.name} (${f.fw})`).join(', ');\n const moreCount = uniqueTwo.length > 3 ? ` +${uniqueTwo.length - 3} more` : '';\n let detail = `These frameworks are 2 major versions behind. Create upgrade tickets and check migration guides — the gap will widen with each new release.`;\n const fileLines: string[] = [];\n let shown = 0;\n for (const tf of twoMajorFrameworks) {\n if (shown >= 8) break;\n fileLines.push(`\\n ./${tf.projectPath}`);\n fileLines.push(`\\n ${tf.name}: ${tf.fw}`);\n shown++;\n }\n const remaining = twoMajorFrameworks.length - shown;\n detail += fileLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n actions.push({\n title: `Plan major framework upgrades: ${list}${moreCount}`,\n explanation: detail,\n impact: `−5–10 drift points`,\n severity: 60,\n });\n }\n\n // 5. Breaking change exposure\n if (artifact.extended?.breakingChangeExposure) {\n const bc = artifact.extended.breakingChangeExposure;\n const total = bc.deprecatedPackages.length + bc.legacyPolyfills.length;\n if (total > 0) {\n const items = [...bc.deprecatedPackages, ...bc.legacyPolyfills].slice(0, 5).join(', ');\n const moreCount = total > 5 ? ` +${total - 5} more` : '';\n let detail = `${total} package${total !== 1 ? 's' : ''} are deprecated or legacy polyfills. These receive no updates and may have known vulnerabilities.`;\n\n // Map deprecated/polyfill packages back to projects with versions\n const allPkgNames = new Set([...bc.deprecatedPackages, ...bc.legacyPolyfills]);\n const fileLines: string[] = [];\n let shown = 0;\n for (const p of artifact.projects) {\n const matches = p.dependencies.filter((d) => allPkgNames.has(d.package));\n if (matches.length === 0) continue;\n if (shown >= 10) break;\n fileLines.push(`\\n ./${p.path}`);\n for (const dep of matches) {\n if (shown >= 10) break;\n const ver = dep.resolvedVersion ?? dep.currentSpec;\n const label = bc.deprecatedPackages.includes(dep.package) ? 'deprecated' : 'polyfill';\n fileLines.push(`\\n ${dep.package}: ${ver} (${label})`);\n shown++;\n }\n }\n const remaining = total - shown;\n detail += fileLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n\n actions.push({\n title: `Replace deprecated/legacy packages: ${items}${moreCount}`,\n explanation: detail,\n severity: 55,\n });\n }\n }\n\n // 6. Phantom dependencies\n if (artifact.extended?.dependencyGraph) {\n const dg = artifact.extended.dependencyGraph;\n const phantomCount = dg.phantomDependencies.length;\n if (phantomCount >= 10) {\n let detail = `Packages used in code but not declared in package.json. These rely on transitive installs and can break unpredictably when other packages update.`;\n\n // Build per-project breakdown from details if available\n const details = dg.phantomDependencyDetails;\n if (details && details.length > 0) {\n // Group by sourcePath\n const byPath = new Map<string, { package: string; spec: string }[]>();\n for (const d of details) {\n if (!byPath.has(d.sourcePath)) byPath.set(d.sourcePath, []);\n byPath.get(d.sourcePath)!.push({ package: d.package, spec: d.spec });\n }\n const pathLines: string[] = [];\n let shown = 0;\n for (const [srcPath, pkgs] of byPath) {\n if (shown >= 10) break;\n pathLines.push(`\\n ./${srcPath}`);\n for (const pkg of pkgs) {\n if (shown >= 10) break;\n pathLines.push(`\\n ${pkg.package}: ${pkg.spec}`);\n shown++;\n }\n }\n const remaining = phantomCount - shown;\n detail += pathLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n }\n\n actions.push({\n title: `Fix ${phantomCount} phantom dependencies`,\n explanation: detail,\n severity: 45,\n });\n }\n }\n\n // 7. Security posture issues\n if (artifact.extended?.securityPosture) {\n const sec = artifact.extended.securityPosture;\n if (sec.envFilesTracked || !sec.lockfilePresent) {\n const issues: string[] = [];\n if (sec.envFilesTracked) issues.push('.env files are tracked in git');\n if (!sec.lockfilePresent) issues.push('no lockfile found');\n let detail: string;\n if (sec.envFilesTracked) {\n detail = 'Environment files may contain secrets. Add them to .gitignore and rotate any exposed credentials immediately.';\n detail += '\\n ./.gitignore';\n detail += '\\n Add: .env, .env.*, .env.local';\n } else {\n detail = 'Without a lockfile, installs are non-deterministic. Run the install command to generate one and commit it.';\n detail += '\\n ./';\n detail += `\\n Missing: ${sec.lockfileTypes.length > 0 ? sec.lockfileTypes.join(', ') + ' (multiple types detected)' : 'package-lock.json, pnpm-lock.yaml, or yarn.lock'}`;\n }\n actions.push({\n title: `Fix security posture: ${issues.join(', ')}`,\n explanation: detail,\n severity: 95,\n });\n }\n }\n\n // 8. Duplicate packages in dependency graph\n if (artifact.extended?.dependencyGraph) {\n const dupes = artifact.extended.dependencyGraph.duplicatedPackages;\n const highImpactDupes = dupes.filter((d) => d.versions.length >= 3);\n if (highImpactDupes.length >= 3) {\n let detail = `${highImpactDupes.length} packages have 3+ versions installed. Run \\`npm dedupe\\` to reduce bundle size and install time.`;\n const dupeLines: string[] = [];\n let shown = 0;\n for (const d of highImpactDupes) {\n if (shown >= 8) break;\n dupeLines.push(`\\n ${d.name}: ${d.versions.join(', ')} (${d.consumers} consumer${d.consumers !== 1 ? 's' : ''})`);\n shown++;\n }\n const remaining = highImpactDupes.length - shown;\n detail += dupeLines.join('');\n if (remaining > 0) detail += `\\n ... and ${remaining} more`;\n actions.push({\n title: `Deduplicate heavily-versioned packages`,\n explanation: detail,\n severity: 35,\n });\n }\n }\n\n // Sort by severity (most urgent first) and take top 5\n actions.sort((a, b) => b.severity - a.severity);\n return actions.slice(0, 5);\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { ScanArtifact, Finding } from '../types.js';\n\n/** Generate a SARIF 2.1.0 document from scan artifact */\nexport function formatSarif(artifact: ScanArtifact): object {\n const rules = buildRules(artifact.findings);\n const results = artifact.findings.map((f) => toSarifResult(f));\n\n return {\n $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'vibgrate',\n version: artifact.vibgrateVersion,\n informationUri: 'https://vibgrate.com',\n rules,\n },\n },\n results,\n invocations: [\n {\n executionSuccessful: true,\n startTimeUtc: artifact.timestamp,\n },\n ],\n },\n ],\n };\n}\n\nfunction buildRules(findings: Finding[]) {\n const ruleIds = [...new Set(findings.map((f) => f.ruleId))];\n return ruleIds.map((id) => {\n const descriptions: Record<string, { id: string; shortDescription: { text: string }; helpUri: string }> = {\n 'vibgrate/runtime-eol': {\n id: 'vibgrate/runtime-eol',\n shortDescription: { text: 'Runtime at or past end-of-life' },\n helpUri: 'https://vibgrate.com/rules/runtime-eol',\n },\n 'vibgrate/runtime-lag': {\n id: 'vibgrate/runtime-lag',\n shortDescription: { text: 'Runtime major version lag' },\n helpUri: 'https://vibgrate.com/rules/runtime-lag',\n },\n 'vibgrate/framework-major-lag': {\n id: 'vibgrate/framework-major-lag',\n shortDescription: { text: 'Framework major version behind latest' },\n helpUri: 'https://vibgrate.com/rules/framework-major-lag',\n },\n 'vibgrate/dependency-rot': {\n id: 'vibgrate/dependency-rot',\n shortDescription: { text: 'High percentage of outdated dependencies' },\n helpUri: 'https://vibgrate.com/rules/dependency-rot',\n },\n 'vibgrate/dependency-major-lag': {\n id: 'vibgrate/dependency-major-lag',\n shortDescription: { text: 'Individual dependency severely behind' },\n helpUri: 'https://vibgrate.com/rules/dependency-major-lag',\n },\n 'vibgrate/vulnerability': {\n id: 'vibgrate/vulnerability',\n shortDescription: { text: 'Known vulnerability in an installed dependency' },\n helpUri: 'https://vibgrate.com/rules/vulnerability',\n },\n };\n return descriptions[id] ?? {\n id,\n shortDescription: { text: id },\n helpUri: 'https://vibgrate.com',\n };\n });\n}\n\nfunction toSarifResult(finding: Finding) {\n return {\n ruleId: finding.ruleId,\n level: finding.level === 'error' ? 'error' : finding.level === 'warning' ? 'warning' : 'note',\n message: { text: finding.message },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: finding.location,\n },\n },\n },\n ],\n // Surface structured finding detail (e.g. advisory id, CVSS, fixed version)\n // to consumers like GitHub code scanning without bloating the message text.\n ...(finding.details && Object.keys(finding.details).length > 0 ? { properties: finding.details } : {}),\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { ScanArtifact } from '../types.js';\n\n/**\n * Format a billable project-equivalent figure to at most 2 decimal places,\n * trimming trailing zeros (0.20 → \"0.2\", 3.00 → \"3\", 0.24 → \"0.24\"). Sub-1\n * fractions therefore never collapse to \"0\".\n */\nfunction formatBillable(value: number): string {\n return String(Number(value.toFixed(2)));\n}\n\n/** Generate a Markdown report from scan artifact */\nexport function formatMarkdown(artifact: ScanArtifact): string {\n const lines: string[] = [];\n\n // Billing (micro-project pricing) is a commercial signal attached by the full\n // scan; the open base scan omits it.\n const billing = artifact.billing;\n\n lines.push('# Vibgrate Drift Report');\n lines.push('');\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| **DriftScore** | ${artifact.drift.score}/100 |`);\n lines.push(`| **Risk Level** | ${artifact.drift.riskLevel.toUpperCase()} |`);\n lines.push(`| **Projects** | ${artifact.projects.length} |`);\n if (billing) {\n // Per-size billable contribution (count ÷ ratio) to 1–2 dp, so tiny projects\n // don't read as free — a scan of 2 micro projects bills 0.2, not 0.\n const contrib: string[] = [];\n if (billing.standardCount > 0) contrib.push(`${formatBillable(billing.standardCount)} standard`);\n if (billing.smallCount > 0) contrib.push(`${formatBillable(billing.smallCount / billing.smallBillingRatio)} small`);\n if (billing.microCount > 0) contrib.push(`${formatBillable(billing.microCount / billing.microBillingRatio)} micro`);\n if (billing.nanoCount > 0) contrib.push(`${formatBillable(billing.nanoCount / billing.nanoBillingRatio)} nano`);\n const raw = formatBillable(billing.billableProjectsRaw);\n lines.push(\n `| **Classification** | ${billing.nanoCount} nano · ${billing.microCount} micro · ${billing.smallCount} small · ${billing.standardCount} standard |`,\n );\n lines.push(\n `| **Billable Projects** | ${raw} (${billing.totalScanned} detected → ${raw} billable${contrib.length > 0 ? `; ${contrib.join(' · ')}` : ''}) |`,\n );\n }\n const scannedMeta: string[] = [artifact.timestamp];\n if (artifact.durationMs !== undefined) scannedMeta.push(`${(artifact.durationMs / 1000).toFixed(1)}s`);\n if (artifact.filesScanned !== undefined) scannedMeta.push(`${artifact.filesScanned} files`);\n if (artifact.treeSummary) scannedMeta.push(`${artifact.treeSummary.totalFiles.toLocaleString()} workspace files · ${artifact.treeSummary.totalDirs.toLocaleString()} dirs`);\n lines.push(`| **Scanned** | ${scannedMeta.join(' · ')} |`);\n if (artifact.vcs) {\n lines.push(`| **VCS** | ${artifact.vcs.type} |`);\n if (artifact.vcs.branch) lines.push(`| **Branch** | ${artifact.vcs.branch} |`);\n if (artifact.vcs.sha) lines.push(`| **Commit** | \\`${artifact.vcs.shortSha}\\` |`);\n }\n lines.push('');\n\n // Score breakdown\n lines.push('## Score Breakdown');\n lines.push('');\n lines.push(`| Component | Score |`);\n lines.push(`|-----------|-------|`);\n lines.push(`| Runtime | ${artifact.drift.components.runtimeScore} |`);\n lines.push(`| Frameworks | ${artifact.drift.components.frameworkScore} |`);\n lines.push(`| Dependencies | ${artifact.drift.components.dependencyScore} |`);\n lines.push(`| EOL Risk | ${artifact.drift.components.eolScore} |`);\n lines.push('');\n\n // Per project\n lines.push('## Projects');\n lines.push('');\n\n for (const project of artifact.projects) {\n lines.push(`### ${project.name} (${project.type})`);\n lines.push('');\n\n if (project.runtime) {\n const lag = project.runtimeMajorsBehind !== undefined && project.runtimeMajorsBehind > 0\n ? ` — ${project.runtimeMajorsBehind} major(s) behind`\n : ' — current';\n lines.push(`- **Runtime:** ${project.runtime}${lag}`);\n }\n\n if (project.frameworks.length > 0) {\n lines.push('- **Frameworks:**');\n for (const fw of project.frameworks) {\n const lag = fw.majorsBehind !== null\n ? (fw.majorsBehind === 0 ? 'current' : `${fw.majorsBehind} behind`)\n : 'unknown';\n lines.push(` - ${fw.name}: ${fw.currentVersion ?? '?'} → ${fw.latestVersion ?? '?'} (${lag})`);\n }\n }\n\n const b = project.dependencyAgeBuckets;\n const total = b.current + b.oneBehind + b.twoPlusBehind + b.unknown;\n if (total > 0) {\n lines.push(`- **Dependencies:** ${b.current} current, ${b.oneBehind} 1-behind, ${b.twoPlusBehind} 2+ behind, ${b.unknown} unknown`);\n }\n\n lines.push('');\n }\n\n\n if (artifact.extended?.uiPurpose) {\n const up = artifact.extended.uiPurpose;\n lines.push('## Product Purpose Signals');\n lines.push('');\n lines.push(`- **Frameworks:** ${up.detectedFrameworks.length > 0 ? up.detectedFrameworks.join(', ') : 'unknown'}`);\n lines.push(`- **Evidence Items:** ${up.topEvidence.length}${up.capped ? ` (capped from ${up.evidenceCount})` : ''}`);\n if (up.topEvidence.length > 0) {\n lines.push('- **Top Evidence:**');\n for (const item of up.topEvidence.slice(0, 10)) {\n lines.push(` - [${item.kind}] ${item.value} (${item.file})`);\n }\n }\n if (up.unknownSignals.length > 0) {\n lines.push('- **Unknowns:**');\n for (const u of up.unknownSignals.slice(0, 5)) {\n lines.push(` - ${u}`);\n }\n }\n lines.push('');\n }\n // Recommended standards (purpose-matched)\n if (artifact.extended?.standards && artifact.extended.standards.recommended.length > 0) {\n const std = artifact.extended.standards;\n lines.push('## Recommended Standards');\n lines.push('');\n const purposes = std.projectPurposes.map((p) => `${p.project} → ${p.category}`).join(', ');\n if (purposes) lines.push(`- **Detected purpose:** ${purposes}`);\n if (std.frameworks.length > 0) {\n lines.push('- **Compliance framework coverage:**');\n for (const f of std.frameworks) {\n lines.push(` - ${f.name}: ${f.recommendedMembers}/${f.totalMembers} member standards apply`);\n }\n }\n lines.push('- **Top standards to consider:**');\n for (const rec of std.recommended.slice(0, 10)) {\n const flag = rec.complianceRelevant ? ' _(compliance)_' : '';\n lines.push(` - **${rec.name}** — ${rec.reason}${flag}`);\n }\n lines.push('');\n }\n // Findings\n if (artifact.findings.length > 0) {\n lines.push('## Findings');\n lines.push('');\n lines.push(`| Level | Rule | Message | Location |`);\n lines.push(`|-------|------|---------|----------|`);\n for (const f of artifact.findings) {\n const emoji = f.level === 'error' ? '🔴' : f.level === 'warning' ? '🟡' : '🔵';\n lines.push(`| ${emoji} ${f.level} | ${f.ruleId} | ${f.message} | ${f.location} |`);\n }\n lines.push('');\n }\n\n if (artifact.delta !== undefined) {\n const dir = artifact.delta > 0 ? '📈' : artifact.delta < 0 ? '📉' : '➡️';\n lines.push(`## Drift Delta: ${dir} ${artifact.delta > 0 ? '+' : ''}${artifact.delta} vs baseline`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type * as TsModule from 'typescript';\nimport type { VibgrateConfig } from './types.js';\nimport { pathExists, readTextFile } from './utils/fs.js';\n\nconst CONFIG_FILES = [\n 'vibgrate.config.ts',\n 'vibgrate.config.js',\n 'vibgrate.config.json',\n];\n\nconst TRUSTED_CONFIG_ENV = 'VIBGRATE_TRUST_CONFIG';\n\n// The TypeScript compiler is loaded LAZILY, only when we actually need to parse\n// a user's vibgrate.config.ts. Importing it at module-init would drag the whole\n// ~10 MB compiler into every consumer bundle — including the Cloudflare Worker\n// (@vibgrate/core → @vibgrate/core-open), where TypeScript's Node system probe\n// touches `__filename` and crashes the deploy (\"ReferenceError: __filename is\n// not defined\"). Deferring the import keeps that code path off the Worker's\n// startup entirely; it runs only on a real filesystem when a .ts config exists.\nlet tsPromise: Promise<typeof TsModule> | null = null;\nfunction loadTypeScript(): Promise<typeof TsModule> {\n tsPromise ??= import('typescript').then((m) => {\n const mod = m as unknown as { default?: typeof TsModule };\n return mod.default ?? (m as unknown as typeof TsModule);\n });\n return tsPromise;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStaticValue(\n expr: TsModule.Expression,\n constBindings: Map<string, TsModule.Expression>,\n ts: typeof TsModule,\n): unknown {\n if (ts.isParenthesizedExpression(expr)) return toStaticValue(expr.expression, constBindings, ts);\n if (ts.isStringLiteralLike(expr)) return expr.text;\n if (ts.isNumericLiteral(expr)) return Number(expr.text);\n if (expr.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (expr.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (expr.kind === ts.SyntaxKind.NullKeyword) return null;\n\n if (ts.isArrayLiteralExpression(expr)) {\n return expr.elements.map((el) => {\n if (ts.isSpreadElement(el)) throw new Error('Spread not supported in static config arrays');\n return toStaticValue(el as TsModule.Expression, constBindings, ts);\n });\n }\n\n if (ts.isObjectLiteralExpression(expr)) {\n const out: Record<string, unknown> = {};\n for (const prop of expr.properties) {\n if (!ts.isPropertyAssignment(prop) || prop.initializer === undefined) {\n throw new Error('Only plain object properties are supported in static config');\n }\n if (ts.isComputedPropertyName(prop.name)) {\n throw new Error('Computed property names are not supported in static config');\n }\n\n const key = ts.isIdentifier(prop.name)\n ? prop.name.text\n : ts.isStringLiteral(prop.name)\n ? prop.name.text\n : ts.isNumericLiteral(prop.name)\n ? prop.name.text\n : null;\n\n if (key === null) {\n throw new Error('Unsupported object key in static config');\n }\n\n out[key] = toStaticValue(prop.initializer, constBindings, ts);\n }\n return out;\n }\n\n if (ts.isIdentifier(expr)) {\n const bound = constBindings.get(expr.text);\n if (!bound) throw new Error(`Unknown identifier in static config: ${expr.text}`);\n return toStaticValue(bound, constBindings, ts);\n }\n\n throw new Error('Non-static expression in config');\n}\n\nasync function tryParseStaticConfig(text: string, configPath: string): Promise<VibgrateConfig | null> {\n const ts = await loadTypeScript();\n const scriptKind = configPath.endsWith('.ts') ? ts.ScriptKind.TS : ts.ScriptKind.JS;\n const source = ts.createSourceFile(configPath, text, ts.ScriptTarget.ESNext, true, scriptKind);\n const constBindings = new Map<string, TsModule.Expression>();\n\n for (const stmt of source.statements) {\n if (!ts.isVariableStatement(stmt)) continue;\n if (!(stmt.declarationList.flags & ts.NodeFlags.Const)) continue;\n\n for (const decl of stmt.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.initializer) {\n constBindings.set(decl.name.text, decl.initializer);\n }\n }\n }\n\n for (const stmt of source.statements) {\n if (!ts.isExportAssignment(stmt)) continue;\n const parsed = toStaticValue(stmt.expression, constBindings, ts);\n if (!isRecord(parsed)) return null;\n return { ...DEFAULT_CONFIG, ...parsed } as VibgrateConfig;\n }\n\n return null;\n}\n\n/** 5 MB — default ceiling for individual files read during a scan */\nconst DEFAULT_MAX_FILE_SIZE = 5_242_880;\n\n/** 3 minutes — default per-project scan timeout (seconds) */\nconst DEFAULT_PROJECT_SCAN_TIMEOUT = 180;\n\nconst DEFAULT_CONFIG: VibgrateConfig = {\n exclude: [],\n maxFileSizeToScan: DEFAULT_MAX_FILE_SIZE,\n projectScanTimeout: DEFAULT_PROJECT_SCAN_TIMEOUT,\n thresholds: {\n failOnError: {\n eolDays: 180,\n frameworkMajorLag: 3,\n dependencyTwoPlusPercent: 50,\n },\n warn: {\n frameworkMajorLag: 2,\n dependencyTwoPlusPercent: 30,\n },\n },\n};\n\nexport async function loadConfig(rootDir: string): Promise<VibgrateConfig> {\n let config = DEFAULT_CONFIG;\n\n for (const file of CONFIG_FILES) {\n const configPath = path.join(rootDir, file);\n if (await pathExists(configPath)) {\n if (file.endsWith('.json')) {\n const txt = await readTextFile(configPath);\n config = { ...DEFAULT_CONFIG, ...JSON.parse(txt) };\n break;\n }\n const txt = await readTextFile(configPath);\n let staticConfig: VibgrateConfig | null = null;\n try {\n staticConfig = await tryParseStaticConfig(txt, configPath);\n } catch {\n staticConfig = null;\n }\n if (staticConfig) {\n config = staticConfig;\n break;\n }\n // Dynamic imports execute arbitrary code from the scanned repository.\n // Require explicit opt-in for this behavior.\n if (process.env[TRUSTED_CONFIG_ENV] === '1') {\n try {\n const mod = await import(configPath);\n config = { ...DEFAULT_CONFIG, ...(mod.default ?? mod) };\n break;\n } catch {\n // Fall back to default\n }\n }\n }\n }\n\n // Merge sidecar auto-excludes (from stuck-dir detection)\n const sidecarPath = path.join(rootDir, '.vibgrate', 'auto-excludes.json');\n if (await pathExists(sidecarPath)) {\n try {\n const txt = await readTextFile(sidecarPath);\n const autoExcludes = JSON.parse(txt);\n if (Array.isArray(autoExcludes) && autoExcludes.length > 0) {\n const existing = config.exclude ?? [];\n config = { ...config, exclude: [...new Set([...existing, ...autoExcludes])] };\n }\n } catch {\n // ignore corrupt sidecar\n }\n }\n\n return config;\n}\n\nexport async function writeDefaultConfig(rootDir: string): Promise<string> {\n const configPath = path.join(rootDir, 'vibgrate.config.ts');\n\n const content = `import type { VibgrateConfig } from '@vibgrate/cli';\n\nconst config: VibgrateConfig = {\n // exclude: ['legacy/**'],\n // maxFileSizeToScan: 5_242_880, // 5 MB (default)\n // projectScanTimeout: 180, // 3 min per project (default, in seconds)\n thresholds: {\n failOnError: {\n eolDays: 180,\n frameworkMajorLag: 3,\n dependencyTwoPlusPercent: 50,\n },\n warn: {\n frameworkMajorLag: 2,\n dependencyTwoPlusPercent: 30,\n },\n },\n};\n\nexport default config;\n`;\n\n await fs.writeFile(configPath, content, 'utf8');\n return configPath;\n}\n\n/**\n * Append exclude patterns to the config file.\n * Deduplicates against existing excludes and writes back.\n * Supports .json configs directly; for .ts/.js configs, falls back to creating\n * a .vibgrate/auto-excludes.json sidecar (merged on next loadConfig).\n * Returns true if patterns were persisted.\n */\nexport async function appendExcludePatterns(rootDir: string, newPatterns: string[]): Promise<boolean> {\n if (newPatterns.length === 0) return false;\n\n // Try JSON config first (easiest to update programmatically)\n const jsonPath = path.join(rootDir, 'vibgrate.config.json');\n if (await pathExists(jsonPath)) {\n try {\n const txt = await readTextFile(jsonPath);\n const cfg = JSON.parse(txt) as Record<string, unknown>;\n const existing = Array.isArray(cfg.exclude) ? (cfg.exclude as string[]) : [];\n const merged = [...new Set([...existing, ...newPatterns])];\n cfg.exclude = merged;\n await fs.writeFile(jsonPath, JSON.stringify(cfg, null, 2) + '\\n', 'utf8');\n return true;\n } catch {\n // fall through\n }\n }\n\n // For .ts/.js configs (or no config at all), use a sidecar JSON\n const vibgrateDir = path.join(rootDir, '.vibgrate');\n const sidecarPath = path.join(vibgrateDir, 'auto-excludes.json');\n let existing: string[] = [];\n if (await pathExists(sidecarPath)) {\n try {\n const txt = await readTextFile(sidecarPath);\n const parsed = JSON.parse(txt);\n if (Array.isArray(parsed)) existing = parsed;\n } catch {\n // ignore\n }\n }\n const merged = [...new Set([...existing, ...newPatterns])];\n try {\n await fs.mkdir(vibgrateDir, { recursive: true });\n await fs.writeFile(sidecarPath, JSON.stringify(merged, null, 2) + '\\n', 'utf8');\n return true;\n } catch {\n return false;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { redactUrlCredentials } from './redact.js';\nimport type { VcsInfo } from '../types.js';\n\n/**\n * Detect version control system and read the current HEAD SHA.\n *\n * Implementation reads `.git/HEAD` directly — no subprocess spawning,\n * no git CLI dependency, pure filesystem read-only.\n *\n * If git is not present or reading fails, returns { type: 'unknown' }.\n */\nexport async function detectVcs(rootDir: string): Promise<VcsInfo> {\n try {\n return await detectGit(rootDir);\n } catch {\n return { type: 'unknown' };\n }\n}\n\nasync function detectGit(rootDir: string): Promise<VcsInfo> {\n const gitDir = await findGitDir(rootDir);\n if (!gitDir) {\n return { type: 'unknown' };\n }\n\n const headPath = path.join(gitDir, 'HEAD');\n let headContent: string;\n try {\n headContent = (await fs.readFile(headPath, 'utf8')).trim();\n } catch {\n return { type: 'unknown' };\n }\n\n let sha: string | undefined;\n let branch: string | undefined;\n\n if (headContent.startsWith('ref: ')) {\n // HEAD points to a branch ref, e.g. \"ref: refs/heads/main\"\n const refPath = headContent.slice(5);\n branch = refPath.startsWith('refs/heads/') ? refPath.slice(11) : refPath;\n\n // Resolve the ref to a SHA — try direct file first, then packed-refs\n sha = await resolveRef(gitDir, refPath);\n } else if (/^[0-9a-f]{40}$/i.test(headContent)) {\n // Detached HEAD — raw SHA\n sha = headContent;\n }\n\n const remoteUrl = await readGitRemoteUrl(gitDir);\n\n return {\n type: 'git',\n sha: sha ?? undefined,\n shortSha: sha ? sha.slice(0, 7) : undefined,\n branch: branch ?? undefined,\n remoteUrl,\n };\n}\n\n/**\n * Walk up from rootDir to find the `.git` directory.\n * Handles both normal repos (.git is a directory) and worktrees (.git is a file\n * containing \"gitdir: <path>\").\n */\nasync function findGitDir(startDir: string): Promise<string | null> {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const gitPath = path.join(dir, '.git');\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n if (stat.isFile()) {\n // Worktree: .git file contains \"gitdir: <path>\"\n const content = (await fs.readFile(gitPath, 'utf8')).trim();\n if (content.startsWith('gitdir: ')) {\n const resolved = path.resolve(dir, content.slice(8));\n return resolved;\n }\n }\n } catch {\n // .git doesn't exist at this level, keep walking up\n }\n dir = path.dirname(dir);\n }\n return null;\n}\n\n/**\n * Resolve a git ref (e.g. \"refs/heads/main\") to a SHA.\n * First tries the loose ref file, then falls back to packed-refs.\n */\nasync function resolveRef(gitDir: string, refPath: string): Promise<string | undefined> {\n // Try loose ref\n const loosePath = path.join(gitDir, refPath);\n try {\n const sha = (await fs.readFile(loosePath, 'utf8')).trim();\n if (/^[0-9a-f]{40}$/i.test(sha)) {\n return sha;\n }\n } catch {\n // Loose ref doesn't exist — try packed-refs\n }\n\n // Try packed-refs\n const packedPath = path.join(gitDir, 'packed-refs');\n try {\n const packed = await fs.readFile(packedPath, 'utf8');\n for (const line of packed.split('\\n')) {\n if (line.startsWith('#') || line.startsWith('^')) continue;\n const parts = line.trim().split(' ');\n if (parts.length >= 2 && parts[1] === refPath) {\n return parts[0];\n }\n }\n } catch {\n // No packed-refs\n }\n\n return undefined;\n}\n\nasync function readGitRemoteUrl(gitDir: string): Promise<string | undefined> {\n const configPath = await resolveGitConfigPath(gitDir);\n if (!configPath) return undefined;\n\n try {\n const config = await fs.readFile(configPath, 'utf8');\n const originBlock = config.match(/\\[remote\\s+\"origin\"\\]([\\s\\S]*?)(?=\\n\\[|$)/);\n if (!originBlock) return undefined;\n const urlMatch = originBlock[1]?.match(/\\n\\s*url\\s*=\\s*(.+)\\s*/);\n const url = urlMatch?.[1]?.trim();\n // GUARDRAILS §1: redact at ingest, before storage. CI clones routinely carry\n // credentials in the remote — as userinfo (`https://user:token@host/…`) or\n // query params (`?access_token=…`) — and the raw URL flows into the scan\n // artifact, which `vg push` uploads.\n return url ? redactUrlCredentials(url) : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function resolveGitConfigPath(gitDir: string): Promise<string | undefined> {\n const directConfig = path.join(gitDir, 'config');\n try {\n const stat = await fs.stat(directConfig);\n if (stat.isFile()) return directConfig;\n } catch {\n // continue to commondir lookup\n }\n\n const commonDirFile = path.join(gitDir, 'commondir');\n try {\n const commonDir = (await fs.readFile(commonDirFile, 'utf8')).trim();\n if (!commonDir) return undefined;\n const resolvedCommonDir = path.resolve(gitDir, commonDir);\n const commonConfig = path.join(resolvedCommonDir, 'config');\n const stat = await fs.stat(commonConfig);\n if (stat.isFile()) return commonConfig;\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport { pathExists, readJsonFile } from './fs.js';\n\n/** Repository name stored on scan artifacts and used for API deduplication. */\nexport async function resolveRepositoryName(rootDir: string): Promise<string> {\n const packageJsonPath = path.join(rootDir, 'package.json');\n let name = path.basename(rootDir);\n\n if (await pathExists(packageJsonPath)) {\n try {\n const packageJson = await readJsonFile<{ name?: string }>(packageJsonPath);\n if (typeof packageJson.name === 'string' && packageJson.name.trim()) {\n name = packageJson.name.trim();\n }\n } catch {\n // fall back to directory name\n }\n }\n\n return name;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, basename } from 'node:path';\n\n/**\n * Semantic progress-event recorder for the web CLI simulator.\n *\n * Enabled by setting VIBGRATE_TRACE_EVENTS=<output.json>. ScanProgress calls\n * record() as the scan runs; finish() flushes a single JSON document.\n *\n * IP boundary: a trace contains ONLY what the terminal renderer would have\n * displayed — step labels, timings, counters and stats. It never contains\n * source code, scanner internals, or absolute machine paths (the workspace\n * root is reduced to its basename). The scenario builder applies a second\n * sanitisation pass before anything is published.\n */\nexport interface TraceEvent {\n /** Milliseconds since trace start */\n t: number;\n op: string;\n [key: string]: unknown;\n}\n\nexport interface TraceDocument {\n traceVersion: 1;\n cliVersion: string;\n /** Basename of the scanned workspace — never the absolute path */\n workspace: string;\n recordedAt: string;\n durationMs: number;\n events: TraceEvent[];\n}\n\nexport class ProgressTrace {\n private events: TraceEvent[] = [];\n private start = Date.now();\n private lastThrottled = new Map<string, number>();\n private flushed = false;\n\n constructor(private outPath: string) {}\n\n /** Returns a trace when VIBGRATE_TRACE_EVENTS is set, else null. */\n static fromEnv(): ProgressTrace | null {\n const path = process.env.VIBGRATE_TRACE_EVENTS;\n return path ? new ProgressTrace(path) : null;\n }\n\n record(op: string, data: Record<string, unknown> = {}): void {\n if (this.flushed) return;\n this.events.push({ t: Date.now() - this.start, op, ...data });\n }\n\n /**\n * Record at most one event per key per interval. Used for high-frequency\n * updates (sub-step progress, live stats) so traces stay compact.\n */\n recordThrottled(key: string, op: string, data: Record<string, unknown> = {}, intervalMs = 120): void {\n if (this.flushed) return;\n const now = Date.now();\n const last = this.lastThrottled.get(key) ?? 0;\n if (now - last < intervalMs) return;\n this.lastThrottled.set(key, now);\n this.record(op, data);\n }\n\n /** Write the trace document. Safe to call once; later calls are no-ops. */\n flush(meta: { cliVersion: string; rootDir: string }): void {\n if (this.flushed) return;\n this.flushed = true;\n const doc: TraceDocument = {\n traceVersion: 1,\n cliVersion: meta.cliVersion,\n workspace: basename(meta.rootDir) || meta.rootDir,\n recordedAt: new Date().toISOString(),\n durationMs: Date.now() - this.start,\n events: this.events,\n };\n try {\n mkdirSync(dirname(this.outPath), { recursive: true });\n writeFileSync(this.outPath, JSON.stringify(doc));\n } catch {\n // Tracing must never break a real scan; swallow write errors.\n }\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport chalk from 'chalk';\nimport type { StepTiming } from './scan-history.js';\nimport { ProgressTrace } from './trace.js';\nimport { brandProgressBar } from './bar.js';\n\n// ── Robot mascot ASCII art ──\nconst ROBOT = [\n chalk.cyan(' ╭───╮') + chalk.greenBright('➜'),\n chalk.cyan(' ╭┤') + chalk.greenBright('◉ ◉') + chalk.cyan('├╮'),\n chalk.cyan(' ╰┤') + chalk.dim('───') + chalk.cyan('├╯'),\n chalk.cyan(' ╰───╯'),\n];\n\nfunction getBrand(version: string): string[] {\n return [\n chalk.bold.white(' V I B G R A T E'),\n chalk.dim(` Drift Intelligence Engine`) + chalk.dim(` v${version}`),\n ];\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport type StepStatus = 'pending' | 'active' | 'done' | 'skipped';\n\nexport interface ScanStep {\n id: string;\n label: string;\n status: StepStatus;\n detail?: string;\n count?: number;\n /** Relative weight of this step for progress calculation (default 1) */\n weight?: number;\n /** Sub-step progress: files or items processed so far */\n subProgress?: number;\n /** Sub-step total: expected total items for this step */\n subTotal?: number;\n /** Current item label (e.g. file path being processed) */\n subLabel?: string;\n}\n\nexport interface LiveStats {\n projects: number;\n dependencies: number;\n frameworks: number;\n findings: { warnings: number; errors: number; notes: number };\n /** Tree summary from pre-scan discovery */\n treeSummary?: { totalFiles: number; totalDirs: number };\n}\n\n/**\n * Zero-dependency live progress renderer for the scan command.\n * Renders to stderr so stdout stays clean for JSON/SARIF output.\n * Gracefully degrades in non-TTY environments (CI).\n */\nexport class ScanProgress {\n private steps: ScanStep[] = [];\n private stats: LiveStats = {\n projects: 0,\n dependencies: 0,\n frameworks: 0,\n findings: { warnings: 0, errors: 0, notes: 0 },\n };\n private spinnerFrame = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRowCount = 0;\n private startTime = Date.now();\n private isTTY: boolean;\n private useLiveUpdates: boolean;\n private rootDir = '';\n /** Last rendered frame content (strip to compare for dirty-checking) */\n private lastFrame = '';\n /** Whether we've hidden the cursor */\n private cursorHidden = false;\n\n /** Estimated total scan duration in ms (from history or live calculation) */\n private estimatedTotalMs: number | null = null;\n /** Per-step estimated durations from history */\n private stepEstimates = new Map<string, number>();\n /** Per-step actual start times for timing */\n private stepStartTimes = new Map<string, number>();\n /** Per-step recorded durations (completed steps) */\n private stepTimings: StepTiming[] = [];\n /** Last emitted step snapshot for append-only output modes */\n private lastLoggedStates = new Map<string, string>();\n\n private version: string;\n\n /** Optional semantic event recorder (VIBGRATE_TRACE_EVENTS) for the web simulator */\n private trace: ProgressTrace | null;\n\n constructor(rootDir: string, version = 'unknown') {\n this.version = version;\n this.trace = ProgressTrace.fromEnv();\n this.isTTY = process.stderr.isTTY ?? false;\n this.useLiveUpdates = this.isTTY && process.env.VIBGRATE_PROGRESS_MODE !== 'plain';\n this.rootDir = rootDir;\n\n // Safety net: restore cursor if the process exits while it's hidden\n if (this.isTTY) {\n const restore = () => {\n if (this.cursorHidden) {\n process.stderr.write('\\x1B[?25h');\n this.cursorHidden = false;\n }\n };\n process.on('exit', restore);\n process.on('SIGINT', () => { restore(); process.exit(130); });\n process.on('SIGTERM', () => { restore(); process.exit(143); });\n }\n }\n\n /** Set the estimated total duration from scan history */\n setEstimatedTotal(estimatedMs: number | null): void {\n this.estimatedTotalMs = estimatedMs;\n this.trace?.record('setEstimatedTotal', { estimatedMs });\n }\n\n /** Set per-step estimated durations from scan history */\n setStepEstimates(estimates: Map<string, number>): void {\n this.stepEstimates = estimates;\n }\n\n /** Get completed step timings for persisting to history */\n getStepTimings(): StepTiming[] {\n return [...this.stepTimings];\n }\n\n /** Register all steps up front, optionally with weights */\n setSteps(steps: Array<{ id: string; label: string; weight?: number }>): void {\n this.steps = steps.map((s) => ({ ...s, status: 'pending' as StepStatus, weight: s.weight ?? 1 }));\n this.trace?.record('setSteps', { steps: steps.map((s) => ({ id: s.id, label: s.label, weight: s.weight ?? 1 })) });\n if (this.isTTY) {\n // Print the static header once — it stays in terminal scroll history and\n // is never included in the repaint region. This prevents the logo from\n // being duplicated when the frame is taller than the terminal viewport.\n const header = [\n '',\n ` ${ROBOT[0]} ${getBrand(this.version)[0]}`,\n ` ${ROBOT[1]} ${getBrand(this.version)[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]} ${chalk.dim(this.rootDir)}`,\n '',\n ].join('\\n') + '\\n';\n process.stderr.write(header);\n if (this.useLiveUpdates) {\n this.startSpinner();\n }\n }\n this.render();\n }\n\n /** Insert a new step before an existing step (used for dynamically discovered items) */\n insertStepBefore(beforeId: string, step: { id: string; label: string; weight?: number }): void {\n const idx = this.steps.findIndex((s) => s.id === beforeId);\n const newStep: ScanStep = { ...step, status: 'pending', weight: step.weight ?? 1 };\n if (idx >= 0) {\n this.steps.splice(idx, 0, newStep);\n } else {\n this.steps.push(newStep);\n }\n this.trace?.record('insertStepBefore', { beforeId, step: { id: step.id, label: step.label, weight: step.weight ?? 1 } });\n }\n\n /** Mark a step as active (currently running), optionally with expected total */\n startStep(id: string, subTotal?: number): void {\n const step = this.steps.find((s) => s.id === id);\n if (step) {\n step.status = 'active';\n step.detail = undefined;\n step.count = undefined;\n step.subProgress = 0;\n step.subTotal = subTotal;\n }\n this.stepStartTimes.set(id, Date.now());\n this.trace?.record('startStep', { id, subTotal });\n this.render();\n }\n\n /** Mark a step as completed */\n completeStep(id: string, detail?: string, count?: number): void {\n const step = this.steps.find((s) => s.id === id);\n if (step) {\n step.status = 'done';\n step.detail = detail;\n step.count = count;\n }\n // Record timing\n const started = this.stepStartTimes.get(id);\n if (started) {\n this.stepTimings.push({ id, durationMs: Date.now() - started });\n }\n this.trace?.record('completeStep', { id, detail, count });\n this.render();\n }\n\n /** Mark a step as skipped */\n skipStep(id: string): void {\n const step = this.steps.find((s) => s.id === id);\n if (step) {\n step.status = 'skipped';\n step.detail = 'disabled';\n }\n this.trace?.record('skipStep', { id });\n this.render();\n }\n\n /** Update sub-step progress for the active step (files processed, etc.) */\n updateStepProgress(id: string, current: number, total?: number, label?: string): void {\n const step = this.steps.find((s) => s.id === id);\n if (step) {\n step.subProgress = current;\n if (total !== undefined) step.subTotal = total;\n if (label !== undefined) step.subLabel = label;\n }\n this.trace?.recordThrottled(`sub:${id}`, 'updateStepProgress', { id, current, total, label });\n this.render();\n }\n\n /** Update live stats */\n updateStats(partial: Partial<LiveStats>): void {\n Object.assign(this.stats, partial);\n this.traceStats(true);\n this.render();\n }\n\n /** Increment stats */\n addProjects(n: number): void {\n this.stats.projects += n;\n this.traceStats();\n this.render();\n }\n\n addDependencies(n: number): void {\n this.stats.dependencies += n;\n this.traceStats();\n this.render();\n }\n\n addFrameworks(n: number): void {\n this.stats.frameworks += n;\n this.traceStats();\n this.render();\n }\n\n addFindings(warnings: number, errors: number, notes: number): void {\n this.stats.findings.warnings += warnings;\n this.stats.findings.errors += errors;\n this.stats.findings.notes += notes;\n this.traceStats();\n this.render();\n }\n\n /** Record a (throttled) snapshot of live stats into the trace */\n private traceStats(force = false): void {\n if (!this.trace) return;\n const snapshot = {\n stats: {\n ...this.stats,\n findings: { ...this.stats.findings },\n treeSummary: this.stats.treeSummary ? { ...this.stats.treeSummary } : undefined,\n },\n };\n if (force) this.trace.record('stats', snapshot);\n else this.trace.recordThrottled('stats', 'stats', snapshot);\n }\n\n /** Stop the progress display and clear it */\n finish(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.isTTY) {\n // Build a single atomic write: cursor-up + erase-to-end + show cursor\n let buf = '';\n if (this.lastRowCount > 0) {\n buf += `\\x1B[${this.lastRowCount}A`;\n buf += '\\x1B[J';\n }\n // Restore cursor visibility\n buf += '\\x1B[?25h';\n if (buf) process.stderr.write(buf);\n this.cursorHidden = false;\n this.lastRowCount = 0;\n }\n // Print a compact summary line\n const elapsed = this.formatElapsed(Date.now() - this.startTime);\n const doneCount = this.steps.filter((s) => s.status === 'done').length;\n process.stderr.write(\n chalk.dim(` ✔ ${doneCount} scanners completed in ${elapsed}\\n\\n`),\n );\n this.trace?.record('finish', { doneCount, elapsedMs: Date.now() - this.startTime, summary: `${doneCount} scanners completed in ${elapsed}` });\n this.trace?.flush({ cliVersion: this.version, rootDir: this.rootDir });\n\n // On Windows, stdout and stderr can desync, causing subsequent stdout\n // output to overlap with residual progress content. Synchronize by\n // writing an empty ANSI reset sequence to stdout and forcing a flush.\n if (this.isTTY && process.platform === 'win32') {\n // Move cursor to column 0 and clear to end of line on stdout\n process.stdout.write('\\x1B[0G\\x1B[K');\n }\n }\n\n // ── Internal rendering ──\n\n private startSpinner(): void {\n // Hide cursor to prevent flicker from cursor jumping during redraws\n if (!this.cursorHidden) {\n process.stderr.write('\\x1B[?25l');\n this.cursorHidden = true;\n }\n // 120ms (≈8fps) is smooth enough and reduces flicker on slower terminals\n this.timer = setInterval(() => {\n this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;\n this.render();\n }, 120);\n }\n\n private clearLines(): void {\n // No-op — clearing is now folded into render() as a single atomic write\n }\n\n private render(): void {\n if (!this.useLiveUpdates) {\n this.renderCI();\n return;\n }\n\n // Build the full frame content first (header is printed once in setSteps)\n const lines: string[] = [];\n\n // Steps\n for (const step of this.steps) {\n lines.push(this.renderStep(step));\n }\n lines.push('');\n\n // Progress bar — weighted calculation with sub-step interpolation\n const totalWeight = this.steps.reduce((sum, s) => sum + (s.weight ?? 1), 0);\n let completedWeight = 0;\n for (const step of this.steps) {\n const w = step.weight ?? 1;\n if (step.status === 'done' || step.status === 'skipped') {\n completedWeight += w;\n } else if (step.status === 'active' && step.subTotal && step.subTotal > 0 && step.subProgress !== undefined) {\n // Interpolate within active step based on sub-progress\n completedWeight += w * Math.min(step.subProgress / step.subTotal, 0.99);\n } else if (step.status === 'active') {\n // Use historical step estimate for time-based interpolation\n const stepStart = this.stepStartTimes.get(step.id);\n const estimate = this.stepEstimates.get(step.id);\n if (stepStart && estimate && estimate > 0) {\n const stepElapsed = Date.now() - stepStart;\n completedWeight += w * Math.min(stepElapsed / estimate, 0.95);\n }\n }\n }\n const fraction = completedWeight / Math.max(totalWeight, 1);\n const pct = totalWeight > 0 ? Math.min(Math.round(fraction * 100), 99) : 0;\n const barWidth = 30;\n // Sub-cell gradient fill so the bar glides as the scan advances.\n const bar = brandProgressBar(fraction, barWidth);\n const elapsedMs = Date.now() - this.startTime;\n const elapsedStr = this.formatElapsed(elapsedMs);\n const etaStr = this.computeEtaString(elapsedMs, completedWeight, totalWeight);\n const treePart = this.stats.treeSummary\n ? chalk.dim(` · ${this.stats.treeSummary.totalFiles.toLocaleString()} files · ${this.stats.treeSummary.totalDirs.toLocaleString()} dirs`)\n : '';\n lines.push(` ${bar} ${chalk.bold.white(`${pct}%`)} ${chalk.dim(elapsedStr)}${etaStr}${treePart}`);\n lines.push('');\n\n // Live stats dashboard\n lines.push(this.renderStats());\n lines.push('');\n\n const content = lines.join('\\n') + '\\n';\n const rowCount = this.countRenderedRows(lines);\n\n // Dirty-check: skip the write entirely if the frame hasn't changed.\n // We compare the raw content (with ANSI codes) — this is cheap and\n // avoids thousands of identical repaints while the spinner is the\n // only thing that changes (it still changes every tick).\n if (content === this.lastFrame && this.lastRowCount === rowCount) {\n return;\n }\n this.lastFrame = content;\n\n // Build a single atomic buffer: cursor-up + erase-to-end + new content.\n // Using \\x1B[J (erase to end of screen) instead of line-by-line \\x1B[2K\\n is\n // more robust: if lastLineCount drifts by 1-2 (e.g. due to PTY CRLF translation\n // or OS-level write splitting), \\x1B[J still erases all ghost content below.\n let buf = '';\n if (this.lastRowCount > 0) {\n buf += `\\x1B[${this.lastRowCount}A`;\n buf += '\\x1B[J';\n }\n buf += content;\n process.stderr.write(buf);\n this.lastRowCount = rowCount;\n }\n\n private countRenderedRows(lines: string[]): number {\n const columns = Math.max(process.stderr.columns ?? 80, 20);\n return lines.reduce((total, line) => total + this.countWrappedRows(line, columns), 0);\n }\n\n private countWrappedRows(line: string, columns: number): number {\n const visibleWidth = Math.max(this.getDisplayWidth(line), 1);\n return Math.max(1, Math.ceil(visibleWidth / columns));\n }\n\n private getDisplayWidth(text: string): number {\n const clean = this.stripAnsi(text).replace(/\\r/g, '');\n let width = 0;\n\n for (const char of clean) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n continue;\n }\n if ((code >= 0 && code < 32) || (code >= 127 && code < 160)) {\n continue;\n }\n\n width += this.isWideCodePoint(code) ? 2 : 1;\n }\n\n return width;\n }\n\n private stripAnsi(text: string): string {\n return text.replace(/\\x1b(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\))/g, '');\n }\n\n private isWideCodePoint(code: number): boolean {\n return code >= 0x1100 && (\n code <= 0x115f ||\n code === 0x2329 ||\n code === 0x232a ||\n (code >= 0x2e80 && code <= 0xa4cf && code !== 0x303f) ||\n (code >= 0xac00 && code <= 0xd7a3) ||\n (code >= 0xf900 && code <= 0xfaff) ||\n (code >= 0xfe10 && code <= 0xfe19) ||\n (code >= 0xfe30 && code <= 0xfe6f) ||\n (code >= 0xff00 && code <= 0xff60) ||\n (code >= 0xffe0 && code <= 0xffe6) ||\n (code >= 0x1f300 && code <= 0x1f64f) ||\n (code >= 0x1f900 && code <= 0x1f9ff) ||\n (code >= 0x20000 && code <= 0x3fffd)\n );\n }\n\n private renderStep(step: ScanStep): string {\n const spinner = SPINNER_FRAMES[this.spinnerFrame]!;\n let icon: string;\n let label: string;\n let detail = '';\n\n switch (step.status) {\n case 'done':\n icon = chalk.green('✔');\n label = chalk.white(step.label);\n break;\n case 'active':\n icon = chalk.cyan(spinner);\n label = chalk.bold.white(step.label);\n // Show sub-progress for active steps (e.g. \"3,421 / 12,340 files\")\n if (step.subTotal && step.subTotal > 0 && step.subProgress !== undefined && step.subProgress > 0) {\n detail = chalk.dim(` · ${step.subProgress.toLocaleString()} / ${step.subTotal.toLocaleString()}`);\n }\n // Show current file/folder if available\n if (step.subLabel) {\n // Truncate long paths to fit terminal width (keep last ~50 chars)\n const maxLen = 50;\n const displayPath = step.subLabel.length > maxLen\n ? '…' + step.subLabel.slice(-maxLen + 1)\n : step.subLabel;\n detail += chalk.dim(` ${displayPath}`);\n }\n break;\n case 'skipped':\n icon = chalk.dim('◌');\n label = chalk.dim.strikethrough(step.label);\n break;\n default:\n icon = chalk.dim('○');\n label = chalk.dim(step.label);\n break;\n }\n\n if (step.detail) {\n detail = chalk.dim(` · ${step.detail}`);\n }\n if (step.count !== undefined && step.count > 0) {\n detail += chalk.cyan(` (${step.count})`);\n }\n\n return ` ${icon} ${label}${detail}`;\n }\n\n private renderStats(): string {\n const p = this.stats.projects;\n const d = this.stats.dependencies;\n const f = this.stats.frameworks;\n const w = this.stats.findings.warnings;\n const e = this.stats.findings.errors;\n const n = this.stats.findings.notes;\n\n const parts: string[] = [\n chalk.bold.white(` ${p}`) + chalk.dim(` project${p !== 1 ? 's' : ''}`),\n chalk.white(`${d}`) + chalk.dim(` dep${d !== 1 ? 's' : ''}`),\n chalk.white(`${f}`) + chalk.dim(` framework${f !== 1 ? 's' : ''}`),\n ];\n\n const findingParts: string[] = [];\n if (e > 0) findingParts.push(chalk.red(`${e} ✖`));\n if (w > 0) findingParts.push(chalk.yellow(`${w} ⚠`));\n if (n > 0) findingParts.push(chalk.blue(`${n} ℹ`));\n\n if (findingParts.length > 0) {\n parts.push(findingParts.join(chalk.dim(' · ')));\n }\n\n return ` ${chalk.dim('┃')} ${parts.join(chalk.dim(' │ '))}`;\n }\n\n /** Simple CI-friendly output (no ANSI rewriting) */\n private renderCI(): void {\n for (const step of this.steps) {\n const stateKey = step.status === 'done'\n ? [step.status, step.detail ?? '', step.count?.toString() ?? ''].join('|')\n : step.status;\n if (this.lastLoggedStates.get(step.id) === stateKey) {\n continue;\n }\n this.lastLoggedStates.set(step.id, stateKey);\n\n if (step.status === 'active') {\n process.stderr.write(` ◉ ${step.label}...\\n`);\n continue;\n }\n\n if (step.status === 'done') {\n const detail = this.formatLoggedStepDetail(step);\n process.stderr.write(` ✔ ${step.label}${detail}\\n`);\n continue;\n }\n\n if (step.status === 'skipped') {\n const detail = step.detail ? ` · ${step.detail}` : '';\n process.stderr.write(` ◌ ${step.label}${detail}\\n`);\n }\n }\n }\n\n private formatLoggedStepDetail(step: ScanStep): string {\n let detail = '';\n\n if (step.detail) {\n detail += ` · ${step.detail}`;\n }\n if (step.count !== undefined && step.count > 0) {\n detail += ` (${step.count})`;\n }\n\n return detail;\n }\n\n // ── Time formatting helpers ──\n\n /**\n * Format elapsed time:\n * - Under 90s → \"12.3s\"\n * - 90s and above → \"1m 30s\"\n */\n private formatElapsed(ms: number): string {\n const totalSecs = ms / 1000;\n if (totalSecs < 90) {\n return `${totalSecs.toFixed(1)}s`;\n }\n const mins = Math.floor(totalSecs / 60);\n const secs = Math.floor(totalSecs % 60);\n return `${mins}m ${secs.toString().padStart(2, '0')}s`;\n }\n\n /**\n * Compute an ETA string for the progress bar.\n *\n * Uses two sources blended together:\n * 1. **Historical estimate** from `estimatedTotalMs` (if available)\n * 2. **Live rate** — extrapolated from `elapsedMs` and `completedWeight`\n *\n * Returns empty string if not enough data yet (< 3% progress or < 2s elapsed).\n */\n private computeEtaString(\n elapsedMs: number,\n completedWeight: number,\n totalWeight: number,\n ): string {\n if (totalWeight === 0 || elapsedMs < 2000) return '';\n\n const fraction = completedWeight / totalWeight;\n // Don't show ETA until we have at least 3% progress — avoids wild estimates\n if (fraction < 0.03) {\n // But if we have historical estimate, show that instead\n if (this.estimatedTotalMs !== null && this.estimatedTotalMs > 0) {\n const remaining = Math.max(0, this.estimatedTotalMs - elapsedMs);\n if (remaining > 1000) {\n return chalk.dim(` · ~${this.formatElapsed(remaining)} left`);\n }\n }\n return '';\n }\n\n // Live rate estimate\n const liveRemaining = (elapsedMs / fraction) * (1 - fraction);\n\n let remainingMs: number;\n if (this.estimatedTotalMs !== null && this.estimatedTotalMs > 0) {\n const histRemaining = Math.max(0, this.estimatedTotalMs - elapsedMs);\n // Blend: as we progress, trust live rate more than history\n // At 3% → 80% history, at 50% → 50/50, at 80% → 20% history\n const histWeight = Math.max(0.1, 1 - fraction);\n const blended = histRemaining * histWeight + liveRemaining * (1 - histWeight);\n // When fraction is fixed, liveRemaining grows at the same rate histRemaining shrinks,\n // causing the blend to be constant. Clamp to histRemaining so ETA always counts down.\n remainingMs = Math.min(histRemaining, blended);\n } else {\n remainingMs = liveRemaining;\n }\n\n // Don't show tiny remainders or negatives\n if (remainingMs < 1500) return '';\n\n return chalk.dim(` · ~${this.formatElapsed(remainingMs)} left`);\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n// ── Scan history for ETA estimation ──\n\n/** Timing data for a single completed scan step */\nexport interface StepTiming {\n id: string;\n durationMs: number;\n}\n\n/** A single historical scan record */\nexport interface ScanRecord {\n /** ISO timestamp of scan */\n timestamp: string;\n /** Total scan wall-clock duration in milliseconds */\n totalDurationMs: number;\n /** File count from tree discovery */\n totalFiles: number;\n /** Directory count from tree discovery */\n totalDirs: number;\n /** Per-step timing breakdown */\n steps: StepTiming[];\n}\n\n/** On-disk shape of the history file */\nexport interface ScanHistoryFile {\n /** Schema version for forward compatibility */\n version: 1;\n /** Most recent scan records (capped at MAX_RECORDS) */\n records: ScanRecord[];\n}\n\nconst HISTORY_FILENAME = 'scan_history.json';\nconst MAX_RECORDS = 10;\n\n/**\n * Load scan history from `.vibgrate/scan_history.json`.\n * Returns null if the file doesn't exist or is unreadable.\n */\nexport async function loadScanHistory(rootDir: string): Promise<ScanHistoryFile | null> {\n const filePath = path.join(rootDir, '.vibgrate', HISTORY_FILENAME);\n try {\n const txt = await fs.readFile(filePath, 'utf8');\n const data = JSON.parse(txt) as ScanHistoryFile;\n if (data.version === 1 && Array.isArray(data.records)) {\n return data;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Append a scan record to history and write to disk.\n * Keeps only the last MAX_RECORDS entries.\n */\nexport async function saveScanHistory(\n rootDir: string,\n record: ScanRecord,\n): Promise<void> {\n const dir = path.join(rootDir, '.vibgrate');\n const filePath = path.join(dir, HISTORY_FILENAME);\n\n let history: ScanHistoryFile;\n const existing = await loadScanHistory(rootDir);\n if (existing) {\n history = existing;\n history.records.push(record);\n // Keep only the most recent records\n if (history.records.length > MAX_RECORDS) {\n history.records = history.records.slice(-MAX_RECORDS);\n }\n } else {\n history = { version: 1, records: [record] };\n }\n\n try {\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(history, null, 2) + '\\n', 'utf8');\n } catch {\n // Non-fatal — history is best-effort\n }\n}\n\n/**\n * Estimate total scan duration from historical records.\n *\n * Strategy:\n * 1. If we have records with a similar file count (within 3×), use a\n * weighted average of their total durations, scaled linearly by\n * the file-count ratio (more files → proportionally longer).\n * 2. Falls back to the most recent record if no similar ones exist.\n * 3. Returns null if no history is available.\n */\nexport function estimateTotalDuration(\n history: ScanHistoryFile | null,\n currentFileCount: number,\n): number | null {\n if (!history || history.records.length === 0) return null;\n\n // Find records within a reasonable size range (0.33× to 3× file count)\n const similar = history.records.filter((r) => {\n if (r.totalFiles === 0 || currentFileCount === 0) return false;\n const ratio = currentFileCount / r.totalFiles;\n return ratio >= 0.33 && ratio <= 3;\n });\n\n if (similar.length > 0) {\n // Weighted average: more recent records weigh more\n let weightedSum = 0;\n let weightTotal = 0;\n for (let i = 0; i < similar.length; i++) {\n const rec = similar[i]!;\n const weight = i + 1; // More recent = higher index in array = higher weight\n const scale = currentFileCount / rec.totalFiles;\n weightedSum += rec.totalDurationMs * scale * weight;\n weightTotal += weight;\n }\n return Math.round(weightedSum / weightTotal);\n }\n\n // Fallback: scale from most recent record\n const last = history.records[history.records.length - 1]!;\n if (last.totalFiles > 0 && currentFileCount > 0) {\n const scale = currentFileCount / last.totalFiles;\n return Math.round(last.totalDurationMs * scale);\n }\n\n return last.totalDurationMs;\n}\n\n/**\n * Estimate per-step duration from the most recent similar record.\n * Returns a map of stepId → estimated milliseconds.\n */\nexport function estimateStepDurations(\n history: ScanHistoryFile | null,\n currentFileCount: number,\n): Map<string, number> {\n const result = new Map<string, number>();\n if (!history || history.records.length === 0) return result;\n\n // Find most recent record with step data\n let best: ScanRecord | null = null;\n for (let i = history.records.length - 1; i >= 0; i--) {\n const rec = history.records[i]!;\n if (rec.steps.length > 0) {\n best = rec;\n break;\n }\n }\n if (!best) return result;\n\n const scale = best.totalFiles > 0 && currentFileCount > 0\n ? currentFileCount / best.totalFiles\n : 1;\n\n for (const step of best.steps) {\n result.set(step.id, Math.round(step.durationMs * scale));\n }\n\n return result;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nexport interface ParsedDsn {\n keyId: string;\n secret: string;\n host: string;\n workspaceId: string;\n scheme: 'https' | 'http';\n}\n\n/**\n * Parse a Vibgrate DSN string into its constituent parts.\n * Format: vibgrate+https://<key_id>:<secret>@<host>/<workspace_id>\n */\nexport function parseDsn(dsn: string): ParsedDsn | null {\n // Strip invisible/control characters (CR, LF, BOM, zero-width, etc.) that may\n // sneak in from Windows .env files, clipboard pastes, or editor artifacts\n const cleaned = dsn\n .replace(/[\\x00-\\x1F\\x7F\\uFEFF\\u200B-\\u200D\\u2060]/g, '')\n .trim();\n const match = cleaned.match(/^vibgrate\\+(https?):?\\/\\/([^:]+):([^@]+)@([^/]+)\\/(.+)$/);\n if (!match) return null;\n return {\n scheme: match[1] as 'https' | 'http',\n keyId: match[2]!,\n secret: match[3]!,\n host: match[4]!,\n workspaceId: match[5]!,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { ProjectScan, MermaidDiagram, SolutionScan } from '../types.js';\n\nfunction sanitizeId(input: string): string {\n return input.replace(/[^a-zA-Z0-9_]/g, '_');\n}\n\nfunction escapeLabel(input: string): string {\n return input.replace(/\"/g, '\\\\\"');\n}\n\nfunction scoreClass(score: number | undefined): 'scoreHigh' | 'scoreModerate' | 'scoreLow' | 'scoreUnknown' {\n if (score === undefined || Number.isNaN(score)) return 'scoreUnknown';\n // Match dashboard thresholds: >= 80 green, >= 50 amber, < 50 red\n if (score >= 80) return 'scoreHigh';\n if (score >= 50) return 'scoreModerate';\n return 'scoreLow';\n}\n\nfunction nodeLabel(project: ProjectScan): string {\n const score = project.drift?.score;\n // Format: \"Name (score)\" matching dashboard display\n if (typeof score === 'number') {\n return `${project.name} (${score})`;\n }\n return project.name;\n}\n\nfunction buildDefs(): string[] {\n // Match dashboard card styling: bg-slate-800/60 with colored borders\n // Border colors: muted versions, hover would be brighter (but mermaid doesn't support hover states well)\n return [\n // Emerald border for high scores (>= 80) - border-emerald-500\n 'classDef scoreHigh fill:#1e293b,stroke:#10b981,color:#f1f5f9,stroke-width:2px',\n // Amber border for moderate scores (50-79) - border-amber-500\n 'classDef scoreModerate fill:#1e293b,stroke:#f59e0b,color:#f1f5f9,stroke-width:2px',\n // Red border for low scores (< 50) - border-red-500\n 'classDef scoreLow fill:#1e293b,stroke:#ef4444,color:#f1f5f9,stroke-width:2px',\n // Slate border for unknown scores\n 'classDef scoreUnknown fill:#1e293b,stroke:#64748b,color:#94a3b8,stroke-width:2px',\n ];\n}\n\nexport function generateWorkspaceRelationshipMermaid(projects: ProjectScan[]): MermaidDiagram {\n const lines: string[] = ['flowchart LR'];\n const byPath = new Map(projects.map((p) => [p.path, p]));\n\n // Collect edges first so we can determine which nodes participate in relationships\n const edges: string[] = [];\n const connectedIds = new Set<string>();\n\n for (const project of projects) {\n const fromId = sanitizeId(project.projectId || project.path || project.name);\n for (const ref of project.projectReferences ?? []) {\n const target = byPath.get(ref.path);\n if (!target) continue;\n const toId = sanitizeId(target.projectId || target.path || target.name);\n edges.push(`${fromId} --> ${toId}`);\n connectedIds.add(fromId);\n connectedIds.add(toId);\n }\n }\n\n // When inter-project edges exist, show only connected nodes.\n // Otherwise show every project so the diagram is never empty.\n const showAll = connectedIds.size === 0;\n for (const project of projects) {\n const id = sanitizeId(project.projectId || project.path || project.name);\n if (!showAll && !connectedIds.has(id)) continue;\n lines.push(`${id}[\"${escapeLabel(nodeLabel(project))}\"]`);\n lines.push(`class ${id} ${scoreClass(project.drift?.score)}`);\n }\n\n lines.push(...edges);\n lines.push(...buildDefs());\n return { mermaid: lines.join('\\n') };\n}\n\nexport function generateProjectRelationshipMermaid(project: ProjectScan, projects: ProjectScan[]): MermaidDiagram {\n const lines: string[] = ['flowchart LR'];\n const byPath = new Map(projects.map((p) => [p.path, p]));\n const parents = projects.filter((p) => p.projectReferences?.some((r) => r.path === project.path));\n const children = (project.projectReferences ?? []).map((r) => byPath.get(r.path)).filter((p): p is ProjectScan => Boolean(p));\n\n const centerId = sanitizeId(project.projectId || project.path || project.name);\n lines.push(`${centerId}[\"${escapeLabel(nodeLabel(project))}\"]`);\n lines.push(`class ${centerId} ${scoreClass(project.drift?.score)}`);\n\n for (const parent of parents) {\n const id = sanitizeId(parent.projectId || parent.path || parent.name);\n lines.push(`${id}[\"${escapeLabel(nodeLabel(parent))}\"]`);\n lines.push(`class ${id} ${scoreClass(parent.drift?.score)}`);\n lines.push(`${id} --> ${centerId}`);\n }\n\n for (const child of children) {\n const id = sanitizeId(child.projectId || child.path || child.name);\n lines.push(`${id}[\"${escapeLabel(nodeLabel(child))}\"]`);\n lines.push(`class ${id} ${scoreClass(child.drift?.score)}`);\n lines.push(`${centerId} --> ${id}`);\n }\n\n lines.push(...buildDefs());\n return { mermaid: lines.join('\\n') };\n}\n\n\nexport function generateSolutionRelationshipMermaid(solution: SolutionScan, projects: ProjectScan[]): MermaidDiagram {\n const lines: string[] = ['flowchart TB'];\n const solutionNodeId = sanitizeId(solution.solutionId || solution.path || solution.name);\n const solutionScore = solution.drift?.score;\n const solutionScoreText = typeof solutionScore === 'number' ? ` (${solutionScore})` : ' (n/a)';\n lines.push(`${solutionNodeId}[\"${escapeLabel(`${solution.name}${solutionScoreText}`)}\"]`);\n lines.push(`class ${solutionNodeId} ${scoreClass(solutionScore)}`);\n\n const projectByPath = new Map(projects.map((p) => [p.path, p]));\n for (const projectPath of solution.projectPaths) {\n const project = projectByPath.get(projectPath);\n if (!project) continue;\n const projectNodeId = sanitizeId(project.projectId || project.path || project.name);\n lines.push(`${projectNodeId}[\"${escapeLabel(nodeLabel(project))}\"]`);\n lines.push(`class ${projectNodeId} ${scoreClass(project.drift?.score)}`);\n lines.push(`${solutionNodeId} --> ${projectNodeId}`);\n\n for (const ref of project.projectReferences ?? []) {\n const target = projectByPath.get(ref.path);\n if (!target) continue;\n const toId = sanitizeId(target.projectId || target.path || target.name);\n lines.push(`${projectNodeId} --> ${toId}`);\n }\n }\n\n lines.push(...buildDefs());\n return { mermaid: lines.join('\\n') };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { ProjectClassification, ProjectScan, BillingSummary } from '../types.js';\n\n/**\n * Project-classification thresholds (\"micro-project pricing\").\n *\n * Every scanned package is placed in one of four tiers — `'nano'`, `'micro'`,\n * `'small'` or `'standard'` — based on three measured signals: source-file\n * count, source byte size (lockfiles, generated code and vendored directories\n * excluded) and declared dependency count.\n *\n * A package qualifies for a tier when it satisfies **any two of the three**\n * limits for that tier. The \"any 2 of 3\" rule means a single chatty test\n * folder or one extra dependency cannot, on its own, push a genuinely small\n * service into a higher (more expensive) tier — which both reflects reality\n * and removes the incentive to game a single metric.\n *\n * The bands are evaluated smallest-first, so a package is billed at the lowest\n * tier it qualifies for:\n *\n * - `nano` — 1/{@link NANO_BILLING_RATIO} of a standard project (default 1/25)\n * - `micro` — 1/{@link MICRO_BILLING_RATIO} of a standard project (default 1/10)\n * - `small` — 1/{@link SMALL_BILLING_RATIO} of a standard project (default 1/3)\n * - `standard` — a full billable project (1)\n *\n * The tiers nest strictly (every nano limit ≤ the matching micro limit ≤ the\n * small limit), so a package that meets two nano criteria always also meets the\n * matching two micro criteria — the smallest-first evaluation simply bills it at\n * the cheapest tier it earns.\n */\n\n// ── Nano tier (smallest, billed at 1/25) ──\n\n/** A nano project has fewer than this many source files. */\nexport const NANO_MAX_FILES = 10;\n\n/** A nano project's source files total fewer than this many bytes (1 MB). */\nexport const NANO_MAX_SIZE_BYTES = 1_048_576;\n\n/** A nano project has fewer than this many dependencies. */\nexport const NANO_MAX_DEPENDENCIES = 5;\n\n// ── Micro tier (billed at 1/10) ──\n\n/** A micro project has fewer than this many source files. */\nexport const MICRO_MAX_FILES = 20;\n\n/** A micro project's source files total fewer than this many bytes (2.5 MB). */\nexport const MICRO_MAX_SIZE_BYTES = 2_621_440;\n\n/** A micro project has fewer than this many dependencies. */\nexport const MICRO_MAX_DEPENDENCIES = 10;\n\n// ── Small tier (middle band, billed at 1/3) ──\n\n/** A small project has fewer than this many source files. */\nexport const SMALL_MAX_FILES = 30;\n\n/** A small project's source files total fewer than this many bytes (5 MB). */\nexport const SMALL_MAX_SIZE_BYTES = 5_242_880;\n\n/** A small project has fewer than this many dependencies. */\nexport const SMALL_MAX_DEPENDENCIES = 25;\n\n// ── Billing ratios ──\n\n/** How many nano projects are billed as one standard project. */\nexport const NANO_BILLING_RATIO = 25;\n\n/** How many micro projects are billed as one standard project. */\nexport const MICRO_BILLING_RATIO = 10;\n\n/** How many small projects are billed as one standard project. */\nexport const SMALL_BILLING_RATIO = 3;\n\n/** A standard project is always billed as exactly one project. */\nexport const STANDARD_BILLING_RATIO = 1;\n\n/** Metrics required to classify a project. */\nexport interface ProjectClassificationInput {\n /** Number of source files in the project directory (lockfiles/vendored excluded). */\n fileCount?: number;\n /** Total byte size of the source files under the project directory (lockfiles/vendored excluded). */\n sizeBytes?: number;\n /** Number of dependencies located in the package manager. */\n dependencyCount?: number;\n}\n\n/**\n * Count how many of the three tier criteria a project satisfies.\n *\n * Each metric only counts toward the total when it is a present, valid\n * measurement within the limit. A file count must be ≥ 1 and a size must be\n * > 0 — a measured package always contains at least its own manifest, so a\n * zero there means the metric could not be resolved (an unresolved path)\n * rather than a genuinely tiny package. A dependency count of 0 is valid (a\n * package may legitimately have no dependencies). Missing metrics simply do\n * not count, which — under the \"any 2 of 3\" rule — keeps a package robust to a\n * single unmeasured signal without ever being inflated by one.\n */\nfunction criteriaSatisfied(\n input: ProjectClassificationInput,\n maxFiles: number,\n maxSizeBytes: number,\n maxDependencies: number,\n): number {\n let met = 0;\n if (input.fileCount !== undefined && input.fileCount >= 1 && input.fileCount < maxFiles) met++;\n if (input.sizeBytes !== undefined && input.sizeBytes > 0 && input.sizeBytes < maxSizeBytes) met++;\n if (input.dependencyCount !== undefined && input.dependencyCount < maxDependencies) met++;\n return met;\n}\n\n/**\n * Classify a project as `'nano'`, `'micro'`, `'small'` or `'standard'`.\n *\n * Bands are evaluated smallest-first; a project is assigned the lowest tier\n * whose limits it satisfies for any two of the three criteria. A project with\n * no usable metrics (e.g. `classifyProject({})`) falls through to `'standard'`,\n * so an unresolved or unmeasured package is always billed at the full rate.\n */\nexport function classifyProject(input: ProjectClassificationInput): ProjectClassification {\n if (criteriaSatisfied(input, NANO_MAX_FILES, NANO_MAX_SIZE_BYTES, NANO_MAX_DEPENDENCIES) >= 2) {\n return 'nano';\n }\n if (criteriaSatisfied(input, MICRO_MAX_FILES, MICRO_MAX_SIZE_BYTES, MICRO_MAX_DEPENDENCIES) >= 2) {\n return 'micro';\n }\n if (criteriaSatisfied(input, SMALL_MAX_FILES, SMALL_MAX_SIZE_BYTES, SMALL_MAX_DEPENDENCIES) >= 2) {\n return 'small';\n }\n return 'standard';\n}\n\n/**\n * Normalise a classification value, mapping the legacy two-tier names emitted\n * by older CLI builds onto the current three-tier scheme and defaulting any\n * unknown/absent value to `'standard'` (the conservative, full-rate tier).\n *\n * - `'function'` (legacy) → `'micro'` (the old smallest tier billed at 1/10;\n * mapped to micro rather than nano so historical artifacts keep their rate)\n * - `'project'` (legacy) / unknown / undefined → `'standard'`\n */\nexport function normalizeClassification(value: string | null | undefined): ProjectClassification {\n switch (value) {\n case 'nano':\n return 'nano';\n case 'micro':\n case 'function':\n return 'micro';\n case 'small':\n return 'small';\n default:\n return 'standard';\n }\n}\n\n/**\n * The billing weight of a single project of the given classification, expressed\n * as a fraction of one standard billable project.\n */\nexport function classificationBillingWeight(classification: ProjectClassification): number {\n switch (classification) {\n case 'nano':\n return 1 / NANO_BILLING_RATIO;\n case 'micro':\n return 1 / MICRO_BILLING_RATIO;\n case 'small':\n return 1 / SMALL_BILLING_RATIO;\n default:\n return 1;\n }\n}\n\n/**\n * Roll project classifications up into a billing summary.\n *\n * Each standard project counts as 1 billable unit, each small project as\n * 1/{@link SMALL_BILLING_RATIO}, each micro project as\n * 1/{@link MICRO_BILLING_RATIO} and each nano project as\n * 1/{@link NANO_BILLING_RATIO}. `billableProjectsRaw` is the exact fractional\n * sum (for transparency and the estimator), while `billableProjects` — the\n * headline figure a customer is billed for — is **always rounded down to the\n * nearest integer**.\n *\n * Note: billing fraction is never risk fraction. Every project, including\n * nano and micro projects, still rolls up fully into drift scores and the\n * portfolio view; only the billing weight is reduced.\n */\nexport function summarizeBilling(projects: ProjectScan[]): BillingSummary {\n let nanoCount = 0;\n let microCount = 0;\n let smallCount = 0;\n let standardCount = 0;\n for (const project of projects) {\n switch (normalizeClassification(project.classification)) {\n case 'nano':\n nanoCount++;\n break;\n case 'micro':\n microCount++;\n break;\n case 'small':\n smallCount++;\n break;\n default:\n standardCount++;\n break;\n }\n }\n\n const billableProjectsRaw =\n standardCount +\n smallCount / SMALL_BILLING_RATIO +\n microCount / MICRO_BILLING_RATIO +\n nanoCount / NANO_BILLING_RATIO;\n\n return {\n nanoCount,\n microCount,\n smallCount,\n standardCount,\n totalScanned: nanoCount + microCount + smallCount + standardCount,\n nanoBillingRatio: NANO_BILLING_RATIO,\n microBillingRatio: MICRO_BILLING_RATIO,\n smallBillingRatio: SMALL_BILLING_RATIO,\n billableProjectsRaw: Math.round(billableProjectsRaw * 100) / 100,\n billableProjects: Math.floor(billableProjectsRaw),\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { VulnSeverity } from '../types.js';\n\n/**\n * Minimal, dependency-free CVSS v3.0/v3.1 base-score calculator.\n *\n * Advisories (OSV/GHSA) carry severity as a CVSS *vector string*, not a number.\n * To order findings and apply CRA severity thresholds we need the numeric base\n * score, so this implements the official base-score formula. It is deterministic\n * and offline. Temporal/environmental metrics are ignored (base score only);\n * non-v3 vectors (e.g. CVSS v2) return null rather than guessing.\n */\n\nconst AV: Record<string, number> = { N: 0.85, A: 0.62, L: 0.55, P: 0.2 };\nconst AC: Record<string, number> = { L: 0.77, H: 0.44 };\nconst UI: Record<string, number> = { N: 0.85, R: 0.62 };\n// Privileges Required depends on Scope (changed scope raises L/H weights).\nconst PR_UNCHANGED: Record<string, number> = { N: 0.85, L: 0.62, H: 0.27 };\nconst PR_CHANGED: Record<string, number> = { N: 0.85, L: 0.68, H: 0.5 };\nconst CIA: Record<string, number> = { H: 0.56, L: 0.22, N: 0 };\n\n/** CVSS v3.1 roundup: smallest one-decimal value ≥ x (float-safe). */\nfunction roundup(x: number): number {\n const i = Math.round(x * 100000);\n if (i % 10000 === 0) return i / 100000;\n return (Math.floor(i / 10000) + 1) / 10;\n}\n\n/**\n * Compute the CVSS v3 base score (0–10) from a vector string, or null when the\n * vector is not a parseable v3 base vector.\n */\nexport function cvssV3BaseScore(vector: string | null | undefined): number | null {\n if (!vector || typeof vector !== 'string') return null;\n const parts = vector.trim().split('/');\n if (!parts.length) return null;\n if (!/^CVSS:3\\.[01]$/i.test(parts[0])) return null;\n\n const m: Record<string, string> = {};\n for (const part of parts.slice(1)) {\n const [k, v] = part.split(':');\n if (k && v) m[k.toUpperCase()] = v.toUpperCase();\n }\n\n const scopeChanged = m.S === 'C';\n const av = AV[m.AV];\n const ac = AC[m.AC];\n const ui = UI[m.UI];\n const pr = (scopeChanged ? PR_CHANGED : PR_UNCHANGED)[m.PR];\n const c = CIA[m.C];\n const integ = CIA[m.I];\n const a = CIA[m.A];\n if ([av, ac, ui, pr, c, integ, a].some((v) => v === undefined)) return null;\n\n const iss = 1 - (1 - c) * (1 - integ) * (1 - a);\n const impact = scopeChanged\n ? 7.52 * (iss - 0.029) - 3.25 * Math.pow(iss - 0.02, 15)\n : 6.42 * iss;\n if (impact <= 0) return 0;\n\n const exploitability = 8.22 * av * ac * pr * ui;\n const raw = scopeChanged\n ? Math.min(1.08 * (impact + exploitability), 10)\n : Math.min(impact + exploitability, 10);\n return roundup(raw);\n}\n\n/** Map a CVSS v3 base score to its qualitative severity band. */\nexport function severityFromCvss(score: number): VulnSeverity {\n if (score >= 9.0) return 'critical';\n if (score >= 7.0) return 'high';\n if (score >= 4.0) return 'moderate';\n if (score > 0) return 'low';\n return 'unknown';\n}\n\n/** Ordinal rank for a severity (higher = worse) — for sorting/aggregation. */\nexport function severityRank(s: VulnSeverity): number {\n switch (s) {\n case 'critical':\n return 4;\n case 'high':\n return 3;\n case 'moderate':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n}\n\n/** Normalize a free-text severity label (e.g. GHSA \"MODERATE\") to a VulnSeverity. */\nexport function normalizeSeverityLabel(label: string | null | undefined): VulnSeverity {\n switch ((label ?? '').trim().toLowerCase()) {\n case 'critical':\n return 'critical';\n case 'high':\n return 'high';\n case 'moderate':\n case 'medium':\n return 'moderate';\n case 'low':\n return 'low';\n default:\n return 'unknown';\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport type { Semaphore } from '../utils/semaphore.js';\nimport {\n getManifestEntry,\n type ManifestAdvisory,\n type ManifestEcosystem,\n type PackageVersionManifest,\n} from '../package-version-manifest.js';\nimport { cvssV3BaseScore, normalizeSeverityLabel, severityFromCvss, severityRank } from '../scoring/cvss.js';\nimport type {\n AffectedRange,\n Finding,\n PackageVulnerabilities,\n ProjectScan,\n ProjectType,\n VulnEcosystem,\n VulnerabilityAdvisory,\n VulnerabilityScanResult,\n VulnSeverity,\n} from '../types.js';\n\n/**\n * Open vulnerability detection.\n *\n * Maps installed packages to known advisories using the public OSV database\n * (online, opt-in via `--vulns`) or advisories carried in an offline\n * package-version manifest (air-gapped). The version-matching and advisory\n * parsing are pure functions; the OSV HTTP calls are a thin, best-effort layer\n * that degrades to \"no data\" on any failure — a missing result means \"not\n * scanned / unreachable\", never \"no vulnerabilities\".\n */\n\n/** A package@version to check for advisories. */\nexport interface VulnTarget {\n ecosystem: VulnEcosystem;\n package: string;\n version: string;\n}\n\nconst OSV_BATCH_URL = 'https://api.osv.dev/v1/querybatch';\nconst OSV_VULN_URL = 'https://api.osv.dev/v1/vulns/';\nconst OSV_TIMEOUT_MS = 15_000;\nconst OSV_BATCH_SIZE = 500;\n/** Extra attempts after the first for a transient OSV failure (network, abort, 429/5xx). */\nconst OSV_MAX_RETRIES = 3;\n/** Base backoff before the first retry; doubles each attempt (250ms, 500ms, 1s). */\nconst OSV_RETRY_BASE_MS = 250;\n/** HTTP statuses worth retrying — rate-limiting and transient server errors. A 4xx\n * like 404 is a definitive answer (e.g. an unknown advisory id) and is not retried. */\nconst OSV_RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/** Map a scanned project's type to the ecosystem OSV/our manifest understands. */\nexport function projectTypeToVulnEcosystem(type: ProjectType): VulnEcosystem | null {\n switch (type) {\n case 'node':\n case 'typescript':\n return 'npm';\n case 'python':\n return 'pypi';\n case 'java':\n return 'maven';\n case 'dotnet':\n return 'nuget';\n case 'go':\n return 'go';\n case 'rust':\n return 'cargo';\n case 'php':\n return 'composer';\n case 'ruby':\n return 'rubygems';\n case 'dart':\n return 'pub';\n case 'elixir':\n return 'hex';\n default:\n return null;\n }\n}\n\n/** Our ecosystem id → the OSV API's ecosystem string. */\nfunction osvEcosystem(ecosystem: VulnEcosystem): string {\n switch (ecosystem) {\n case 'npm':\n return 'npm';\n case 'pypi':\n return 'PyPI';\n case 'maven':\n return 'Maven';\n case 'nuget':\n return 'NuGet';\n case 'go':\n return 'Go';\n case 'cargo':\n return 'crates.io';\n case 'composer':\n return 'Packagist';\n case 'rubygems':\n return 'RubyGems';\n case 'pub':\n return 'Pub';\n case 'hex':\n return 'Hex';\n }\n}\n\n/** Our ecosystem id → the manifest table key (they line up 1:1). */\nfunction manifestEcosystem(ecosystem: VulnEcosystem): ManifestEcosystem {\n return ecosystem as ManifestEcosystem;\n}\n\nfunction emptySeverityCounts(): Record<VulnSeverity, number> {\n return { low: 0, moderate: 0, high: 0, critical: 0, unknown: 0 };\n}\n\nfunction targetKey(t: VulnTarget): string {\n return `${t.ecosystem}\\0${t.package}\\0${t.version}`;\n}\n\n/** Build the deduplicated, deterministically-ordered target list from scanned projects. */\nexport function collectVulnTargets(projects: ProjectScan[]): VulnTarget[] {\n const seen = new Set<string>();\n const targets: VulnTarget[] = [];\n for (const project of projects) {\n const ecosystem = projectTypeToVulnEcosystem(project.type);\n if (!ecosystem) continue;\n for (const dep of project.dependencies) {\n if (!dep.resolvedVersion) continue;\n const t: VulnTarget = { ecosystem, package: dep.package, version: dep.resolvedVersion };\n const key = targetKey(t);\n if (seen.has(key)) continue;\n seen.add(key);\n targets.push(t);\n }\n }\n targets.sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.version.localeCompare(b.version),\n );\n return targets;\n}\n\n/**\n * Whether `version` falls within any affected range or explicit version list.\n * A range is `[introduced, fixed)`; an absent `introduced` means \"from the\n * beginning\" and an absent `fixed` means \"still affected\". Versions that aren't\n * valid semver only match the explicit `versions` list.\n */\nexport function isVersionAffected(\n version: string,\n ranges: Array<{ introduced?: string; fixed?: string }> | undefined,\n versions: string[] | undefined,\n): boolean {\n if (versions && versions.includes(version)) return true;\n const v = semver.valid(semver.coerce(version));\n if (!v) return false;\n for (const range of ranges ?? []) {\n const introduced = range.introduced && range.introduced !== '0' ? semver.valid(semver.coerce(range.introduced)) : '0.0.0';\n const fixed = range.fixed ? semver.valid(semver.coerce(range.fixed)) : null;\n const afterIntroduced = introduced ? semver.gte(v, introduced) : true;\n const beforeFixed = fixed ? semver.lt(v, fixed) : true;\n if (afterIntroduced && beforeFixed) return true;\n }\n return false;\n}\n\n// ── OSV advisory parsing (pure) ──────────────────────────────────────────────\n\ninterface RawOsvSeverity {\n type?: string;\n score?: string;\n}\ninterface RawOsvRangeEvent {\n introduced?: string;\n fixed?: string;\n last_affected?: string;\n}\ninterface RawOsvAffected {\n package?: { ecosystem?: string; name?: string };\n ranges?: Array<{ type?: string; events?: RawOsvRangeEvent[] }>;\n versions?: string[];\n ecosystem_specific?: { severity?: string };\n database_specific?: { severity?: string };\n}\ninterface RawOsvVuln {\n id?: string;\n aliases?: string[];\n summary?: string;\n published?: string;\n withdrawn?: string;\n severity?: RawOsvSeverity[];\n affected?: RawOsvAffected[];\n references?: Array<{ url?: string }>;\n database_specific?: { severity?: string };\n}\n\n/** Parse a raw OSV advisory into our shape, scoped to a specific package name. */\nexport function parseOsvAdvisory(raw: RawOsvVuln, packageName: string): VulnerabilityAdvisory {\n const cvssVector = raw.severity?.find((s) => (s.type ?? '').toUpperCase().startsWith('CVSS_V3'))?.score ?? null;\n const cvss = cvssV3BaseScore(cvssVector);\n\n // Qualitative fallback severity (GHSA): top-level, then the matching affected entry.\n const lowerName = packageName.toLowerCase();\n const matchingAffected = (raw.affected ?? []).filter((a) => (a.package?.name ?? '').toLowerCase() === lowerName);\n const qualitative =\n raw.database_specific?.severity ??\n matchingAffected.map((a) => a.ecosystem_specific?.severity ?? a.database_specific?.severity).find(Boolean) ??\n null;\n const severity: VulnSeverity = cvss != null ? severityFromCvss(cvss) : normalizeSeverityLabel(qualitative);\n\n const fixedVersions: string[] = [];\n const affectedRanges: AffectedRange[] = [];\n const affectedVersions: string[] = [];\n for (const affected of matchingAffected) {\n for (const range of affected.ranges ?? []) {\n // OSV events are an ordered sequence of introduced/fixed boundaries.\n let introduced: string | undefined;\n let pending = false;\n for (const event of range.events ?? []) {\n if (event.introduced !== undefined) {\n introduced = event.introduced === '0' ? undefined : event.introduced;\n pending = true;\n }\n if (event.fixed) {\n if (!fixedVersions.includes(event.fixed)) fixedVersions.push(event.fixed);\n affectedRanges.push({ introduced, fixed: event.fixed });\n pending = false;\n introduced = undefined;\n }\n }\n if (pending) affectedRanges.push({ introduced }); // open-ended range (no fix yet)\n }\n for (const v of affected.versions ?? []) if (!affectedVersions.includes(v)) affectedVersions.push(v);\n }\n\n return {\n id: raw.id ?? 'UNKNOWN',\n aliases: Array.isArray(raw.aliases) ? raw.aliases : [],\n summary: raw.summary ?? null,\n severity,\n cvss,\n cvssVector,\n fixedVersions,\n published: raw.published ?? null,\n withdrawn: raw.withdrawn ?? null,\n references: (raw.references ?? []).map((r) => r.url).filter((u): u is string => Boolean(u)),\n ...(affectedRanges.length ? { affectedRanges } : {}),\n ...(affectedVersions.length ? { affectedVersions } : {}),\n };\n}\n\nexport function manifestAdvisoryToAdvisory(m: ManifestAdvisory): VulnerabilityAdvisory {\n const cvss = typeof m.cvss === 'number' ? m.cvss : cvssV3BaseScore(m.cvssVector ?? null);\n const severity: VulnSeverity = m.severity\n ? normalizeSeverityLabel(m.severity)\n : cvss != null\n ? severityFromCvss(cvss)\n : 'unknown';\n return {\n id: m.id,\n aliases: m.aliases ?? [],\n summary: m.summary ?? null,\n severity,\n cvss,\n cvssVector: m.cvssVector ?? null,\n fixedVersions: (m.ranges ?? []).map((r) => r.fixed).filter((f): f is string => Boolean(f)),\n published: m.published ?? null,\n withdrawn: m.withdrawn ?? null,\n references: m.references ?? [],\n ...(m.ranges?.length ? { affectedRanges: m.ranges } : {}),\n ...(m.versions?.length ? { affectedVersions: m.versions } : {}),\n };\n}\n\n// ── OSV HTTP (thin, best-effort) ─────────────────────────────────────────────\n\n/**\n * Outcome of a best-effort OSV fetch. `ok: false` is a *reachability* failure —\n * the network was down, the request timed out, or OSV returned a transient/4xx\n * error after retries — and is deliberately distinct from a successful empty\n * answer (which arrives as `ok: true` with empty data). Callers use this to tell\n * \"OSV said clean\" from \"OSV could not be asked\" (GUARDRAILS §1.4).\n */\ntype FetchOutcome = { ok: true; data: unknown } | { ok: false };\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchJson(url: string, init: RequestInit, sem: Semaphore): Promise<FetchOutcome> {\n return sem.run(async () => {\n for (let attempt = 0; ; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), OSV_TIMEOUT_MS);\n try {\n const res = await fetch(url, { ...init, signal: controller.signal });\n if (res.ok) return { ok: true, data: await res.json() };\n // Non-retryable status (e.g. 404 = unknown id) is a definitive answer, not\n // a reachability failure to retry — give up immediately.\n if (!OSV_RETRYABLE_STATUS.has(res.status)) return { ok: false };\n } catch {\n // Network error / timeout (abort) — fall through to the retry decision.\n } finally {\n clearTimeout(timer);\n }\n if (attempt >= OSV_MAX_RETRIES) return { ok: false };\n // Fixed exponential backoff (no jitter) keeps the engine deterministic.\n await sleep(OSV_RETRY_BASE_MS * 2 ** attempt);\n }\n });\n}\n\n/** Per-target advisory ids plus whether every batch was answered (OSV reachable). */\ninterface OsvBatchResult {\n idsByTarget: Map<string, string[]>;\n /** True only when every batch request succeeded; false if any batch failed after\n * retries, so an empty `idsByTarget` can be read as \"unreachable\", not \"clean\". */\n allBatchesOk: boolean;\n}\n\n/** Query OSV for advisory ids affecting each target, in bulk batches. */\nasync function osvQueryBatch(targets: VulnTarget[], sem: Semaphore): Promise<OsvBatchResult> {\n const idsByTarget = new Map<string, string[]>();\n let allBatchesOk = true;\n for (let i = 0; i < targets.length; i += OSV_BATCH_SIZE) {\n const chunk = targets.slice(i, i + OSV_BATCH_SIZE);\n const body = JSON.stringify({\n queries: chunk.map((t) => ({ version: t.version, package: { name: t.package, ecosystem: osvEcosystem(t.ecosystem) } })),\n });\n const outcome = await fetchJson(OSV_BATCH_URL, { method: 'POST', body, headers: { 'content-type': 'application/json' } }, sem);\n if (!outcome.ok) {\n allBatchesOk = false;\n continue;\n }\n const data = outcome.data as { results?: Array<{ vulns?: Array<{ id?: string }> }> } | null;\n if (!data?.results) {\n // A 200 with an unparseable/missing body is still an answer we can't use.\n allBatchesOk = false;\n continue;\n }\n for (let j = 0; j < chunk.length; j++) {\n const ids = (data.results[j]?.vulns ?? []).map((v) => v.id).filter((id): id is string => Boolean(id));\n if (ids.length) idsByTarget.set(targetKey(chunk[j]), ids);\n }\n }\n return { idsByTarget, allBatchesOk };\n}\n\n/** Fetch + parse full advisory details for a set of ids, deduplicated. */\nasync function osvFetchAdvisories(ids: Set<string>, sem: Semaphore): Promise<Map<string, RawOsvVuln>> {\n const out = new Map<string, RawOsvVuln>();\n await Promise.all(\n [...ids].map(async (id) => {\n const outcome = await fetchJson(`${OSV_VULN_URL}${encodeURIComponent(id)}`, { method: 'GET' }, sem);\n if (outcome.ok && outcome.data) out.set(id, outcome.data as RawOsvVuln);\n }),\n );\n return out;\n}\n\n// ── Orchestration ────────────────────────────────────────────────────────────\n\nfunction finalize(source: VulnerabilityScanResult['source'], packages: PackageVulnerabilities[]): VulnerabilityScanResult {\n // Sort packages and advisories deterministically.\n packages.sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.version.localeCompare(b.version),\n );\n const severityCounts = emptySeverityCounts();\n let totalAdvisories = 0;\n for (const pkg of packages) {\n pkg.advisories.sort((a, b) => severityRank(b.severity) - severityRank(a.severity) || a.id.localeCompare(b.id));\n totalAdvisories += pkg.advisories.length;\n const worst = pkg.advisories.reduce<VulnSeverity>((w, a) => (severityRank(a.severity) > severityRank(w) ? a.severity : w), 'unknown');\n severityCounts[worst]++;\n }\n return { source, packages, totalAdvisories, severityCounts };\n}\n\n/** A fresh empty result each call — never a shared object, so downstream\n * attribution can attach `cra` without mutating a module-level constant. */\nfunction emptyResult(): VulnerabilityScanResult {\n return {\n source: 'none',\n packages: [],\n totalAdvisories: 0,\n severityCounts: { low: 0, moderate: 0, high: 0, critical: 0, unknown: 0 },\n };\n}\n\n/**\n * Resolve advisories for the given targets.\n *\n * - Online (default): query OSV. Degrades to `source: 'none'` if OSV is unreachable.\n * - Offline: match against advisories carried in the package-version manifest.\n */\nexport async function scanVulnerabilities(\n targets: VulnTarget[],\n opts: { sem: Semaphore; offline?: boolean; manifest?: PackageVersionManifest },\n): Promise<VulnerabilityScanResult> {\n if (targets.length === 0) return emptyResult();\n\n // Offline / air-gapped: advisories come only from the manifest.\n if (opts.offline) {\n return scanFromManifest(targets, opts.manifest);\n }\n\n // Online: OSV. (A manifest, if present, augments with private advisories.)\n const { idsByTarget, allBatchesOk } = await osvQueryBatch(targets, opts.sem);\n if (idsByTarget.size === 0) {\n // No OSV matches. Fold in any manifest advisories first; if there are none,\n // report `osv` (checked & clean) only when every batch was answered. If a\n // batch failed, report `unreachable` so an empty result is never mistaken\n // for \"no vulnerabilities\" (GUARDRAILS §1.4 — absent ≠ zero).\n const manifestResult = scanFromManifest(targets, opts.manifest);\n if (manifestResult.packages.length) return manifestResult;\n return { ...emptyResult(), source: allBatchesOk ? 'osv' : 'unreachable' };\n }\n\n const allIds = new Set<string>();\n for (const ids of idsByTarget.values()) for (const id of ids) allIds.add(id);\n const rawById = await osvFetchAdvisories(allIds, opts.sem);\n\n const manifestByTarget = manifestAdvisoryMap(targets, opts.manifest);\n const packages: PackageVulnerabilities[] = [];\n for (const target of targets) {\n const ids = idsByTarget.get(targetKey(target)) ?? [];\n const advisories: VulnerabilityAdvisory[] = [];\n const seenIds = new Set<string>();\n for (const id of ids) {\n const raw = rawById.get(id);\n if (!raw || raw.withdrawn) continue;\n advisories.push(parseOsvAdvisory(raw, target.package));\n seenIds.add(id);\n }\n for (const adv of manifestByTarget.get(targetKey(target)) ?? []) {\n if (!seenIds.has(adv.id)) advisories.push(adv);\n }\n if (advisories.length) packages.push({ ...target, advisories });\n }\n return finalize('osv', packages);\n}\n\n/** Build per-target manifest advisories (matched against the installed version). */\nfunction manifestAdvisoryMap(targets: VulnTarget[], manifest?: PackageVersionManifest): Map<string, VulnerabilityAdvisory[]> {\n const map = new Map<string, VulnerabilityAdvisory[]>();\n if (!manifest) return map;\n for (const target of targets) {\n const entry = getManifestEntry(manifest, manifestEcosystem(target.ecosystem), target.package);\n const matched = (entry?.vulns ?? []).filter(\n (m) => !m.withdrawn && isVersionAffected(target.version, m.ranges, m.versions),\n );\n if (matched.length) map.set(targetKey(target), matched.map(manifestAdvisoryToAdvisory));\n }\n return map;\n}\n\nfunction scanFromManifest(targets: VulnTarget[], manifest?: PackageVersionManifest): VulnerabilityScanResult {\n const byTarget = manifestAdvisoryMap(targets, manifest);\n if (byTarget.size === 0) return emptyResult();\n const packages: PackageVulnerabilities[] = [];\n for (const target of targets) {\n const advisories = byTarget.get(targetKey(target));\n if (advisories?.length) packages.push({ ...target, advisories });\n }\n return finalize('manifest', packages);\n}\n\n// ── Findings ─────────────────────────────────────────────────────────────────\n\n/** SARIF/text rule id for vulnerability findings. */\nexport const VULN_RULE_ID = 'vibgrate/vulnerability';\n\nfunction levelForSeverity(severity: VulnSeverity): Finding['level'] {\n switch (severity) {\n case 'critical':\n case 'high':\n return 'error';\n case 'moderate':\n return 'warning';\n default:\n return 'note';\n }\n}\n\n/** One finding per (package, advisory) so each CVE surfaces as its own code-scanning alert. */\nexport function generateVulnerabilityFindings(result: VulnerabilityScanResult): Finding[] {\n const findings: Finding[] = [];\n for (const pkg of result.packages) {\n for (const adv of pkg.advisories) {\n const cve = adv.aliases.find((a) => a.startsWith('CVE-'));\n const idLabel = cve && cve !== adv.id ? `${adv.id} (${cve})` : adv.id;\n const fixed = adv.fixedVersions.length ? ` — fixed in ${adv.fixedVersions.join(', ')}` : ' — no fix available';\n const cvssLabel = adv.cvss != null ? ` ${adv.cvss}` : '';\n const attribution =\n adv.introduced != null\n ? ` — introduced by ${adv.introduced.authorName} in ${adv.introduced.shortSha}${adv.exposureDays != null ? ` (${adv.exposureDays}d exposed)` : ''}`\n : '';\n findings.push({\n ruleId: VULN_RULE_ID,\n level: levelForSeverity(adv.severity),\n message: `${pkg.package}@${pkg.version}: ${idLabel} (${adv.severity}${cvssLabel})${fixed}${attribution}`,\n location: pkg.package,\n details: {\n ecosystem: pkg.ecosystem,\n package: pkg.package,\n installedVersion: pkg.version,\n advisoryId: adv.id,\n aliases: adv.aliases,\n severity: adv.severity,\n cvss: adv.cvss,\n fixedVersions: adv.fixedVersions,\n ...(adv.introduced\n ? {\n introducedBy: adv.introduced.authorName,\n introducedSha: adv.introduced.shortSha,\n introducedDate: adv.introduced.date,\n exposureDays: adv.exposureDays,\n }\n : {}),\n },\n });\n }\n }\n return findings;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { execFile } from 'node:child_process';\nimport * as path from 'node:path';\n\n/**\n * Git history primitives (gated, graceful, deterministic).\n *\n * `vcs.ts` is a pure-filesystem reader: it can name the current HEAD/branch/remote\n * but cannot see *history*. Dependency attribution (\"who introduced this package /\n * this vulnerable version, and when\") is inherently temporal, so it needs the\n * commit graph. This module is the one place that shells out to the `git` CLI to\n * read that history.\n *\n * Rules this module follows:\n * - **Gated.** Everything degrades to \"history unavailable\" (empty/null) when the\n * `git` binary is missing or the path is not inside a work tree. It never throws\n * to the caller, so callers can treat attribution as best-effort enrichment.\n * - **Safe.** Commands run via `execFile` with an argument array — never a shell\n * string — so branch names, paths, and refs cannot inject. Output is bounded by\n * a byte cap and a timeout, and `git` is run with prompts/pager/optional-locks\n * disabled so it can never hang waiting on a terminal.\n * - **Deterministic.** Author identity and dates are read from the commit objects\n * (`%an`/`%ae`/`%aI`), never from the wall clock. Given a fixed repo state the\n * output is byte-stable.\n *\n * Paths passed to {@link fileCommits}/{@link fileAtCommit} are interpreted\n * relative to the repository top level (resolved via `git rev-parse\n * --show-toplevel`) using POSIX separators, matching git's own pathspec handling.\n */\n\n/** How long any single `git` invocation may run before it is killed (ms). */\nconst GIT_TIMEOUT_MS = 15_000;\n/** Upper bound on a single `git` invocation's stdout. Lockfile blobs can be MBs. */\nconst GIT_MAX_BUFFER = 64 * 1024 * 1024;\n/** Default cap on how far back history is walked, to bound cost on deep repos. */\nexport const DEFAULT_MAX_COMMITS = 500;\n\n/** A commit that touched a tracked path, with author attribution. */\nexport interface GitCommitRef {\n /** Full 40-hex commit SHA. */\n sha: string;\n /** Abbreviated SHA as git chose to print it (`%h`). */\n shortSha: string;\n /** Commit author name (`%an`). */\n authorName: string;\n /** Commit author email (`%ae`). */\n authorEmail: string;\n /** Author date in strict ISO-8601 (`%aI`) — from the commit, never wall-clock. */\n date: string;\n /** Commit subject / summary line (`%s`). */\n subject: string;\n}\n\ninterface GitResult {\n ok: boolean;\n stdout: string;\n}\n\n/** ASCII unit separator — delimits fields within one `git log` record. */\nconst FIELD_SEP = '\\x1f';\n\n/**\n * Run a single `git` command. Resolves to `{ ok: false }` on any failure (binary\n * missing, non-zero exit, timeout, buffer overflow) — never rejects.\n */\nfunction runGit(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n args,\n {\n cwd,\n timeout: GIT_TIMEOUT_MS,\n maxBuffer: GIT_MAX_BUFFER,\n windowsHide: true,\n encoding: 'utf8',\n env: {\n ...process.env,\n // Never block on credential/auth prompts, a pager, or lock contention.\n GIT_TERMINAL_PROMPT: '0',\n GIT_OPTIONAL_LOCKS: '0',\n GIT_PAGER: 'cat',\n },\n },\n (err, stdout) => {\n if (err) resolve({ ok: false, stdout: '' });\n else resolve({ ok: true, stdout: typeof stdout === 'string' ? stdout : String(stdout) });\n },\n );\n });\n}\n\n/** Cache of resolved repository top levels, keyed by the absolute query path. */\nconst toplevelCache = new Map<string, string | null>();\n\n/** Normalize a path to POSIX separators for git pathspecs. */\nfunction toPosix(p: string): string {\n return p.split(path.sep).join('/');\n}\n\n/**\n * Resolve the repository top level that contains `root`, or `null` when git is\n * unavailable or `root` is not inside a work tree. Memoized per absolute path.\n */\nexport async function resolveToplevel(root: string): Promise<string | null> {\n const key = path.resolve(root);\n const cached = toplevelCache.get(key);\n if (cached !== undefined) return cached;\n const res = await runGit(key, ['rev-parse', '--show-toplevel']);\n const top = res.ok ? res.stdout.trim() || null : null;\n toplevelCache.set(key, top);\n return top;\n}\n\n/**\n * Whether git history is readable for `root` — i.e. the `git` binary exists and\n * `root` is inside a work tree.\n */\nexport async function gitHistoryAvailable(root: string): Promise<boolean> {\n return (await resolveToplevel(root)) !== null;\n}\n\n/** Resolve the current HEAD commit SHA, or `null` (no git / unborn branch). */\nexport async function resolveHead(root: string): Promise<string | null> {\n const top = await resolveToplevel(root);\n if (!top) return null;\n const res = await runGit(top, ['rev-parse', 'HEAD']);\n return res.ok ? res.stdout.trim() || null : null;\n}\n\n/**\n * Commits that touched `relPath`, oldest → newest. Follows renames, so a file's\n * history survives a move. Returns `[]` when git is unavailable or the path has\n * no history.\n *\n * @param relPath repository-top-relative path (POSIX or native separators accepted)\n * @param opts.maxCommits cap on commits returned (most-recent N), default {@link DEFAULT_MAX_COMMITS}\n */\nexport async function fileCommits(\n root: string,\n relPath: string,\n opts: { maxCommits?: number } = {},\n): Promise<GitCommitRef[]> {\n const top = await resolveToplevel(root);\n if (!top) return [];\n const max = Math.max(1, opts.maxCommits ?? DEFAULT_MAX_COMMITS);\n // %x1f between fields; one commit per line (subject is single-line, names have no newlines).\n const format = ['%H', '%h', '%an', '%ae', '%aI', '%s'].join('%x1f');\n // Walk newest-first so `--max-count` keeps the most-recent N, then reverse to\n // chronological order in JS. We deliberately do *not* pass git's `--reverse`:\n // combined with `--follow` it drops pre-rename history, so a renamed file would\n // lose the commits before its move.\n const res = await runGit(top, [\n 'log',\n `--max-count=${max}`,\n '--follow',\n `--format=${format}`,\n '--',\n toPosix(relPath),\n ]);\n if (!res.ok) return [];\n const commits: GitCommitRef[] = [];\n for (const line of res.stdout.split('\\n')) {\n if (!line) continue;\n const f = line.split(FIELD_SEP);\n if (f.length < 6) continue;\n commits.push({\n sha: f[0],\n shortSha: f[1],\n authorName: f[2],\n authorEmail: f[3],\n date: f[4],\n subject: f[5],\n });\n }\n // git emits newest-first; callers want oldest → newest.\n commits.reverse();\n return commits;\n}\n\n/**\n * Contents of `relPath` as of commit `sha`, or `null` when git is unavailable,\n * the SHA is malformed, or the path did not exist at that commit.\n *\n * @param relPath repository-top-relative path (POSIX or native separators accepted)\n */\nexport async function fileAtCommit(root: string, sha: string, relPath: string): Promise<string | null> {\n if (!/^[0-9a-f]{4,40}$/i.test(sha)) return null;\n const top = await resolveToplevel(root);\n if (!top) return null;\n const res = await runGit(top, ['show', `${sha}:${toPosix(relPath)}`]);\n return res.ok ? res.stdout : null;\n}\n\n/**\n * Whether the working tree has uncommitted changes relative to HEAD — i.e. the\n * scanned files may differ from the recorded commit SHA.\n *\n * Returns:\n * - `true` when `git status --porcelain` reports any change (modified/staged\n * tracked files, or untracked non-ignored files),\n * - `false` when the tree is clean (output empty), so the scan corresponds to\n * the committed SHA,\n * - `undefined` when we cannot tell (git missing, not a work tree, timeout).\n *\n * This is what lets a downstream commit-signature check honestly claim the\n * *scanned* code is the signed commit: a signature only attests to the committed\n * tree, so a dirty working tree must not read as \"verified\". Uses `--porcelain`\n * (stable, machine format) and respects `.gitignore`, matching what the scanner\n * itself treats as source.\n */\nexport async function workingTreeDirty(root: string): Promise<boolean | undefined> {\n const top = await resolveToplevel(root);\n if (!top) return undefined;\n const res = await runGit(top, ['status', '--porcelain', '--untracked-files=normal']);\n if (!res.ok) return undefined;\n return res.stdout.trim().length > 0;\n}\n\n/** Test-only: clear the memoized top-level lookups so each case starts clean. */\nexport function __resetGitHistoryCaches(): void {\n toplevelCache.clear();\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport { XMLParser } from 'fast-xml-parser';\nimport {\n type GitCommitRef,\n DEFAULT_MAX_COMMITS,\n fileAtCommit,\n fileCommits,\n resolveHead,\n resolveToplevel,\n} from './git-history.js';\nimport { parseGradleLockfile } from '../scanners/gradle-lockfile.js';\nimport type { VulnEcosystem } from '../types.js';\n\n/**\n * Per-package version history derived from a lockfile's git history, across every\n * package ecosystem Vibgrate can resolve advisories for.\n *\n * By replaying the resolved-version lockfile across the commits that changed it,\n * we learn the commit (author + date) at which each package first appeared and at\n * which each version bump happened. Attribution then intersects these timelines\n * with advisory ranges to answer \"who introduced this vulnerable version, and how\n * long were we exposed\" — for npm/pnpm/yarn, pip/poetry/pipenv, cargo, composer,\n * bundler, go, pub, hex, NuGet, and Maven/Gradle alike.\n *\n * Maven/Java has no single universally-committed resolved lockfile, so coverage is\n * a best-effort subset: Gradle's fully-resolved `gradle.lockfile` when present,\n * else a `pom.xml`'s direct dependencies that pin a concrete version. Dependencies\n * whose version is managed by a BOM/`<dependencyManagement>` resolve to no version\n * here and are honestly absent rather than fabricated.\n */\n\n/** Bumps the cache key when the on-disk cache shape changes. */\nconst CACHE_SCHEMA = 3;\nconst CACHE_FILENAME = 'version-timeline.json';\n\n/** A single point at which a package's resolved version changed. */\nexport interface VersionChange {\n /** Resolved version at this commit. */\n version: string;\n /** The commit that introduced this version. */\n commit: GitCommitRef;\n}\n\n/** A point in a package's presence history: a resolved version, or its removal. */\nexport interface PresenceEvent {\n /** Resolved version at this commit, or `null` when the package was removed from the lockfile here. */\n version: string | null;\n /** The commit that made the change. */\n commit: GitCommitRef;\n}\n\n/** Chronological version history for one package. */\nexport interface PackageTimeline {\n ecosystem: VulnEcosystem;\n name: string;\n /** Oldest → newest; consecutive identical versions are collapsed. Present states only. */\n changes: VersionChange[];\n /**\n * Full presence history, oldest → newest: every version transition plus the\n * commits where the package was removed from the lockfile (`version: null`). A\n * superset of `changes` (which omits removals). Lets remediation analysis see a\n * vulnerable version leave entirely, not just get bumped. Optional for\n * backward-compatible reads of an older cache.\n */\n presence?: PresenceEvent[];\n}\n\n/** Version history for one ecosystem's lockfile. */\nexport interface EcosystemTimeline {\n ecosystem: VulnEcosystem;\n /** Repository-top-relative lockfile path the timeline was built from. */\n lockfile: string;\n /** Packages, sorted by name. */\n packages: PackageTimeline[];\n}\n\n/** Version timelines across every ecosystem found in the repo. */\nexport interface VersionTimelines {\n /** HEAD SHA when built (the cache key), or `null` if unknown. */\n head: string | null;\n ecosystems: EcosystemTimeline[];\n}\n\ninterface CacheEnvelope {\n schema: number;\n timelines: VersionTimelines;\n}\n\n// ── Version selection helper ─────────────────────────────────────────────────\n\n/**\n * When a package appears at multiple versions (dedup), keep the highest semver as\n * its primary version — deterministic, and usually the direct dependency.\n */\nfunction considerVersion(out: Map<string, string>, name: string, version: string): void {\n if (!name || !version) return;\n const prev = out.get(name);\n if (prev === undefined) {\n out.set(name, version);\n return;\n }\n const a = semver.valid(semver.coerce(prev));\n const b = semver.valid(semver.coerce(version));\n if (a && b) {\n if (semver.gt(b, a)) out.set(name, version);\n } else if (version > prev) {\n out.set(name, version);\n }\n}\n\n// ── npm ecosystem (npm / pnpm / yarn) ────────────────────────────────────────\n\n/**\n * Parse an npm `package-lock.json` / `npm-shrinkwrap.json` blob into a\n * `name → version` map. Handles lockfileVersion 2/3 (`packages` keyed by\n * `node_modules/<name>`) and legacy version 1 (`dependencies` tree); the\n * shallowest (hoisted) version wins, ties break on sorted key order.\n */\nexport function parseNpmLockfile(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let json: unknown;\n try {\n json = JSON.parse(content);\n } catch {\n return out;\n }\n if (!json || typeof json !== 'object') return out;\n const root = json as Record<string, unknown>;\n\n const packages = root.packages;\n if (packages && typeof packages === 'object') {\n const depthByName = new Map<string, number>();\n for (const key of Object.keys(packages as Record<string, unknown>).sort()) {\n if (!key) continue; // \"\" is the project root itself\n const marker = 'node_modules/';\n const idx = key.lastIndexOf(marker);\n if (idx === -1) continue;\n const name = key.slice(idx + marker.length);\n if (!name) continue;\n const entry = (packages as Record<string, unknown>)[key];\n const version = entry && typeof entry === 'object' ? (entry as Record<string, unknown>).version : undefined;\n if (typeof version !== 'string') continue;\n const depth = key.split(marker).length - 1;\n const prev = depthByName.get(name);\n if (prev === undefined || depth < prev) {\n out.set(name, version);\n depthByName.set(name, depth);\n }\n }\n return out;\n }\n\n const deps = root.dependencies;\n if (deps && typeof deps === 'object') {\n walkV1Dependencies(deps as Record<string, unknown>, out);\n }\n return out;\n}\n\n/** Recursively collect names → versions from a lockfileVersion-1 `dependencies` tree. */\nfunction walkV1Dependencies(deps: Record<string, unknown>, out: Map<string, string>): void {\n for (const name of Object.keys(deps).sort()) {\n const entry = deps[name];\n if (!entry || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n if (typeof rec.version === 'string' && !out.has(name)) {\n out.set(name, rec.version);\n }\n if (rec.dependencies && typeof rec.dependencies === 'object') {\n walkV1Dependencies(rec.dependencies as Record<string, unknown>, out);\n }\n }\n}\n\n/** Split a pnpm `packages:` key into name + version (handles v5/v6/v9 + peer suffixes). */\nfunction parsePnpmPackageKey(key: string): { name: string; version: string } | null {\n const k = key.replace(/^\\//, '');\n let sep = -1;\n for (let i = k.startsWith('@') ? 1 : 0; i < k.length - 1; i++) {\n if (k[i] === '@' && /[0-9]/.test(k[i + 1]!)) {\n sep = i;\n break;\n }\n }\n let name: string;\n let rest: string;\n if (sep > 0) {\n name = k.slice(0, sep);\n rest = k.slice(sep + 1);\n } else {\n const slash = k.lastIndexOf('/');\n if (slash <= 0) return null;\n name = k.slice(0, slash);\n rest = k.slice(slash + 1);\n }\n const vm = rest.match(/^[0-9][^_(\\s]*/);\n if (!name || !vm) return null;\n return { name, version: vm[0] };\n}\n\n/** Parse a `pnpm-lock.yaml` blob (lockfile v5/v6/v9) into a `name → version` map. */\nexport function parsePnpmLockfile(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let inPackages = false;\n for (const raw of content.split('\\n')) {\n if (/^\\S/.test(raw)) {\n inPackages = /^packages:\\s*$/.test(raw);\n continue;\n }\n if (!inPackages) continue;\n const m = raw.match(/^ {2}(\\S.*?):\\s*$/);\n if (!m) continue;\n let key = m[1].trim();\n if ((key.startsWith(\"'\") && key.endsWith(\"'\")) || (key.startsWith('\"') && key.endsWith('\"'))) {\n key = key.slice(1, -1);\n }\n const parsed = parsePnpmPackageKey(key);\n if (parsed) considerVersion(out, parsed.name, parsed.version);\n }\n return out;\n}\n\n/** Extract the package name from a yarn header specifier (first one if comma-listed). */\nfunction yarnHeaderName(header: string): string | null {\n const first = header.split(',')[0].trim().replace(/^\"/, '').replace(/\"$/, '');\n const at = first.indexOf('@', first.startsWith('@') ? 1 : 0);\n if (at <= 0) return null;\n return first.slice(0, at);\n}\n\n/** Parse a `yarn.lock` blob (classic v1 and berry v2+) into a `name → version` map. */\nexport function parseYarnLockfile(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let currentName: string | null = null;\n for (const raw of content.split('\\n')) {\n if (!raw.trim() || raw.trimStart().startsWith('#')) continue;\n if (/^\\S/.test(raw) || raw.startsWith('\"')) {\n currentName = yarnHeaderName(raw.replace(/:\\s*$/, ''));\n continue;\n }\n const vm = raw.match(/^\\s+version:?\\s+\"?([^\"\\s]+)\"?/);\n if (vm && currentName) considerVersion(out, currentName, vm[1]!);\n }\n return out;\n}\n\n// ── Other ecosystems ─────────────────────────────────────────────────────────\n\n/** Parse a TOML lockfile with `[[package]]` tables (Cargo.lock, poetry.lock). */\nexport function parseTomlPackages(content: string): Map<string, string> {\n const out = new Map<string, string>();\n for (const block of content.split(/\\[\\[package\\]\\]/)) {\n const nameM = block.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n const verM = block.match(/^\\s*version\\s*=\\s*\"([^\"]+)\"/m);\n if (nameM && verM) considerVersion(out, nameM[1]!, verM[1]!);\n }\n return out;\n}\n\n/** Parse a PHP `composer.lock` (JSON: `packages` + `packages-dev`). */\nexport function parseComposerLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let json: unknown;\n try {\n json = JSON.parse(content);\n } catch {\n return out;\n }\n const root = json as Record<string, unknown>;\n for (const key of ['packages', 'packages-dev']) {\n const arr = root?.[key];\n if (!Array.isArray(arr)) continue;\n for (const p of arr) {\n if (p && typeof p === 'object') {\n const name = (p as Record<string, unknown>).name;\n const version = (p as Record<string, unknown>).version;\n if (typeof name === 'string' && typeof version === 'string') {\n considerVersion(out, name, version.replace(/^v/, ''));\n }\n }\n }\n }\n return out;\n}\n\n/** Parse a Ruby `Gemfile.lock` (the `specs:` sections). */\nexport function parseGemfileLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let inSpecs = false;\n for (const raw of content.split('\\n')) {\n if (/^\\S/.test(raw)) {\n inSpecs = false;\n continue;\n }\n if (/^ {2}specs:\\s*$/.test(raw)) {\n inSpecs = true;\n continue;\n }\n if (!inSpecs) continue;\n // Resolved gems are indented exactly 4 spaces: \" name (version)\".\n const m = raw.match(/^ {4}(\\S+) \\(([^)]+)\\)\\s*$/);\n if (m) considerVersion(out, m[1]!, m[2]!.split('-')[0]!.trim());\n }\n return out;\n}\n\n/** Parse a Go `go.mod` (`require` directives). Module path is the package name. */\nexport function parseGoMod(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let inRequire = false;\n for (const raw of content.split('\\n')) {\n const line = raw.replace(/\\/\\/.*$/, '').trim();\n if (!line) continue;\n if (inRequire) {\n if (line === ')') {\n inRequire = false;\n continue;\n }\n const m = line.match(/^(\\S+)\\s+(v\\S+)/);\n if (m) considerVersion(out, m[1]!, m[2]!);\n continue;\n }\n if (line === 'require (') {\n inRequire = true;\n continue;\n }\n const single = line.match(/^require\\s+(\\S+)\\s+(v\\S+)/);\n if (single) considerVersion(out, single[1]!, single[2]!);\n }\n return out;\n}\n\n/** Parse a Python `Pipfile.lock` (JSON: `default` + `develop`). */\nexport function parsePipfileLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let json: unknown;\n try {\n json = JSON.parse(content);\n } catch {\n return out;\n }\n const root = json as Record<string, unknown>;\n for (const section of ['default', 'develop']) {\n const obj = root?.[section];\n if (!obj || typeof obj !== 'object') continue;\n for (const [name, info] of Object.entries(obj as Record<string, unknown>)) {\n const v = info && typeof info === 'object' ? (info as Record<string, unknown>).version : undefined;\n if (typeof v === 'string') considerVersion(out, name, v.replace(/^==/, '').trim());\n }\n }\n return out;\n}\n\n/** Parse a Dart `pubspec.lock` (YAML `packages:` → name → version). */\nexport function parsePubspecLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let inPackages = false;\n let current: string | null = null;\n for (const raw of content.split('\\n')) {\n if (/^\\S/.test(raw)) {\n inPackages = /^packages:\\s*$/.test(raw);\n current = null;\n continue;\n }\n if (!inPackages) continue;\n const nameM = raw.match(/^ {2}(\\S+):\\s*$/);\n if (nameM) {\n current = nameM[1]!;\n continue;\n }\n const verM = raw.match(/^ {4}version:\\s*\"?([^\"\\s]+)\"?/);\n if (verM && current) considerVersion(out, current, verM[1]!);\n }\n return out;\n}\n\n/** Parse an Elixir `mix.lock` (`\"name\" => {:hex, :name, \"version\", ...}`). */\nexport function parseMixLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n const re = /\"([^\"]+)\"\\s*=>\\s*\\{:hex,\\s*:\\w+,\\s*\"([^\"]+)\"/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(content)) !== null) considerVersion(out, m[1]!, m[2]!);\n return out;\n}\n\n/** Parse a NuGet `packages.lock.json` (per-framework `resolved` versions). */\nexport function parseNugetLock(content: string): Map<string, string> {\n const out = new Map<string, string>();\n let json: unknown;\n try {\n json = JSON.parse(content);\n } catch {\n return out;\n }\n const deps = (json as Record<string, unknown>)?.dependencies;\n if (!deps || typeof deps !== 'object') return out;\n for (const framework of Object.values(deps as Record<string, unknown>)) {\n if (!framework || typeof framework !== 'object') continue;\n for (const [name, info] of Object.entries(framework as Record<string, unknown>)) {\n const v = info && typeof info === 'object' ? (info as Record<string, unknown>).resolved : undefined;\n if (typeof v === 'string') considerVersion(out, name, v);\n }\n }\n return out;\n}\n\n// ── Maven (Java) ─────────────────────────────────────────────────────────────\n\nconst POM_PARSER = new XMLParser({ ignoreAttributes: true, parseTagValue: false, trimValues: true });\n\nfunction pomArray<T>(v: T | T[] | undefined): T[] {\n return v == null ? [] : Array.isArray(v) ? v : [v];\n}\n\n/** A concrete, pinned version — not a range (`[1,2)`, `(,1.0]`) or an unresolved `${...}`. */\nfunction isConcreteMavenVersion(version: string): boolean {\n return Boolean(version) && !version.includes('${') && !/[[\\](),]/.test(version);\n}\n\n/**\n * Parse a Maven `pom.xml` into a `groupId:artifactId → version` map for the\n * direct `<dependencies>` that pin a concrete version. `${...}` is resolved\n * against the POM's own `<properties>` (plus `${project.version}`). Dependencies\n * whose version is managed by a BOM/`<dependencyManagement>` (no explicit\n * `<version>`), a range, or an unresolved property are skipped — honestly absent,\n * since their resolved version isn't knowable from this file offline. The\n * coordinate matches OSV's Maven naming and the Java scanner's `dep.package`.\n */\nexport function parsePomXml(content: string): Map<string, string> {\n const out = new Map<string, string>();\n if (!content) return out;\n let doc: { project?: Record<string, unknown> };\n try {\n doc = POM_PARSER.parse(content) as { project?: Record<string, unknown> };\n } catch {\n return out;\n }\n const project = doc?.project;\n if (!project || typeof project !== 'object') return out;\n\n const properties: Record<string, string> = {};\n const rawProps = project.properties;\n if (rawProps && typeof rawProps === 'object') {\n for (const [k, val] of Object.entries(rawProps as Record<string, unknown>)) {\n if (val != null && typeof val !== 'object') properties[k] = String(val);\n }\n }\n // `${project.version}` falls back to the parent's version, as Maven does.\n const ownVersion =\n project.version != null\n ? String(project.version)\n : (project.parent as Record<string, unknown> | undefined)?.version != null\n ? String((project.parent as Record<string, unknown>).version)\n : undefined;\n if (ownVersion) {\n properties['project.version'] = ownVersion;\n properties['project.parent.version'] = ownVersion;\n }\n const resolve = (value: string): string =>\n value.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => properties[key] ?? `\\${${key}}`);\n\n const deps = (project.dependencies as Record<string, unknown> | undefined)?.dependency;\n for (const dep of pomArray(deps)) {\n if (!dep || typeof dep !== 'object') continue;\n const d = dep as Record<string, unknown>;\n if (d.version == null) continue; // BOM/dependencyManagement-managed — not resolvable here\n const groupId = d.groupId != null ? resolve(String(d.groupId)).trim() : '';\n const artifactId = d.artifactId != null ? resolve(String(d.artifactId)).trim() : '';\n if (!groupId || !artifactId) continue;\n const version = resolve(String(d.version)).trim();\n if (!isConcreteMavenVersion(version)) continue;\n considerVersion(out, `${groupId}:${artifactId}`, version);\n }\n return out;\n}\n\n// ── Lockfile registry ────────────────────────────────────────────────────────\n\ntype LockfileParser = (content: string) => Map<string, string>;\n\n/**\n * The lockfiles we know how to replay, per ecosystem, in preference order. For\n * an ecosystem with several formats (npm, pypi, maven), the first one with git\n * history wins.\n */\nconst LOCKFILE_PARSERS: Array<{ ecosystem: VulnEcosystem; basename: string; parse: LockfileParser }> = [\n { ecosystem: 'npm', basename: 'package-lock.json', parse: parseNpmLockfile },\n { ecosystem: 'npm', basename: 'npm-shrinkwrap.json', parse: parseNpmLockfile },\n { ecosystem: 'npm', basename: 'pnpm-lock.yaml', parse: parsePnpmLockfile },\n { ecosystem: 'npm', basename: 'yarn.lock', parse: parseYarnLockfile },\n { ecosystem: 'pypi', basename: 'poetry.lock', parse: parseTomlPackages },\n { ecosystem: 'pypi', basename: 'Pipfile.lock', parse: parsePipfileLock },\n { ecosystem: 'cargo', basename: 'Cargo.lock', parse: parseTomlPackages },\n { ecosystem: 'composer', basename: 'composer.lock', parse: parseComposerLock },\n { ecosystem: 'rubygems', basename: 'Gemfile.lock', parse: parseGemfileLock },\n { ecosystem: 'go', basename: 'go.mod', parse: parseGoMod },\n { ecosystem: 'pub', basename: 'pubspec.lock', parse: parsePubspecLock },\n { ecosystem: 'hex', basename: 'mix.lock', parse: parseMixLock },\n { ecosystem: 'nuget', basename: 'packages.lock.json', parse: parseNugetLock },\n // Maven/Java: prefer Gradle's fully-resolved lockfile; fall back to a pom.xml's\n // pinned direct dependencies (root file only, like every other ecosystem here).\n { ecosystem: 'maven', basename: 'gradle.lockfile', parse: parseGradleLockfile },\n { ecosystem: 'maven', basename: 'pom.xml', parse: parsePomXml },\n];\n\n/** Route a lockfile blob to the right parser by basename (npm dispatch + others). */\nexport function parseLockfile(lockfile: string, content: string): Map<string, string> {\n const base = path.basename(lockfile);\n const entry = LOCKFILE_PARSERS.find((p) => p.basename === base);\n return entry ? entry.parse(content) : parseNpmLockfile(content);\n}\n\nfunction parsersByEcosystem(): Array<{ ecosystem: VulnEcosystem; candidates: Array<{ basename: string; parse: LockfileParser }> }> {\n const order: VulnEcosystem[] = [];\n const map = new Map<VulnEcosystem, Array<{ basename: string; parse: LockfileParser }>>();\n for (const p of LOCKFILE_PARSERS) {\n if (!map.has(p.ecosystem)) {\n map.set(p.ecosystem, []);\n order.push(p.ecosystem);\n }\n map.get(p.ecosystem)!.push({ basename: p.basename, parse: p.parse });\n }\n return order.map((ecosystem) => ({ ecosystem, candidates: map.get(ecosystem)! }));\n}\n\n// ── Cache ────────────────────────────────────────────────────────────────────\n\nasync function readCache(cacheDir: string): Promise<VersionTimelines | null> {\n try {\n const raw = await fs.readFile(path.join(cacheDir, CACHE_FILENAME), 'utf8');\n const parsed = JSON.parse(raw) as CacheEnvelope;\n if (parsed?.schema === CACHE_SCHEMA && parsed.timelines) return parsed.timelines;\n } catch {\n // Missing/corrupt cache → rebuild.\n }\n return null;\n}\n\nasync function writeCache(cacheDir: string, timelines: VersionTimelines): Promise<void> {\n try {\n await fs.mkdir(cacheDir, { recursive: true });\n const envelope: CacheEnvelope = { schema: CACHE_SCHEMA, timelines };\n await fs.writeFile(path.join(cacheDir, CACHE_FILENAME), JSON.stringify(envelope, null, 2));\n } catch {\n // Caching is best-effort; a read-only or privacy-restricted FS just skips it.\n }\n}\n\n// ── Builder ──────────────────────────────────────────────────────────────────\n\n/** Replay one ecosystem's lockfile across its git history into per-package timelines. */\nasync function buildEcosystemTimeline(\n root: string,\n ecosystem: VulnEcosystem,\n basename: string,\n parse: LockfileParser,\n maxCommits: number,\n): Promise<EcosystemTimeline | null> {\n const commits = await fileCommits(root, basename, { maxCommits });\n if (!commits.length) return null;\n\n // `lastState` tracks each package's current resolved version, or `null` once it\n // has been removed from the lockfile, so we can record removals (a vulnerable\n // version leaving entirely) alongside version bumps.\n const lastState = new Map<string, string | null>();\n const timelines = new Map<string, VersionChange[]>();\n const presences = new Map<string, PresenceEvent[]>();\n const pushPresence = (name: string, event: PresenceEvent): void => {\n let p = presences.get(name);\n if (!p) {\n p = [];\n presences.set(name, p);\n }\n p.push(event);\n };\n for (const commit of commits) {\n const blob = await fileAtCommit(root, commit.sha, basename);\n if (blob == null) continue;\n const versions = parse(blob);\n // Removals: present last commit (non-null), absent now. Safe to mutate values\n // of an existing Map key while iterating its entries.\n for (const [name, prev] of lastState) {\n if (prev !== null && !versions.has(name)) {\n lastState.set(name, null);\n pushPresence(name, { version: null, commit });\n }\n }\n // Additions and version changes.\n for (const [name, version] of versions) {\n if (lastState.get(name) === version) continue;\n lastState.set(name, version);\n let changes = timelines.get(name);\n if (!changes) {\n changes = [];\n timelines.set(name, changes);\n }\n changes.push({ version, commit });\n pushPresence(name, { version, commit });\n }\n }\n if (timelines.size === 0) return null;\n\n const packages: PackageTimeline[] = [...timelines.keys()]\n .sort()\n .map((name) => ({ ecosystem, name, changes: timelines.get(name)!, presence: presences.get(name)! }));\n return { ecosystem, lockfile: basename, packages };\n}\n\n/**\n * Build version timelines for every ecosystem found in the repository containing\n * `root`. Returns `null` when git history is unavailable or no known lockfile has\n * any history. Deterministic for a fixed repo state.\n *\n * @param opts.maxCommits cap on history depth per lockfile, default {@link DEFAULT_MAX_COMMITS}\n * @param opts.cacheDir when set, read/write a `.vibgrate/`-style cache keyed by HEAD;\n * omit (the default) to keep the call side-effect-free\n */\nexport async function buildVersionTimelines(\n root: string,\n opts: { maxCommits?: number; cacheDir?: string } = {},\n): Promise<VersionTimelines | null> {\n const top = await resolveToplevel(root);\n if (!top) return null;\n\n const head = await resolveHead(root);\n if (opts.cacheDir && head) {\n const cached = await readCache(opts.cacheDir);\n if (cached && cached.head === head) return cached;\n }\n\n const maxCommits = opts.maxCommits ?? DEFAULT_MAX_COMMITS;\n const ecosystems: EcosystemTimeline[] = [];\n for (const { ecosystem, candidates } of parsersByEcosystem()) {\n for (const { basename, parse } of candidates) {\n const et = await buildEcosystemTimeline(root, ecosystem, basename, parse, maxCommits);\n if (et) {\n ecosystems.push(et);\n break; // first lockfile with history wins for this ecosystem\n }\n }\n }\n if (ecosystems.length === 0) return null;\n\n const timelines: VersionTimelines = { head, ecosystems };\n if (opts.cacheDir && head) await writeCache(opts.cacheDir, timelines);\n return timelines;\n}\n\n/** Find the timeline for a specific package in a specific ecosystem. */\nexport function findPackageTimeline(\n timelines: VersionTimelines,\n ecosystem: VulnEcosystem,\n name: string,\n): PackageTimeline | undefined {\n return timelines.ecosystems.find((e) => e.ecosystem === ecosystem)?.packages.find((p) => p.name === name);\n}\n\n/** Find a package's timeline by name across all ecosystems (first match wins). */\nexport function findPackageAnyEcosystem(timelines: VersionTimelines, name: string): PackageTimeline | undefined {\n for (const e of timelines.ecosystems) {\n const pt = e.packages.find((p) => p.name === name);\n if (pt) return pt;\n }\n return undefined;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport { isVersionAffected, manifestAdvisoryToAdvisory } from '../scanners/vulnerability-scanner.js';\nimport {\n getManifestEntry,\n type ManifestEcosystem,\n type PackageVersionManifest,\n} from '../package-version-manifest.js';\nimport {\n findPackageTimeline,\n type PackageTimeline,\n type PresenceEvent,\n type VersionTimelines,\n} from '../utils/version-timeline.js';\nimport type {\n CommitAttribution,\n CraRemediationMetrics,\n VulnerabilityAdvisory,\n VulnerabilityScanResult,\n VulnSeverity,\n} from '../types.js';\n\n/**\n * Vulnerability exposure attribution + CRA remediation metrics.\n *\n * Given the scan's vulnerability result and the npm version timeline (from git\n * history), this answers \"who introduced the still-open exposure to this\n * advisory, and how long have we been exposed\". It replays each package's\n * version history against the advisory's affected ranges to find the commit at\n * which the package most recently entered (and stayed in) the affected state.\n *\n * All time figures are relative to a caller-supplied `nowIso` (the scan\n * timestamp), never the wall clock, so a scan's metrics are reproducible.\n */\n\n/**\n * Default CRA-inspired remediation SLA, in days, by severity. Tunable later;\n * `unknown` has no SLA. Critical mirrors CRA's \"act without undue delay\" posture.\n */\nexport const DEFAULT_CRA_SLA_DAYS: Record<VulnSeverity, number | null> = {\n critical: 7,\n high: 30,\n moderate: 90,\n low: 180,\n unknown: null,\n};\n\nfunction daysBetween(fromIso: string, toIso: string): number | null {\n const a = Date.parse(fromIso);\n const b = Date.parse(toIso);\n if (!Number.isFinite(a) || !Number.isFinite(b)) return null;\n return Math.max(0, Math.round((b - a) / 86_400_000));\n}\n\n/** Lowest published fix version (semver), or null when none. */\nfunction earliestFix(advisory: VulnerabilityAdvisory): string | null {\n const valid = advisory.fixedVersions.map((v) => semver.valid(semver.coerce(v))).filter((v): v is string => Boolean(v));\n if (!valid.length) return null;\n return valid.sort(semver.compare)[0] ?? null;\n}\n\n/**\n * Whether `version` is affected by `advisory`. Prefers explicit affected ranges/\n * versions; falls back to \"below the earliest fix\" (or \"all versions\" when no fix\n * is published) so an advisory that matched the installed version stays affected.\n */\nexport function isAffectedByAdvisory(version: string, advisory: VulnerabilityAdvisory): boolean {\n if ((advisory.affectedRanges && advisory.affectedRanges.length) || (advisory.affectedVersions && advisory.affectedVersions.length)) {\n return isVersionAffected(version, advisory.affectedRanges, advisory.affectedVersions);\n }\n const fix = earliestFix(advisory);\n if (!fix) return true; // no fix published → treat as affected\n const v = semver.valid(semver.coerce(version));\n return v ? semver.lt(v, fix) : false;\n}\n\nfunction toAttribution(commit: PackageTimeline['changes'][number]['commit']): CommitAttribution {\n return {\n sha: commit.sha,\n shortSha: commit.shortSha,\n authorName: commit.authorName,\n authorEmail: commit.authorEmail,\n date: commit.date,\n subject: commit.subject,\n };\n}\n\n/**\n * The commit that began the current exposure: the earliest change in the trailing\n * contiguous run of affected versions ending at the installed version. Null when\n * the timeline is unknown or the current version isn't affected in it.\n */\nexport function findIntroduced(timeline: PackageTimeline | undefined, advisory: VulnerabilityAdvisory): CommitAttribution | null {\n if (!timeline || !timeline.changes.length) return null;\n let introduced: CommitAttribution | null = null;\n for (let i = timeline.changes.length - 1; i >= 0; i--) {\n const change = timeline.changes[i];\n if (isAffectedByAdvisory(change.version, advisory)) {\n introduced = toAttribution(change.commit);\n } else {\n break;\n }\n }\n return introduced;\n}\n\n/** One contiguous span during which the package was affected by an advisory. */\nexport interface ExposureWindow {\n /** Commit that began the affected span. */\n introduced: CommitAttribution;\n /** Commit that ended it — a bump out of the affected range, or the package's removal — or `null` if still open. */\n remediated: CommitAttribution | null;\n /** Days affected: `introduced`→`remediated` for a closed window, `introduced`→`now` for an open one. */\n exposureDays: number | null;\n /** Whether the span is still open at the current state. */\n open: boolean;\n}\n\n/**\n * Reconstruct every span during which the package was affected by the advisory,\n * walking its full presence history (version bumps and removals). A span closes\n * when the resolved version moves out of the affected range or the package is\n * removed from the lockfile — that closing commit is the real remediation. The\n * trailing span stays open when the current version is still affected.\n *\n * Pure: presence history in, windows out. Falls back to `changes` (present states\n * only) when an older cache has no `presence`, so removals just aren't seen there.\n */\nexport function analyzeExposureWindows(\n timeline: PackageTimeline | undefined,\n advisory: VulnerabilityAdvisory,\n nowIso: string,\n): ExposureWindow[] {\n if (!timeline) return [];\n const events: PresenceEvent[] = timeline.presence\n ?? timeline.changes.map((c) => ({ version: c.version as string | null, commit: c.commit }));\n const windows: ExposureWindow[] = [];\n let introduced: CommitAttribution | null = null;\n for (const event of events) {\n const affected = event.version != null && isAffectedByAdvisory(event.version, advisory);\n if (affected && !introduced) {\n introduced = toAttribution(event.commit);\n } else if (!affected && introduced) {\n const remediated = toAttribution(event.commit);\n windows.push({ introduced, remediated, exposureDays: daysBetween(introduced.date, remediated.date), open: false });\n introduced = null;\n }\n }\n if (introduced) {\n windows.push({ introduced, remediated: null, exposureDays: daysBetween(introduced.date, nowIso), open: true });\n }\n return windows;\n}\n\nfunction emptySeverityCounts(): Record<VulnSeverity, number> {\n return { low: 0, moderate: 0, high: 0, critical: 0, unknown: 0 };\n}\n\n/** Build the CRA remediation metrics from already-attributed advisories and any closed remediation windows. */\nexport function computeCra(\n result: VulnerabilityScanResult,\n nowIso: string,\n slaDays: Record<VulnSeverity, number | null> = DEFAULT_CRA_SLA_DAYS,\n remediationDays: number[] = [],\n): CraRemediationMetrics {\n const openBySeverity = emptySeverityCounts();\n let openCount = 0;\n let slaBreaches = 0;\n let attributedCount = 0;\n let maxOpenExposureDays: number | null = null;\n let exposureSum = 0;\n let exposureN = 0;\n\n for (const pkg of result.packages) {\n for (const adv of pkg.advisories) {\n openCount++;\n openBySeverity[adv.severity]++;\n const exposure = adv.exposureDays ?? null;\n if (exposure != null) {\n attributedCount++;\n exposureSum += exposure;\n exposureN++;\n if (maxOpenExposureDays == null || exposure > maxOpenExposureDays) maxOpenExposureDays = exposure;\n const sla = slaDays[adv.severity];\n if (sla != null && exposure > sla) slaBreaches++;\n }\n }\n }\n\n const remediatedCount = remediationDays.length;\n const remediationSum = remediationDays.reduce((a, b) => a + b, 0);\n\n return {\n openCount,\n openBySeverity,\n slaDays,\n slaBreaches,\n maxOpenExposureDays,\n meanOpenExposureDays: exposureN > 0 ? Math.round(exposureSum / exposureN) : null,\n attributedCount,\n remediatedCount,\n meanRemediationDays: remediatedCount > 0 ? Math.round(remediationSum / remediatedCount) : null,\n maxRemediationDays: remediatedCount > 0 ? Math.max(...remediationDays) : null,\n };\n}\n\n/**\n * Real remediation times (introduced→remediated, in days) for every closed\n * exposure window we can evaluate against history, deduplicated by\n * (ecosystem, package, advisory):\n *\n * - advisories the scan currently reports — catches an earlier fix that later\n * regressed, and\n * - when a package-version manifest is supplied (offline mode), every advisory it\n * carries for any package seen in history — catches fully-remediated advisories\n * the current-version scan never surfaces because the installed version is now\n * clean.\n *\n * Online without a manifest, only the first source is available, so a package that\n * is clean today contributes no remediation sample (honestly absent, not zero).\n */\nfunction collectRemediationDays(\n result: VulnerabilityScanResult,\n timelines: VersionTimelines | null,\n nowIso: string,\n manifest?: PackageVersionManifest,\n): number[] {\n if (!timelines) return [];\n const seen = new Set<string>();\n const days: number[] = [];\n const analyze = (pt: PackageTimeline, advisory: VulnerabilityAdvisory): void => {\n const key = `${pt.ecosystem}\\0${pt.name}\\0${advisory.id}`;\n if (seen.has(key)) return;\n seen.add(key);\n for (const w of analyzeExposureWindows(pt, advisory, nowIso)) {\n if (!w.open && w.exposureDays != null) days.push(w.exposureDays);\n }\n };\n\n for (const pkg of result.packages) {\n const pt = findPackageTimeline(timelines, pkg.ecosystem, pkg.package);\n if (pt) for (const adv of pkg.advisories) analyze(pt, adv);\n }\n\n if (manifest) {\n for (const eco of timelines.ecosystems) {\n for (const pt of eco.packages) {\n const entry = getManifestEntry(manifest, pt.ecosystem as ManifestEcosystem, pt.name);\n for (const m of entry?.vulns ?? []) {\n if (m.withdrawn) continue;\n analyze(pt, manifestAdvisoryToAdvisory(m));\n }\n }\n }\n }\n return days;\n}\n\n/**\n * Enrich a vulnerability result in place with per-advisory introduction\n * attribution and exposure days, then attach the CRA remediation metrics —\n * including real remediation times (MTTR) reconstructed from closed exposure\n * windows in git history. Returns the same result for convenience.\n */\nexport function attributeVulnerabilities(\n result: VulnerabilityScanResult,\n timelines: VersionTimelines | null,\n nowIso: string,\n opts: { slaDays?: Record<VulnSeverity, number | null>; manifest?: PackageVersionManifest } = {},\n): VulnerabilityScanResult {\n const slaDays = opts.slaDays ?? DEFAULT_CRA_SLA_DAYS;\n for (const pkg of result.packages) {\n const pt: PackageTimeline | undefined = timelines\n ? findPackageTimeline(timelines, pkg.ecosystem, pkg.package)\n : undefined;\n for (const adv of pkg.advisories) {\n const introduced = findIntroduced(pt, adv);\n adv.introduced = introduced;\n adv.exposureDays = introduced ? daysBetween(introduced.date, nowIso) : null;\n }\n }\n\n const remediationDays = collectRemediationDays(result, timelines, nowIso, opts.manifest);\n result.cra = computeCra(result, nowIso, slaDays, remediationDays);\n return result;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { scanNodeProjects } from './scanners/node-scanner.js';\nimport { scanDotnetProjects } from './scanners/dotnet-scanner.js';\nimport { scanPythonProjects } from './scanners/python-scanner.js';\nimport { scanJavaProjects } from './scanners/java-scanner.js';\nimport { scanRubyProjects } from './scanners/ruby-scanner.js';\nimport { scanSwiftProjects } from './scanners/swift-scanner.js';\nimport { scanGoProjects } from './scanners/go-scanner.js';\nimport { scanRustProjects } from './scanners/rust-scanner.js';\nimport { scanPhpProjects } from './scanners/php-scanner.js';\nimport { scanDartProjects } from './scanners/dart-scanner.js';\nimport { scanElixirProjects } from './scanners/elixir-scanner.js';\nimport { scanDockerProjects } from './scanners/docker-scanner.js';\nimport { scanHelmProjects } from './scanners/helm-scanner.js';\nimport { scanTerraformProjects } from './scanners/terraform-scanner.js';\nimport { scanPolyglotProjects } from './scanners/polyglot-scanner.js';\nimport { NpmCache, checkRegistryAccess } from './scanners/npm-cache.js';\nimport { RuntimeCatalogClient } from './runtimes/client.js';\nimport { NuGetCache } from './scanners/nuget-cache.js';\nimport { PyPICache } from './scanners/pypi-cache.js';\nimport { MavenCache } from './scanners/maven-cache.js';\nimport { RubyGemsCache } from './scanners/rubygems-cache.js';\nimport { SwiftCache } from './scanners/swift-cache.js';\nimport { GoCache } from './scanners/go-cache.js';\nimport { CargoCache } from './scanners/cargo-cache.js';\nimport { ComposerCache } from './scanners/composer-cache.js';\nimport { PubCache } from './scanners/pub-cache.js';\nimport { Semaphore } from './utils/semaphore.js';\nimport { computeDriftScore, generateFindings, computeProjectId, computeSolutionId } from './scoring/drift-score.js';\nimport { formatText } from './formatters/text.js';\nimport { formatSarif } from './formatters/sarif.js';\nimport { formatMarkdown } from './formatters/markdown.js';\nimport { loadConfig, appendExcludePatterns } from './config.js';\nimport { pathExists, readJsonFile, writeJsonFile, writeTextFile, ensureDir, FileCache, quickTreeCount } from './utils/fs.js';\nimport { detectVcs } from './utils/vcs.js';\nimport { resolveRepositoryName } from './utils/repository-name.js';\nimport { ScanProgress } from './ui/progress.js';\nimport { loadScanHistory, saveScanHistory, estimateTotalDuration, estimateStepDurations } from './ui/scan-history.js';\nimport { parseDsn } from './utils/dsn.js';\nimport { loadPackageVersionManifest } from './package-version-manifest.js';\nimport { generateWorkspaceRelationshipMermaid, generateProjectRelationshipMermaid, generateSolutionRelationshipMermaid } from './utils/mermaid.js';\nimport { classifyProject, summarizeBilling } from './scanners/project-classification.js';\nimport { collectVulnTargets, scanVulnerabilities, generateVulnerabilityFindings } from './scanners/vulnerability-scanner.js';\nimport { attributeVulnerabilities } from './scoring/vuln-attribution.js';\nimport { gitHistoryAvailable, workingTreeDirty } from './utils/git-history.js';\nimport { buildVersionTimelines } from './utils/version-timeline.js';\nimport type {\n ScanArtifact, ScanOptions, ProjectScan, ExtendedScanResults, RepositoryInfo, SolutionScan,\n VibgrateConfig, Finding,\n} from './types.js';\nimport type { RuntimeCatalog } from './runtimes/types.js';\n\n/**\n * Shared context handed to the advanced-analysis hook (see {@link AdvancedScanHook}).\n *\n * This is the seam between the open core scan and the proprietary advanced\n * analysis. `runCoreScan` builds the base artifact from the fields below; the\n * hook (supplied only by the commercial `runScan`) reads them, runs the private\n * scanners, and writes its results back via `extended` and `addFilesScanned` —\n * which `runCoreScan` folds into the final artifact.\n *\n * When no hook is supplied (the open path), none of the private scanners run and\n * the artifact carries only base drift facts.\n */\nexport interface CoreScanContext {\n rootDir: string;\n opts: ScanOptions;\n config: VibgrateConfig;\n /** `false` when scanners are disabled in config; otherwise the per-scanner config. */\n scanners: VibgrateConfig['scanners'];\n maxPrivacyMode: boolean;\n allProjects: ProjectScan[];\n solutions: SolutionScan[];\n projectsByPath: Map<string, ProjectScan>;\n fileCache: FileCache;\n progress: ScanProgress;\n runtimeCatalog: RuntimeCatalog;\n /** Accumulator the hook populates with advanced scanner results. */\n extended: ExtendedScanResults;\n /** Add to the artifact's `filesScanned` total (e.g. files touched by advanced scanners). */\n addFilesScanned: (count: number) => void;\n}\n\n/**\n * Optional advanced-analysis pass. Runs after the base projects/solutions are\n * resolved but before the drift score is computed, so it sees the full project\n * set and can attach `extended`/billing results that land in the artifact.\n */\nexport type AdvancedScanHook = (ctx: CoreScanContext) => Promise<void>;\n\ninterface ParsedSolutionFile {\n path: string;\n name: string;\n type: 'dotnet-sln';\n projectPaths: string[];\n}\n\nasync function discoverSolutions(rootDir: string, fileCache: FileCache): Promise<ParsedSolutionFile[]> {\n const solutionFiles = await fileCache.findSolutionFiles(rootDir);\n const parsed: ParsedSolutionFile[] = [];\n\n for (const solutionFile of solutionFiles) {\n try {\n const content = await fileCache.readTextFile(solutionFile);\n const dir = path.dirname(solutionFile);\n const rootBasename = path.basename(rootDir);\n const relSolutionPath = [rootBasename, path.relative(rootDir, solutionFile).replace(/\\\\/g, '/')].join('/');\n const projectPaths = new Set<string>();\n const projectRegex = /Project\\(\"[^\"]*\"\\)\\s*=\\s*\"([^\"]*)\",\\s*\"([^\"]+\\.(?:cs|vb)proj)\"/g;\n let match: RegExpExecArray | null;\n while ((match = projectRegex.exec(content)) !== null) {\n const projectRelative = match[2];\n const absProjectPath = path.resolve(dir, projectRelative.replace(/\\\\/g, '/'));\n projectPaths.add(path.relative(rootDir, absProjectPath).replace(/\\\\/g, '/'));\n }\n\n const solutionName = path.basename(solutionFile, path.extname(solutionFile));\n\n parsed.push({\n path: relSolutionPath,\n name: solutionName,\n type: 'dotnet-sln',\n projectPaths: [...projectPaths],\n });\n } catch {\n // ignore unreadable solution files\n }\n }\n\n return parsed;\n}\n\n/**\n * Open base scan: discovery → per-ecosystem fact collection → drift score →\n * findings → artifact assembly + output. Contains **no** references to the\n * proprietary advanced scanners; those are layered in only when `advanced` is\n * supplied (by the commercial {@link import('./run-scan.js').runScan}).\n */\nexport async function runCoreScan(\n rootDir: string,\n opts: ScanOptions,\n advanced?: AdvancedScanHook,\n): Promise<ScanArtifact> {\n const vibgrateVersion = opts.vibgrateVersion ?? 'unknown';\n const scanStart = Date.now();\n const config = await loadConfig(rootDir);\n const sem = new Semaphore(opts.concurrency);\n const packageManifest = opts.packageManifest ? await loadPackageVersionManifest(opts.packageManifest) : undefined;\n const offlineMode = opts.offline === true;\n const maxPrivacyMode = opts.maxPrivacy === true;\n const npmCache = new NpmCache(rootDir, sem, packageManifest, offlineMode);\n const nugetCache = new NuGetCache(sem, packageManifest, offlineMode);\n const pypiCache = new PyPICache(sem, packageManifest, offlineMode);\n const mavenCache = new MavenCache(sem, packageManifest, offlineMode);\n const rubygemsCache = new RubyGemsCache(sem, packageManifest, offlineMode);\n const swiftCache = new SwiftCache(sem, packageManifest, offlineMode);\n const goCache = new GoCache(sem, packageManifest, offlineMode);\n const cargoCache = new CargoCache(sem, packageManifest, offlineMode);\n const composerCache = new ComposerCache(sem, packageManifest, offlineMode);\n const pubCache = new PubCache(sem, packageManifest, offlineMode);\n const fileCache = new FileCache();\n // Merge config-file excludes with any patterns passed on the command line\n // (--exclude). CLI patterns are additive and de-duplicated.\n const excludePatterns = [...new Set([...(config.exclude ?? []), ...(opts.exclude ?? [])])];\n fileCache.setExcludePatterns(excludePatterns);\n const projectScanTimeoutMs = ((opts.projectScanTimeout ?? config.projectScanTimeout ?? 180) * 1000);\n fileCache.setMaxFileSize(config.maxFileSizeToScan ?? 5_242_880);\n fileCache.setProjectScanTimeout(projectScanTimeoutMs);\n const scanners = config.scanners;\n let filesScanned = 0;\n const addFilesScanned = (count: number): void => { filesScanned += count; };\n\n // ── Progress UI ──\n // Base steps only; the advanced hook inserts its own steps before `drift`\n // (the same dynamic-insertion pattern used for per-ecosystem project steps).\n const progress = new ScanProgress(rootDir, vibgrateVersion);\n const steps = [\n { id: 'config', label: 'Loading configuration' },\n { id: 'discovery', label: 'Discovering workspace', weight: 3 },\n { id: 'vcs', label: 'Detecting version control' },\n { id: 'walk', label: 'Indexing files', weight: 8 },\n { id: 'drift', label: 'Computing drift score' },\n { id: 'findings', label: 'Generating findings' },\n ];\n if (opts.postScan) steps.push({ id: 'map', label: 'Building code map' });\n progress.setSteps(steps);\n\n // ── Step: Config ──\n progress.completeStep('config', 'loaded');\n\n // ── Preflight: verify npm registry connectivity ──\n const registryOk = offlineMode ? true : await checkRegistryAccess(rootDir);\n if (!registryOk) {\n progress.finish();\n const msg = [\n '',\n chalk.red.bold(' ✖ Vibgrate cannot connect to the npm registry to check package versions.'),\n '',\n chalk.dim(' Possible causes:'),\n chalk.dim(' • No internet connection'),\n chalk.dim(' • Corporate proxy/firewall blocking registry.npmjs.org'),\n chalk.dim(' • npm is not installed or not in PATH'),\n '',\n chalk.dim(' Try running: ') + chalk.cyan('npm view npm dist-tags.latest'),\n '',\n ].join('\\n');\n throw new Error(msg);\n }\n\n // Resolve the Runtime Catalog (latest / latest-LTS / real EOL dates for\n // Node/Python/Java/.NET/Go/Ruby) before scanning. Mirrors dependency\n // resolution: live via the Vibgrate API (`/v1/reference/runtimes`) with local\n // cache, offline `--package-manifest` `runtimes`, and the bundled snapshot as\n // fallbacks. Best-effort; never throws.\n const runtimeClient = new RuntimeCatalogClient({ offline: offlineMode, manifest: packageManifest });\n const resolvedRuntimeCatalog = await runtimeClient.resolve();\n const runtimeCatalog = resolvedRuntimeCatalog.catalog;\n\n // Kick off fast tree counting early so ETA can be initialized before indexing.\n const treeCountPromise = quickTreeCount(rootDir, excludePatterns);\n\n // ── Step: Discovery — fast file & folder count ──\n progress.startStep('discovery');\n const treeCount = await treeCountPromise;\n progress.updateStats({ treeSummary: treeCount });\n progress.completeStep(\n 'discovery',\n `${treeCount.totalFiles.toLocaleString()} files · ${treeCount.totalDirs.toLocaleString()} dirs`,\n );\n\n // ── Load scan history for ETA estimation ──\n const scanHistory = await loadScanHistory(rootDir);\n const estimatedTotal = estimateTotalDuration(scanHistory, treeCount.totalFiles);\n progress.setEstimatedTotal(estimatedTotal);\n progress.setStepEstimates(estimateStepDurations(scanHistory, treeCount.totalFiles));\n\n // ── Step: VCS ──\n progress.startStep('vcs');\n const vcs = await detectVcs(rootDir);\n // Record whether the working tree matches HEAD, so downstream commit-signature\n // verification can only report \"verified\" when the scanned code IS the signed\n // commit (a signature attests to the committed tree, not local edits).\n if (vcs.type === 'git' && vcs.sha) {\n vcs.dirty = await workingTreeDirty(rootDir);\n }\n const vcsDetail = vcs.type !== 'unknown'\n ? `${vcs.type}${vcs.branch ? ` ${vcs.branch}` : ''}${vcs.shortSha ? ` @ ${vcs.shortSha}` : ''}${vcs.dirty ? ' (dirty)' : ''}`\n : 'none detected';\n progress.completeStep('vcs', vcsDetail);\n\n // ── Step: Index files (shared walk with progress) ──\n progress.startStep('walk', treeCount.totalFiles);\n await fileCache.walkDir(rootDir, (found, currentPath) => {\n progress.updateStepProgress('walk', found, treeCount.totalFiles, currentPath);\n });\n const indexedTreeCount = fileCache.getWalkSummary(rootDir);\n if (indexedTreeCount && (indexedTreeCount.totalFiles !== treeCount.totalFiles || indexedTreeCount.totalDirs !== treeCount.totalDirs)) {\n progress.updateStats({ treeSummary: indexedTreeCount });\n }\n progress.completeStep('walk', `${treeCount.totalFiles.toLocaleString()} files indexed`);\n\n // ── Step: Node projects ──\n const nodeProjects = await scanNodeProjects(rootDir, npmCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (nodeProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'node', label: 'Found Node projects', weight: 4 });\n progress.startStep('node');\n for (const p of nodeProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += nodeProjects.length;\n progress.addProjects(nodeProjects.length);\n progress.completeStep('node', `${nodeProjects.length} project${nodeProjects.length !== 1 ? 's' : ''}`, nodeProjects.length);\n }\n\n // ── Step: .NET projects ──\n const dotnetProjects = await scanDotnetProjects(rootDir, nugetCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (dotnetProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'dotnet', label: 'Found .NET projects', weight: 2 });\n progress.startStep('dotnet');\n for (const p of dotnetProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += dotnetProjects.length;\n progress.addProjects(dotnetProjects.length);\n progress.completeStep('dotnet', `${dotnetProjects.length} project${dotnetProjects.length !== 1 ? 's' : ''}`, dotnetProjects.length);\n }\n\n // ── Step: Python projects ──\n const pythonProjects = await scanPythonProjects(rootDir, pypiCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (pythonProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'python', label: 'Found Python projects', weight: 3 });\n progress.startStep('python');\n for (const p of pythonProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += pythonProjects.length;\n progress.addProjects(pythonProjects.length);\n progress.completeStep('python', `${pythonProjects.length} project${pythonProjects.length !== 1 ? 's' : ''}`, pythonProjects.length);\n }\n\n // ── Step: Java projects ──\n const javaProjects = await scanJavaProjects(rootDir, mavenCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (javaProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'java', label: 'Found Java projects', weight: 3 });\n progress.startStep('java');\n for (const p of javaProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += javaProjects.length;\n progress.addProjects(javaProjects.length);\n progress.completeStep('java', `${javaProjects.length} project${javaProjects.length !== 1 ? 's' : ''}`, javaProjects.length);\n }\n\n // ── Step: Ruby projects ──\n const rubyProjects = await scanRubyProjects(rootDir, rubygemsCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (rubyProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'ruby', label: 'Found Ruby projects', weight: 2 });\n progress.startStep('ruby');\n for (const p of rubyProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += rubyProjects.length;\n progress.addProjects(rubyProjects.length);\n progress.completeStep('ruby', `${rubyProjects.length} project${rubyProjects.length !== 1 ? 's' : ''}`, rubyProjects.length);\n }\n\n // ── Step: Swift projects ──\n const swiftProjects = await scanSwiftProjects(rootDir, swiftCache, fileCache, projectScanTimeoutMs);\n if (swiftProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'swift', label: 'Found Swift projects', weight: 2 });\n progress.startStep('swift');\n for (const p of swiftProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += swiftProjects.length;\n progress.addProjects(swiftProjects.length);\n progress.completeStep('swift', `${swiftProjects.length} project${swiftProjects.length !== 1 ? 's' : ''}`, swiftProjects.length);\n }\n\n // ── Step: Go projects ──\n const goProjects = await scanGoProjects(rootDir, goCache, fileCache, projectScanTimeoutMs, runtimeCatalog);\n if (goProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'go', label: 'Found Go projects', weight: 2 });\n progress.startStep('go');\n for (const p of goProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += goProjects.length;\n progress.addProjects(goProjects.length);\n progress.completeStep('go', `${goProjects.length} project${goProjects.length !== 1 ? 's' : ''}`, goProjects.length);\n }\n\n // ── Step: Rust projects ──\n const rustProjects = await scanRustProjects(rootDir, cargoCache, fileCache, projectScanTimeoutMs);\n if (rustProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'rust', label: 'Found Rust projects', weight: 2 });\n progress.startStep('rust');\n for (const p of rustProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += rustProjects.length;\n progress.addProjects(rustProjects.length);\n progress.completeStep('rust', `${rustProjects.length} project${rustProjects.length !== 1 ? 's' : ''}`, rustProjects.length);\n }\n\n // ── Step: PHP projects ──\n const phpProjects = await scanPhpProjects(rootDir, composerCache, fileCache, projectScanTimeoutMs);\n if (phpProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'php', label: 'Found PHP projects', weight: 2 });\n progress.startStep('php');\n for (const p of phpProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += phpProjects.length;\n progress.addProjects(phpProjects.length);\n progress.completeStep('php', `${phpProjects.length} project${phpProjects.length !== 1 ? 's' : ''}`, phpProjects.length);\n }\n\n // ── Step: Dart projects ──\n const dartProjects = await scanDartProjects(rootDir, pubCache, fileCache, projectScanTimeoutMs);\n if (dartProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'dart', label: 'Found Dart projects', weight: 2 });\n progress.startStep('dart');\n for (const p of dartProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += dartProjects.length;\n progress.addProjects(dartProjects.length);\n progress.completeStep('dart', `${dartProjects.length} project${dartProjects.length !== 1 ? 's' : ''}`, dartProjects.length);\n }\n\n // ── Step: Elixir projects ──\n const elixirProjects = await scanElixirProjects(rootDir, packageManifest, fileCache, projectScanTimeoutMs, offlineMode);\n if (elixirProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'elixir', label: 'Found Elixir projects', weight: 2 });\n progress.startStep('elixir');\n for (const p of elixirProjects) {\n progress.addDependencies(p.dependencies.length);\n if (p.frameworks) progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += elixirProjects.length;\n progress.addProjects(elixirProjects.length);\n progress.completeStep('elixir', `${elixirProjects.length} project${elixirProjects.length !== 1 ? 's' : ''}`, elixirProjects.length);\n }\n\n // ── Step: Docker images ──\n const dockerProjects = await scanDockerProjects(rootDir, packageManifest, fileCache, projectScanTimeoutMs, offlineMode);\n if (dockerProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'docker', label: 'Found Docker images', weight: 2 });\n progress.startStep('docker');\n for (const p of dockerProjects) {\n progress.addDependencies(p.dependencies.length);\n }\n filesScanned += dockerProjects.length;\n progress.addProjects(dockerProjects.length);\n progress.completeStep('docker', `${dockerProjects.length} project${dockerProjects.length !== 1 ? 's' : ''}`, dockerProjects.length);\n }\n\n // ── Step: Helm charts ──\n const helmProjects = await scanHelmProjects(rootDir, packageManifest, fileCache, projectScanTimeoutMs, offlineMode);\n if (helmProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'helm', label: 'Found Helm charts', weight: 2 });\n progress.startStep('helm');\n for (const p of helmProjects) {\n progress.addDependencies(p.dependencies.length);\n if (p.frameworks) progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += helmProjects.length;\n progress.addProjects(helmProjects.length);\n progress.completeStep('helm', `${helmProjects.length} project${helmProjects.length !== 1 ? 's' : ''}`, helmProjects.length);\n }\n\n // ── Step: Terraform configs ──\n const terraformProjects = await scanTerraformProjects(rootDir, packageManifest, fileCache, projectScanTimeoutMs, offlineMode);\n if (terraformProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'terraform', label: 'Found Terraform configs', weight: 2 });\n progress.startStep('terraform');\n for (const p of terraformProjects) {\n progress.addDependencies(p.dependencies.length);\n }\n filesScanned += terraformProjects.length;\n progress.addProjects(terraformProjects.length);\n progress.completeStep('terraform', `${terraformProjects.length} project${terraformProjects.length !== 1 ? 's' : ''}`, terraformProjects.length);\n }\n\n // ── Step: Additional language projects ──\n const polyglotProjects = await scanPolyglotProjects(rootDir, fileCache);\n if (polyglotProjects.length > 0) {\n progress.insertStepBefore('drift', { id: 'polyglot', label: 'Found additional language projects', weight: 2 });\n progress.startStep('polyglot');\n for (const p of polyglotProjects) {\n progress.addDependencies(p.dependencies.length);\n progress.addFrameworks(p.frameworks.length);\n }\n filesScanned += polyglotProjects.length;\n progress.addProjects(polyglotProjects.length);\n progress.completeStep('polyglot', `${polyglotProjects.length} project${polyglotProjects.length !== 1 ? 's' : ''}`, polyglotProjects.length);\n }\n\n // Deduplicate projects by path. Infrastructure overlays (a Dockerfile,\n // Helm chart, or Terraform config living inside a code project's\n // directory) are distinct projects, so their keys are type-qualified —\n // otherwise services/etl [docker] would swallow services/etl [python].\n const OVERLAY_PROJECT_TYPES = new Set<string>(['docker', 'helm', 'terraform']);\n const dedupeKey = (p: ProjectScan): string =>\n OVERLAY_PROJECT_TYPES.has(p.type as string) ? `${p.type}:${p.path}` : p.path;\n const rawProjects: ProjectScan[] = [...nodeProjects, ...dotnetProjects, ...pythonProjects, ...javaProjects, ...rubyProjects, ...swiftProjects, ...goProjects, ...rustProjects, ...phpProjects, ...dartProjects, ...elixirProjects, ...dockerProjects, ...helmProjects, ...terraformProjects, ...polyglotProjects];\n const deduplicatedMap = new Map<string, ProjectScan>();\n for (const project of rawProjects) {\n const existing = deduplicatedMap.get(dedupeKey(project));\n if (!existing) {\n deduplicatedMap.set(dedupeKey(project), project);\n } else {\n // Prefer the scan with resolved version data (a dedicated scanner\n // reading lockfiles) over a raw manifest parse with more rows but no\n // resolution (the polyglot fallback); tie-break on row count.\n const resolvedCount = (p: ProjectScan): number =>\n p.dependencies.filter((d) => d.resolvedVersion || d.latestStable).length;\n const keepNew =\n resolvedCount(project) > resolvedCount(existing) ||\n (resolvedCount(project) === resolvedCount(existing) &&\n project.dependencies.length > existing.dependencies.length);\n const winner = keepNew ? project : existing;\n const loser = keepNew ? existing : project;\n\n if (loser.projectReferences?.length) {\n if (!winner.projectReferences) {\n winner.projectReferences = loser.projectReferences;\n } else {\n const existingPaths = new Set(winner.projectReferences.map((r) => r.path));\n for (const ref of loser.projectReferences) {\n if (!existingPaths.has(ref.path)) winner.projectReferences.push(ref);\n }\n }\n }\n\n deduplicatedMap.set(dedupeKey(project), winner);\n }\n }\n const allProjects: ProjectScan[] = [...deduplicatedMap.values()];\n\n // ── Compute per-project drift scores & project IDs ──\n const dsn = opts.dsn || process.env.VIBGRATE_DSN;\n const parsedDsn = dsn ? parseDsn(dsn) : null;\n const workspaceId = parsedDsn?.workspaceId;\n\n for (const project of allProjects) {\n project.drift = computeDriftScore([project]);\n project.projectId = computeProjectId(project.path, project.name, workspaceId);\n\n // ── Source-only size metrics (inputs to the billing classification, which\n // runs in the advanced pass). Lockfiles, generated manifests and vendored/\n // build directories are excluded so a single large lockfile can't push a\n // tiny project past the size thresholds.\n const absProjectDir = path.resolve(rootDir, project.path);\n try {\n const source = await fileCache.sourceMetricsUnder(rootDir, absProjectDir);\n if (project.fileCount === undefined) project.fileCount = source.fileCount;\n project.sizeBytes = source.sizeBytes;\n } catch {\n // leave metrics undefined if they cannot be computed\n }\n project.dependencyCount = project.dependencies.length;\n // Project size categorisation (micro/small/standard). This is commodity\n // categorisation — open — and feeds the billing rollup below; the commercial\n // billing *rates* live server-side, not here.\n project.classification = classifyProject({\n fileCount: project.fileCount,\n sizeBytes: project.sizeBytes,\n dependencyCount: project.dependencyCount,\n });\n }\n\n const solutionsManifestPath = path.join(rootDir, '.vibgrate', 'solutions.json');\n const persistedSolutionIds = new Map<string, string>();\n if (await pathExists(solutionsManifestPath)) {\n try {\n const persisted = await readJsonFile<{ solutions?: Array<{ path: string; solutionId: string }> }>(solutionsManifestPath);\n for (const solution of persisted.solutions ?? []) {\n if (solution.path && solution.solutionId) persistedSolutionIds.set(solution.path, solution.solutionId);\n }\n } catch {\n // ignore malformed persisted solution manifest\n }\n }\n\n const discoveredSolutions = await discoverSolutions(rootDir, fileCache);\n const solutions: SolutionScan[] = discoveredSolutions.map((solution) => ({\n solutionId: persistedSolutionIds.get(solution.path) ?? computeSolutionId(solution.path, solution.name, workspaceId),\n path: solution.path,\n name: solution.name,\n type: solution.type,\n projectPaths: solution.projectPaths,\n }));\n\n const projectsByPath = new Map(allProjects.map((project) => [project.path, project]));\n for (const solution of solutions) {\n const includedProjects = solution.projectPaths\n .map((projectPath) => {\n return projectsByPath.get(projectPath)\n ?? projectsByPath.get(path.dirname(projectPath).replace(/\\\\/g, '/'));\n })\n .filter((project): project is ProjectScan => Boolean(project));\n\n solution.drift = includedProjects.length > 0\n ? computeDriftScore(includedProjects)\n : undefined;\n\n for (const project of includedProjects) {\n project.solutionId = solution.solutionId;\n project.solutionName = solution.name;\n }\n }\n\n for (const project of allProjects) {\n project.relationshipDiagram = generateProjectRelationshipMermaid(project, allProjects);\n }\n\n for (const solution of solutions) {\n solution.relationshipDiagram = generateSolutionRelationshipMermaid(solution, allProjects);\n }\n\n const relationshipDiagram = generateWorkspaceRelationshipMermaid(allProjects);\n\n // ── Advanced analysis (proprietary; supplied only by the commercial runScan) ──\n // Runs before drift/findings so its results land in the artifact. The open\n // path passes no hook, so no private scanner runs.\n const extended: ExtendedScanResults = {};\n if (advanced) {\n await advanced({\n rootDir,\n opts,\n config,\n scanners,\n maxPrivacyMode,\n allProjects,\n solutions,\n projectsByPath,\n fileCache,\n progress,\n runtimeCatalog,\n extended,\n addFilesScanned,\n });\n }\n\n // Surface Runtime Catalog freshness/provenance as a confidence signal.\n const catalogAgeDays = (Date.now() - Date.parse(runtimeCatalog.generatedAt)) / (1000 * 60 * 60 * 24);\n const runtimeCatalogStale = Number.isFinite(catalogAgeDays) && catalogAgeDays > 30;\n extended.runtimeCatalogInfo = {\n generatedAt: runtimeCatalog.generatedAt,\n source: resolvedRuntimeCatalog.source,\n stale: runtimeCatalogStale,\n };\n\n // ── Step: Vulnerability scan (opt-in) ──\n // Open detection via OSV (online) or advisories carried in an offline\n // package-version manifest (air-gapped). Off unless `--vulns` is set, so the\n // default scan keeps its behaviour, latency, and network surface.\n let vulnFindings: Finding[] = [];\n if (opts.vulns) {\n progress.insertStepBefore('drift', { id: 'vulns', label: 'Scanning for vulnerabilities', weight: 3 });\n progress.startStep('vulns');\n const targets = collectVulnTargets(allProjects);\n const vulnerabilities = await scanVulnerabilities(targets, { sem, offline: offlineMode, manifest: packageManifest });\n // Attribute exposure to introducing commits via git history. Best-effort:\n // skipped silently when git history is unavailable. We also run it when a\n // package manifest is present but nothing is open, so remediation analysis can\n // surface advisories for packages that are clean today but were vulnerable in\n // history (real MTTR), not just the currently-open ones.\n const wantRemediation = packageManifest != null;\n if ((vulnerabilities.packages.length > 0 || wantRemediation) && (await gitHistoryAvailable(rootDir))) {\n const cacheDir = !opts.noLocalArtifacts && !maxPrivacyMode ? path.join(rootDir, '.vibgrate') : undefined;\n const timelines = await buildVersionTimelines(rootDir, { cacheDir });\n attributeVulnerabilities(vulnerabilities, timelines, new Date().toISOString(), { manifest: packageManifest });\n }\n if (\n vulnerabilities.source !== 'none' ||\n vulnerabilities.packages.length > 0 ||\n (vulnerabilities.cra != null && vulnerabilities.cra.remediatedCount > 0)\n ) {\n extended.vulnerabilities = vulnerabilities;\n }\n vulnFindings = generateVulnerabilityFindings(vulnerabilities);\n const affected = vulnerabilities.packages.length;\n progress.completeStep(\n 'vulns',\n affected > 0\n ? `${vulnerabilities.totalAdvisories} advisor${vulnerabilities.totalAdvisories === 1 ? 'y' : 'ies'} across ${affected} package${affected === 1 ? '' : 's'}`\n // Distinguish \"OSV unreachable\" from a clean result so an empty answer is\n // never read as \"no vulnerabilities\" (GUARDRAILS §1.4 — absent ≠ zero).\n : vulnerabilities.source === 'unreachable'\n ? 'OSV unreachable — not checked'\n : 'none found',\n );\n }\n\n // ── Step: Drift score ──\n progress.startStep('drift');\n const drift = computeDriftScore(allProjects);\n progress.completeStep('drift', `${drift.score}/100 — ${drift.riskLevel} risk`);\n\n // ── Step: Findings ──\n progress.startStep('findings');\n const findings = [...generateFindings(allProjects, config), ...vulnFindings];\n const warnCount = findings.filter((f) => f.level === 'warning').length;\n const errCount = findings.filter((f) => f.level === 'error').length;\n const noteCount = findings.filter((f) => f.level === 'note').length;\n progress.addFindings(warnCount, errCount, noteCount);\n const findingParts: string[] = [];\n if (errCount > 0) findingParts.push(`${errCount} error${errCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) findingParts.push(`${warnCount} warning${warnCount !== 1 ? 's' : ''}`);\n if (noteCount > 0) findingParts.push(`${noteCount} note${noteCount !== 1 ? 's' : ''}`);\n progress.completeStep('findings', findingParts.join(', ') || 'none');\n\n // ── Step: Code map (optional post-scan hook) ──\n // Runs inside the same progress bar so one command yields the DriftScore plus\n // a ready code map. Fail-soft: a map error never fails the scan.\n if (opts.postScan) {\n progress.startStep('map');\n try {\n const detail = await opts.postScan((done, total, phase) => progress.updateStepProgress('map', done, total, phase));\n progress.completeStep('map', detail || 'done');\n } catch {\n progress.completeStep('map', 'skipped (map build failed)');\n }\n }\n\n progress.finish();\n\n const stuckPaths = fileCache.stuckPaths;\n const skippedLarge = fileCache.skippedLargeFiles;\n\n if (stuckPaths.length > 0) {\n console.log(\n chalk.yellow(`\\n⚠ ${stuckPaths.length} path${stuckPaths.length === 1 ? '' : 's'} timed out (>${Math.round(projectScanTimeoutMs / 1000)}s) and ${stuckPaths.length === 1 ? 'was' : 'were'} skipped:`),\n );\n for (const d of stuckPaths) {\n console.log(chalk.dim(` → ${d}`));\n }\n const newExcludes = stuckPaths.map((d) => `${d}/**`);\n const updated = await appendExcludePatterns(rootDir, newExcludes);\n if (updated) {\n console.log(chalk.green('✔') + ` Added ${newExcludes.length} pattern${newExcludes.length !== 1 ? 's' : ''} to exclude list in config`);\n }\n }\n\n if (skippedLarge.length > 0) {\n const sizeLimit = config.maxFileSizeToScan ?? 5_242_880;\n const sizeMB = (sizeLimit / 1_048_576).toFixed(0);\n console.log(\n chalk.yellow(`\\n⚠ ${skippedLarge.length} file${skippedLarge.length === 1 ? '' : 's'} skipped (>${sizeMB} MB):`),\n );\n for (const f of skippedLarge.slice(0, 10)) {\n console.log(chalk.dim(` → ${f}`));\n }\n if (skippedLarge.length > 10) {\n console.log(chalk.dim(` … and ${skippedLarge.length - 10} more`));\n }\n }\n\n fileCache.clear();\n\n if (allProjects.length === 0) {\n console.log(chalk.yellow('No projects found.'));\n }\n\n const durationMs = Date.now() - scanStart;\n const repository = await buildRepositoryInfo(rootDir, vcs.remoteUrl, extended.buildDeploy?.ci, opts.repositoryName);\n // Project size rollup (micro/small/standard → billable count). Open: it is\n // categorisation, not pricing — the commercial rates live server-side.\n const billing = summarizeBilling(allProjects);\n\n const artifact: ScanArtifact = {\n schemaVersion: '1.0',\n timestamp: new Date().toISOString(),\n vibgrateVersion,\n rootPath: path.basename(rootDir),\n ...(vcs.type !== 'unknown' ? { vcs } : {}),\n repository,\n projects: allProjects,\n ...(solutions.length > 0 ? { solutions } : {}),\n drift,\n findings,\n ...(Object.keys(extended).length > 0 ? { extended } : {}),\n durationMs,\n filesScanned,\n treeSummary: treeCount,\n relationshipDiagram,\n billing,\n };\n\n if (opts.baseline) {\n const baselinePath = path.resolve(opts.baseline);\n if (await pathExists(baselinePath)) {\n try {\n const baseline = await readJsonFile<ScanArtifact>(baselinePath);\n // Only a repo-relative reference may enter the artifact: the absolute\n // path leaks the local username/home layout to the ingest server. A\n // baseline outside the repo degrades to its basename for the same reason.\n const relBaseline = path.relative(rootDir, baselinePath);\n artifact.baseline = !relBaseline || relBaseline.startsWith('..') ? path.basename(baselinePath) : relBaseline;\n artifact.delta = artifact.drift.score - baseline.drift.score;\n } catch {\n console.error(chalk.yellow(`Warning: Could not read baseline file: ${baselinePath}`));\n }\n }\n }\n\n if (!opts.noLocalArtifacts && !maxPrivacyMode) {\n const vibgrateDir = path.join(rootDir, '.vibgrate');\n await ensureDir(vibgrateDir);\n await writeJsonFile(path.join(vibgrateDir, 'scan_result.json'), artifact);\n await writeJsonFile(path.join(vibgrateDir, 'solutions.json'), {\n scannedAt: artifact.timestamp,\n solutions: solutions.map((solution) => ({\n solutionId: solution.solutionId,\n name: solution.name,\n path: solution.path,\n type: solution.type,\n projectPaths: solution.projectPaths,\n })),\n });\n }\n\n // scan_history.json is local ETA telemetry, not a result — honour the same\n // \"no local artifacts\" contract as the result/solutions writes above so that\n // privacy modes (and `scan --emit-facts`) leave the scanned tree untouched.\n if (!opts.noLocalArtifacts && !maxPrivacyMode) {\n await saveScanHistory(rootDir, {\n timestamp: artifact.timestamp,\n totalDurationMs: durationMs,\n totalFiles: treeCount.totalFiles,\n totalDirs: treeCount.totalDirs,\n steps: progress.getStepTimings(),\n });\n }\n\n if (!opts.noLocalArtifacts && !maxPrivacyMode) {\n const projectScores: Record<string, object> = {};\n for (const project of allProjects) {\n if (project.drift && project.path) {\n projectScores[project.path] = {\n projectId: project.projectId,\n name: project.name,\n type: project.type,\n path: project.path,\n score: project.drift.score,\n riskLevel: project.drift.riskLevel,\n components: project.drift.components,\n measured: project.drift.measured,\n scannedAt: artifact.timestamp,\n vibgrateVersion,\n solutionId: project.solutionId,\n solutionName: project.solutionName,\n };\n }\n }\n if (Object.keys(projectScores).length > 0) {\n const vibgrateDir = path.join(rootDir, '.vibgrate');\n await ensureDir(vibgrateDir);\n await writeJsonFile(path.join(vibgrateDir, 'project_scores.json'), projectScores);\n }\n }\n\n if (opts.format === 'json') {\n const jsonStr = JSON.stringify(artifact, null, 2);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), jsonStr);\n console.log(chalk.green('✔') + ` JSON written to ${opts.out}`);\n } else {\n console.log(jsonStr);\n }\n } else if (opts.format === 'sarif') {\n const sarif = formatSarif(artifact);\n const sarifStr = JSON.stringify(sarif, null, 2);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), sarifStr);\n console.log(chalk.green('✔') + ` SARIF written to ${opts.out}`);\n } else {\n console.log(sarifStr);\n }\n } else if (opts.format === 'md') {\n const markdown = formatMarkdown(artifact);\n console.log(markdown);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), markdown);\n }\n } else {\n // Upsell-panel audience. The CLI passes the authoritative `authenticated`\n // signal, which honours the stored login credential\n // (`~/.vibgrate/credentials.json`) that `parsedDsn` above cannot see, plus\n // the workspace `planTier` learned from preflight. Three cases:\n // • signed out → show the panel with the `login → push` CTA\n // • signed in, free plan → show the panel with an *upgrade* CTA (telling\n // them to log in again would be wrong)\n // • signed in, paid plan → suppress it\n // When signed in but the plan is unknown (offline, no push, or preflight\n // failed) we suppress rather than risk telling a paying customer they are on\n // the free plan. `--quiet` suppresses the panel in every case (promotional\n // output only — the report itself is unchanged).\n const authenticated = opts.authenticated ?? !!parsedDsn;\n const freePlan = opts.planTier === 'free';\n const showUpsell = !opts.quiet && (!authenticated || freePlan);\n const text = formatText(artifact, {\n free: showUpsell,\n authenticated,\n invocation: opts.invocation,\n upgradeUrl: opts.upgradeUrl,\n });\n console.log(text);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), text);\n }\n }\n\n return artifact;\n}\n\nasync function buildRepositoryInfo(rootDir: string, remoteUrl: string | undefined, ciSystems: string[] | undefined, nameOverride?: string): Promise<RepositoryInfo> {\n const name = nameOverride?.trim() ? nameOverride.trim() : await resolveRepositoryName(rootDir);\n let version: string | undefined;\n\n const packageJsonPath = path.join(rootDir, 'package.json');\n if (await pathExists(packageJsonPath)) {\n try {\n const packageJson = await readJsonFile<{ version?: string }>(packageJsonPath);\n if (typeof packageJson.version === 'string' && packageJson.version.trim()) {\n version = packageJson.version.trim();\n }\n } catch {\n // ignore\n }\n }\n\n return {\n name,\n ...(version ? { version } : {}),\n ...(ciSystems && ciSystems.length > 0 ? { pipeline: ciSystems.join(',') } : {}),\n ...(remoteUrl ? { remoteUrl } : {}),\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as semver from 'semver';\nimport type { BlastRadius, UpgradeImpactResult, UpgradePosture, UpgradeUsage, VulnEcosystem } from '../types.js';\n\n/**\n * Open \"what breaks if I upgrade this\" analysis for a drifted package.\n *\n * Combines the version distance (majors behind + the interim major lines to\n * step through) with a bounded scan of how heavily the package is used in the\n * source tree (the blast radius), plus any open advisories an upgrade would\n * remediate. Deterministic and offline — no changelog fetching here, so a\n * missing signal is reported honestly rather than guessed.\n *\n * This is the open counterpart to the proprietary breaking-change scanner: it\n * needs no playbooks and works for any npm/PyPI package by reading the repo.\n */\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'out', '.vibgrate', 'vendor',\n '.venv', 'venv', 'env', '__pycache__', 'target', '.next', '.nuxt', 'coverage', '.cache',\n]);\nconst MAX_FILES = 8000;\nconst MAX_DEPTH = 12;\nconst MAX_FILE_BYTES = 1_048_576;\nconst MAX_SAMPLES = 5;\n\nconst SOURCE_EXT: Partial<Record<VulnEcosystem, Set<string>>> = {\n npm: new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts', '.vue', '.svelte']),\n pypi: new Set(['.py']),\n};\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Build the import-detection regex for a package in a given ecosystem, or null. */\nfunction importPattern(ecosystem: VulnEcosystem, pkg: string): RegExp | null {\n const e = escapeRegExp(pkg);\n if (ecosystem === 'npm') {\n // from '<pkg>' | from '<pkg>/sub' | require('<pkg>') | import('<pkg>')\n return new RegExp(`(?:from\\\\s+|require\\\\(\\\\s*|import\\\\(\\\\s*)['\"]${e}(?:/[^'\"]*)?['\"]`, 'g');\n }\n if (ecosystem === 'pypi') {\n // import <pkg> | import <pkg>.sub | from <pkg> import | from <pkg>.sub import\n return new RegExp(`^\\\\s*(?:import\\\\s+${e}(?:[.\\\\s]|$)|from\\\\s+${e}(?:[.\\\\s]))`, 'gm');\n }\n return null;\n}\n\n/** Bounded walk of the source tree counting import sites for the package. */\nexport function analyzeUsage(root: string, packageName: string, ecosystem: VulnEcosystem | 'unknown'): UpgradeUsage {\n const empty: UpgradeUsage = { importSites: 0, filesTouched: 0, sampleFiles: [] };\n if (ecosystem === 'unknown') return empty;\n const exts = SOURCE_EXT[ecosystem];\n const pattern = importPattern(ecosystem, packageName);\n if (!exts || !pattern) return empty;\n\n let importSites = 0;\n let filesTouched = 0;\n const samples: string[] = [];\n let filesSeen = 0;\n\n const walk = (dir: string, depth: number): void => {\n if (depth > MAX_DEPTH || filesSeen >= MAX_FILES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n // Sort for deterministic sampling/order.\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (filesSeen >= MAX_FILES) return;\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) continue;\n walk(path.join(dir, entry.name), depth + 1);\n } else if (entry.isFile() && exts.has(path.extname(entry.name))) {\n filesSeen++;\n const full = path.join(dir, entry.name);\n let content: string;\n try {\n const stat = fs.statSync(full);\n if (stat.size > MAX_FILE_BYTES) continue;\n content = fs.readFileSync(full, 'utf8');\n } catch {\n continue;\n }\n pattern.lastIndex = 0;\n const matches = content.match(pattern);\n if (matches && matches.length) {\n importSites += matches.length;\n filesTouched++;\n if (samples.length < MAX_SAMPLES) samples.push(path.relative(root, full).replace(/\\\\/g, '/'));\n }\n }\n }\n };\n walk(root, 0);\n samples.sort();\n return { importSites, filesTouched, sampleFiles: samples };\n}\n\n/** Major-version distance + the interim major lines between current and latest. */\nexport function computeVersionJump(\n current: string | null,\n latest: string | null,\n knownMajorsBehind?: number | null,\n): { majorsBehind: number | null; interimMajors: string[] } {\n const c = current ? semver.valid(semver.coerce(current)) : null;\n const l = latest ? semver.valid(semver.coerce(latest)) : null;\n if (!c || !l) return { majorsBehind: knownMajorsBehind ?? null, interimMajors: [] };\n const cMajor = semver.major(c);\n const lMajor = semver.major(l);\n const majorsBehind = knownMajorsBehind ?? Math.max(0, lMajor - cMajor);\n const interimMajors: string[] = [];\n for (let m = cMajor + 1; m < lMajor; m++) interimMajors.push(`${m}.x`);\n return { majorsBehind, interimMajors };\n}\n\nfunction assessBlast(majorsBehind: number | null, usage: UpgradeUsage): BlastRadius {\n const ft = usage.filesTouched;\n if (!majorsBehind || majorsBehind <= 0) return ft > 0 ? 'low' : 'none';\n if (ft === 0) return 'low'; // major bump but no direct source usage found\n if (ft > 20 || (majorsBehind >= 2 && ft > 5)) return 'high';\n if (ft > 5 || majorsBehind >= 2) return 'moderate';\n return 'low';\n}\n\nfunction recommend(majorsBehind: number | null, current: string | null, latest: string | null): UpgradePosture {\n if (majorsBehind != null && majorsBehind >= 2) return 'multi-major-plan';\n if (majorsBehind === 1) return 'single-major';\n if (current && latest && current !== latest) return 'patch-minor';\n return 'current';\n}\n\n/**\n * Compute the upgrade-impact brief for a single package.\n *\n * @param opts.fixesVulnerabilities open advisory ids an upgrade would remediate\n * (supplied by the caller from the last vulnerability scan).\n */\nexport function computeUpgradeImpact(\n root: string,\n target: {\n package: string;\n ecosystem: VulnEcosystem | 'unknown';\n currentVersion: string | null;\n latestVersion: string | null;\n majorsBehind?: number | null;\n },\n opts: { fixesVulnerabilities?: string[] } = {},\n): UpgradeImpactResult {\n const { majorsBehind, interimMajors } = computeVersionJump(target.currentVersion, target.latestVersion, target.majorsBehind);\n const usage = analyzeUsage(root, target.package, target.ecosystem);\n const blastRadius = assessBlast(majorsBehind, usage);\n const recommendation = recommend(majorsBehind, target.currentVersion, target.latestVersion);\n const fixesVulnerabilities = opts.fixesVulnerabilities ?? [];\n\n const notes: string[] = [];\n if (interimMajors.length) {\n notes.push(`Step through ${interimMajors.join(' → ')} before the latest major rather than jumping directly.`);\n }\n if (usage.filesTouched === 0 && majorsBehind && majorsBehind > 0) {\n notes.push('No direct source usage found — likely a transitive or config-only dependency; upgrade risk is mostly indirect.');\n } else if (usage.filesTouched > 0) {\n notes.push(`Used at ${usage.importSites} import site(s) across ${usage.filesTouched} file(s) — review these when upgrading.`);\n }\n if (fixesVulnerabilities.length) {\n notes.push(`Upgrading also remediates ${fixesVulnerabilities.length} open advisory(ies): ${fixesVulnerabilities.join(', ')}.`);\n }\n\n return {\n package: target.package,\n ecosystem: target.ecosystem,\n currentVersion: target.currentVersion,\n latestVersion: target.latestVersion,\n majorsBehind,\n interimMajors,\n usage,\n blastRadius,\n recommendation,\n fixesVulnerabilities,\n notes,\n };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport type { VulnEcosystem } from '../types.js';\n\n/**\n * Online breaking-change signal extraction for upgrade planning.\n *\n * Given a package and a current→latest version span, this resolves the package's\n * source repository (via ecosyste.ms) and scans its GitHub releases in that span\n * for breaking-change signals (BREAKING markers, removals, migrations, dropped\n * support, …). It enriches the offline upgrade-impact brief with *what* is likely\n * to break, not just *how far* behind you are.\n *\n * Everything here is **opt-in and best-effort**: any network failure, a package\n * with no resolvable GitHub repo, or an unparseable release degrades to\n * `source: 'none'` with empty signals — never a fabricated result. The pure\n * parsing helpers are exported for testing without the network.\n */\n\nconst FETCH_TIMEOUT_MS = 12_000;\nconst RELEASES_PER_PAGE = 100;\n\n/** A release that carries breaking-change signals. */\nexport interface ReleaseSignals {\n version: string;\n tag: string;\n url: string | null;\n date: string | null;\n /** Distinct breaking-change signal labels found in the release notes. */\n signals: string[];\n /** A short excerpt around the first signal, for context. */\n excerpt: string | null;\n}\n\n/** Breaking-change signals across the releases between current and latest. */\nexport interface ChangelogSignals {\n source: 'github-releases' | 'none';\n repositoryUrl: string | null;\n releasesScanned: number;\n /** Releases in (current, latest] that carry signals, oldest → newest. */\n breakingReleases: ReleaseSignals[];\n notes: string[];\n}\n\nconst EMPTY: ChangelogSignals = {\n source: 'none',\n repositoryUrl: null,\n releasesScanned: 0,\n breakingReleases: [],\n notes: [],\n};\n\n/** ecosyste.ms registry host per ecosystem (for repository resolution). */\nconst ECOSYSTEME_REGISTRY: Record<VulnEcosystem, string> = {\n npm: 'npmjs.org',\n pypi: 'pypi.org',\n maven: 'repo1.maven.org',\n nuget: 'nuget.org',\n go: 'proxy.golang.org',\n cargo: 'crates.io',\n composer: 'packagist.org',\n rubygems: 'rubygems.org',\n pub: 'pub.dev',\n hex: 'hex.pm',\n};\n\n/** Breaking-change phrase patterns → canonical signal labels. */\nconst SIGNAL_PATTERNS: Array<{ re: RegExp; label: string }> = [\n { re: /breaking[\\s-]?change/i, label: 'breaking change' },\n { re: /\\bbreaking\\b/i, label: 'breaking' },\n { re: /\\bdrop(?:ped|s)?\\s+support\\b/i, label: 'dropped support' },\n { re: /\\bremoved?\\b/i, label: 'removal' },\n { re: /\\bdeprecat/i, label: 'deprecation' },\n { re: /\\bmigrat/i, label: 'migration' },\n { re: /\\brenamed?\\b/i, label: 'rename' },\n { re: /\\bno longer\\b/i, label: 'no longer supported' },\n { re: /\\bincompatib/i, label: 'incompatibility' },\n];\n\n/** Extract the distinct breaking-change signal labels present in some text. */\nexport function extractBreakingSignals(text: string | null | undefined): string[] {\n if (!text) return [];\n const found = new Set<string>();\n for (const { re, label } of SIGNAL_PATTERNS) {\n if (re.test(text)) found.add(label);\n }\n return [...found];\n}\n\n/** A short excerpt around the first breaking signal (single-line, trimmed). */\nexport function signalExcerpt(text: string | null | undefined): string | null {\n if (!text) return null;\n for (const { re } of SIGNAL_PATTERNS) {\n const m = re.exec(text);\n if (m && m.index != null) {\n const start = Math.max(0, m.index - 60);\n const slice = text.slice(start, m.index + 100).replace(/\\s+/g, ' ').trim();\n return (start > 0 ? '…' : '') + slice + (m.index + 100 < text.length ? '…' : '');\n }\n }\n return null;\n}\n\n/** Parse owner/repo from a GitHub URL (https, git, ssh, with or without .git). */\nexport function parseGitHubRepo(url: string | null | undefined): { owner: string; repo: string } | null {\n if (!url) return null;\n const m = url.match(/github\\.com[/:]([^/]+)\\/([^/#?]+?)(?:\\.git)?(?:[/#?].*)?$/i);\n return m ? { owner: m[1]!, repo: m[2]! } : null;\n}\n\n/** Derive a semver from a release tag, stripping `v`/`pkg@`/`pkg-` style prefixes. */\nexport function versionFromTag(tag: string, pkgName?: string): string | null {\n let t = tag.trim();\n if (pkgName) {\n for (const prefix of [`${pkgName}@`, `${pkgName}-v`, `${pkgName}-`, `${pkgName}/`, `${pkgName}_`]) {\n if (t.startsWith(prefix)) {\n t = t.slice(prefix.length);\n break;\n }\n }\n }\n t = t.replace(/^v/i, '');\n return semver.valid(semver.coerce(t));\n}\n\n/** Whether `version` is in the half-open span (from, to] (newer than current, up to latest). */\nexport function inUpgradeRange(version: string, fromVersion: string, toVersion: string): boolean {\n const v = semver.valid(semver.coerce(version));\n const from = semver.valid(semver.coerce(fromVersion));\n const to = semver.valid(semver.coerce(toVersion));\n if (!v || !from || !to) return false;\n return semver.gt(v, from) && semver.lte(v, to);\n}\n\n/** A raw GitHub release (the subset we read). */\nexport interface RawRelease {\n tag_name?: string;\n name?: string;\n body?: string;\n html_url?: string;\n published_at?: string;\n draft?: boolean;\n prerelease?: boolean;\n}\n\n/**\n * Pure: turn raw GitHub releases into the breaking-release list for an upgrade\n * span. Skips drafts; keeps releases in (from, to] that carry signals; sorts\n * oldest → newest.\n */\nexport function signalsFromReleases(\n releases: RawRelease[],\n fromVersion: string,\n toVersion: string,\n pkgName?: string,\n): ReleaseSignals[] {\n const out: ReleaseSignals[] = [];\n for (const release of releases) {\n if (release.draft) continue;\n const tag = release.tag_name ?? release.name ?? '';\n const version = versionFromTag(tag, pkgName);\n if (!version || !inUpgradeRange(version, fromVersion, toVersion)) continue;\n const body = [release.name, release.body].filter(Boolean).join('\\n');\n const signals = extractBreakingSignals(body);\n if (!signals.length) continue;\n out.push({\n version,\n tag,\n url: release.html_url ?? null,\n date: release.published_at ?? null,\n signals,\n excerpt: signalExcerpt(body),\n });\n }\n out.sort((a, b) => (semver.lt(a.version, b.version) ? -1 : semver.gt(a.version, b.version) ? 1 : a.tag.localeCompare(b.tag)));\n return out;\n}\n\n// ── Network (best-effort) ─────────────────────────────────────────────────────\n\nasync function fetchJson(url: string): Promise<unknown | null> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n signal: controller.signal,\n headers: { 'user-agent': 'vibgrate-cli', accept: 'application/json' },\n });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Resolve a package's source repository URL via ecosyste.ms. */\nexport async function resolveRepositoryUrl(ecosystem: VulnEcosystem, pkg: string): Promise<string | null> {\n const registry = ECOSYSTEME_REGISTRY[ecosystem];\n if (!registry) return null;\n const data = await fetchJson(\n `https://packages.ecosyste.ms/api/v1/registries/${registry}/packages/${encodeURIComponent(pkg)}`,\n );\n const repo = (data as Record<string, unknown> | null)?.repository_url;\n return typeof repo === 'string' ? repo : null;\n}\n\n/**\n * Resolve breaking-change signals for upgrading `pkg` from `fromVersion` to\n * `toVersion`. Best-effort and online; returns `source: 'none'` on any failure.\n *\n * @param opts.repositoryUrl skip ecosyste.ms resolution (e.g. for tests)\n * @param opts.fetchReleases inject the releases fetcher (e.g. for tests)\n */\nexport async function getChangelogSignals(\n ecosystem: VulnEcosystem | 'unknown',\n pkg: string,\n fromVersion: string | null,\n toVersion: string | null,\n opts: {\n repositoryUrl?: string | null;\n fetchReleases?: (owner: string, repo: string) => Promise<RawRelease[] | null>;\n } = {},\n): Promise<ChangelogSignals> {\n if (ecosystem === 'unknown' || !fromVersion || !toVersion) return EMPTY;\n\n const repositoryUrl = opts.repositoryUrl ?? (await resolveRepositoryUrl(ecosystem, pkg));\n const gh = parseGitHubRepo(repositoryUrl);\n if (!gh) {\n return { ...EMPTY, repositoryUrl: repositoryUrl ?? null, notes: ['no GitHub repository resolved for this package — changelog signals unavailable'] };\n }\n\n const releases = opts.fetchReleases\n ? await opts.fetchReleases(gh.owner, gh.repo)\n : ((await fetchJson(`https://api.github.com/repos/${gh.owner}/${gh.repo}/releases?per_page=${RELEASES_PER_PAGE}`)) as RawRelease[] | null);\n if (!Array.isArray(releases)) {\n return { ...EMPTY, repositoryUrl, notes: ['could not fetch releases (network, rate limit, or no GitHub Releases)'] };\n }\n\n const breakingReleases = signalsFromReleases(releases, fromVersion, toVersion, pkg);\n const notes: string[] = [];\n if (releases.length === 0) notes.push('the repository publishes no GitHub Releases');\n else if (breakingReleases.length === 0) notes.push('no breaking-change signals found in releases across this version span');\n return { source: 'github-releases', repositoryUrl, releasesScanned: releases.length, breakingReleases, notes };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as semver from 'semver';\nimport type { GitCommitRef } from './git-history.js';\nimport type { PackageTimeline } from './version-timeline.js';\n\n/**\n * Version-line bisection over a package's git-history timeline.\n *\n * Where `vg why` narrates *every* version transition for a dependency, bisection\n * answers a targeted question: \"when did this dependency cross a specific version\n * line?\" — e.g. \"when did we finally patch past the vulnerable lodash\" or \"when\n * did we adopt React 18\". It walks the same offline, no-checkout\n * `buildVersionTimelines` data the attribution code uses, finding the commits at\n * which the constraint's satisfied-state flipped.\n *\n * All functions here are pure (timeline in, crossings out), so they unit-test\n * without a repo and never touch git, the network, or the working tree.\n */\n\n/** A commit at which the resolved version flipped the constraint's satisfied-state. */\nexport interface VersionCrossing {\n /** `entered` = the version started satisfying the constraint here; `left` = stopped. */\n kind: 'entered' | 'left';\n /** The commit that made the change. */\n commit: GitCommitRef;\n /** Resolved version at this commit (the version that triggered the crossing). */\n version: string;\n /** Resolved version immediately before this commit, or `null` if this is the package's first appearance. */\n previousVersion: string | null;\n}\n\n/**\n * Normalize a user-supplied target into a valid semver range.\n *\n * A bare version (`4.17.21`) means \"reached or surpassed\" → `>=4.17.21`, which is\n * the useful default for \"did we get to the fix yet\". Anything that already looks\n * like a range/operator (`>=1.2`, `^18`, `~4.17`, `<2 || >=3`, `*`) is passed\n * through verbatim. Returns `null` when the input is not a usable range.\n */\nexport function normalizeConstraint(input: string): string | null {\n const trimmed = input.trim();\n if (!trimmed) return null;\n // A plain, exact version → \">=\" that version. semver.valid rejects ranges and\n // partials (e.g. \"18\", \"^1\"), so only true pinned versions take this branch.\n const candidate = semver.valid(trimmed) ? `>=${trimmed}` : trimmed;\n return semver.validRange(candidate) ? candidate : null;\n}\n\n/**\n * Whether `version` satisfies `range`, tolerating non-semver resolved versions\n * (e.g. Go pseudo-versions): coerce, and treat anything unparseable as \"does not\n * satisfy\" rather than throwing. Mirrors the leniency in the vulnerability scanner.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n if (semver.valid(version) && semver.satisfies(version, range)) return true;\n const coerced = semver.valid(semver.coerce(version));\n return coerced != null && semver.satisfies(coerced, range);\n}\n\n/**\n * Find every commit at which the package's resolved version flipped the\n * constraint's satisfied-state, oldest → newest. Before a package first appears\n * the constraint is treated as unsatisfied, so a package that is introduced\n * already satisfying the constraint yields one `entered` crossing with a null\n * `previousVersion`.\n */\nexport function findVersionCrossings(timeline: PackageTimeline, range: string): VersionCrossing[] {\n const crossings: VersionCrossing[] = [];\n let prevSatisfied = false;\n let prevVersion: string | null = null;\n for (const change of timeline.changes) {\n const satisfied = versionSatisfies(change.version, range);\n if (satisfied !== prevSatisfied) {\n crossings.push({\n kind: satisfied ? 'entered' : 'left',\n commit: change.commit,\n version: change.version,\n previousVersion: prevVersion,\n });\n }\n prevSatisfied = satisfied;\n prevVersion = change.version;\n }\n return crossings;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport semver from 'semver';\nimport { VERSION } from '../version.js';\n\nconst REGISTRY_URL = 'https://registry.npmjs.org/@vibgrate%2fcli/latest';\nconst CACHE_DIR = path.join(os.homedir(), '.vibgrate');\nconst CACHE_FILE = path.join(CACHE_DIR, 'update-check.json');\nconst CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000; // 12 hours\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n updateAvailable: boolean;\n}\n\ninterface CachedCheck {\n latest: string;\n checkedAt: number;\n}\n\n/**\n * Check the npm registry for a newer version.\n * Results are cached for 24 hours to avoid unnecessary network requests.\n * Never throws — returns null on any failure.\n */\nexport async function checkForUpdate(): Promise<UpdateInfo | null> {\n try {\n // Try cache first\n const cached = await readCache();\n if (cached && Date.now() - cached.checkedAt < CHECK_INTERVAL_MS) {\n return {\n current: VERSION,\n latest: cached.latest,\n updateAvailable: semver.gt(cached.latest, VERSION),\n };\n }\n\n // Fetch from registry with a short timeout\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n timeout.unref?.();\n\n let response: Awaited<ReturnType<typeof fetch>>;\n try {\n response = await fetch(REGISTRY_URL, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latest = data.version;\n if (!latest || !semver.valid(latest)) return null;\n\n // Update cache\n await writeCache({ latest, checkedAt: Date.now() });\n\n return {\n current: VERSION,\n latest,\n updateAvailable: semver.gt(latest, VERSION),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch the latest version from the npm registry (no cache).\n * Returns the version string or null on failure.\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000);\n timeout.unref?.();\n\n let response: Awaited<ReturnType<typeof fetch>>;\n try {\n response = await fetch(REGISTRY_URL, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latest = data.version;\n if (!latest || !semver.valid(latest)) return null;\n\n // Update cache\n await writeCache({ latest, checkedAt: Date.now() });\n\n return latest;\n } catch {\n return null;\n }\n}\n\nasync function readCache(): Promise<CachedCheck | null> {\n try {\n const raw = await fs.readFile(CACHE_FILE, 'utf-8');\n const data = JSON.parse(raw) as CachedCheck;\n if (data.latest && typeof data.checkedAt === 'number') return data;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(data: CachedCheck): Promise<void> {\n try {\n await fs.mkdir(CACHE_DIR, { recursive: true });\n await fs.writeFile(CACHE_FILE, JSON.stringify(data), 'utf-8');\n } catch {\n // Non-critical — silently ignore cache write failures\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Compact UI purpose evidence for efficient LLM inference\n *\n * Reduces token usage by ~80-90% through:\n * 1. Semantic categorization (pricing, auth, dashboard, etc.)\n * 2. Stem-based deduplication\n * 3. Route normalization\n * 4. Top-N sampling per category\n */\n\nimport type { UiPurposeResult, CompactUiPurpose } from '../types.js';\n\n/** Semantic category patterns for grouping evidence */\nconst CATEGORY_PATTERNS: Array<{ category: string; pattern: RegExp }> = [\n { category: 'pricing', pattern: /price|pricing|billing|subscri|trial|credit|plan|tier|upgrade|premium|pro|enterprise/i },\n { category: 'auth', pattern: /sign[- ]?in|sign[- ]?up|log[- ]?in|log[- ]?out|auth|sso|oauth|password|register|invite|onboard/i },\n { category: 'dashboard', pattern: /dashboard|overview|home|main|summary|stats/i },\n { category: 'settings', pattern: /setting|config|preference|option|profile|account/i },\n { category: 'users', pattern: /user|member|team|role|permission|access|admin|owner/i },\n { category: 'integrations', pattern: /integrat|connect|webhook|api[- ]?key|sync|import|export/i },\n { category: 'reports', pattern: /report|analy|metric|chart|graph|insight|track/i },\n { category: 'workflows', pattern: /workflow|automat|schedule|trigger|action|job|task|pipeline/i },\n { category: 'projects', pattern: /project|workspace|organization|folder|repo/i },\n { category: 'navigation', pattern: /menu|nav|sidebar|header|footer|breadcrumb/i },\n];\n\n/**\n * Compact raw UI evidence into a smaller payload for LLM inference\n */\nexport function compactUiPurpose(result: UiPurposeResult, maxSamplesPerCategory = 3): CompactUiPurpose {\n const evidence = result.topEvidence;\n\n // Extract special kinds\n const dependencies = evidence\n .filter((e) => e.kind === 'dependency')\n .map((e) => e.value)\n .slice(0, 10);\n\n const routes = dedupeRoutes(\n evidence.filter((e) => e.kind === 'route').map((e) => e.value),\n ).slice(0, 15);\n\n // Process text evidence\n const textEvidence = evidence.filter(\n (e) => e.kind !== 'dependency' && e.kind !== 'route' && e.kind !== 'feature_flag',\n );\n\n const byCategory = new Map<string, Set<string>>();\n const categoryCounts: Record<string, number> = {};\n\n for (const item of textEvidence) {\n const category = categorize(item.value);\n if (!byCategory.has(category)) {\n byCategory.set(category, new Set());\n }\n const normalized = normalizeValue(item.value);\n if (normalized.length >= 3) {\n byCategory.get(category)!.add(normalized);\n }\n }\n\n // Build samples\n const samples: Array<{ kind: string; value: string; category: string }> = [];\n\n for (const [category, values] of byCategory) {\n const deduped = dedupeStrings([...values]);\n categoryCounts[category] = deduped.length;\n\n for (const value of deduped.slice(0, maxSamplesPerCategory)) {\n samples.push({ kind: 'text', value, category });\n }\n }\n\n // Add feature flag indicator\n const featureFlags = evidence.filter((e) => e.kind === 'feature_flag');\n if (featureFlags.length > 0) {\n categoryCounts['feature_flags'] = featureFlags.length;\n samples.push({ kind: 'feature_flag', value: 'feature flags detected', category: 'feature_flags' });\n }\n\n return {\n samples,\n categoryCounts,\n originalCount: evidence.length,\n dependencies,\n routes,\n detectedFrameworks: result.detectedFrameworks,\n };\n}\n\n/** Categorize a value into semantic buckets */\nfunction categorize(value: string): string {\n for (const { category, pattern } of CATEGORY_PATTERNS) {\n if (pattern.test(value)) return category;\n }\n return 'general';\n}\n\n/** Normalize a value for deduplication */\nfunction normalizeValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 60);\n}\n\n/** Dedupe strings by prefix/stem similarity */\nfunction dedupeStrings(values: string[]): string[] {\n const sorted = values.sort((a, b) => b.length - a.length);\n const kept: string[] = [];\n\n for (const value of sorted) {\n const isDupe = kept.some((k) => {\n const stem = value.slice(0, 6);\n return k.startsWith(stem) || k.includes(value) || value.includes(k);\n });\n if (!isDupe) {\n kept.push(value);\n }\n }\n\n return kept;\n}\n\n/** Dedupe routes by normalized path structure */\nfunction dedupeRoutes(routes: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const route of routes) {\n const normalized = route\n .replace(/:[a-z_]+/gi, ':param')\n .replace(/\\[\\[*\\.*\\.*[a-z_]+\\]*\\]/gi, ':param')\n .replace(/\\/+$/, '')\n .toLowerCase();\n\n if (!seen.has(normalized)) {\n seen.add(normalized);\n result.push(route);\n }\n }\n\n return result;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Compact scan artifact for efficient upload\n *\n * Reduces artifact size by:\n * 1. Extracting only DB object names (not full CREATE statements)\n * 2. Simplifying API integrations to domains only\n * 3. Using compacted UI purpose evidence\n * 4. Including only first favicon, no logos\n * 5. Capping unbounded arrays\n */\n\nimport * as zlib from 'node:zlib';\nimport { promisify } from 'node:util';\nimport type {\n ScanArtifact,\n DataStoresResult,\n ApiSurfaceResult,\n AssetBrandingResult,\n DatabaseSchemaResult,\n DatabaseSchemaUploadCaps,\n ExtendedScanResults,\n} from '../types.js';\nimport { compactUiPurpose } from './compact-evidence.js';\n\nconst gzip = promisify(zlib.gzip);\n\n/** Max items per array field to prevent bloat */\nconst MAX_ITEMS = 50;\n\n/** Default caps for the `databaseSchema` scanner — a large monorepo can carry\n * hundreds of tables and thousands of columns, so this scanner gets its own\n * (more generous, but still bounded) limits rather than the generic\n * `MAX_ITEMS`. Overridable per-field via `scanners.databaseSchema` in\n * `vibgrate.config.ts` (see DOCS.md § Database Schema), up to\n * `DB_UPLOAD_HARD_CEILING` below. */\nconst MAX_DB_MODELS = 300;\nconst MAX_DB_FIELDS_PER_MODEL = 100;\nconst MAX_DB_MODEL_FILES = 5;\nconst MAX_DB_FILES_SCANNED = 500;\n\n/** Absolute ceiling on the `databaseSchema` upload caps, regardless of what a\n * user configures — mirrored server-side in vibgrate-api's ingest zod schema\n * as a hard `.max()` so a payload can never exceed these bounds even from a\n * misconfigured or non-CLI client. */\nexport const DB_UPLOAD_HARD_CEILING = {\n maxModels: 2000,\n maxFieldsPerModel: 500,\n maxFilesPerModel: 20,\n maxFilesScanned: 5000,\n} as const;\n\nfunction clampCap(configured: number | undefined, fallback: number, ceiling: number): number {\n if (typeof configured !== 'number' || !Number.isFinite(configured) || configured <= 0) return fallback;\n return Math.min(Math.floor(configured), ceiling);\n}\n\n/**\n * Extract just the object name from a \"name (file)\" formatted string\n */\nfunction extractName(entry: string): string {\n const match = entry.match(/^(.+?)\\s*\\(/);\n return match ? match[1].trim() : entry.trim();\n}\n\n/**\n * Compact DataStores result - extract only object names, cap arrays\n */\nexport function compactDataStores(result: DataStoresResult): DataStoresResult {\n return {\n databaseTechnologies: result.databaseTechnologies.slice(0, 10),\n connectionStrings: [], // Don't include connection strings in upload\n connectionPoolSettings: result.connectionPoolSettings.slice(0, MAX_ITEMS),\n replicationSettings: result.replicationSettings.slice(0, 20),\n readReplicaSettings: result.readReplicaSettings.slice(0, 20),\n failoverSettings: result.failoverSettings.slice(0, 20),\n collationAndEncoding: result.collationAndEncoding.slice(0, 20),\n queryTimeoutDefaults: result.queryTimeoutDefaults.slice(0, 20),\n manualIndexes: result.manualIndexes.map(extractName).slice(0, MAX_ITEMS),\n tables: result.tables.map(extractName).slice(0, MAX_ITEMS),\n views: result.views.map(extractName).slice(0, MAX_ITEMS),\n storedProcedures: result.storedProcedures.map(extractName).slice(0, MAX_ITEMS),\n triggers: result.triggers.map(extractName).slice(0, MAX_ITEMS),\n rowLevelSecurityPolicies: result.rowLevelSecurityPolicies.slice(0, 20),\n otherServices: result.otherServices.slice(0, 20),\n };\n}\n\n/**\n * Compact ApiSurface result - simplify to domains, cap arrays\n */\nexport function compactApiSurface(result: ApiSurfaceResult): ApiSurfaceResult {\n // Dedupe integrations by provider domain\n const seenProviders = new Set<string>();\n const uniqueIntegrations = result.integrations.filter((i) => {\n const domain = i.provider.split(':')[0];\n if (seenProviders.has(domain)) return false;\n seenProviders.add(domain);\n return true;\n }).slice(0, MAX_ITEMS).map((i) => ({\n provider: i.provider,\n endpoint: '', // Don't include full endpoints\n version: i.version,\n parameters: [], // Don't include params\n configOptions: [],\n authHints: [],\n files: [], // Don't include file paths\n }));\n\n return {\n integrations: uniqueIntegrations,\n openApiSpecifications: result.openApiSpecifications.slice(0, 10),\n webhookUrls: result.webhookUrls.slice(0, 20),\n callbackEndpoints: result.callbackEndpoints.slice(0, 20),\n apiVersionPins: result.apiVersionPins.slice(0, 20),\n tokenExpirationPolicies: result.tokenExpirationPolicies.slice(0, 20),\n rateLimitOverrides: result.rateLimitOverrides.slice(0, 20),\n customHeaders: result.customHeaders.slice(0, 20),\n corsPolicies: result.corsPolicies.slice(0, 20),\n oauthScopes: result.oauthScopes.slice(0, 20),\n apiTokens: [], // Don't include token references\n };\n}\n\n/**\n * Compact AssetBranding result - first favicon only, no logos\n */\nexport function compactAssetBranding(result: AssetBrandingResult): AssetBrandingResult {\n return {\n faviconFiles: result.faviconFiles.slice(0, 1),\n productLogos: [], // Don't include logos\n };\n}\n\n/**\n * Compact DatabaseSchemaResult — cap models, fields-per-model, and files so a\n * schema-heavy monorepo can't dominate the upload payload. Structural facts\n * only are ever present here to begin with (see `database-schema.ts`); this\n * only trims *how many* of those facts survive, never adds anything new.\n *\n * `caps` lets `scanners.databaseSchema` in `vibgrate.config.ts` raise (or\n * lower) the defaults per-field; each override is clamped to\n * `DB_UPLOAD_HARD_CEILING` so local config can never produce a payload the\n * ingest API's own hard limit would reject outright.\n */\nexport function compactDatabaseSchema(result: DatabaseSchemaResult, caps?: DatabaseSchemaUploadCaps): DatabaseSchemaResult {\n const maxModels = clampCap(caps?.maxModels, MAX_DB_MODELS, DB_UPLOAD_HARD_CEILING.maxModels);\n const maxFieldsPerModel = clampCap(caps?.maxFieldsPerModel, MAX_DB_FIELDS_PER_MODEL, DB_UPLOAD_HARD_CEILING.maxFieldsPerModel);\n const maxFilesPerModel = clampCap(caps?.maxFilesPerModel, MAX_DB_MODEL_FILES, DB_UPLOAD_HARD_CEILING.maxFilesPerModel);\n const maxFilesScanned = clampCap(caps?.maxFilesScanned, MAX_DB_FILES_SCANNED, DB_UPLOAD_HARD_CEILING.maxFilesScanned);\n\n return {\n providers: result.providers.slice(0, MAX_ITEMS),\n models: result.models.slice(0, maxModels).map((model) => ({\n ...model,\n fields: model.fields.slice(0, maxFieldsPerModel),\n files: model.files.slice(0, maxFilesPerModel),\n })),\n enums: result.enums.slice(0, MAX_ITEMS),\n filesScanned: result.filesScanned.slice(0, maxFilesScanned),\n projects: result.projects.slice(0, MAX_ITEMS).map((project) => ({\n project: project.project,\n filesScanned: project.filesScanned.slice(0, MAX_ITEMS),\n models: project.models.slice(0, MAX_ITEMS),\n enums: project.enums.slice(0, MAX_ITEMS),\n })),\n };\n}\n\nexport interface PrepareArtifactForUploadOptions {\n /** Overrides for the `databaseSchema` scanner's upload caps, sourced from\n * `scanners.databaseSchema` in `vibgrate.config.ts`. */\n databaseSchemaCaps?: DatabaseSchemaUploadCaps;\n}\n\n/**\n * Prepare artifact for upload by compacting all extended results\n */\nexport function prepareArtifactForUpload(artifact: ScanArtifact, opts?: PrepareArtifactForUploadOptions): ScanArtifact {\n const compacted = { ...artifact };\n\n if (compacted.extended) {\n const ext: ExtendedScanResults = { ...compacted.extended };\n\n // Compact DataStores\n if (ext.dataStores) {\n ext.dataStores = compactDataStores(ext.dataStores);\n }\n\n // Compact ApiSurface\n if (ext.apiSurface) {\n ext.apiSurface = compactApiSurface(ext.apiSurface);\n }\n\n // Compact AssetBranding\n if (ext.assetBranding) {\n ext.assetBranding = compactAssetBranding(ext.assetBranding);\n }\n\n // Convert UiPurpose to compacted version\n if (ext.uiPurpose) {\n // Replace full UiPurposeResult with CompactUiPurpose structure\n // We store it under the same key but with compacted data\n const compactedUi = compactUiPurpose(ext.uiPurpose);\n // Store as a minimal structure\n ext.uiPurpose = {\n enabled: ext.uiPurpose.enabled,\n detectedFrameworks: compactedUi.detectedFrameworks,\n evidenceCount: compactedUi.originalCount,\n capped: ext.uiPurpose.capped,\n topEvidence: [], // Clear full evidence\n unknownSignals: [],\n // Add compacted data under extended properties\n ...({ compacted: compactedUi } as Record<string, unknown>),\n };\n }\n\n // Cap other potentially large arrays\n if (ext.runtimeConfiguration) {\n ext.runtimeConfiguration = {\n ...ext.runtimeConfiguration,\n environmentVariables: ext.runtimeConfiguration.environmentVariables.slice(0, 100),\n hiddenConfigFiles: ext.runtimeConfiguration.hiddenConfigFiles.slice(0, MAX_ITEMS),\n startupArguments: ext.runtimeConfiguration.startupArguments.slice(0, 100),\n };\n }\n\n if (ext.operationalResilience) {\n const ops = ext.operationalResilience;\n ext.operationalResilience = {\n implicitTimeouts: ops.implicitTimeouts.slice(0, 30),\n defaultPaginationSize: ops.defaultPaginationSize.slice(0, 30),\n implicitRetryLogic: ops.implicitRetryLogic.slice(0, 30),\n defaultLocale: ops.defaultLocale.slice(0, 20),\n defaultCurrency: ops.defaultCurrency.slice(0, 20),\n implicitTimezone: ops.implicitTimezone.slice(0, 20),\n defaultCharacterEncoding: ops.defaultCharacterEncoding.slice(0, 20),\n sessionStores: ops.sessionStores.slice(0, 20),\n distributedLocks: ops.distributedLocks.slice(0, 20),\n jobSchedulers: ops.jobSchedulers.slice(0, 30),\n idempotencyKeys: ops.idempotencyKeys.slice(0, 20),\n rateLimitingCounters: ops.rateLimitingCounters.slice(0, 20),\n circuitBreakerState: ops.circuitBreakerState.slice(0, 20),\n abTestToggles: ops.abTestToggles.slice(0, 20),\n regionalEnablementRules: ops.regionalEnablementRules.slice(0, 20),\n betaAccessGroups: ops.betaAccessGroups.slice(0, 20),\n licensingEnforcementLogic: ops.licensingEnforcementLogic.slice(0, 20),\n killSwitches: ops.killSwitches.slice(0, 20),\n connectorRetryLogic: ops.connectorRetryLogic.slice(0, 20),\n apiPollingIntervals: ops.apiPollingIntervals.slice(0, 20),\n fieldMappings: ops.fieldMappings.slice(0, 20),\n schemaRegistryRules: ops.schemaRegistryRules.slice(0, 20),\n deadLetterQueueBehavior: ops.deadLetterQueueBehavior.slice(0, 20),\n dataMaskingRules: ops.dataMaskingRules.slice(0, 20),\n transformationLogic: ops.transformationLogic.slice(0, 20),\n timezoneHandling: ops.timezoneHandling.slice(0, 20),\n encryptionSettings: ops.encryptionSettings.slice(0, 30),\n hardcodedSecretSignals: ops.hardcodedSecretSignals.slice(0, 20),\n };\n }\n\n // Cap dependencyGraph phantom details\n if (ext.dependencyGraph) {\n ext.dependencyGraph = {\n ...ext.dependencyGraph,\n phantomDependencies: ext.dependencyGraph.phantomDependencies.slice(0, MAX_ITEMS),\n phantomDependencyDetails: ext.dependencyGraph.phantomDependencyDetails?.slice(0, MAX_ITEMS),\n duplicatedPackages: ext.dependencyGraph.duplicatedPackages.slice(0, MAX_ITEMS),\n };\n }\n\n // Cap databaseSchema (models/fields/files) — see compactDatabaseSchema.\n if (ext.databaseSchema) {\n ext.databaseSchema = compactDatabaseSchema(ext.databaseSchema, opts?.databaseSchemaCaps);\n }\n\n compacted.extended = ext;\n }\n\n return compacted;\n}\n\n/**\n * Compress artifact JSON with gzip\n */\nexport async function compressArtifact(artifact: ScanArtifact): Promise<Buffer> {\n const json = JSON.stringify(artifact);\n return gzip(json, { level: 9 });\n}\n\n/**\n * Prepare and compress artifact for upload\n */\nexport async function prepareCompressedUpload(\n artifact: ScanArtifact,\n opts?: PrepareArtifactForUploadOptions,\n): Promise<{ body: Buffer; contentEncoding: 'gzip' }> {\n const compacted = prepareArtifactForUpload(artifact, opts);\n const compressed = await compressArtifact(compacted);\n return { body: compressed, contentEncoding: 'gzip' };\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { ParsedDsn } from './dsn.js';\n\nexport interface ScanPreflightResponse {\n status: 'ok' | 'error';\n workspaceId: string;\n /** Data-residency region the workspace is pinned to (newer APIs only). */\n region?: string;\n /** Ingest host to push results to (the workspace's region; newer APIs only). */\n ingestHost?: string;\n plan: { tier: string; label: string };\n scans: {\n used: number;\n limit: number;\n remaining: number | null;\n allowed: boolean;\n yearMonth: string;\n };\n vm?: {\n used: number;\n limit: number;\n remaining: number | null;\n allowed: boolean;\n overageEnabled: boolean;\n yearMonth: string;\n };\n repository?: {\n name: string;\n id: string | null;\n unchanged?: boolean;\n lastScannedAt?: string;\n lastIngestId?: string;\n lastVcsSha?: string;\n };\n /**\n * Repository-count accounting against the plan's `maxRepos` cap. Present when a\n * repository name was supplied. `isNew` is true when the repository is not yet\n * mapped in the workspace (so scanning it would add to the estate); `allowed`\n * is false only when binding this *new* repository would breach the cap — an\n * already-mapped repository is always allowed to re-scan.\n */\n repositories?: {\n total: number;\n /** The plan's repository cap (-1 = unlimited). */\n max: number;\n isNew: boolean;\n allowed: boolean;\n };\n error?: string;\n code?: string;\n upgradeUrl?: string;\n}\n\nexport interface ScanPreflightOptions {\n repositoryName?: string;\n vcsSha?: string;\n}\n\n/**\n * Call GET /v1/ingest/scan/preflight before an expensive local scan.\n */\nexport async function fetchScanPreflight(\n parsed: ParsedDsn,\n ingestHost: string,\n options?: ScanPreflightOptions,\n): Promise<ScanPreflightResponse> {\n const host = ingestHost;\n const url = new URL(`${parsed.scheme}://${host}/v1/ingest/scan/preflight`);\n if (options?.repositoryName) {\n url.searchParams.set('repository', options.repositoryName);\n }\n if (options?.vcsSha) {\n url.searchParams.set('vcsSha', options.vcsSha);\n }\n\n const timestamp = String(Date.now());\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'X-Vibgrate-Timestamp': timestamp,\n Authorization: `VibgrateDSN ${parsed.keyId}:${parsed.secret}`,\n },\n });\n\n const body = (await response.json()) as ScanPreflightResponse;\n if (!response.ok && body.status !== 'error') {\n throw new Error(`HTTP ${response.status}: ${JSON.stringify(body)}`);\n }\n return body;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Scan symbols preflight transport — the client half of the reachability\n * hand-off. Posts the scan's dependency coordinates (ecosystem/package/version\n * ONLY — never source, never file paths) to\n * `POST /v1/ingest/scan/preflight/symbols` and receives the risky-symbol\n * manifest: \"for the versions you have, here are the vulnerable symbols to\n * look for\" in the local code graph.\n *\n * Best-effort by design: callers treat any failure as \"no manifest\" and leave\n * every finding Unknown — reachability never blocks or fails a scan.\n */\n\nimport type { ParsedDsn } from './dsn.js';\nimport type { ProjectType } from '../types.js';\n\n/** One dependency coordinate posted to the preflight (OSV ecosystem naming). */\nexport interface SymbolsPreflightDependency {\n ecosystem: string;\n package: string;\n version: string;\n}\n\nexport interface RiskySymbol {\n symbol: string;\n kind: 'function' | 'method' | 'class' | 'module';\n confidence: number;\n source: 'osv' | 'patch-diff';\n evidenceUrl?: string;\n}\n\nexport interface RiskySymbolManifestEntry {\n advisoryId: string;\n aliases: string[];\n ecosystem: string;\n package: string;\n /** The posted version this advisory matched. */\n version: string;\n symbols: RiskySymbol[];\n symbolCoverage: 'function' | 'module' | 'none';\n state: 'pending' | 'extracting' | 'ready' | 'needs-review' | 'failed' | 'stale';\n}\n\nexport interface SymbolsPreflightResponse {\n status: 'ok' | 'error';\n schemaVersion?: '1';\n generatedAt?: string;\n methodologyVersion?: string;\n advisories?: RiskySymbolManifestEntry[];\n /** Advisories registered for background symbol extraction on this call. */\n pendingExtractions?: number;\n error?: string;\n}\n\n/**\n * OSV-canonical ecosystem name per project type (matches the server's SCA\n * mapping). Types absent here have no reliable OSV coverage and are not posted.\n */\nexport const PROJECT_TYPE_TO_OSV_ECOSYSTEM: Partial<Record<ProjectType, string>> = {\n node: 'npm',\n typescript: 'npm',\n dotnet: 'NuGet',\n 'visual-basic': 'NuGet',\n python: 'PyPI',\n ruby: 'RubyGems',\n java: 'Maven',\n kotlin: 'Maven',\n scala: 'Maven',\n groovy: 'Maven',\n clojure: 'Maven',\n go: 'Go',\n rust: 'crates.io',\n php: 'Packagist',\n dart: 'Pub',\n elixir: 'Hex',\n};\n\nconst MAX_DEPENDENCIES = 4000;\n\n/**\n * Call POST /v1/ingest/scan/preflight/symbols with the scan's dependency list.\n * Throws on transport/HTTP errors — the caller degrades to \"no manifest\".\n */\nexport async function fetchRiskySymbols(\n parsed: ParsedDsn,\n ingestHost: string,\n dependencies: SymbolsPreflightDependency[],\n): Promise<SymbolsPreflightResponse> {\n const url = `${parsed.scheme}://${ingestHost}/v1/ingest/scan/preflight/symbols`;\n const body = JSON.stringify({\n schemaVersion: '1',\n dependencies: dependencies.slice(0, MAX_DEPENDENCIES),\n });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Vibgrate-Timestamp': String(Date.now()),\n Authorization: `VibgrateDSN ${parsed.keyId}:${parsed.secret}`,\n },\n body,\n });\n\n const payload = (await response.json()) as SymbolsPreflightResponse;\n if (!response.ok && payload.status !== 'error') {\n throw new Error(`HTTP ${response.status}: ${JSON.stringify(payload)}`);\n }\n return payload;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { VcsInfo } from '../types.js';\nimport { detectVcs } from './vcs.js';\n\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n '.vibgrate',\n '.wrangler',\n '.next',\n 'dist',\n 'build',\n 'out',\n '.turbo',\n '.cache',\n 'coverage',\n 'bin',\n 'obj',\n '.vs',\n 'TestResults',\n '.nuxt',\n '.output',\n '.svelte-kit',\n]);\n\nexport interface RepoFingerprint {\n /** Primary dedup key when git HEAD is available */\n vcsSha?: string;\n /** Fallback content signature for non-git trees (hex sha256) */\n treeHash?: string;\n /** How the fingerprint was derived */\n method: 'git_sha' | 'tree_metadata' | 'unknown';\n}\n\nexport interface TreeFingerprintOptions {\n /** Skip directories with more than this many direct file children (default 500) */\n maxFilesPerDirectory?: number;\n}\n\n/**\n * Resolve a repository fingerprint for ingest deduplication.\n * Prefer git HEAD SHA; otherwise hash relative paths + size + mtime for scannable files.\n */\nexport async function computeRepoFingerprint(\n rootDir: string,\n vcs?: VcsInfo,\n): Promise<RepoFingerprint> {\n const vcsInfo = vcs ?? (await detectVcs(rootDir));\n if (vcsInfo.type === 'git' && vcsInfo.sha) {\n return { vcsSha: vcsInfo.sha, method: 'git_sha' };\n }\n\n const treeHash = await computeTreeMetadataHash(rootDir);\n if (treeHash) {\n return { treeHash, method: 'tree_metadata' };\n }\n\n return { method: 'unknown' };\n}\n\n/**\n * Merkle-style hash over scannable file metadata (path, size, mtime ms).\n * Same algorithm should be used client-side before scan and server-side when validating.\n */\nexport async function computeTreeMetadataHash(\n rootDir: string,\n options?: TreeFingerprintOptions,\n): Promise<string | undefined> {\n const maxFiles = options?.maxFilesPerDirectory ?? 500;\n const leaves: string[] = [];\n\n async function walk(absDir: string, relDir: string): Promise<void> {\n let entries;\n try {\n entries = await fs.readdir(absDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n const files = entries.filter((e) => e.isFile());\n if (files.length > maxFiles) {\n leaves.push(`${relDir || '.'}|dir_overflow|${files.length}`);\n return;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n const childRel = relDir ? `${relDir}/${entry.name}` : entry.name;\n await walk(path.join(absDir, entry.name), childRel);\n continue;\n }\n\n if (!entry.isFile()) continue;\n const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;\n const absPath = path.join(absDir, entry.name);\n try {\n const stat = await fs.stat(absPath);\n leaves.push(`${relPath}|${stat.size}|${stat.mtimeMs}`);\n } catch {\n // ignore unreadable files\n }\n }\n }\n\n await walk(path.resolve(rootDir), '');\n if (leaves.length === 0) return undefined;\n\n leaves.sort();\n const digest = crypto.createHash('sha256');\n for (const leaf of leaves) {\n digest.update(leaf);\n digest.update('\\n');\n }\n return digest.digest('hex');\n}\n","import { execFile } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport type { Dirent } from 'node:fs';\nimport { Semaphore } from './semaphore.js';\nimport { compileGlobs } from './glob.js';\n\n\nconst execFileAsync = promisify(execFile);\n\nconst SKIP_DIRS = new Set([\n 'node_modules',\n // Vendored third-party dependency trees (Go vendor/, PHP composer,\n // Rails vendor/) — their manifests are not the repo's own projects and\n // their runtimes/dependencies must not produce drift findings.\n 'vendor',\n '.git',\n '.vibgrate',\n '.wrangler',\n '.next',\n 'dist',\n 'build',\n 'out',\n '.turbo',\n '.cache',\n 'coverage',\n 'bin',\n 'obj',\n '.vs',\n 'TestResults',\n]);\n\n/** File extensions skipped during the walk — binary/font/media that no scanner needs to read */\nconst SKIP_EXTENSIONS = new Set([\n // Fonts\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n // Images & vector\n '.png', '.jpg', '.jpeg', '.gif', '.ico', '.bmp', '.tiff', '.tif', '.webp', '.avif', '.svg',\n '.heic', '.heif', '.jfif', '.psd', '.ai', '.eps', '.raw', '.cr2', '.nef', '.dng',\n // Video\n '.mp4', '.webm', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.m4v', '.mpg', '.mpeg', '.3gp', '.ogv',\n // Audio\n '.mp3', '.wav', '.ogg', '.flac', '.aac', '.wma', '.m4a', '.opus', '.aiff', '.mid', '.midi',\n // Archives\n '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',\n // Compiled / binary\n '.exe', '.dll', '.so', '.dylib', '.o', '.a', '.class', '.pyc', '.pdb',\n // Source maps & lockfiles (large, not useful for drift analysis)\n '.map',\n]);\n\nconst EXTRA_SKIP_DIRS = new Set(['.nuxt', '.output', '.svelte-kit']);\n\n// ── Directory entry gathered in a single walk ──\n\nexport interface DirEntry {\n /** Absolute path */\n absPath: string;\n /** Path relative to the walk root */\n relPath: string;\n /** Filename (basename) */\n name: string;\n /** Whether this is a regular file */\n isFile: boolean;\n /** Whether this is a directory */\n isDirectory: boolean;\n}\n\n// ── FileCache: walk once, read once ──\n\n/**\n * Maximum file size (in bytes) that will be held in the text cache.\n * Files larger than this are read from disk but NOT stored — this prevents\n * lockfiles (pnpm-lock.yaml, package-lock.json, etc.) from consuming\n * 50-200 MB of heap. Small config files like package.json (~1-5 KB each)\n * are cached normally.\n */\nconst TEXT_CACHE_MAX_BYTES = 1_048_576; // 1 MB\n\n/**\n * Shared cache that ensures the filesystem is walked at most once per root dir\n * and every small file is read at most once across all scanners.\n *\n * Memory-conscious design:\n * - Walk results are stored once; consumers filter in-memory.\n * - File content is only cached when ≤ TEXT_CACHE_MAX_BYTES (1 MB).\n * Large files (lockfiles) pass straight through without caching.\n * - readJsonFile evicts the raw-text entry after parsing so we never\n * hold *both* the string and the parsed object for the same file.\n * - No stat caching — only file-hotspots uses stat and there's no\n * cross-scanner reuse to justify holding thousands of Stats objects.\n * - Call `clear()` after the scan to release all remaining references.\n */\nexport class FileCache {\n /** Directory walk results keyed by rootDir */\n private walkCache = new Map<string, Promise<DirEntry[]>>();\n /** File content keyed by absolute path (only files ≤ TEXT_CACHE_MAX_BYTES) */\n private textCache = new Map<string, Promise<string>>();\n /** Parsed JSON keyed by absolute path */\n private jsonCache = new Map<string, Promise<unknown>>();\n /** pathExists keyed by absolute path */\n private existsCache = new Map<string, Promise<boolean>>();\n /** User-configured exclude predicate (compiled from glob patterns) */\n private excludePredicate: ((relPath: string) => boolean) | null = null;\n /** Directories that were auto-skipped because they were stuck */\n private _stuckPaths: string[] = [];\n /** Files skipped because they exceed maxFileSizeToScan */\n private _skippedLargeFiles: string[] = [];\n /** Maximum file size (bytes) we will read. 0 = unlimited. */\n private _maxFileSize = 0;\n /** Per-project / per-directory scan timeout in ms. */\n private _projectScanTimeout = 180_000;\n /** Whether we have already shown the \"increase projectScanTimeout\" hint */\n private _timeoutHintShown = false;\n /** Root dir for relative-path computation (set by the first walkDir call) */\n private _rootDir: string | null = null;\n /** Cached tree summary captured during the shared walk */\n private walkSummary = new Map<string, TreeCount>();\n /** Fast lookup for exact filename (e.g. package.json) */\n private fileNameIndex = new Map<string, Map<string, string[]>>();\n\n /** Set exclude patterns from config (call once before the walk) */\n setExcludePatterns(patterns: string[]): void {\n this.excludePredicate = compileGlobs(patterns);\n }\n\n /** Set the maximum file size in bytes that readTextFile / readJsonFile will process */\n setMaxFileSize(bytes: number): void {\n this._maxFileSize = bytes;\n }\n\n /** Set the per-project scan timeout (milliseconds). Scanners use this\n * instead of a hard-coded constant so the user can override it via config. */\n setProjectScanTimeout(ms: number): void {\n this._projectScanTimeout = ms;\n }\n\n /** Current per-project scan timeout in milliseconds */\n get projectScanTimeout(): number {\n return this._projectScanTimeout;\n }\n\n /** Record a path that timed out or was stuck during scanning */\n addStuckPath(relPath: string): void {\n this._stuckPaths.push(relPath);\n }\n\n /**\n * Returns true the first time it is called, false thereafter.\n * Used by scanners to print the \"increase projectScanTimeout\" hint\n * only once per scan run.\n */\n shouldShowTimeoutHint(): boolean {\n if (this._timeoutHintShown) return false;\n this._timeoutHintShown = true;\n return true;\n }\n\n /** Get all paths that were auto-skipped due to being stuck (dirs + scanner files) */\n get stuckPaths(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** @deprecated Use stuckPaths instead */\n get stuckDirs(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** Get files that were skipped because they exceeded maxFileSizeToScan */\n get skippedLargeFiles(): readonly string[] {\n return this._skippedLargeFiles;\n }\n\n // ── Directory walking ──\n\n /**\n * Walk the directory tree from `rootDir` once, skipping SKIP_DIRS plus\n * common framework output dirs (.nuxt, .output, .svelte-kit).\n *\n * The result is memoised so every scanner filters the same array.\n * Consumers that need additional filtering (e.g. SOURCE_EXTENSIONS,\n * SKIP_EXTENSIONS) do so on the returned entries — no separate walk.\n */\n walkDir(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n this._rootDir = rootDir;\n const cached = this.walkCache.get(rootDir);\n if (cached) return cached;\n\n const promise = this._doWalk(rootDir, onProgress);\n this.walkCache.set(rootDir, promise);\n return promise;\n }\n\n /** Return tree summary from the cached walk, if available. */\n getWalkSummary(rootDir: string): TreeCount | undefined {\n return this.walkSummary.get(rootDir);\n }\n\n /** Additional dirs skipped only by the cached walk (framework outputs) */\n private static readonly EXTRA_SKIP = EXTRA_SKIP_DIRS;\n\n private async _doWalk(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n const results: DirEntry[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n let foundCount = 0;\n let lastReported = 0;\n const REPORT_INTERVAL = 50; // report every N files\n // Semaphore limits concurrent readdir I/O only — NOT the entire\n // recursive walk. Previously sem.run wrapped the whole walk(),\n // so parent directories held a slot while awaiting children,\n // starving deep trees into near-serial execution.\n const sem = new Semaphore(maxConcurrentReads);\n const STUCK_TIMEOUT_MS = this._projectScanTimeout;\n\n const extraSkip = FileCache.EXTRA_SKIP;\n const isExcluded = this.excludePredicate;\n const stuckDirs = this._stuckPaths;\n\n async function walk(dir: string) {\n const relDir = path.relative(rootDir, dir);\n\n // Report the directory we are ABOUT to read so the UI shows\n // where we are if this readdir gets stuck.\n if (onProgress) {\n onProgress(foundCount, relDir || '.');\n }\n\n // Acquire the semaphore ONLY for the readdir I/O, then release\n // immediately so parent dirs don't hold slots while awaiting children.\n let entries: Dirent[] | null;\n try {\n entries = await sem.run(async () => {\n const readPromise = fs.readdir(dir, { withFileTypes: true });\n let stuckTimer: ReturnType<typeof setTimeout>;\n const result = await Promise.race([\n readPromise.then((e) => ({ ok: true as const, entries: e })),\n new Promise<{ ok: false }>((resolve) => {\n stuckTimer = setTimeout(() => resolve({ ok: false }), STUCK_TIMEOUT_MS);\n stuckTimer.unref();\n }),\n ]);\n clearTimeout(stuckTimer!);\n if (!result.ok) {\n // Directory read timed out — record and skip\n stuckDirs.push(relDir || dir);\n return null;\n }\n return result.entries;\n });\n } catch {\n return;\n }\n if (!entries) return;\n\n const subWalks: Promise<void>[] = [];\n for (const e of entries) {\n const absPath = path.join(dir, e.name);\n const relPath = path.relative(rootDir, absPath);\n\n // Check user-configured excludes\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (SKIP_DIRS.has(e.name) || extraSkip.has(e.name)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: false, isDirectory: true });\n // Launch sub-walk WITHOUT wrapping in sem.run — child walks\n // acquire the semaphore independently for their own readdir.\n subWalks.push(walk(absPath));\n } else if (e.isFile()) {\n // Skip binary/font/media files that no scanner needs\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: true, isDirectory: false });\n foundCount++;\n if (onProgress && foundCount - lastReported >= REPORT_INTERVAL) {\n lastReported = foundCount;\n onProgress(foundCount, relPath);\n }\n }\n }\n await Promise.all(subWalks);\n }\n\n await walk(rootDir);\n\n let totalDirs = 0;\n const rootNameIndex = new Map<string, string[]>();\n for (const entry of results) {\n if (entry.isDirectory) totalDirs++;\n if (!entry.isFile) continue;\n const bucket = rootNameIndex.get(entry.name);\n if (bucket) {\n bucket.push(entry.absPath);\n } else {\n rootNameIndex.set(entry.name, [entry.absPath]);\n }\n }\n this.walkSummary.set(rootDir, { totalFiles: foundCount, totalDirs });\n this.fileNameIndex.set(rootDir, rootNameIndex);\n\n // Final progress report\n if (onProgress && foundCount !== lastReported) {\n onProgress(foundCount, '');\n }\n return results;\n }\n\n /**\n * Find files matching a predicate from the cached walk.\n * Returns absolute paths (same contract as the standalone `findFiles`).\n */\n async findFiles(rootDir: string, predicate: (name: string) => boolean): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && predicate(e.name)).map((e) => e.absPath);\n }\n\n async findPackageJsonFiles(rootDir: string): Promise<string[]> {\n await this.walkDir(rootDir);\n return this.fileNameIndex.get(rootDir)?.get('package.json') ?? [];\n }\n\n async findCsprojFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.csproj')).map((e) => e.absPath);\n }\n\n async findSolutionFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.sln')).map((e) => e.absPath);\n }\n\n /**\n * Count files under a given directory using the cached walk data.\n * Avoids a redundant recursive readdir that can be slow on large\n * project trees (the main cause of per-project timeout hits).\n * Falls back to the standalone `countFilesInDir` if the walk hasn't\n * been populated yet.\n */\n async countFilesUnder(rootDir: string, dir: string): Promise<number> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to standalone count\n return countFilesInDir(dir);\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n let count = 0;\n for (const e of resolved) {\n if (!e.isFile) continue;\n // File is directly in `dir` or in a subdirectory of `dir`\n if (e.absPath === dir || e.absPath.startsWith(prefix)) {\n count++;\n }\n }\n return count;\n }\n\n // ── File content reading ──\n\n /**\n * Read a text file. Files ≤ 1 MB are cached so subsequent calls from\n * different scanners return the same string. Files > 1 MB (lockfiles,\n * large generated files) are read directly and never retained.\n *\n * If maxFileSizeToScan is set and the file exceeds it, the file is\n * recorded as skipped and an empty string is returned.\n */\n readTextFile(filePath: string): Promise<string> {\n const abs = path.resolve(filePath);\n const cached = this.textCache.get(abs);\n if (cached) return cached;\n\n const maxSize = this._maxFileSize;\n const skippedLarge = this._skippedLargeFiles;\n const rootDir = this._rootDir;\n\n // Read file, then decide whether to cache based on size\n const promise = (async () => {\n // Check file size before reading when a limit is configured\n if (maxSize > 0) {\n try {\n const stat = await fs.stat(abs);\n if (stat.size > maxSize) {\n const rel = rootDir ? path.relative(rootDir, abs) : abs;\n skippedLarge.push(rel);\n this.textCache.delete(abs);\n return '';\n }\n } catch {\n // If stat fails, fall through and let readFile handle it\n }\n }\n\n const content = await fs.readFile(abs, 'utf8');\n if (content.length > TEXT_CACHE_MAX_BYTES) {\n // Too large for cache — evict so we don't hold it\n this.textCache.delete(abs);\n }\n return content;\n })();\n\n // Temporarily store the promise so concurrent callers during the same\n // tick await the same read (avoids double-reads even for large files).\n this.textCache.set(abs, promise);\n return promise;\n }\n\n /**\n * Read and parse a JSON file. The parsed object is cached; the raw\n * text is evicted immediately so we never hold both representations.\n */\n readJsonFile<T>(filePath: string): Promise<T> {\n const abs = path.resolve(filePath);\n const cached = this.jsonCache.get(abs);\n if (cached) return cached as Promise<T>;\n\n const promise = this.readTextFile(abs).then((txt) => {\n // Evict raw text — we now have the parsed object\n this.textCache.delete(abs);\n return JSON.parse(stripBom(txt)) as T;\n });\n this.jsonCache.set(abs, promise);\n return promise;\n }\n\n // ── Existence checks ──\n\n pathExists(p: string): Promise<boolean> {\n const abs = path.resolve(p);\n const cached = this.existsCache.get(abs);\n if (cached) return cached;\n const promise = fs.access(abs).then(() => true, () => false);\n this.existsCache.set(abs, promise);\n return promise;\n }\n\n // ── Lifecycle ──\n\n /** Release all cached data. Call after the scan completes. */\n clear(): void {\n this.walkCache.clear();\n this.walkSummary.clear();\n this.fileNameIndex.clear();\n this.textCache.clear();\n this.jsonCache.clear();\n this.existsCache.clear();\n }\n\n /** Number of file content entries currently held */\n get textCacheSize(): number { return this.textCache.size; }\n /** Number of parsed JSON entries currently held */\n get jsonCacheSize(): number { return this.jsonCache.size; }\n}\n\n// ── Quick tree count (fast pre-scan) ──\n\nexport interface TreeCount {\n /** Total files discovered (excluding skipped dirs) */\n totalFiles: number;\n /** Total subdirectories discovered (excluding skipped dirs) */\n totalDirs: number;\n}\n\n/**\n * Fast, lightweight traversal that only *counts* files and directories\n * without storing entries. Used before the main scan so the progress\n * bar can show an accurate percentage.\n *\n * Respects the same SKIP_DIRS as the full walk.\n */\nexport async function quickTreeCount(rootDir: string, excludePatterns?: string[]): Promise<TreeCount> {\n const native = await quickTreeCountWithRipgrep(rootDir, excludePatterns);\n if (native) return native;\n\n let totalFiles = 0;\n let totalDirs = 0;\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrent = Math.max(8, Math.min(128, cores * 8));\n const sem = new Semaphore(maxConcurrent);\n const extraSkip = EXTRA_SKIP_DIRS;\n const isExcluded = excludePatterns ? compileGlobs(excludePatterns) : null;\n\n async function count(dir: string) {\n let entries: Dirent[];\n try {\n entries = await sem.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n const relPath = path.relative(rootDir, path.join(dir, e.name));\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (SKIP_DIRS.has(e.name) || extraSkip.has(e.name)) continue;\n totalDirs++;\n subs.push(count(path.join(dir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) totalFiles++;\n }\n }\n await Promise.all(subs);\n }\n\n await count(rootDir);\n return { totalFiles, totalDirs };\n}\n\n\n\nexport function normalizeGlobForRipgrep(pattern: string): string {\n return pattern.replace(/\\\\/g, '/');\n}\n\nasync function quickTreeCountWithRipgrep(rootDir: string, excludePatterns?: string[]): Promise<TreeCount | null> {\n const args = ['--files', '--hidden', '--no-ignore', '--null'];\n\n for (const dir of SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const dir of EXTRA_SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const ext of SKIP_EXTENSIONS) {\n args.push('-g', `!**/*${ext}`);\n }\n for (const pattern of (excludePatterns ?? [])) {\n const trimmed = pattern.trim();\n if (!trimmed) continue;\n args.push('-g', `!${normalizeGlobForRipgrep(trimmed)}`);\n }\n\n try {\n const { stdout } = await execFileAsync('rg', args, { cwd: rootDir, maxBuffer: 64 * 1024 * 1024, encoding: 'utf8' });\n if (!stdout) return { totalFiles: 0, totalDirs: 0 };\n\n const files = stdout.split('\\0').filter(Boolean);\n const dirs = new Set<string>();\n for (const file of files) {\n const dir = path.dirname(file);\n if (dir && dir !== '.') dirs.add(dir);\n }\n\n return { totalFiles: files.length, totalDirs: dirs.size };\n } catch {\n return null;\n }\n}\n\n/**\n * Count the number of source files in a directory (non-recursive by default).\n * For project-level file counting, skips binary/media files.\n */\nexport async function countFilesInDir(dir: string, recursive = true): Promise<number> {\n let count = 0;\n const extraSkip = new Set(['obj', 'bin', 'Debug', 'Release', 'TestResults']);\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!recursive) continue;\n if (SKIP_DIRS.has(e.name) || extraSkip.has(e.name)) continue;\n subs.push(walk(path.join(currentDir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) count++;\n }\n }\n await Promise.all(subs);\n }\n\n await walk(dir);\n return count;\n}\n\n/** Recursively find files matching a predicate, skipping common build/output dirs */\nexport async function findFiles(\n rootDir: string,\n predicate: (name: string) => boolean,\n): Promise<string[]> {\n const results: string[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n const readDirSemaphore = new Semaphore(maxConcurrentReads);\n\n async function walk(dir: string) {\n let entries: Dirent[];\n try {\n entries = await readDirSemaphore.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n\n const subDirectoryWalks: Promise<void>[] = [];\n\n for (const e of entries) {\n if (e.isDirectory()) {\n if (SKIP_DIRS.has(e.name)) continue;\n subDirectoryWalks.push(walk(path.join(dir, e.name)));\n } else if (e.isFile() && predicate(e.name)) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) results.push(path.join(dir, e.name));\n }\n }\n\n await Promise.all(subDirectoryWalks);\n }\n\n await walk(rootDir);\n return results;\n}\n\nexport async function findPackageJsonFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name === 'package.json');\n}\n\nexport async function findSolutionFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.sln'));\n}\n\nexport async function findCsprojFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.csproj'));\n}\n\n/**\n * Strip a UTF-8 byte-order mark — editors on Windows commonly save\n * manifests with a BOM, and JSON.parse rejects it, which silently\n * dropped the project from scan results.\n */\nexport function stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const txt = await fs.readFile(filePath, 'utf8');\n return JSON.parse(stripBom(txt)) as T;\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf8');\n}\n\nexport async function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf8');\n}\n\nexport async function writeTextFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf8');\n}\n"]}
|