@vibgrate/cli 2026.720.4 → 2026.721.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/util/output.ts","../src/util/logo.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts","../src/commands/status.ts","../src/commands/util.ts","../src/commands/ask.ts","../src/commands/embed.ts","../src/commands/ambiguity.ts","../src/commands/show.ts","../src/commands/path.ts","../src/commands/tree.ts","../src/commands/insights.ts","../src/commands/impact.ts","../src/commands/unknowns.ts","../src/engine/stats-share.ts","../src/util/origin.ts","../src/mcp/live-stats.ts","../src/mcp/serve-stats.ts","../src/mcp/ledger-tail.ts","../src/commands/serve.ts","../src/lsp/protocol.ts","../src/lsp/manifest-positions.ts","../src/lsp/scan-cache.ts","../src/lsp/graph-query.ts","../src/lsp/enrich.ts","../src/lsp/server.ts","../src/commands/lsp.ts","../src/commands/install.ts","../src/commands/share.ts","../src/commands/benchmark.ts","../src/commands/tests.ts","../src/commands/facts.ts","../src/commands/guide.ts","../src/commands/why.ts","../src/commands/bisect.ts","../src/engine/standards.ts","../src/commands/drift.ts","../src/commands/models.ts","../src/commands/savings.ts","../src/commands/lib.ts","../src/commands/export.ts","../src/commands/bundle.ts","../src/commands/doctor.ts","../src/reporting/commands/init.ts","../src/reporting/reachability.ts","../src/reporting/utils/ingest-id-output.ts","../src/reporting/ai-context-prompt.ts","../src/reporting/commands/scan.ts","../src/reporting/utils/scan-freshness.ts","../src/reporting/planning/contracts.ts","../src/reporting/planning/usage.ts","../src/reporting/utils/fix-plan.ts","../src/reporting/planning/render.ts","../src/reporting/planning/dedupe.ts","../src/reporting/planning/expected-drift.ts","../src/reporting/planning/apply.ts","../src/reporting/utils/update-check.ts","../src/reporting/commands/update.ts","../src/reporting/commands/fix.ts","../src/reporting/formatters/text.ts","../src/reporting/formatters/markdown.ts","../src/reporting/commands/report.ts","../src/reporting/utils/open-url.ts","../src/reporting/commands/login.ts","../src/reporting/utils/shell.ts","../src/reporting/commands/logout.ts","../src/reporting/commands/vex.ts","../src/reporting/commands/sbom.ts","../src/cli.ts"],"names":["fs","crypto2","resolve","chalk","path2","rel","fs2","path3","fs3","path4","out","pad","path5","fs4","key","path6","now","fs5","teal","mint","fs6","fs7","handler","path7","walk","fs8","nodeSummary","path8","fs9","path9","next","mb","fs11","c","path","parseDsn","fs14","path12","path13","fs15","fs16","path14","parsed","Command","path15","vibgrateDir","pathExists","readFile","path16","stat","path17","path18","SKIP_DIRS","fs18","path19","MAX_FILE_BYTES","escapeRegExp","fs20","path21","path22","path23","os2","fs21","fsSync","execSync","path24","os3","semver","path25","os4","readline2","path26","spawn","path27","randomUUID","path28","json","path29","fs22","path30","realpathSync","fileURLToPath"],"mappings":"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","file":"cli.js","sourcesContent":["import * as crypto from 'node:crypto';\nimport { canonicalize } from './hash.js';\nimport { VERSION } from '../version.js';\nimport type { Toolchain, VgGraph } from '../schema.js';\n\n/**\n * `vg attest` — a signed, reproducible attestation over the code graph.\n *\n * This is the moat made load-bearing: a consumer can cryptographically verify,\n * offline, that a graph was produced by a named toolchain over a named commit and\n * has not changed since. We sign an in-toto Statement wrapped in a DSSE envelope\n * with Ed25519 (`node:crypto`, zero dependencies) — interoperable with\n * `cosign verify-blob-attestation`. Ed25519 signatures are deterministic\n * (RFC 8032), so the same graph + key produce a byte-identical envelope.\n *\n * The subject digest excludes the graph's volatile `generatedAt`, so it is\n * reproducible across rebuilds of identical content — which is exactly what makes\n * the attestation verifiable rather than a timestamped snapshot.\n */\n\nexport const DSSE_PAYLOAD_TYPE = 'application/vnd.in-toto+json';\nexport const IN_TOTO_STATEMENT_TYPE = 'https://in-toto.io/Statement/v1';\nexport const VG_PREDICATE_TYPE = 'https://vibgrate.com/attestation/code-graph/v1';\n\nexport interface CommitInfo {\n sha?: string;\n shortSha?: string;\n branch?: string;\n dirty?: boolean; // uncommitted changes vs sha — never verified-clean when true\n}\n\nexport interface AttestPredicate {\n tool: { name: 'vg'; version: string };\n toolchain?: Toolchain;\n corpusHash: string;\n graphDigest: string; // sha256 of the canonical graph (generatedAt excluded)\n counts: VgGraph['meta']['counts'];\n commit?: CommitInfo;\n sbomDigest?: string; // sha256 of an accompanying SBOM, if attested together\n timestamp?: string; // optional, opt-in (omitted by default for determinism)\n}\n\nexport interface InTotoStatement {\n _type: string;\n subject: { name: string; digest: { sha256: string } }[];\n predicateType: string;\n predicate: AttestPredicate;\n}\n\nexport interface DsseSignature {\n keyid: string;\n sig: string; // base64\n publicKey?: string; // PEM, embedded so the envelope self-verifies for integrity\n}\n\nexport interface DsseEnvelope {\n payloadType: string;\n payload: string; // base64 of the Statement JSON\n signatures: DsseSignature[];\n}\n\nexport function sha256Hex(input: string | Uint8Array): string {\n return crypto.createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * sha256 over the canonical graph with the volatile `generatedAt` excluded, so\n * two builds of identical content attest to the same digest.\n */\nexport function graphSubjectDigest(graph: VgGraph): string {\n const { generatedAt: _omit, ...rest } = graph;\n return sha256Hex(canonicalize(rest));\n}\n\n/** The 16-hex key id: a truncated sha256 over the SPKI DER public key. */\nexport function keyId(publicKey: crypto.KeyObject): string {\n return sha256Hex(publicKey.export({ type: 'spki', format: 'der' })).slice(0, 16);\n}\n\nexport interface StatementInput {\n commit?: CommitInfo;\n sbomDigest?: string;\n timestamp?: string;\n}\n\nexport function buildStatement(graph: VgGraph, input: StatementInput = {}): InTotoStatement {\n const graphDigest = graphSubjectDigest(graph);\n const predicate: AttestPredicate = {\n tool: { name: 'vg', version: VERSION },\n toolchain: graph.provenance.toolchain,\n corpusHash: graph.provenance.corpusHash,\n graphDigest,\n counts: graph.meta.counts,\n };\n if (input.commit) predicate.commit = input.commit;\n if (input.sbomDigest) predicate.sbomDigest = input.sbomDigest;\n if (input.timestamp) predicate.timestamp = input.timestamp;\n return {\n _type: IN_TOTO_STATEMENT_TYPE,\n subject: [{ name: 'graph.json', digest: { sha256: graphDigest } }],\n predicateType: VG_PREDICATE_TYPE,\n predicate,\n };\n}\n\n/**\n * DSSE Pre-Authentication Encoding:\n * \"DSSEv1\" SP len(type) SP type SP len(body) SP body\n * with lengths as ASCII decimal byte counts. Signing the PAE (not the raw body)\n * is what binds the payloadType to the signature.\n */\nexport function dssePae(payloadType: string, body: Uint8Array): Buffer {\n const typeBytes = Buffer.from(payloadType, 'utf8');\n const header = Buffer.from(\n `DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `,\n 'utf8',\n );\n return Buffer.concat([header, Buffer.from(body)]);\n}\n\n/** Sign a statement, returning a self-contained DSSE envelope. */\nexport function signStatement(statement: InTotoStatement, privateKey: crypto.KeyObject): DsseEnvelope {\n const body = Buffer.from(JSON.stringify(statement), 'utf8');\n const pae = dssePae(DSSE_PAYLOAD_TYPE, body);\n const sig = crypto.sign(null, pae, privateKey);\n // Derive the public key from the private key (via its PEM, for @types/node compat).\n const publicKey = crypto.createPublicKey(privateKey.export({ type: 'pkcs8', format: 'pem' }).toString());\n return {\n payloadType: DSSE_PAYLOAD_TYPE,\n payload: body.toString('base64'),\n signatures: [\n {\n keyid: keyId(publicKey),\n sig: sig.toString('base64'),\n publicKey: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n },\n ],\n };\n}\n\nexport type AttestStatus = 'verified' | 'signature-valid' | 'failed';\n\nexport interface VerifyResult {\n status: AttestStatus;\n signatureValid: boolean;\n signerPinned: boolean; // signature verified against a caller-supplied trusted key\n digestMatches?: boolean; // recomputed graph digest matches the attested one\n dirty?: boolean; // the attested commit had uncommitted changes\n keyid: string;\n reason: string;\n statement: InTotoStatement;\n}\n\n/**\n * Verify an envelope. Honest states, never a fabricated pass:\n * failed — bad signature, or the on-disk graph no longer matches.\n * signature-valid — cryptographically intact, but signer not pinned (or dirty).\n * verified — pinned signer + matching digest + clean tree.\n */\n/** An empty statement for results where the envelope could not even be parsed. */\nfunction emptyStatement(): InTotoStatement {\n return {\n _type: '',\n subject: [],\n predicateType: '',\n predicate: {\n tool: { name: 'vg', version: '' },\n corpusHash: '',\n graphDigest: '',\n counts: { nodes: 0, edges: 0, areas: 0, tests: 0, untested: 0 },\n },\n };\n}\n\nfunction failedResult(reason: string): VerifyResult {\n return {\n status: 'failed',\n signatureValid: false,\n signerPinned: false,\n keyid: '',\n reason,\n statement: emptyStatement(),\n };\n}\n\nexport function verifyEnvelope(\n env: DsseEnvelope,\n opts: { publicKeyPem?: string; graph?: VgGraph } = {},\n): VerifyResult {\n // A `.intoto.jsonl` is attacker-supplied input: every decode/parse/key step\n // must degrade to an honest `failed`, never crash the command.\n let body: Buffer;\n let statement: InTotoStatement;\n try {\n body = Buffer.from(env?.payload ?? '', 'base64');\n const parsed = JSON.parse(body.toString('utf8')) as InTotoStatement;\n if (!parsed || typeof parsed !== 'object' || !parsed.predicate) {\n throw new Error('missing predicate');\n }\n statement = parsed;\n } catch {\n return failedResult('malformed attestation payload (not a valid in-toto statement)');\n }\n\n const pae = dssePae(env.payloadType, body);\n const sig0 = env.signatures?.[0];\n const keyid = sig0?.keyid ?? '';\n const sig = sig0?.sig ? Buffer.from(sig0.sig, 'base64') : Buffer.alloc(0);\n\n let signatureValid = false;\n let signerPinned = false;\n try {\n if (sig0 && sig.length) {\n if (opts.publicKeyPem) {\n const pinnedKey = crypto.createPublicKey(opts.publicKeyPem);\n signatureValid = crypto.verify(null, pae, pinnedKey, sig);\n signerPinned = signatureValid;\n } else if (sig0.publicKey) {\n const embeddedKey = crypto.createPublicKey(sig0.publicKey);\n signatureValid = crypto.verify(null, pae, embeddedKey, sig);\n }\n }\n } catch {\n // Malformed key or signature bytes → not a valid signature (not a crash).\n signatureValid = false;\n signerPinned = false;\n }\n\n const digestMatches = opts.graph\n ? graphSubjectDigest(opts.graph) === statement.predicate.graphDigest\n : undefined;\n const dirty = statement.predicate.commit?.dirty;\n\n let status: AttestStatus;\n let reason: string;\n if (!signatureValid) {\n status = 'failed';\n reason = sig0 ? 'signature verification failed' : 'no signature in envelope';\n } else if (digestMatches === false) {\n status = 'failed';\n reason = 'graph.json no longer matches the attested digest (content changed since signing)';\n } else if (signerPinned && !dirty) {\n status = 'verified';\n reason =\n digestMatches === true\n ? 'signature valid, signer trusted, graph digest matches'\n : 'signature valid, signer trusted';\n } else {\n status = 'signature-valid';\n reason = dirty\n ? 'signature valid but the attested tree was dirty (uncommitted changes)'\n : 'signature valid but signer not pinned — pass --pub to establish trust';\n }\n\n return { status, signatureValid, signerPinned, digestMatches, dirty, keyid, reason, statement };\n}\n\nexport interface GeneratedKeypair {\n privatePem: string;\n publicPem: string;\n keyid: string;\n}\n\n/** Mint a fresh Ed25519 keypair for signing attestations. */\nexport function generateKeypair(): GeneratedKeypair {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');\n return {\n privatePem: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),\n publicPem: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n keyid: keyId(publicKey),\n };\n}\n\n/** Serialize an envelope as a single-line `.intoto.jsonl` record (deterministic). */\nexport function serializeEnvelope(env: DsseEnvelope): string {\n return `${JSON.stringify(env)}\\n`;\n}\n\nexport function parseEnvelope(text: string): DsseEnvelope {\n const line = text.trim().split('\\n')[0];\n return JSON.parse(line) as DsseEnvelope;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { execFile } from 'node:child_process';\nimport { loadGraph } from '../engine/load.js';\nimport { resolveHead, workingTreeDirty } from '../core-open/utils/git-history.js';\nimport {\n buildStatement,\n signStatement,\n verifyEnvelope,\n generateKeypair,\n serializeEnvelope,\n parseEnvelope,\n type CommitInfo,\n type VerifyResult,\n} from '../engine/attest.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Attestation actions folded into the graph lifecycle: `vg build --attest` signs\n * the graph it just built; `vg build --verify` checks a committed attestation.\n * The crypto lives in engine/attest.ts; this is the file/key/git glue + output.\n */\n\nconst DEFAULT_ATTESTATION = 'attestation.intoto.jsonl';\nconst DEFAULT_KEY = 'attest-key.pem';\n\nexport interface SignOpts {\n /** Signing key PEM path; else $VG_ATTEST_KEY; else .vibgrate/attest-key.pem (auto-minted). */\n key?: string;\n /** Output path for the attestation (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n}\n\nexport interface SignSummary {\n keyid: string;\n graphDigest: string;\n fingerprint?: string;\n commit?: CommitInfo;\n out: string;\n keyGeneratedAt?: string;\n}\n\n/** Sign an already-built graph, writing a DSSE attestation. Returns a summary +\n * human notices (the caller decides how to render them alongside build output). */\nexport async function signGraphAttestation(\n root: string,\n graph: VgGraph,\n opts: SignOpts,\n): Promise<{ summary: SignSummary; notices: string[] }> {\n const notices: string[] = [];\n const explicitKey = opts.key ?? process.env.VG_ATTEST_KEY;\n const keyPath = explicitKey ? path.resolve(explicitKey) : path.join(root, '.vibgrate', DEFAULT_KEY);\n\n let keyGeneratedAt: string | undefined;\n if (!fs.existsSync(keyPath)) {\n if (explicitKey) {\n throw new CliError(`signing key not found: ${explicitKey}`, ExitCode.USAGE_ERROR);\n }\n // First use with no key: mint one at the default path (loud — it must be kept\n // and gitignored to re-sign reproducibly).\n const kp = generateKeypair();\n fs.mkdirSync(path.dirname(keyPath), { recursive: true });\n fs.writeFileSync(keyPath, kp.privatePem, { mode: 0o600 });\n fs.writeFileSync(`${keyPath}.pub`, kp.publicPem);\n keyGeneratedAt = keyPath;\n notices.push(\n `minted a new Ed25519 signing key at ${rel(root, keyPath)} (keyid ${kp.keyid}) — ` +\n `keep it, add it to .gitignore, and reuse it to re-sign reproducibly`,\n );\n }\n\n let privateKey: crypto.KeyObject;\n try {\n privateKey = crypto.createPrivateKey(fs.readFileSync(keyPath, 'utf8'));\n } catch {\n throw new CliError(`could not read an Ed25519 private key from ${rel(root, keyPath)}`, ExitCode.USAGE_ERROR);\n }\n if (privateKey.asymmetricKeyType !== 'ed25519') {\n throw new CliError(\n `attest requires an Ed25519 key, but ${rel(root, keyPath)} is ${privateKey.asymmetricKeyType ?? 'unknown'}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const commit = await gitCommitInfo(root);\n const statement = buildStatement(graph, { commit });\n const envelope = signStatement(statement, privateKey);\n const outPath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, serializeEnvelope(envelope));\n\n return {\n summary: {\n keyid: envelope.signatures[0]?.keyid ?? '',\n graphDigest: statement.predicate.graphDigest,\n fingerprint: statement.predicate.toolchain?.fingerprint,\n commit,\n out: rel(root, outPath),\n keyGeneratedAt: keyGeneratedAt ? rel(root, keyGeneratedAt) : undefined,\n },\n notices,\n };\n}\n\nexport interface VerifyOpts {\n /** Attestation path (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n /** Public key PEM to pin the signer (else integrity-only verification). */\n pub?: string;\n}\n\nexport interface AttestVerifyOutcome {\n bundlePath: string;\n /** True when no attestation exists at the default path (and none was required). */\n missing: boolean;\n result?: VerifyResult;\n}\n\n/** Verify a committed attestation against the on-disk graph. Returns the outcome\n * (the caller renders + decides the exit code). Throws only when an attestation\n * was explicitly requested but is absent. */\nexport function verifyGraphAttestation(root: string, opts: VerifyOpts): AttestVerifyOutcome {\n const bundlePath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n if (!fs.existsSync(bundlePath)) {\n if (opts.attestation || opts.pub) {\n throw new CliError(\n `no attestation at ${rel(root, bundlePath)} — sign one with \\`vg build --attest\\``,\n ExitCode.NOT_FOUND,\n );\n }\n return { bundlePath, missing: true };\n }\n const envelope = parseEnvelope(fs.readFileSync(bundlePath, 'utf8'));\n const publicKeyPem = opts.pub ? fs.readFileSync(path.resolve(opts.pub), 'utf8') : undefined;\n const graph = loadGraph(root) ?? undefined;\n return { bundlePath, missing: false, result: verifyEnvelope(envelope, { publicKeyPem, graph }) };\n}\n\nasync function gitCommitInfo(root: string): Promise<CommitInfo | undefined> {\n const sha = await resolveHead(root);\n if (!sha) return undefined;\n const dirty = await workingTreeDirty(root);\n const branch = await gitBranch(root);\n return { sha, shortSha: sha.slice(0, 7), branch, dirty: dirty === true ? true : dirty === false ? false : undefined };\n}\n\n/** Best-effort current branch name; undefined on detached HEAD or no git. */\nfunction gitBranch(root: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { cwd: root, timeout: 5000, windowsHide: true, encoding: 'utf8' },\n (err, stdout) => {\n if (err) return resolve(undefined);\n const name = String(stdout).trim();\n resolve(name && name !== 'HEAD' ? name : undefined);\n },\n );\n });\n}\n\nfunction rel(root: string, p: string): string {\n const r = path.relative(root, p);\n return r.startsWith('..') ? p : r;\n}\n","import chalk from 'chalk';\n\n/**\n * Output conventions (VG-CLI-SPEC §1.1): human output + progress → stderr;\n * machine output (JSON/exports) → stdout. So `vg \"…\" --json | jq` and\n * `vg export - …` pipe cleanly.\n */\n\nexport function info(message = ''): void {\n process.stderr.write(`${message}\\n`);\n}\n\nexport function out(message: string): void {\n process.stdout.write(`${message}\\n`);\n}\n\nexport function json(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport const c = chalk;\n\n/** Honor NO_COLOR / --no-color via chalk's level (set by the CLI bootstrap). */\nexport function disableColor(): void {\n chalk.level = 0;\n}\n","import { c } from './output.js';\nimport { VERSION } from '../version.js';\n\n/**\n * The `vg` brand banner — the same boxy robot mark and brand colours (teal/mint)\n * as the Vibgrate scanner (`vibgrate-cli/src/ui/progress.ts`), replicated here so\n * the open graph package stays standalone.\n *\n * The wordmark is stacked BELOW the mark rather than beside it: the robot's eye\n * (`◼`) and arrow (`➜`) glyphs are East-Asian \"ambiguous\"/wide, so terminals that\n * render them double-width make the rows unequal — text placed to their right\n * (the scanner's layout) then misaligns. Nothing sits beside the art here, so the\n * banner lines up in every terminal. Shown on `vg build` for a human at a TTY;\n * never on `--json`, `--quiet`, or under a pipe.\n */\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\n// ── Boxy robot mark — identical glyphs/colours to the scanner's ROBOT ──\nconst ROBOT = [\n ' ' + teal('╭──────╮') + mint('➜'),\n ' ' + c.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + c.dim('├'),\n ' ' + c.dim('┤') + teal('│') + ' ' + c.dim('▁▁') + ' ' + teal('│') + c.dim('├'),\n ' ' + teal('╰──────╯'),\n] as const;\n\n/**\n * The banner as lines (no I/O) so it is unit-testable. The robot mark is a\n * self-contained block; the wordmark/tagline sit on their OWN lines beneath it\n * (never beside the variable-width glyphs), so the banner aligns in any terminal.\n */\nexport function logoLines(root?: string, opts: { product?: string; tagline?: string } = {}): string[] {\n const product = opts.product ?? 'Graph';\n const tagline = opts.tagline ?? 'Code Intelligence Engine';\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('Vibgrate')} ${teal(product)} ${c.dim(`· ${tagline} · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the banner to stderr, only for an interactive human (TTY). */\nexport function printLogo(root?: string, opts: { product?: string; tagline?: string } = {}): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${logoLines(root, opts).join('\\n')}\\n`);\n}\n","import { c } from './output.js';\nimport { brandProgressBar } from '../core-open/ui/bar.js';\n\n/**\n * A small progress bar matching the scanner's style\n * (`vibgrate-core-open/src/ui/progress.ts`): a smooth sub-cell gradient bar\n * (shared `brandProgressBar`), a braille spinner, percent, elapsed and ETA.\n * Renders to **stderr** in place, and only when stderr is a TTY — under a\n * pipe/CI it stays silent so logs aren't polluted.\n */\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst WIDTH = 30;\n\nfunction fmtDuration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n}\n\n/**\n * Pure render of one progress line (no I/O, no clock) so it is unit-testable.\n * `elapsedMs` and `frame` are passed in by the caller.\n */\nexport function formatProgressLine(\n label: string,\n done: number,\n total: number,\n elapsedMs: number,\n frame: number,\n): string {\n const ratio = total > 0 ? Math.min(done / total, 1) : 0;\n const bar = brandProgressBar(ratio, WIDTH);\n const pct = Math.round(ratio * 100);\n const spin = c.cyan(FRAMES[((frame % FRAMES.length) + FRAMES.length) % FRAMES.length]);\n const eta = ratio > 0.02 && ratio < 1 ? ` · eta ${fmtDuration((elapsedMs / ratio) * (1 - ratio))}` : '';\n return ` ${spin} ${label} ${bar} ${c.bold(`${pct}%`)} ${c.dim(`${done}/${total} · ${fmtDuration(elapsedMs)}${eta}`)}`;\n}\n\n/** Live, in-place progress bar on stderr (no-op when stderr isn't a TTY). */\nexport class ProgressBar {\n private readonly start = Date.now();\n private frame = 0;\n private readonly tty = Boolean(process.stderr.isTTY);\n\n constructor(private readonly label: string) {}\n\n update(done: number, total: number): void {\n if (!this.tty) return;\n const line = formatProgressLine(this.label, done, total, Date.now() - this.start, this.frame++);\n process.stderr.write(`\\r\\x1b[2K${line}`);\n }\n\n /** Clear the bar; optionally print a final summary line. */\n done(summary?: string): void {\n if (!this.tty) return;\n process.stderr.write('\\r\\x1b[2K');\n if (summary) process.stderr.write(`${summary}\\n`);\n }\n}\n","import type { Command } from 'commander';\n\n/** Global flags shared across all `vg` commands (VG-CLI-SPEC §1.1). */\nexport interface GlobalOpts {\n /** -C, --cwd <dir> */\n cwd?: string;\n /** --deep */\n deep?: boolean;\n /** --json */\n json?: boolean;\n /** --generated-at <iso> */\n generatedAt?: string;\n /** --graph <file> (override the map path) */\n graph?: string;\n /** --no-cache (commander exposes this as `cache: false`) */\n noCache?: boolean;\n /** --local (never touch the network) */\n local?: boolean;\n /** --quiet */\n quiet?: boolean;\n /**\n * --client <name> — the AI on the other end (e.g. `claude`, `cursor`). When an\n * AI host runs `vg`, passing this lets navigation calls be counted in the local\n * savings ledger with the command-vs-MCP split, so `vg savings` and the opt-in\n * share-stats upload can attribute usage. Counts only; a coarse label, not\n * identity (sanitized before it's recorded). Absent for human-run commands.\n */\n client?: string;\n}\n\n/**\n * Attach the global flags to a command. They live on every subcommand (rather\n * than only the program) so the \"simple as Google\" dispatch can put the command\n * token first and let flags appear in any order after it.\n */\nexport function applyGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>', '.')\n .option('--deep', 'do more: precise resolution, all edges, semantic links')\n .option('--json', 'machine-readable JSON on stdout')\n .option('--generated-at <iso>', 'pin the artifact timestamp for byte-deterministic output')\n .option('--graph <file>', 'override the map path')\n .option('--no-cache', 'full rebuild (ignore the incremental cache)')\n .option('--local', 'never touch the network (lexical-only semantic)')\n .option('--quiet', 'suppress progress output')\n .option('--client <name>', 'identify the AI client (e.g. claude) so navigation calls are counted in vg savings')\n .option('--no-color', 'disable colored output');\n}\n\n/** Read the global subset from a command's parsed options. */\nexport function readGlobal(cmd: Command): GlobalOpts {\n const o = cmd.opts<Record<string, unknown>>();\n return {\n cwd: o.cwd as string | undefined,\n deep: o.deep as boolean | undefined,\n json: o.json as boolean | undefined,\n generatedAt: o.generatedAt as string | undefined,\n graph: o.graph as string | undefined,\n noCache: o.cache === false,\n local: o.local as boolean | undefined,\n quiet: o.quiet as boolean | undefined,\n client: o.client as string | undefined,\n };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { verifyDeterminism } from '../engine/verify.js';\nimport { epistemicBreakdown } from '../engine/epistemic.js';\nimport { signGraphAttestation, verifyGraphAttestation, type SignSummary } from './attest-actions.js';\nimport { isModelReady, countPending, resolveEmbedModel } from '../engine/embeddings.js';\nimport type { VgGraph } from '../schema.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshInstalledInstructions, SMALL_REPO_FILES } from '../install/registry.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { renderReport } from '../engine/report.js';\nimport { renderHtml } from '../engine/html.js';\nimport { UsageError } from '../engine/discover.js';\nimport { ResourceLimitError } from '../engine/limits.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, out, json } from '../util/output.js';\nimport { printLogo } from '../util/logo.js';\nimport { ProgressBar } from '../util/progress.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\ninterface BuildCmdOpts {\n only?: string;\n exclude?: string[];\n html?: boolean;\n report?: boolean;\n ground?: boolean;\n jobs?: string;\n scip?: string | boolean;\n tsc?: boolean;\n export?: string;\n warm?: boolean;\n grammars?: string;\n attest?: boolean;\n verify?: boolean;\n attestKey?: string;\n attestation?: string;\n pub?: string;\n}\n\nexport function registerBuild(program: Command): void {\n const cmd = program\n .command('build')\n .description('build / update the code map (incremental, deterministic)')\n .argument('[paths...]', 'folders or files to map (default: current folder)')\n .option('--only <langs>', 'restrict to languages, e.g. ts,py,go')\n .option('--exclude <glob>', 'extra ignore glob (repeatable)', collect, [])\n .option('--no-html', 'do not write graph.html')\n .option('--no-report', 'do not write GRAPH_REPORT.md')\n .option('--no-ground', 'do not attach grounding (Phase 2)')\n .option('--jobs <n>', 'worker count (1 = single-threaded)')\n .option('--scip <file>', 'ingest a SCIP index for precise resolution (default: auto-detect index.scip)')\n .option('--no-scip', 'ignore any SCIP index')\n .option('--no-tsc', 'skip the in-process TypeScript resolver (heuristic floor only)')\n .option('--no-warm', 'do not warm the semantic index in the background after building')\n .option('--grammars <dir>', 'directory of grammar .wasm files (offline / air-gapped)')\n .option('-o, --export <file>', 'also write the map to a file (format inferred)')\n .option('--attest', 'sign the built graph → .vibgrate/attestation.intoto.jsonl')\n .option('--verify', 'verify a committed attestation against the graph (no rebuild)')\n .option('--attest-key <path>', 'signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)')\n .option('--attestation <file>', 'attestation path (out for --attest, in for --verify)')\n .option('--pub <path>', 'public key PEM to pin the signer (with --verify)')\n .action(async function (this: Command, paths: string[], opts: BuildCmdOpts) {\n await runBuild(paths, opts, readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n\n // `vg build --verify`: the single verification entry point — determinism\n // self-check plus (if present) attestation verification.\n if (opts.verify) {\n await verifyGraph(root, opts, global);\n return;\n }\n\n // Brand banner + live parse progress for an interactive human while the index\n // builds (TTY only; both are no-ops under --json/--quiet/pipe so machine output\n // stays clean).\n const interactive = !global.json && !global.quiet;\n if (interactive) printLogo(path.basename(root) || root);\n const bar = interactive ? new ProgressBar(c.dim('parsing')) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n if (jobs !== undefined && (!Number.isInteger(jobs) || jobs < 1)) {\n throw usageError(`--jobs must be a positive integer (got \"${opts.jobs}\")`);\n }\n\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n let result;\n try {\n result = await buildGraph({\n root,\n paths: paths.length ? paths : undefined,\n only,\n exclude: opts.exclude,\n jobs,\n noCache: global.noCache,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n generatedAt: global.generatedAt,\n onParseProgress: bar ? (done, total) => bar.update(done, total) : undefined,\n grammarsDir: opts.grammars,\n });\n } catch (err) {\n bar?.done();\n if (err instanceof UsageError) throw usageError(err.message);\n // A resource safeguard fired (file-count cap, heap budget, worker OOM) —\n // the message already carries the remedy; surface it without a stack.\n if (err instanceof ResourceLimitError) throw new CliError(err.message, ExitCode.ERROR);\n throw err;\n }\n bar?.done();\n\n const written = writeArtifacts(result.graph, {\n root,\n html: opts.html,\n report: opts.report,\n graphPath: global.graph,\n });\n\n // Record the freshness snapshot (stat+hash per corpus file, plus this build's\n // scope) so `vg serve`/`vg ask` can auto-refresh the map when the tree drifts.\n // Skipped for a custom --graph target: that is an explicit artifact the\n // auto-refresh machinery must not manage.\n if (!global.graph) {\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, {\n only,\n exclude: opts.exclude,\n paths: paths.length ? paths : undefined,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n grammarsDir: opts.grammars,\n });\n }\n\n if (opts.export) writeExport(result.graph, opts.export);\n\n // Bring previously-installed assistant instructions (skill/nudge files from\n // `vg install`) up to the current content version — so evolved instructions\n // reach this repo the first time a new CLI builds here. Only files carrying\n // vg's own version marker (or the exact legacy generated content) are\n // touched; a custom --graph build is an explicit artifact and skips this.\n if (!global.graph) {\n const fileCount = result.graph.nodes.filter((n) => n.kind === 'file').length;\n const refreshed = refreshInstalledInstructions(root, fileCount > 0 && fileCount < SMALL_REPO_FILES);\n if (interactive) {\n for (const r of refreshed) {\n info(c.dim(`vg · refreshed assistant instructions ${r.file} (v${r.from} → v${r.to})`));\n }\n }\n }\n\n // `--attest`: sign the freshly-built graph → .vibgrate/attestation.intoto.jsonl.\n let attestation: SignSummary | undefined;\n const attestNotices: string[] = [];\n if (opts.attest) {\n const signed = await signGraphAttestation(root, result.graph, {\n key: opts.attestKey,\n attestation: opts.attestation,\n });\n attestation = signed.summary;\n attestNotices.push(...signed.notices);\n }\n\n if (global.json) {\n json({\n ok: true,\n counts: result.graph.meta.counts,\n languages: result.graph.meta.languages,\n reparsed: result.reparsed,\n reused: result.reused,\n totalFiles: result.totalFiles,\n resolve: result.resolveStats,\n tsc: result.tsc,\n scip: result.scip,\n epistemic: epistemicBreakdown(result.graph.edges),\n artifacts: written,\n corpusHash: result.graph.provenance.corpusHash,\n toolchain: result.graph.provenance.toolchain,\n attestation,\n timingMs: result.timing.totalMs,\n warnings: result.warnings,\n });\n return;\n }\n\n const { counts } = result.graph.meta;\n const incremental =\n result.reused > 0\n ? `incremental: ${result.reparsed} of ${result.totalFiles} files re-parsed`\n : `${result.totalFiles} files parsed`;\n const seconds = (result.timing.totalMs / 1000).toFixed(2);\n info(`${c.cyan('vg')} · mapped ${rel(root)} in ${seconds}s (${incremental})`);\n info(\n ` nodes ${c.bold(String(counts.nodes))} edges ${c.bold(String(counts.edges))} ` +\n `areas ${counts.areas} langs ${result.graph.meta.languages.join(',') || '—'}`,\n );\n const callPct =\n result.resolveStats.callsResolved + result.resolveStats.callsUnresolved > 0\n ? Math.round(\n (100 * result.resolveStats.callsResolved) /\n (result.resolveStats.callsResolved + result.resolveStats.callsUnresolved),\n )\n : 100;\n // When a precise rung ran it is authoritative; callPct is only the heuristic\n // floor (label it so, to avoid understating the precise result below).\n const precise = result.tsc || result.scip;\n const callLabel = precise ? `heuristic floor ${callPct}%` : `calls resolved ${callPct}%`;\n info(c.dim(` ${callLabel} · resolver ${result.graph.provenance.resolver.join(',')}`));\n if (result.tsc) {\n const jsx = result.tsc.jsx > 0 ? `, ${result.tsc.jsx} JSX` : '';\n info(c.dim(` tsc: ${result.tsc.resolved} precise edges across ${result.tsc.files} TS/JS files (${result.tsc.calls} calls${jsx})`));\n }\n if (result.scip) {\n info(c.dim(` scip: ${result.scip.resolved} precise edges from ${result.scip.tool ?? 'index'} (${result.scip.documents} docs)`));\n }\n const ep = epistemicBreakdown(result.graph.edges);\n info(\n c.dim(\n ` edges by evidence · observed ${ep.observed} · name-matched ${ep['name-matched']} · declared ${ep.declared}`,\n ),\n );\n const artifactList = [written.graphPath, written.htmlPath, written.reportPath]\n .filter(Boolean)\n .map((p) => path.relative(root, p as string))\n .join(' ');\n info(` → ${artifactList}`);\n if (result.warnings.length) {\n info(c.yellow(` ${result.warnings.length} parse warning(s) — run with --json for detail`));\n }\n if (attestation) {\n for (const n of attestNotices) info(c.yellow(` ${n}`));\n info(\n c.dim(\n ` attested · keyid ${attestation.keyid} · digest ${attestation.graphDigest.slice(0, 16)}… → ${attestation.out}`,\n ),\n );\n }\n\n maybeWarmEmbeddings(root, result.graph, global, opts.warm !== false);\n}\n\n/**\n * `vg build --verify` — the single verification entry point. Runs the determinism\n * self-check (byte-identical rebuilds + toolchain fingerprint) and, when an\n * attestation is present, verifies it against the on-disk graph. Exit 4 on a\n * determinism failure, exit 2 on an attestation failure.\n */\nasync function verifyGraph(root: string, opts: BuildCmdOpts, global: GlobalOpts): Promise<void> {\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n const det = await verifyDeterminism({ root, only, exclude: opts.exclude, jobs });\n const attest = verifyGraphAttestation(root, { attestation: opts.attestation, pub: opts.pub });\n const attestFailed = !attest.missing && attest.result?.status === 'failed';\n\n if (global.json) {\n json({\n ok: det.ok && !attestFailed,\n determinism: { ok: det.ok, checks: det.checks, digest: det.digest },\n attestation: attest.missing\n ? null\n : {\n status: attest.result?.status,\n signatureValid: attest.result?.signatureValid,\n signerPinned: attest.result?.signerPinned,\n digestMatches: attest.result?.digestMatches,\n dirty: attest.result?.dirty,\n keyid: attest.result?.keyid,\n reason: attest.result?.reason,\n },\n });\n } else {\n info(`${c.cyan('vg build --verify')} · ${path.relative(process.cwd(), root) || '.'}`);\n for (const check of det.checks) {\n const mark = check.ok ? c.green('✔') : c.red('✘');\n const detail = check.detail ? c.dim(` (${check.detail})`) : '';\n info(` ${mark} ${check.name}${detail}`);\n }\n info(det.ok ? c.green(` deterministic · digest ${det.digest.slice(0, 16)}…`) : c.red(' NON-DETERMINISTIC'));\n if (attest.missing) {\n info(c.dim(` attestation: none (sign one with \\`vg build --attest\\`)`));\n } else {\n const r = attest.result;\n const badge =\n r?.status === 'verified'\n ? c.green('✔ attestation verified')\n : r?.status === 'signature-valid'\n ? c.yellow('~ attestation signature valid')\n : c.red('✘ attestation failed');\n info(` ${badge}${r?.keyid ? c.dim(` · keyid ${r.keyid}`) : ''}`);\n info(c.dim(` ${r?.reason ?? ''}`));\n }\n }\n\n if (!det.ok) throw new CliError('determinism self-check failed', ExitCode.NON_DETERMINISTIC);\n if (attestFailed) throw new CliError('attestation verification failed', ExitCode.GATE_FAILED);\n}\n\n/**\n * After an interactive build we have just committed to a code graph, so the\n * user is likely to run `vg ask`/`vg serve` next — start warming the semantic\n * index in the background now so that first semantic call is instant instead of\n * paying a cold model load. If the model isn't downloaded yet, the background\n * warm fetches it (once, centrally) rather than deferring the whole cost to the\n * first `ask`. Disabled with `--no-warm`; skipped under --json/--quiet/--local\n * and when not at a TTY (so CI never auto-downloads). The detached child runs\n * `vg embed --bg [--download]`; a lock prevents it racing a foreground `ask`.\n */\nfunction maybeWarmEmbeddings(root: string, graph: VgGraph, global: GlobalOpts, warm: boolean): void {\n if (!warm || global.json || global.quiet || global.local) return;\n if (!process.stdout.isTTY && !process.stderr.isTTY) return;\n const cli = process.argv[1];\n if (!cli) return;\n const modelId = resolveEmbedModel();\n const ready = isModelReady(modelId);\n // Already fully warm: model present and every node embedded → nothing to do.\n if (ready && countPending(graph, root, modelId) === 0) return;\n // When the model isn't on this machine yet, start the one-time download now\n // (the graph is built; the next semantic call shouldn't wait for it).\n const args = ready\n ? [cli, 'embed', '-C', root, '--bg']\n : [cli, 'embed', '-C', root, '--bg', '--download'];\n try {\n const child = spawn(process.execPath, args, { detached: true, stdio: 'ignore' });\n child.unref();\n info(\n c.dim(\n ready\n ? ' warming the semantic index in the background — `vg ask` will be instant'\n : ' downloading the semantic model in the background (once) — `vg ask`/`vg serve` will be instant; disable with --no-warm',\n ),\n );\n } catch {\n /* warm-up is best-effort */\n }\n}\n\nfunction writeExport(graph: Parameters<typeof serializeGraph>[0], target: string): void {\n if (target === '-') {\n out(serializeGraph(graph).trimEnd());\n return;\n }\n const ext = path.extname(target).toLowerCase();\n let content: string;\n switch (ext) {\n case '.json':\n content = serializeGraph(graph);\n break;\n case '.md':\n content = renderReport(graph);\n break;\n case '.html':\n content = renderHtml(graph);\n break;\n default:\n throw new CliError(\n `cannot export to \"${ext || target}\" yet — supported in Phase 0: .json, .md, .html, \"-\" (stdout). ` +\n `More formats (graphml, dot, cypher) arrive with \\`vg export\\` in Phase 1.`,\n ExitCode.USAGE_ERROR,\n );\n }\n fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });\n fs.writeFileSync(target, content);\n}\n\nfunction collect(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nfunction rel(root: string): string {\n const r = path.relative(process.cwd(), root);\n return r === '' ? '.' : r;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { defaultGraphPath, vibgrateDir } from '../engine/artifacts.js';\nimport { cacheDir } from '../engine/cache.js';\nimport { discover } from '../engine/discover.js';\nimport { probeFreshness, driftCount } from '../engine/freshness.js';\nimport { c, info, json } from '../util/output.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\n/**\n * `vg status` — cache/freshness, counts, staleness, resolver rungs used.\n * Read-only; compares the committed graph against the working tree.\n */\nexport function registerStatus(program: Command): void {\n const cmd = program\n .command('status')\n .description('cache/freshness, counts, staleness, resolver rungs used')\n .action(async function (this: Command) {\n await runStatus(readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nasync function runStatus(global: GlobalOpts): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n const graphPath = global.graph ?? defaultGraphPath(root);\n const graph = loadGraph(root, graphPath);\n const hasCache = fs.existsSync(path.join(cacheDir(root), 'parse-cache.json'));\n\n // Determine staleness deterministically. Preferred path: the freshness\n // snapshot (stat+hash per corpus file, written by every build) gives an\n // exact per-file answer — content edits, adds, AND removes. Fallback when\n // no snapshot exists on this machine: \"files present now\" vs \"the graph's\n // node file set\", which sees adds/removes but not content edits.\n let stale: number | null = null;\n let staleExact = false;\n if (graph) {\n const probe = probeFreshness(root);\n if (probe) {\n stale = driftCount(probe.drift);\n staleExact = true;\n } else {\n const files = discover({ root });\n let changed = 0;\n const graphFiles = new Set(graph.nodes.filter((n) => n.kind === 'file').map((n) => n.file));\n const currentFiles = new Set(files.map((f) => f.rel));\n for (const f of currentFiles) if (!graphFiles.has(f)) changed++;\n for (const f of graphFiles) if (!currentFiles.has(f)) changed++;\n stale = changed;\n }\n }\n\n if (global.json) {\n json({\n root: path.relative(process.cwd(), root) || '.',\n graphPath: path.relative(root, graphPath),\n built: graph !== null,\n generatedAt: graph?.generatedAt ?? null,\n counts: graph?.meta.counts ?? null,\n languages: graph?.meta.languages ?? [],\n cluster: graph?.meta.cluster ?? null,\n resolver: graph?.provenance.resolver ?? [],\n corpusHash: graph?.provenance.corpusHash ?? null,\n cache: hasCache,\n staleFiles: stale,\n staleExact,\n });\n return;\n }\n\n if (!graph) {\n info(`${c.cyan('vg')} · no map yet at ${c.dim(path.relative(root, graphPath))}`);\n info(` run ${c.bold('vg')} to build one`);\n return;\n }\n\n info(`${c.cyan('vg')} · ${path.relative(root, graphPath)}`);\n info(` generated ${graph.generatedAt}`);\n info(\n ` nodes ${c.bold(String(graph.meta.counts.nodes))} edges ${c.bold(\n String(graph.meta.counts.edges),\n )} areas ${graph.meta.counts.areas} langs ${graph.meta.languages.join(',') || '—'}`,\n );\n info(` cluster ${graph.meta.cluster} · resolver ${graph.provenance.resolver.join(',')}`);\n info(` cache ${hasCache ? c.green('warm') : c.dim('cold')} · corpus ${graph.provenance.corpusHash.slice(0, 12)}…`);\n if (stale && stale > 0) {\n info(c.yellow(` ${stale} file(s) changed since last build — run ${c.bold('vg')} to refresh`));\n } else {\n info(c.dim(' up to date'));\n }\n if (vibgrateDir(root)) {\n /* artifact dir exists implicitly */\n }\n}\n","import * as path from 'node:path';\nimport { loadGraph } from '../engine/load.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport type { VgGraph } from '../schema.js';\n\nexport function rootOf(global: GlobalOpts): string {\n return path.resolve(global.cwd ?? '.');\n}\n\n/** Load the committed graph, or fail with an actionable NOT_FOUND error. */\nexport function requireGraph(global: GlobalOpts): { root: string; graph: VgGraph } {\n const root = rootOf(global);\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no map found — run \\`vg\\` to build one first` +\n (global.graph ? ` (looked at ${global.graph})` : ''),\n ExitCode.NOT_FOUND,\n );\n }\n return { root, graph };\n}\n","import { Command } from 'commander';\nimport { queryGraph, queryGraphSemantic, type QueryResult } from '../engine/query.js';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n resolveEmbedModel,\n embeddingsCached,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { driftCount } from '../engine/freshness.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { c, info, json, out } from '../util/output.js';\nimport { ProgressBar } from '../util/progress.js';\n\n/**\n * `vg ask \"<question>\"` (VG-CLI-SPEC §3.2). Hybrid lexical+structural+semantic\n * retrieval **on by default** — no API key, no flags. A local ONNX embedding\n * model is downloaded once on first use (then cached and fully offline) and\n * blends with the always-on deterministic lexical floor. It degrades gracefully\n * to lexical alone under `--local`, `--no-semantic`, on an unsupported platform,\n * or if the model can't be fetched — `ask` never fails. The context block goes\n * to stdout (pipeable); notes/progress to stderr.\n *\n * Before answering, `ask` auto-refreshes the map if the working tree drifted\n * since the last build (incremental, fail-soft; `--no-refresh` opts out), so\n * answers reflect the code as it is now — not as it was last built.\n */\nexport function registerAsk(program: Command): void {\n const cmd = program\n .command('ask')\n .description('ask the map — returns a budget-bounded context block')\n .argument('<question...>', 'your question (a bare quoted string also works: vg \"…\")')\n .option('-b, --budget <n>', 'approx token budget for the answer', '2000')\n .option('--no-semantic', 'lexical only (skip the local-embedding pass)')\n .option('--no-refresh', 'answer from the map as built — skip the auto-rebuild when files change')\n .action(async function (this: Command, question: string[], opts: { budget?: string; semantic?: boolean; refresh?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n // Answer from a map that matches the working tree: a cheap freshness\n // probe, then an incremental rebuild only if files really drifted. A\n // custom --graph is an explicit artifact and is never rebuilt over.\n // Fail-soft — a refresh problem falls back to the last built map.\n if (opts.refresh !== false && !global.graph) {\n const refreshed = await refreshIfStale(root);\n if (refreshed.status === 'refreshed' && !global.json) {\n const n = driftCount(refreshed.drift);\n info(c.dim(` map refreshed — ${n} file(s) drifted (${(refreshed.ms / 1000).toFixed(2)}s)`));\n } else if (refreshed.status === 'error' && !global.json) {\n info(c.yellow(` map refresh failed (${refreshed.message}) — answering from the last built map`));\n }\n }\n const { graph } = requireGraph(global);\n const budget = Number(opts.budget) || 2000;\n const q = question.join(' ');\n // Semantic is the default; --no-semantic or --local opt out.\n const wantSemantic = opts.semantic !== false && !global.local;\n\n let result: QueryResult;\n let mode = 'lexical';\n let note = '';\n\n if (wantSemantic) {\n // A genuine first run for this repo (no cached vectors yet) → show a\n // one-time note + live progress bar for the embedding pass. Otherwise stay quiet.\n const firstRun = !embeddingsCached(root, resolveEmbedModel());\n if (!global.json && firstRun) {\n info(c.dim(' preparing semantic search (first use embeds the map; cached, resumable & offline after)…'));\n }\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({ local: global.local, onUnavailable: (r) => (reason = r) });\n if (embedder) {\n const bar = !global.json && firstRun ? new ProgressBar(c.dim('embedding')) : undefined;\n const vectors = await getNodeEmbeddings(graph, embedder, root, bar ? (d, t) => bar.update(d, t) : undefined);\n bar?.done();\n result = await queryGraphSemantic(graph, q, { budget, embedder, nodeVectors: vectors });\n mode = `semantic (${embedder.id})`;\n } else {\n result = queryGraph(graph, q, { budget });\n note = reason ? unavailableMessage(reason) : 'semantic unavailable; used lexical';\n }\n } else {\n result = queryGraph(graph, q, { budget });\n if (global.local) note = 'semantic skipped under --local; used lexical';\n }\n\n // Count this call in the local ledger when an AI host identified itself\n // (`--client`). `ask` is the CLI twin of the MCP `query_graph` tool, so it\n // records under that shared name with source `cli` — that's the\n // command-vs-MCP split `vg savings` reports.\n if (global.client) {\n const files = new Set(result.matches.map((m) => m.node.file).filter(Boolean));\n recordCliCall(\n root,\n {\n tool: CLI_TOOL_ALIASES.ask,\n client: global.client,\n outcome: result.matches.length === 0 ? 'miss' : 'complete',\n vgTokens: result.tokensEstimate,\n baselineFiles: files.size,\n },\n Date.now(),\n );\n }\n\n if (global.json) {\n json({\n question: result.question,\n mode,\n note: note || undefined,\n tokensEstimate: result.tokensEstimate,\n matches: result.matches.map((m) => ({\n name: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span.start,\n score: m.score,\n why: m.why,\n })),\n context: result.context,\n });\n return;\n }\n\n out(result.context);\n info('');\n info(c.dim(`vg · ${result.matches.length} match(es) · ~${result.tokensEstimate} tokens (budget ${budget}) · ${mode}`));\n if (note) info(c.yellow(` ${note}`));\n });\n applyGlobalOptions(cmd);\n}\n","import { Command, Option } from 'commander';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n resolveEmbedModel,\n countPending,\n embeddingsCached,\n modelCacheInfo,\n clearModelCache,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\nimport { ProgressBar } from '../util/progress.js';\n\nfunction mb(bytes: number): string {\n if (bytes <= 0) return '0 MB';\n if (bytes < 1024 * 1024) return `${Math.max(1, Math.round(bytes / 1024))} KB`;\n return `${Math.round(bytes / (1024 * 1024))} MB`;\n}\n\n/**\n * `vg embed` — precompute the semantic index (node embeddings) so the next\n * `vg ask` is instant. The model is downloaded once per machine into a central,\n * home-folder cache (XDG `~/.cache/vibgrate/models`; no admin/sudo needed) shared\n * across all repos; per-repo vectors live in `.vibgrate/cache/`.\n *\n * `--where` shows the cache location/size; `--clear` removes the model. The\n * hidden `--bg` flag warms silently and never downloads (the `vg build` warm-up).\n */\nexport function registerEmbed(program: Command): void {\n const cmd = program\n .command('embed')\n .description('precompute the semantic index for instant `vg ask` (or --where / --clear)')\n .option('--where', 'show where the model is cached, and its size')\n .option('--clear', 'remove the downloaded model from the shared cache')\n // --bg: the silent background warm-up spawned by `vg build`. It skips the\n // model download by default; `--download` lets that background warm fetch\n // the model too, so a graph build starts the one-time download immediately\n // and the next `vg serve`/`vg ask` is instant instead of paying a cold load.\n .addOption(new Option('--bg').hideHelp())\n .addOption(new Option('--download').hideHelp())\n .action(async function (this: Command, opts: { where?: boolean; clear?: boolean; bg?: boolean; download?: boolean }) {\n const global = readGlobal(this);\n const modelId = resolveEmbedModel();\n\n // --where / --clear don't need a built graph.\n if (opts.where) return showWhere(rootOf(global), modelId, global.json);\n if (opts.clear) return doClear(global.json);\n\n const { graph } = requireGraph(global);\n const root = rootOf(global);\n const bg = opts.bg === true;\n const speak = !bg && !global.json;\n\n if (global.local) {\n if (speak) info(c.dim('vg embed · semantic is off (--local) — lexical search only'));\n return;\n }\n if (countPending(graph, root, modelId) === 0) {\n if (global.json) json({ embedded: 0, pending: 0, upToDate: true, model: modelId });\n else if (speak) info(`${c.cyan('vg embed')} · semantic index already up to date`);\n return;\n }\n\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({\n local: global.local,\n // Background warm-ups skip the download unless explicitly asked to fetch\n // (`--bg --download`, spawned by `vg build` so the model is ready by the\n // time `vg serve`/`vg ask` needs it).\n noDownload: bg && opts.download !== true,\n showDownloadProgress: !bg,\n onUnavailable: (r) => (reason = r),\n });\n if (!embedder) {\n // Calm, specific fallback — never a stack trace. (bg stays silent.)\n if (speak && reason) info(c.dim(`vg embed · ${unavailableMessage(reason)}`));\n return;\n }\n\n const pending = countPending(graph, root, modelId);\n const bar = speak ? new ProgressBar(c.dim('embedding')) : undefined;\n await getNodeEmbeddings(graph, embedder, root, bar ? (d, t) => bar.update(d, t) : undefined);\n bar?.done();\n if (global.json) json({ embedded: pending, model: modelId });\n else if (speak) info(`${c.green('✔')} vg embed · semantic index ready (~${pending} node(s) · model ${modelId})`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction showWhere(root: string, modelId: string, asJson?: boolean): void {\n const m = modelCacheInfo(modelId);\n const repoCached = embeddingsCached(root, modelId);\n if (asJson) {\n json({ model: modelId, cacheDir: m.dir, present: m.present, bytes: m.bytes, repoEmbeddings: repoCached });\n return;\n }\n info(`${c.cyan('vg embed')} · model cache`);\n info(` model ${c.bold(modelId)}`);\n info(` shared at ${m.dir}`);\n info(` ${m.present ? c.green(`present · ~${mb(m.bytes)}`) : c.dim('not downloaded yet (fetched on first semantic ask)')}`);\n info(` this repo ${repoCached ? c.green('embeddings cached') : c.dim('not embedded yet — run `vg embed`')}`);\n info(c.dim(' no admin/sudo needed — the cache is in your home folder, shared across all repos.'));\n info(c.dim(' turn off: run with --local · relocate: XDG_CACHE_HOME=<dir> · remove: vg embed --clear'));\n}\n\nfunction doClear(asJson?: boolean): void {\n const before = modelCacheInfo();\n const freed = clearModelCache();\n if (asJson) {\n json({ removed: before.present, bytesFreed: freed, dir: before.dir });\n return;\n }\n if (!before.present || freed === 0) {\n info(`${c.cyan('vg embed')} · no model in the shared cache — nothing to remove (${before.dir})`);\n return;\n }\n info(`${c.green('✔')} vg embed · removed the shared model (~${mb(freed)}) from ${before.dir}`);\n info(c.dim(' repos use fast lexical search until the next semantic ask re-downloads it.'));\n}\n","import { CliError, ExitCode } from '../util/exit.js';\nimport type { GraphNode } from '../schema.js';\n\n/**\n * Build a NOT_FOUND error that lists ambiguous candidates with `--pick` hints,\n * so the message is actionable (VG-CLI-SPEC §3.3). `pickFlag` lets multi-argument\n * commands point at the right flag (e.g. `vg path` uses `--pick-a`/`--pick-b`).\n */\nexport function ambiguityError(summary: string, candidates: GraphNode[], pickFlag = '--pick'): CliError {\n if (candidates.length === 0) {\n return new CliError(`${summary} — try \\`vg hubs\\` or a broader name/glob`, ExitCode.NOT_FOUND);\n }\n const lines = candidates\n .slice(0, 10)\n .map((n, i) => ` ${i + 1}. ${n.qualifiedName} (${n.kind}, ${n.file}:${n.span.start})`);\n const more = candidates.length > 10 ? `\\n …and ${candidates.length - 10} more` : '';\n return new CliError(\n `${summary} — pick one with ${pickFlag} <n>:\\n${lines.join('\\n')}${more}`,\n ExitCode.NOT_FOUND,\n );\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { indexFor } from '../engine/relations.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg show <name>` (VG-CLI-SPEC §3.3) — the richest single-node view: what it\n * is, its callers and callees and other edges, its area and importance.\n * (Facts + grounding are attached in Phase 2.)\n */\nexport function registerShow(program: Command): void {\n const cmd = program\n .command('show')\n .description('explain a node: what it is, what it calls, what calls it')\n .argument('<name>', 'qualified name, short name, file:line, glob, or id')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n\n if (!node) {\n if (candidates.length === 0) {\n throw ambiguityError(`no node matches \"${name}\"`, []);\n }\n throw ambiguityError(`\"${name}\" is ambiguous`, candidates);\n }\n\n const index = indexFor(graph);\n const callees = dedupe(index.callees(node.id).map((x) => x.node));\n const callers = dedupe(index.callers(node.id).map((x) => x.node));\n const extendsEdges = index.out(node.id, 'extends').concat(index.out(node.id, 'implements'));\n const supertypes = extendsEdges.map((e) => index.node(e.dst)?.qualifiedName).filter(Boolean);\n const area = graph.areas.find((a) => a.id === node.area);\n\n // `show` is the CLI twin of the MCP `get_node` tool — record it under that\n // shared name (source `cli`) when an AI host identified itself. Baseline =\n // the node's file plus each caller/callee file a grep/read agent would open.\n if (global.client) {\n const files = new Set<string>([node.file]);\n for (const n of [...callees, ...callers]) if (n.file) files.add(n.file);\n const shown =\n node.qualifiedName +\n (node.signature ?? '') +\n callees.map((n) => n.qualifiedName).join('') +\n callers.map((n) => n.qualifiedName).join('');\n recordCliCall(\n rootOf(global),\n {\n tool: CLI_TOOL_ALIASES.show,\n client: global.client,\n outcome: 'complete',\n vgTokens: countTokens(shown),\n baselineFiles: files.size,\n },\n Date.now(),\n );\n }\n\n if (global.json) {\n json({\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n centrality: node.centrality,\n isHub: node.isHub,\n area: node.area,\n areaLabel: area?.label ?? null,\n tested: node.tested,\n calls: callees.map((n) => n.qualifiedName),\n calledBy: callers.map((n) => n.qualifiedName),\n extends: supertypes,\n });\n return;\n }\n\n info(`${c.cyan(node.qualifiedName)} ${c.dim(`(${node.kind})`)}`);\n info(` ${c.dim(`${node.file}:${node.span.start}`)}`);\n if (node.signature) info(` ${c.bold(node.signature)}`);\n info(\n ` importance ${node.importance.toFixed(3)}${node.isHub ? c.yellow(' ★ hub') : ''} · area #${node.area}${area ? ` ${c.dim(area.label)}` : ''}`,\n );\n if (supertypes.length) info(` ${c.dim('extends:')} ${supertypes.join(', ')}`);\n info(` ${c.dim('calls')} (${callees.length}): ${callees.slice(0, 12).map((n) => n.qualifiedName).join(', ') || '—'}`);\n info(` ${c.dim('called by')} (${callers.length}): ${callers.slice(0, 12).map((n) => n.qualifiedName).join(', ') || '—'}`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction dedupe<T extends { id: string }>(nodes: T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const n of nodes) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out;\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { shortestPath } from '../engine/paths.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg path <A> <B>` (VG-CLI-SPEC §4.1) — how A connects to B (shortest path).\n */\nexport function registerPath(program: Command): void {\n const cmd = program\n .command('path')\n .description('how A connects to B (shortest path)')\n .argument('<a>', 'source node')\n .argument('<b>', 'target node')\n .option('--pick-a <n>', 'pick the nth candidate for A when ambiguous')\n .option('--pick-b <n>', 'pick the nth candidate for B when ambiguous')\n .action(function (this: Command, a: string, b: string, opts: { pickA?: string; pickB?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n\n const ra = resolveOne(graph, a, opts.pickA ? Number(opts.pickA) : undefined);\n if (!ra.node) throw ambiguityError(`\"${a}\" ${ra.candidates.length ? 'is ambiguous' : 'not found'}`, ra.candidates, '--pick-a');\n const rb = resolveOne(graph, b, opts.pickB ? Number(opts.pickB) : undefined);\n if (!rb.node) throw ambiguityError(`\"${b}\" ${rb.candidates.length ? 'is ambiguous' : 'not found'}`, rb.candidates, '--pick-b');\n\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n // Record the call for the command-vs-MCP split when an AI identified itself\n // (before the not-found throw, so a no-path attempt is counted as a miss).\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.path, client: global.client, outcome: result ? 'complete' : 'miss' },\n Date.now(),\n );\n }\n if (!result) {\n throw new CliError(\n `no path between ${ra.node.qualifiedName} and ${rb.node.qualifiedName}`,\n ExitCode.NOT_FOUND,\n );\n }\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const names = result.ids.map((id) => byId.get(id)?.qualifiedName ?? id);\n\n if (global.json) {\n json({ from: ra.node.qualifiedName, to: rb.node.qualifiedName, hops: names.length - 1, direction: result.direction, path: names });\n return;\n }\n\n info(`${c.cyan('vg path')} · ${names.length - 1} hop(s)${result.direction === 'reverse' ? c.dim(' (reverse)') : ''}`);\n info(' ' + names.map((n) => c.bold(n)).join(c.dim(' → ')));\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { GraphIndex, indexFor } from '../engine/relations.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\nimport type { GraphNode } from '../schema.js';\n\n/**\n * `vg tree <name>` (VG-CLI-SPEC §2/§3) — the call tree rooted at a node\n * (callees by default; `--callers` to invert), depth-bounded and cycle-safe.\n */\nexport function registerTree(program: Command): void {\n const cmd = program\n .command('tree')\n .description('the call tree rooted at a node (callees; --callers to invert)')\n .argument('<name>', 'root node')\n .option('--callers', 'show callers instead of callees')\n .option('--depth <n>', 'max depth', '3')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { callers?: boolean; depth?: string; pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const index = indexFor(graph);\n const maxDepth = Math.max(1, Number(opts.depth) || 3);\n const direction = opts.callers ? 'callers' : 'callees';\n // Record the call for the command-vs-MCP split when an AI identified itself.\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.tree, client: global.client, outcome: 'complete' },\n Date.now(),\n );\n }\n\n if (global.json) {\n json(toJsonTree(index, node, direction, maxDepth, new Set()));\n return;\n }\n\n info(`${c.cyan('vg tree')} · ${direction} of ${c.bold(node.qualifiedName)} (depth ${maxDepth})`);\n const lines: string[] = [];\n walk(index, node, direction, maxDepth, 0, new Set(), lines, '');\n for (const l of lines) info(l);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction next(index: GraphIndex, node: GraphNode, direction: 'callers' | 'callees'): GraphNode[] {\n const rel = direction === 'callees' ? index.callees(node.id) : index.callers(node.id);\n const seen = new Set<string>();\n const out: GraphNode[] = [];\n for (const { node: n } of rel) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out.sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName));\n}\n\nfunction walk(\n index: GraphIndex,\n node: GraphNode,\n direction: 'callers' | 'callees',\n maxDepth: number,\n depth: number,\n visited: Set<string>,\n lines: string[],\n prefix: string,\n): void {\n if (depth === 0) lines.push(`${c.bold(node.qualifiedName)} ${c.dim(`(${node.kind})`)}`);\n if (depth >= maxDepth) return;\n if (visited.has(node.id)) {\n lines.push(`${prefix}${c.dim('↻ (cycle)')}`);\n return;\n }\n visited.add(node.id);\n const children = next(index, node, direction);\n children.forEach((child, i) => {\n const last = i === children.length - 1;\n const branch = last ? '└─ ' : '├─ ';\n const cyc = visited.has(child.id) ? c.dim(' ↻') : '';\n lines.push(`${prefix}${c.dim(branch)}${child.qualifiedName}${cyc}`);\n walk(index, child, direction, maxDepth, depth + 1, new Set(visited), lines, prefix + (last ? ' ' : c.dim('│ ')));\n });\n}\n\nexport function toJsonTree(\n index: GraphIndex,\n node: GraphNode,\n direction: 'callers' | 'callees',\n maxDepth: number,\n visited: Set<string>,\n): unknown {\n if (maxDepth <= 0 || visited.has(node.id)) {\n return { name: node.qualifiedName, kind: node.kind, cycle: visited.has(node.id) };\n }\n const nextVisited = new Set(visited).add(node.id);\n return {\n name: node.qualifiedName,\n kind: node.kind,\n children: next(index, node, direction).map((child) =>\n toJsonTree(index, child, direction, maxDepth - 1, nextVisited),\n ),\n };\n}\n","import { Command } from 'commander';\nimport { renderReport } from '../engine/report.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { c, info, json, out } from '../util/output.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Map insights (VG-CLI-SPEC §4.1): `vg map`, `vg hubs`, `vg areas`,\n * `vg oddities`. Read-only views over the committed graph.\n */\nexport function registerInsights(program: Command): void {\n const map = program\n .command('map')\n .description('the overview report (areas, hubs, untested hotspots)')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n if (global.json) json(reportJson(graph));\n else out(renderReport(graph));\n });\n applyGlobalOptions(map);\n\n const hubs = program\n .command('hubs')\n .description('the most-depended-on code (centrality outliers)')\n .option('-n, --limit <n>', 'how many to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n const list = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, limit);\n if (global.json) {\n json(list.map(nodeSummary));\n return;\n }\n info(`${c.cyan('vg hubs')} · top ${list.length} by importance`);\n for (const n of list) {\n const hub = n.isHub ? c.yellow(' ★') : '';\n info(` ${pad(n.importance.toFixed(3), 6)} ${c.bold(n.qualifiedName)}${hub} ${c.dim(`${n.file}:${n.span.start}`)}`);\n }\n });\n applyGlobalOptions(hubs);\n\n const areas = program\n .command('areas')\n .description('the natural groupings (communities), each labelled and sized')\n .option('-n, --limit <n>', 'how many to show', '30')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 30;\n const list = [...graph.areas].sort((a, b) => b.size - a.size || a.id - b.id).slice(0, limit);\n if (global.json) {\n json(list);\n return;\n }\n info(`${c.cyan('vg areas')} · ${graph.areas.length} communities (${graph.meta.cluster})`);\n for (const a of list) {\n info(\n ` ${c.bold(`#${a.id}`)} ${a.label} ${c.dim(`${a.size} nodes · cohesion ${a.cohesion.toFixed(2)} · ${a.externalEdges} external`)}`,\n );\n }\n });\n applyGlobalOptions(areas);\n\n const oddities = program\n .command('oddities')\n .description('surprising cross-area links (architectural smells)')\n .option('-n, --limit <n>', 'how many to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const list = graph.edges\n .filter((e) => typeof e.surprise === 'number' && e.surprise > 0)\n .sort((a, b) => (b.surprise ?? 0) - (a.surprise ?? 0) || a.id.localeCompare(b.id))\n .slice(0, limit);\n if (global.json) {\n json(\n list.map((e) => ({\n kind: e.kind,\n surprise: e.surprise,\n from: byId.get(e.src)?.qualifiedName ?? e.src,\n to: byId.get(e.dst)?.qualifiedName ?? e.dst,\n })),\n );\n return;\n }\n if (!list.length) {\n info(`${c.cyan('vg oddities')} · none found (no cross-area links, or only one area)`);\n return;\n }\n info(`${c.cyan('vg oddities')} · top ${list.length} surprising links`);\n for (const e of list) {\n const from = byId.get(e.src)?.qualifiedName ?? e.src;\n const to = byId.get(e.dst)?.qualifiedName ?? e.dst;\n info(` ${pad((e.surprise ?? 0).toFixed(2), 5)} ${c.bold(from)} ${c.dim(`—${e.kind}→`)} ${c.bold(to)}`);\n }\n });\n applyGlobalOptions(oddities);\n}\n\nfunction nodeSummary(n: GraphNode) {\n return {\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n isHub: n.isHub,\n area: n.area,\n };\n}\n\nfunction reportJson(graph: VgGraph) {\n return {\n counts: graph.meta.counts,\n languages: graph.meta.languages,\n cluster: graph.meta.cluster,\n areas: graph.areas.length,\n hubs: graph.nodes.filter((n) => n.isHub).length,\n };\n}\n\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { impactOf } from '../engine/impact.js';\nimport { testsToRun, detectRunner } from '../engine/test-query.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg impact <name>` (VG-CLI-SPEC §3.5) — what breaks if you change it: the\n * deterministic structural blast radius (reverse reachability + decay\n * confidence), and with `--tests`, exactly the tests to run before shipping.\n * `--fail-on-untested` is a CI gate (exit 2).\n */\nexport function registerImpact(program: Command): void {\n const cmd = program\n .command('impact')\n .description('what breaks if you change it — and the tests to run')\n .argument('<name>', 'node to assess')\n .option('--depth <n>', 'max depth', '4')\n .option('--tests', 'also select the tests to run for the affected set')\n .option('--fail-on-untested', 'exit 2 if any affected node is untested')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { depth?: string; tests?: boolean; failOnUntested?: boolean; pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const depth = Number(opts.depth) || 4;\n const result = impactOf(graph, node.id, { depth });\n // Record the call for the command-vs-MCP split when an AI identified itself.\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.impact, client: global.client, outcome: 'complete' },\n Date.now(),\n );\n }\n const withTests = opts.tests || opts.failOnUntested;\n const ti = withTests ? testsToRun(graph, node.id, depth) : undefined;\n const runner = ti ? detectRunner(rootOf(global), node.lang) : undefined;\n\n if (global.json) {\n json({\n ...result,\n tests: ti\n ? { toRun: ti.affectedTestFiles, command: runner?.command(ti.affectedTestFiles), untestedAffected: ti.untestedAffected }\n : undefined,\n });\n } else {\n info(`${c.cyan('Impact of')} ${c.bold(result.root.name)}`);\n info(` Affected (${result.affected.length}) ▸ ${result.direct} direct, ${result.transitive} transitive (depth ≤ ${result.depth})`);\n const preview = result.affected.slice(0, 15);\n for (const a of preview) {\n info(` ${c.dim(`d${a.depth}`)} ${a.name} ${c.dim(`${a.file}:${a.line} · conf ${a.confidence.toFixed(2)}`)}`);\n }\n if (result.affected.length > preview.length) info(c.dim(` …and ${result.affected.length - preview.length} more (use --json)`));\n if (result.minEdgeConfidence < 1) info(c.dim(` lowest edge confidence ${result.minEdgeConfidence.toFixed(2)} (ambiguous/dynamic edges lower it)`));\n if (ti) {\n info(` ${c.cyan(`Tests to run (${ti.affectedTestFiles.length})`)} ▸ ${ti.affectedTestFiles.join(' · ') || c.dim('none found')}`);\n if (runner && ti.affectedTestFiles.length) info(c.dim(` $ ${runner.command(ti.affectedTestFiles)}`));\n if (ti.untestedAffected.length) info(c.yellow(` ${ti.untestedAffected.length} affected node(s) are untested`));\n }\n }\n\n if (opts.failOnUntested && ti && ti.untestedAffected.length > 0) {\n throw new CliError(\n `${ti.untestedAffected.length} affected node(s) are untested: ${ti.untestedAffected.slice(0, 5).map((u) => u.name).join(', ')}`,\n ExitCode.GATE_FAILED,\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { impactOf } from '../engine/impact.js';\nimport { c, info, json } from '../util/output.js';\nimport type { GraphNode, Unknown, VgGraph } from '../schema.js';\n\n/**\n * `vg unknowns` — the honest inverse of a scanner that hides its blind spots.\n *\n * The graph records every heuristic reference it could not resolve (a call to a\n * name with no reachable definition, a supertype it could not connect), minus any\n * site a precise rung already covered. This command ranks those blind spots by\n * *blast radius*: an unresolved call inside a hub is far more consequential than\n * one in a leaf, because the graph is blind about a node everything depends on.\n * Deterministic: same graph → same ranking.\n */\n\n// Bound the impact BFS work: rank the most-central candidate sites exactly and\n// note if the tail was ordered by centrality alone.\nconst IMPACT_CANDIDATE_CAP = 200;\n\nexport interface Site {\n node: GraphNode;\n refs: Unknown[];\n total: number; // total unresolved occurrences at this site\n blastRadius: number; // transitive dependents (blind-spot reach)\n direct: number;\n transitive: number;\n}\n\nexport interface RankedUnknowns {\n sites: Site[];\n totalSites: number; // distinct sites with unknowns\n /** True when more sites existed than were exactly blast-radius scored (see cap). */\n capped: boolean;\n}\n\nexport function registerUnknowns(program: Command): void {\n const cmd = program\n .command('unknowns')\n .description('what the graph cannot resolve, ranked by blast radius')\n .option('-n, --limit <n>', 'how many sites to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n\n const ranked = rankUnknowns(graph, limit);\n const { sites, totalSites, capped } = ranked;\n const totalRefs = (graph.unknowns ?? []).reduce((n, u) => n + u.count, 0);\n\n if (global.json) {\n json({\n unresolvedReferences: totalRefs,\n sites: totalSites,\n shown: sites.length,\n blastRankedCandidateCap: capped ? IMPACT_CANDIDATE_CAP : null,\n top: sites.map((s) => ({\n id: s.node.id,\n name: s.node.qualifiedName,\n kind: s.node.kind,\n file: s.node.file,\n line: s.node.span.start,\n importance: s.node.importance,\n blastRadius: s.blastRadius,\n direct: s.direct,\n transitive: s.transitive,\n unresolved: s.refs.map((r) => ({ name: r.name, kind: r.kind, count: r.count })),\n })),\n });\n return;\n }\n\n if (totalRefs === 0) {\n info(\n `${c.cyan('vg unknowns')} · none — every heuristic reference resolved ` +\n `(or was covered by a precise rung)`,\n );\n return;\n }\n\n info(\n `${c.cyan('vg unknowns')} · ${c.bold(String(totalRefs))} unresolved reference(s) at ` +\n `${totalSites} site(s) · top ${sites.length} by blast radius`,\n );\n for (const s of sites) {\n info(\n ` ${c.yellow(pad(String(s.blastRadius), 5))} ${c.bold(s.node.qualifiedName)} ` +\n c.dim(`${s.node.file}:${s.node.span.start} · importance ${s.node.importance.toFixed(3)}`),\n );\n info(` ${c.dim('cannot resolve:')} ${s.refs.map(fmtRef).join(', ')}`);\n }\n info(\n c.dim(\n ` blast radius = transitive dependents; these are the code paths the graph is blind about`,\n ),\n );\n if (capped) {\n info(\n c.dim(\n ` note: ${totalSites} sites have unknowns; only the top ${IMPACT_CANDIDATE_CAP} by ` +\n `centrality were blast-radius scored (the tail is ordered by centrality alone)`,\n ),\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/** Group unknowns by their originating node and rank by blast radius. */\nexport function rankSites(graph: VgGraph, limit: number): Site[] {\n return rankUnknowns(graph, limit).sites;\n}\n\n/** Group unknowns by originating node, rank by blast radius, and report truncation. */\nexport function rankUnknowns(graph: VgGraph, limit: number): RankedUnknowns {\n const unknowns = graph.unknowns ?? [];\n if (unknowns.length === 0) return { sites: [], totalSites: 0, capped: false };\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const grouped = new Map<string, Unknown[]>();\n for (const u of unknowns) {\n const list = grouped.get(u.from);\n if (list) list.push(u);\n else grouped.set(u.from, [u]);\n }\n\n // Only sites whose node still exists; pre-rank by centrality so the exact\n // (bounded) impact pass runs on the most consequential candidates first.\n const candidates: { node: GraphNode; refs: Unknown[]; total: number }[] = [];\n for (const [from, refs] of grouped) {\n const node = byId.get(from);\n if (!node) continue;\n candidates.push({ node, refs, total: refs.reduce((n, r) => n + r.count, 0) });\n }\n candidates.sort(\n (a, b) => b.node.importance - a.node.importance || a.node.id.localeCompare(b.node.id),\n );\n\n const scored: Site[] = candidates.slice(0, IMPACT_CANDIDATE_CAP).map((cand) => {\n const impact = impactOf(graph, cand.node.id);\n return {\n ...cand,\n blastRadius: impact.affected.length,\n direct: impact.direct,\n transitive: impact.transitive,\n };\n });\n\n scored.sort(\n (a, b) =>\n b.blastRadius - a.blastRadius ||\n b.node.importance - a.node.importance ||\n b.total - a.total ||\n a.node.id.localeCompare(b.node.id),\n );\n\n return {\n sites: scored.slice(0, limit),\n totalSites: candidates.length,\n capped: candidates.length > IMPACT_CANDIDATE_CAP,\n };\n}\n\nfunction fmtRef(r: Unknown): string {\n const times = r.count > 1 ? ` ×${r.count}` : '';\n const kind = r.kind === 'call' ? '' : ` (${r.kind})`;\n return `${r.name}${kind}${times}`;\n}\n\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from '../reporting/regions.js';\nimport type { SavingEntry, Source, Outcome } from './savings.js';\n\n/**\n * Opt-in usage-stats sharing for `vg serve --share-stats`.\n *\n * This is the ONLY path in `vg serve` that sends anything off the machine, and\n * it is off unless the operator explicitly asks for it. What we send is the\n * same counts-only ledger `vg savings` reports locally — per (source, client,\n * tool, outcome): how many calls and the vg-vs-grep token figures — plus the vg\n * version, OS/arch, and a random per-install id. We never send code, file paths,\n * question text, repo identity, or any credential. See GUARDRAILS §3.4.\n *\n * Even when the flag is passed, the universal `DO_NOT_TRACK` opt-out (or\n * `VIBGRATE_TELEMETRY=0`) wins: nothing is uploaded and no install id is ever\n * minted or persisted (see `telemetryOptOut` / `installId`).\n *\n * Design:\n * - The local ledger (savings.jsonl) is the single source of truth; the flusher\n * reads only the tail past a persisted byte offset, so a batch is sent once.\n * - Fire-and-forget with a short timeout. A network problem never blocks a tool\n * call and never throws — the offset only advances on a confirmed 2xx, so a\n * failed batch is retried on the next flush.\n * - Fully offline-safe: under `--local` the sharer is never constructed.\n */\n\n/** Payload schema version — must match the server's `mcpUsageStatsSchema`. */\nconst SCHEMA_VERSION = '1';\n/** Where the offset (and cached install id) live, per repo, beside the ledger. */\nconst OFFSET_FILE = 'stats-share.json';\n/** The machine-global anonymous install id lives here (stable across repos). */\nconst INSTALL_ID_DIR = path.join(os.homedir(), '.vibgrate');\nconst INSTALL_ID_FILE = path.join(INSTALL_ID_DIR, 'install-id');\n/** Give a flush POST a hard ceiling so a hung endpoint never stalls shutdown. */\nconst SEND_TIMEOUT_MS = 4000;\n\n/** One aggregated row of the shared batch — counts only. */\nexport interface StatsRow {\n source: Source;\n client: string;\n tool: string;\n outcome: Outcome;\n calls: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\n/** The counts-only batch POSTed to the ingest endpoint. */\nexport interface StatsBatch {\n schemaVersion: string;\n installId: string;\n vgVersion: string;\n os: string;\n arch: string;\n windowStart: string;\n windowEnd: string;\n totalCalls: number;\n rows: StatsRow[];\n}\n\n/**\n * The universal opt-out (https://consoledonottrack.com) plus a tool-specific\n * alias, honoured even when `--share-stats` is passed explicitly. Pure function\n * of the environment for testability. Returns the name of the variable that\n * opted out (for the disclosure message), or null when sharing may proceed.\n */\nexport function telemetryOptOut(env: NodeJS.ProcessEnv = process.env): string | null {\n const dnt = (env.DO_NOT_TRACK ?? '').trim().toLowerCase();\n if (dnt !== '' && dnt !== '0' && dnt !== 'false') return 'DO_NOT_TRACK';\n const vt = (env.VIBGRATE_TELEMETRY ?? '').trim().toLowerCase();\n if (vt === '0' || vt === 'false' || vt === 'off') return 'VIBGRATE_TELEMETRY';\n return null;\n}\n\n/** Common CI environment markers — a CI runner is never an interactive session. */\nconst CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'TRAVIS',\n 'BUILDKITE',\n 'JENKINS_URL',\n 'TF_BUILD',\n] as const;\n\n/** True when running under a recognised CI system. Pure function of the env. */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return CI_ENV_VARS.some((v) => {\n const val = (env[v] ?? '').trim().toLowerCase();\n return val !== '' && val !== '0' && val !== 'false';\n });\n}\n\n/**\n * Read (or lazily create) the anonymous per-install id — a random UUID stored in\n * `~/.vibgrate/install-id`. It is *not* tied to the user, the repo, or any\n * account; it only lets us de-duplicate batches from the same install when\n * aggregating. If the home dir isn't writable we fall back to an ephemeral id\n * so sharing still works (it just can't be de-duplicated across restarts).\n *\n * Under an env opt-out no id is ever read or persisted (the sharing path isn't\n * reached then either — this is defence in depth), and on CI runners the id is\n * ephemeral: a persisted id on a shared/throwaway runner would be meaningless\n * for de-duplication and would leave state behind on machines we don't own.\n */\nexport function installId(env: NodeJS.ProcessEnv = process.env): string {\n if (telemetryOptOut(env) !== null || isCI(env)) return randomUuid();\n try {\n const existing = fs.readFileSync(INSTALL_ID_FILE, 'utf8').trim();\n if (isUuid(existing)) return existing;\n } catch {\n /* not created yet */\n }\n const id = randomUuid();\n try {\n fs.mkdirSync(INSTALL_ID_DIR, { recursive: true });\n fs.writeFileSync(INSTALL_ID_FILE, id + '\\n', { mode: 0o600 });\n } catch {\n /* home dir read-only — use the ephemeral id for this process */\n }\n return id;\n}\n\nfunction isUuid(s: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);\n}\n\nfunction randomUuid(): string {\n return randomUUID();\n}\n\n/** Resolve the ingest endpoint: env override wins, else the default region host. */\nexport function statsEndpoint(): string {\n const override = process.env.VIBGRATE_STATS_ENDPOINT;\n if (override && /^https?:\\/\\//.test(override)) return override;\n return `https://${resolveIngestHost()}/v1/ingest/cli-mcp-usage`;\n}\n\nfunction offsetPath(root: string): string {\n return path.join(cacheDir(root), OFFSET_FILE);\n}\n\nfunction ledgerFilePath(root: string): string {\n return path.join(cacheDir(root), 'savings.jsonl');\n}\n\nfunction readOffset(root: string): number {\n try {\n const raw = JSON.parse(fs.readFileSync(offsetPath(root), 'utf8')) as { offset?: number };\n return typeof raw.offset === 'number' && raw.offset >= 0 ? raw.offset : 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeOffset(root: string, offset: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(offsetPath(root), JSON.stringify({ offset }) + '\\n');\n } catch {\n /* best-effort; a lost offset just means one batch may re-send */\n }\n}\n\n/**\n * Aggregate the ledger entries after `fromOffset` into a counts-only batch.\n * Returns the batch (or null if there's nothing new) and the new byte offset to\n * persist once the batch is confirmed sent.\n */\nexport function buildBatch(\n root: string,\n fromOffset: number,\n id = installId(),\n): { batch: StatsBatch | null; newOffset: number } {\n const file = ledgerFilePath(root);\n let size = 0;\n try {\n size = fs.statSync(file).size;\n } catch {\n return { batch: null, newOffset: 0 };\n }\n // The ledger was truncated/recreated under us — re-read from the top.\n const start = fromOffset > size ? 0 : fromOffset;\n if (start >= size) return { batch: null, newOffset: size };\n\n let text = '';\n try {\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(size - start);\n fs.readSync(fd, buf, 0, buf.length, start);\n text = buf.toString('utf8');\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return { batch: null, newOffset: fromOffset };\n }\n\n // Only whole lines are complete; a trailing partial line (mid-append) is left\n // for the next flush by rewinding the offset to the last newline.\n const lastNl = text.lastIndexOf('\\n');\n if (lastNl < 0) return { batch: null, newOffset: start };\n const consumed = start + lastNl + 1;\n const rows = new Map<string, StatsRow>();\n let total = 0;\n let minTs = Infinity;\n let maxTs = -Infinity;\n for (const line of text.slice(0, lastNl).split('\\n')) {\n if (!line.trim()) continue;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n continue;\n }\n const source: Source = e.source ?? 'mcp';\n const client = e.client ?? 'unknown';\n const outcome: Outcome = e.outcome ?? 'complete';\n const key = `${source}|${client}|${e.tool}|${outcome}`;\n const row = rows.get(key) ?? {\n source,\n client,\n tool: e.tool,\n outcome,\n calls: 0,\n vgTokens: 0,\n baselineTokens: 0,\n };\n row.calls++;\n row.vgTokens += e.vgTokens ?? 0;\n row.baselineTokens += e.baselineTokens ?? 0;\n rows.set(key, row);\n total++;\n if (typeof e.ts === 'number') {\n if (e.ts < minTs) minTs = e.ts;\n if (e.ts > maxTs) maxTs = e.ts;\n }\n }\n if (total === 0 || !Number.isFinite(minTs)) return { batch: null, newOffset: consumed };\n const batch: StatsBatch = {\n schemaVersion: SCHEMA_VERSION,\n installId: id,\n vgVersion: VERSION,\n os: process.platform,\n arch: process.arch,\n windowStart: new Date(minTs).toISOString(),\n windowEnd: new Date(maxTs).toISOString(),\n totalCalls: total,\n rows: [...rows.values()],\n };\n return { batch, newOffset: consumed };\n}\n\n/**\n * POST a batch to the endpoint. Never throws; returns whether it was accepted.\n * A short timeout keeps a hung endpoint from stalling the caller (e.g. shutdown).\n */\nasync function postBatch(batch: StatsBatch): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);\n timer.unref?.();\n try {\n const res = await fetch(statsEndpoint(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Periodic + on-shutdown flusher for one serve session. Holds the install id and\n * the persisted offset so each flush reads only new ledger lines and advances the\n * offset only when the batch is confirmed sent.\n */\nexport class StatsSharer {\n private readonly id = installId();\n private offset: number;\n private flushing = false;\n\n constructor(private readonly root: string) {\n this.offset = readOffset(root);\n }\n\n /**\n * Flush any new ledger entries. Single-flight (a slow POST won't overlap the\n * next tick). Best-effort: any failure is swallowed and retried next time.\n */\n async flush(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n const { batch, newOffset } = buildBatch(this.root, this.offset, this.id);\n if (!batch) {\n // Nothing to send, but still advance past consumed blank/partial space.\n if (newOffset > this.offset) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n return;\n }\n const ok = await postBatch(batch);\n if (ok) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n } catch {\n /* never let sharing break serving */\n } finally {\n this.flushing = false;\n }\n }\n}\n","/**\n * DNS-rebinding protection for the local `vg serve --http` endpoint, per the\n * MCP 2025-11-25 transport spec: a browser reaching a localhost server via a\n * rebound hostname still sends the *attacker's* Origin, so policing Origin is\n * the boundary that keeps drive-by pages from reading the local map.\n *\n * Policy: no Origin header (CLI/native MCP clients) passes; a browser-set\n * Origin must be loopback (localhost / 127.0.0.0/8 / [::1]) or on the\n * comma-separated `VIBGRATE_ALLOWED_ORIGINS` allowlist (`*` allows all —\n * an explicit operator escape hatch, never the default).\n */\nexport function originAllowed(origin: string | undefined, allowlist?: string): boolean {\n if (origin === undefined || origin === '') return true;\n const allowed = (allowlist ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (allowed.includes('*')) return true;\n if (allowed.includes(origin)) return true;\n return isLoopbackOrigin(origin);\n}\n\nfunction isLoopbackOrigin(origin: string): boolean {\n let url: URL;\n try {\n url = new URL(origin);\n } catch {\n return false; // unparsable Origin (\"null\", garbage) is never trusted\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n const host = url.hostname;\n if (host === 'localhost' || host === '[::1]' || host === '::1') return true;\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from '../engine/cache.js';\nimport type { SessionStats, SessionSnapshot, RollupRow } from './serve-stats.js';\n\n/**\n * Cross-process live stats for `vg serve` — the missing link between the serve\n * process an operator watches in a terminal and the one their assistant\n * actually talks to.\n *\n * Stdio MCP servers are spawned *by the client*: Claude Code launches its own\n * private `vg serve` child, so a manually-run terminal serve never receives\n * those tool calls and its dashboard would sit at zero forever. Every serve\n * process therefore publishes its in-memory session snapshot (counts only —\n * the exact data the live display already renders) to an ephemeral per-process\n * file under `.vibgrate/cache/serve-live/`, and a TTY display folds fresh\n * sibling snapshots into its render. Net effect: `vg serve` in a terminal\n * shows the MCP traffic of the assistant-spawned server(s) in the same repo.\n *\n * Privacy posture is identical to the live display itself: counts, tool\n * names, and coarse client labels only — never code, paths, or question text;\n * local only; files die with the session (unlinked on exit, and stale files\n * from crashed processes are swept on read). This is NOT the opt-in usage\n * ledger (GUARDRAILS §3.4) — nothing here persists or uploads.\n */\n\n/** Publish cadence; also the reader's poll granularity via the display timer. */\nconst PUBLISH_INTERVAL_MS = 2000;\n/** Rewrite even without new calls so `updatedAt` proves the process is alive. */\nconst KEEPALIVE_MS = 10_000;\n/** A snapshot older than this is a dead process — ignored and swept. */\nconst STALE_MS = 60_000;\n\ninterface LiveSnapshotFile {\n pid: number;\n updatedAt: number;\n snapshot: SessionSnapshot;\n}\n\nexport function liveStatsDir(root: string): string {\n return path.join(cacheDir(root), 'serve-live');\n}\n\nexport class LiveStatsBus {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRevision = -1;\n private lastWriteAt = 0;\n private readonly file: string;\n\n constructor(\n private readonly dir: string,\n private readonly stats: SessionStats,\n private readonly pid: number = process.pid,\n ) {\n this.file = path.join(dir, `serve-${this.pid}.json`);\n }\n\n start(): void {\n if (this.timer) return;\n this.publish();\n this.timer = setInterval(() => this.publish(), PUBLISH_INTERVAL_MS);\n this.timer.unref?.(); // the MCP server, not this bus, keeps the process alive\n process.on('exit', this.unlinkOwn);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n process.removeListener('exit', this.unlinkOwn);\n this.unlinkOwn();\n }\n\n /** Write the current snapshot when it changed (or as a keepalive). Never throws. */\n publish(now: number = Date.now()): void {\n const snap = this.stats.snapshot();\n if (snap.revision === this.lastRevision && now - this.lastWriteAt < KEEPALIVE_MS) return;\n this.lastRevision = snap.revision;\n this.lastWriteAt = now;\n const body: LiveSnapshotFile = { pid: this.pid, updatedAt: now, snapshot: snap };\n try {\n fs.mkdirSync(this.dir, { recursive: true });\n // tmp + rename so a concurrent reader never sees a half-written file.\n const tmp = `${this.file}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(body));\n fs.renameSync(tmp, this.file);\n } catch {\n /* display plumbing must never break serving */\n }\n }\n\n /**\n * Fresh snapshots of the OTHER serve processes in this repo. Stale files\n * (crashed processes) are swept best-effort while reading.\n */\n siblings(now: number = Date.now()): SessionSnapshot[] {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.dir);\n } catch {\n return [];\n }\n const out: SessionSnapshot[] = [];\n for (const name of entries.sort()) {\n if (!/^serve-\\d+\\.json$/.test(name)) continue;\n const file = path.join(this.dir, name);\n let parsed: LiveSnapshotFile;\n try {\n parsed = JSON.parse(fs.readFileSync(file, 'utf8')) as LiveSnapshotFile;\n } catch {\n continue; // mid-write or corrupt — skip, the next poll will see it\n }\n if (typeof parsed?.pid !== 'number' || typeof parsed.updatedAt !== 'number' || !parsed.snapshot?.totals) continue;\n if (now - parsed.updatedAt > STALE_MS) {\n try {\n fs.unlinkSync(file);\n } catch {\n /* best-effort sweep */\n }\n continue;\n }\n if (parsed.pid === this.pid) continue;\n out.push(parsed.snapshot);\n }\n return out;\n }\n\n private readonly unlinkOwn = (): void => {\n try {\n fs.unlinkSync(this.file);\n } catch {\n /* already gone */\n }\n };\n}\n\nfunction addInto(target: RollupRow, add: RollupRow): void {\n target.calls += add.calls;\n target.complete += add.complete;\n target.partial += add.partial;\n target.miss += add.miss;\n target.timed += add.timed;\n target.totalMs += add.totalMs;\n target.vgTokens += add.vgTokens;\n target.baselineTokens += add.baselineTokens;\n}\n\nfunction mergeRows(base: RollupRow[], extra: RollupRow[]): RollupRow[] {\n const byKey = new Map<string, RollupRow>(base.map((r) => [r.key, { ...r }]));\n for (const row of extra) {\n const hit = byKey.get(row.key);\n if (hit) addInto(hit, row);\n else byKey.set(row.key, { ...row });\n }\n return [...byKey.values()].sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * The operator's aggregate view: own snapshot plus every sibling's, rows\n * summed by key. Uptime stays the own process's; lastCallAt is the latest\n * anywhere; revision sums so change detection fires on sibling activity too.\n */\nexport function mergeSnapshots(own: SessionSnapshot, siblings: SessionSnapshot[]): SessionSnapshot {\n if (!siblings.length) return own;\n const merged: SessionSnapshot = {\n startedAt: own.startedAt,\n revision: own.revision,\n lastCallAt: own.lastCallAt,\n totals: { ...own.totals },\n clients: [...own.clients.map((r) => ({ ...r }))],\n tools: [...own.tools.map((r) => ({ ...r }))],\n sources: [...own.sources.map((r) => ({ ...r }))],\n };\n for (const s of siblings) {\n merged.revision += s.revision;\n if (s.lastCallAt !== null && (merged.lastCallAt === null || s.lastCallAt > merged.lastCallAt)) {\n merged.lastCallAt = s.lastCallAt;\n }\n addInto(merged.totals, s.totals);\n merged.clients = mergeRows(merged.clients, s.clients);\n merged.tools = mergeRows(merged.tools, s.tools);\n merged.sources = mergeRows(merged.sources, s.sources);\n }\n return merged;\n}\n","import { c } from '../util/output.js';\nimport { SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport { mergeSnapshots } from './live-stats.js';\n\n/**\n * Live, in-memory session stats for `vg serve` — the \"is it earning its keep?\"\n * display. While the MCP server runs, every tool call is aggregated per tool\n * and per client (which AI is calling, how many calls, how long they take, and\n * the context tokens served vs the grep/read baseline they replaced), and a\n * status block on stderr keeps the operator posted. CLI navigation calls made\n * while serving (`vg impact … --client=<ai>` etc.) are folded in from the local\n * ledger by ./ledger-tail.ts, so agents that shell out to `vg` instead of\n * calling MCP tools still show up here.\n *\n * Privacy: everything here lives and dies with the serve session — nothing is\n * persisted or uploaded, so the display is always on (GUARDRAILS §3.4 applies\n * to the opt-in ledger/upload, which remain separate and off by default).\n * Counts only — never code, paths beyond what the operator already sees, or\n * question text. Sibling serve processes in the same repo (an assistant's own\n * spawned stdio server) surface their counts to a TTY display through the\n * ephemeral live-stats bus (./live-stats.ts) — same counts-only data, swept\n * on exit.\n *\n * Output discipline: stderr only. Under stdio transport, stdout IS the MCP\n * protocol stream and carries nothing else.\n */\n\nexport interface CallSample {\n tool: string;\n /** Coarse, sanitized client label ('claude', 'cursor', … or 'unknown'). */\n client: string;\n outcome: Outcome;\n /**\n * How the call arrived: an MCP tool call into this serve process, or a\n * `vg <cmd> --client=<ai>` CLI invocation folded in from the local ledger\n * (see ./ledger-tail.ts). Absent reads as 'mcp'.\n */\n source?: 'mcp' | 'cli';\n /** Wall time of the call, ms. Absent = not measured (CLI ledger lines carry none) — never 0. */\n ms?: number;\n /** Context tokens vg actually returned (savings tools only; else 0). */\n vgTokens: number;\n /** Grep/read baseline estimate those tokens replaced (savings tools only; else 0). */\n baselineTokens: number;\n}\n\nexport interface RollupRow {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** Calls that carried a measured wall time — the avg-ms denominator. */\n timed: number;\n totalMs: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\nexport interface SessionSnapshot {\n startedAt: number;\n /** Bumped on every recorded call — cheap dirty check for renderers. */\n revision: number;\n /** Epoch ms of the most recent call, or null when none yet (never 0). */\n lastCallAt: number | null;\n totals: RollupRow;\n /** Sorted by calls desc, then key — deterministic display order. */\n clients: RollupRow[];\n tools: RollupRow[];\n /** The mcp-vs-cli split ('mcp' / 'cli' rows), same ordering. */\n sources: RollupRow[];\n}\n\nfunction zeroRow(key: string): RollupRow {\n return { key, calls: 0, complete: 0, partial: 0, miss: 0, timed: 0, totalMs: 0, vgTokens: 0, baselineTokens: 0 };\n}\n\n/** Aggregates tool calls for the lifetime of one serve process. */\nexport class SessionStats {\n readonly startedAt: number;\n private revision = 0;\n private lastCallAt: number | null = null;\n private readonly totals = zeroRow('total');\n private readonly byClient = new Map<string, RollupRow>();\n private readonly byTool = new Map<string, RollupRow>();\n private readonly bySource = new Map<string, RollupRow>();\n\n constructor(now: number = Date.now()) {\n this.startedAt = now;\n }\n\n record(sample: CallSample, now: number = Date.now()): void {\n this.revision++;\n this.lastCallAt = now;\n const rows = [\n this.totals,\n this.rowFor(this.byClient, sample.client),\n this.rowFor(this.byTool, sample.tool),\n this.rowFor(this.bySource, sample.source ?? 'mcp'),\n ];\n for (const row of rows) {\n row.calls++;\n row[sample.outcome]++;\n if (typeof sample.ms === 'number') {\n row.timed++;\n row.totalMs += sample.ms;\n }\n row.vgTokens += sample.vgTokens;\n row.baselineTokens += sample.baselineTokens;\n }\n }\n\n snapshot(): SessionSnapshot {\n const sorted = (m: Map<string, RollupRow>): RollupRow[] =>\n [...m.values()]\n .map((r) => ({ ...r }))\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n return {\n startedAt: this.startedAt,\n revision: this.revision,\n lastCallAt: this.lastCallAt,\n totals: { ...this.totals },\n clients: sorted(this.byClient),\n tools: sorted(this.byTool),\n sources: sorted(this.bySource),\n };\n }\n\n private rowFor(m: Map<string, RollupRow>, key: string): RollupRow {\n let row = m.get(key);\n if (!row) {\n row = zeroRow(key);\n m.set(key, row);\n }\n return row;\n }\n}\n\n// ── Formatting helpers (exported for tests) ──\n\n/** '45s' / '12m 03s' / '2h 14m' / '3d 02h' — compact uptime. */\nexport function fmtUptime(ms: number): string {\n const s = Math.max(0, Math.floor(ms / 1000));\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, '0')}s`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ${String(m % 60).padStart(2, '0')}m`;\n const d = Math.floor(h / 24);\n return `${d}d ${String(h % 24).padStart(2, '0')}h`;\n}\n\n/** 1234 → '1.2k', 2500000 → '2.50M'. */\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction fmtAvgMs(row: RollupRow): string {\n // Average only over calls that measured a wall time — CLI-sourced ledger\n // entries carry none, and counting them as 0 would fake a faster average.\n if (row.timed === 0) return '—';\n const avg = row.totalMs / row.timed;\n return avg >= 1000 ? `${(avg / 1000).toFixed(1)}s` : `${Math.round(avg)}ms`;\n}\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\n\n/** How many tool rows the live block shows before folding into \"+N more\". */\nconst MAX_TOOL_ROWS = 8;\n\n/**\n * The status block as lines (no I/O, injected clock) so it is unit-testable —\n * same pattern as `logoLines`. `tick` drives the spinner frame.\n */\nexport function serveStatusLines(snap: SessionSnapshot, now: number, tick = 0, siblingServers = 0): string[] {\n const spinner = mint(SPINNER[tick % SPINNER.length]!);\n const up = fmtUptime(now - snap.startedAt);\n const lines: string[] = [];\n // Assistant-spawned serve processes in this repo whose live counts are\n // folded into this view (see ./live-stats.ts) — worth a line either way:\n // \"your assistant IS connected, just to its own server process\".\n const siblingNote =\n siblingServers > 0\n ? ` ${c.dim(`incl. ${siblingServers} assistant-spawned server${siblingServers === 1 ? '' : 's'} in this repo`)}`\n : null;\n\n if (snap.totals.calls === 0) {\n lines.push(\n ` ${spinner} ${c.bold.white('vg serve')} ${c.dim('·')} up ${teal(up)} ${c.dim('· waiting for your assistant’s first call (MCP tool call, or `vg … --client=<ai>` CLI)…')}`,\n );\n if (siblingNote) lines.push(siblingNote);\n return lines;\n }\n\n const t = snap.totals;\n const answered = Math.round(((t.complete + t.partial) / t.calls) * 100);\n // The mcp-vs-cli split — shown once CLI-sourced calls exist, so a pure-MCP\n // session keeps the familiar compact header.\n const cli = snap.sources.find((s) => s.key === 'cli');\n const via = cli\n ? c.dim(' · via ') + snap.sources.map((s) => `${c.white(s.key)} ${teal(String(s.calls))}`).join(c.dim(' · '))\n : '';\n const ago = snap.lastCallAt === null ? '' : c.dim(` · last call ${fmtUptime(now - snap.lastCallAt)} ago`);\n lines.push(\n ` ${spinner} ${c.bold.white('vg serve')} ${c.dim('·')} up ${teal(up)} ${c.dim('·')} ` +\n `${c.bold.white(String(t.calls))} call${t.calls === 1 ? '' : 's'} ${c.dim('·')} ${mint(`${answered}%`)} answered${via}${ago}`,\n );\n\n // Which AI is calling, and how fast we answer it.\n lines.push(\n ` ${c.dim('clients')} ` +\n snap.clients\n .map((cl) => `${c.white(cl.key)} ${teal(String(cl.calls))}${c.dim(` (avg ${fmtAvgMs(cl)})`)}`)\n .join(c.dim(' · ')),\n );\n\n // Per-tool rows: calls, avg time and — for the grep-baseline tools — the\n // context served vs what a grep/read agent would have burned instead.\n const shown = snap.tools.slice(0, MAX_TOOL_ROWS);\n const nameW = Math.max(...shown.map((r) => r.key.length));\n for (const row of shown) {\n let line =\n ` ${c.white(row.key.padEnd(nameW))} ${teal(String(row.calls).padStart(4))} ${c.dim('·')} ` +\n c.dim(`avg ${fmtAvgMs(row)}`);\n if (SAVINGS_TOOLS.has(row.key) && row.baselineTokens > 0) {\n line += c.dim(' · ctx ') + c.white(fmtTokens(row.vgTokens)) + c.dim(` vs ≈${fmtTokens(row.baselineTokens)} grep/read`);\n }\n if (row.miss > 0) line += c.dim(' · ') + c.yellow(`${row.miss} miss`);\n lines.push(line);\n }\n if (snap.tools.length > shown.length) {\n lines.push(` ${c.dim(`… +${snap.tools.length - shown.length} more tools`)}`);\n }\n\n // Session totals + the honest estimate, on two lines so the block survives\n // narrow terminals without wrapping. Tokens only — no monetary figures: the\n // operator's model rate is unknowable here, and a wrong $ number reads as a\n // claim. `vg savings` remains the place for cost estimates with stated rates.\n if (t.baselineTokens > 0) {\n const savedTokens = Math.max(0, t.baselineTokens - t.vgTokens);\n const ratio = t.vgTokens > 0 ? (t.baselineTokens / t.vgTokens).toFixed(1) : '—';\n lines.push(\n ` ${c.dim('session')} ctx ${c.bold.white(fmtTokens(t.vgTokens))} ` +\n c.dim(`vs grep/read ≈${fmtTokens(t.baselineTokens)} → `) +\n mint(`${ratio}× fewer`),\n );\n lines.push(\n ` ${c.dim('est. saved ≈')} ${mint(`${fmtTokens(savedTokens)} context tokens`)} ${c.dim('(estimate)')}`,\n );\n }\n if (siblingNote) lines.push(siblingNote);\n return lines;\n}\n\n/** One-line summary for non-TTY heartbeats (logs, CI, piped stderr). */\nexport function serveHeartbeatLine(snap: SessionSnapshot, now: number): string {\n const up = fmtUptime(now - snap.startedAt);\n const t = snap.totals;\n if (t.calls === 0) return c.dim(`vg · serving for ${up} — no tool calls yet`);\n const clients = snap.clients.map((cl) => `${cl.key} ${cl.calls}`).join(', ');\n const cli = snap.sources.find((s) => s.key === 'cli');\n let line = `vg · serving for ${up} — ${t.calls} call${t.calls === 1 ? '' : 's'} (${clients})`;\n if (cli) line += ` · ${cli.calls} via CLI`;\n if (t.baselineTokens > 0) {\n const savedTokens = Math.max(0, t.baselineTokens - t.vgTokens);\n line += ` · ctx ${fmtTokens(t.vgTokens)} vs ≈${fmtTokens(t.baselineTokens)} grep/read · est. saved ≈ ${fmtTokens(savedTokens)} tokens`;\n }\n return c.dim(line);\n}\n\n/** TTY repaint cadence — 1s keeps the uptime ticking without meaningful cost. */\nconst TTY_INTERVAL_MS = 1000;\n/** Non-TTY heartbeat cadence — a quiet, greppable pulse in logs. */\nconst HEARTBEAT_INTERVAL_MS = 15 * 60 * 1000;\n\n/**\n * Drives the live status display on stderr for the lifetime of a serve process.\n *\n * - **TTY** (a human ran `vg serve` in a terminal): an in-place repainted block,\n * spinner + uptime + per-client/per-tool stats, redrawn atomically\n * (cursor-up + erase) with a dirty check, cursor hidden while live.\n * - **non-TTY** (assistant-spawned, logs, CI): one compact heartbeat line every\n * 15 minutes, and only when there is new activity — never log spam.\n *\n * Timers are unref'd: the MCP server, not this display, keeps the process alive.\n */\nexport class ServeStatusDisplay {\n private timer: ReturnType<typeof setInterval> | null = null;\n private tick = 0;\n private lastRowCount = 0;\n private lastFrame = '';\n private lastHeartbeatRevision = -1;\n private cursorHidden = false;\n private readonly isTTY: boolean;\n\n constructor(\n private readonly stats: SessionStats,\n private readonly stream: NodeJS.WriteStream = process.stderr,\n /** Fresh sibling-process snapshots to fold into the view (live-stats bus). */\n private readonly siblings?: () => SessionSnapshot[],\n ) {\n this.isTTY = (stream.isTTY ?? false) && process.env.VIBGRATE_PROGRESS_MODE !== 'plain';\n }\n\n start(): void {\n if (this.timer) return;\n if (this.isTTY) {\n this.hideCursor();\n // Restore the cursor however the process ends. SIGINT/SIGTERM: any\n // earlier-registered handler (e.g. the share-stats final flush) runs\n // first and exits; its process.exit still fires our 'exit' restore.\n process.on('exit', this.restoreCursor);\n process.once('SIGINT', () => {\n this.restoreCursor();\n process.exit(130);\n });\n process.once('SIGTERM', () => {\n this.restoreCursor();\n process.exit(143);\n });\n this.timer = setInterval(() => this.renderTTY(), TTY_INTERVAL_MS);\n this.renderTTY();\n } else {\n this.timer = setInterval(() => this.renderHeartbeat(), HEARTBEAT_INTERVAL_MS);\n }\n this.timer.unref?.();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.isTTY) {\n let buf = '';\n if (this.lastRowCount > 0) buf += `\\x1B[${this.lastRowCount}A\\x1B[J`;\n this.stream.write(buf);\n this.lastRowCount = 0;\n this.restoreCursor();\n }\n }\n\n private renderTTY(): void {\n this.tick++;\n const sibs = this.siblings?.() ?? [];\n const snap = mergeSnapshots(this.stats.snapshot(), sibs);\n const lines = serveStatusLines(snap, Date.now(), this.tick, sibs.length);\n const content = lines.join('\\n') + '\\n';\n if (content === this.lastFrame) return;\n this.lastFrame = content;\n // Atomic repaint: cursor-up over the previous block, erase to end, redraw.\n let buf = '';\n if (this.lastRowCount > 0) buf += `\\x1B[${this.lastRowCount}A\\x1B[J`;\n buf += content;\n this.stream.write(buf);\n this.lastRowCount = this.countRows(lines);\n }\n\n private renderHeartbeat(): void {\n const snap = this.stats.snapshot();\n // Only pulse when something happened since the last line — idle logs stay idle.\n if (snap.revision === this.lastHeartbeatRevision) return;\n this.lastHeartbeatRevision = snap.revision;\n this.stream.write(serveHeartbeatLine(snap, Date.now()) + '\\n');\n }\n\n /** Terminal rows the frame occupies, accounting for line wrap. */\n private countRows(lines: string[]): number {\n const columns = Math.max(this.stream.columns ?? 80, 20);\n return lines.reduce((total, line) => {\n const visible = line.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n return total + Math.max(1, Math.ceil(visible / columns));\n }, 0);\n }\n\n private hideCursor(): void {\n if (this.cursorHidden) return;\n this.stream.write('\\x1B[?25l');\n this.cursorHidden = true;\n }\n\n private readonly restoreCursor = (): void => {\n if (!this.cursorHidden) return;\n this.stream.write('\\x1B[?25h');\n this.cursorHidden = false;\n };\n}\n","import * as fs from 'node:fs';\nimport { sanitizeClient, type SavingEntry } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\n\n/**\n * Folds CLI navigation calls into the live `vg serve` status display.\n *\n * An agent that shells out to the CLI (`vg impact <name> --client=claude`)\n * appends a counts-only entry to the local ledger (`.vibgrate/cache/\n * savings.jsonl`, engine/savings.ts) — a different process from the serve one,\n * so the in-memory SessionStats never sees it. This tail polls the ledger for\n * lines appended after serve start and records the `source: 'cli'` ones into\n * the same SessionStats the display renders, so the operator watching\n * `vg serve` sees CLI traffic too.\n *\n * Only `cli` entries are ingested: `mcp` lines are written by a serve process\n * that already recorded them live (its own, or another one — either way,\n * counting them here would double-book).\n *\n * Everything stays in-process and local. Polling (not fs.watch) because watch\n * semantics differ per platform (and are unreliable on Windows/network drives);\n * a 2s stat of one small file is free. The timer is unref'd — the MCP server,\n * not this tail, keeps the process alive.\n */\n\nconst POLL_INTERVAL_MS = 2000;\n\nexport class LedgerTail {\n private timer: ReturnType<typeof setInterval> | null = null;\n /** Byte offset of the next unread ledger byte (always at a line boundary). */\n private offset = 0;\n\n constructor(\n private readonly file: string,\n private readonly stats: SessionStats,\n private readonly intervalMs = POLL_INTERVAL_MS,\n ) {}\n\n start(): void {\n if (this.timer) return;\n // Start at the current end: only calls made while this serve runs count —\n // the display is a session view, not a history report (`vg savings` is).\n this.offset = this.sizeOf();\n this.timer = setInterval(() => this.poll(), this.intervalMs);\n this.timer.unref?.();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** One poll cycle — exposed for tests (deterministic, no timers needed). */\n poll(now: number = Date.now()): void {\n let size: number;\n try {\n size = this.sizeOf();\n } catch {\n return; // never let the display break serving\n }\n // Shrunk file = truncated/rotated ledger — start over from the top.\n if (size < this.offset) this.offset = 0;\n if (size === this.offset) return;\n\n let chunk: Buffer;\n try {\n const fd = fs.openSync(this.file, 'r');\n try {\n chunk = Buffer.alloc(size - this.offset);\n fs.readSync(fd, chunk, 0, chunk.length, this.offset);\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return;\n }\n // Consume only whole lines; a partially-flushed last line stays for the\n // next poll (offset advances to just past the final newline).\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline < 0) return;\n const text = chunk.subarray(0, lastNewline).toString('utf8');\n this.offset += lastNewline + 1;\n for (const line of text.split('\\n')) ingestLedgerLine(this.stats, line, now);\n }\n\n private sizeOf(): number {\n try {\n return fs.statSync(this.file).size;\n } catch {\n return 0; // no ledger yet — nothing recorded so far\n }\n }\n}\n\n/**\n * Record one ledger line into the session stats iff it is a CLI-sourced call.\n * Corrupt lines are skipped, same as every other ledger reader.\n */\nexport function ingestLedgerLine(stats: SessionStats, line: string, now: number): void {\n if (!line.trim()) return;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n return;\n }\n if (e.source !== 'cli' || typeof e.tool !== 'string') return;\n stats.record(\n {\n tool: e.tool,\n client: sanitizeClient(e.client),\n outcome: e.outcome ?? 'complete',\n source: 'cli',\n // CLI lines carry no wall time — leave ms absent (\"not measured\").\n vgTokens: e.vgTokens ?? 0,\n baselineTokens: e.baselineTokens ?? 0,\n },\n now,\n );\n}\n","import * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { serveStdio, createServer, GraphSource, type ServeOptions } from '../mcp/server.js';\nimport { StatsSharer, statsEndpoint, telemetryOptOut } from '../engine/stats-share.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { driftCount } from '../engine/freshness.js';\nimport { runBuild } from './build.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info } from '../util/output.js';\nimport { originAllowed } from '../util/origin.js';\nimport { printLogo } from '../util/logo.js';\nimport { SessionStats, ServeStatusDisplay } from '../mcp/serve-stats.js';\nimport { LedgerTail } from '../mcp/ledger-tail.js';\nimport { LiveStatsBus, liveStatsDir } from '../mcp/live-stats.js';\nimport { savingsLedgerPath } from '../engine/savings.js';\n\n/** How often the opt-in `--share-stats` flusher uploads new ledger entries. */\nconst SHARE_FLUSH_INTERVAL_MS = 5 * 60 * 1000;\n\n/**\n * `vg serve` (VG-CLI-SPEC §3.6) — a LOCAL MCP server over the map. Default\n * transport is stdio (what assistants spawn); `--http` exposes a stateless\n * streamable-HTTP endpoint for local browser/shared hosts. Fully offline,\n * read-only tools only. Independent of Vibgrate's hosted cloud MCP.\n *\n * The map auto-refreshes: tool calls run a cheap freshness probe and trigger\n * an incremental in-process rebuild when the working tree drifted, so the AI\n * always queries an up-to-date graph (see mcp/server.ts). `--no-refresh`\n * pins serving to the map as built; a custom `--graph` implies it.\n *\n * Before the server accepts its first request it also brings the map in sync\n * once, up front: a missing map is built from scratch and a stale map is\n * rebuilt incrementally (see `ensureServableGraph`). That way the first tool\n * call already sees an up-to-date graph instead of waiting for the in-process\n * probe — which only fires once tool calls start arriving — to notice drift.\n */\nexport function registerServe(program: Command): void {\n const cmd = program\n .command('serve')\n .description('start Vibgrate AI Context — local-first MCP serving your code map, drift & version-correct docs to your AI')\n .option('--http', 'serve over streamable HTTP instead of stdio')\n .option('--port <n>', 'port for --http', '7437')\n .option('--host <h>', 'host for --http', '127.0.0.1')\n .option('--savings', 'record local, counts-only usage savings (opt-in; off by default)')\n .option('--share-stats', 'ALSO upload the counts-only usage ledger to Vibgrate to improve the local MCP (opt-in; off by default; implies --savings; disabled under --local)')\n .option('--dedup', \"collapse a node's heavy relation lists on repeat reads within a session (opt-in; saves tokens)\")\n .option('--no-refresh', 'serve the map as built — skip the auto-rebuild when files change')\n .action(async function (this: Command, opts: { http?: boolean; port?: string; host?: string; savings?: boolean; shareStats?: boolean; dedup?: boolean; refresh?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const graphPath = global.graph ?? defaultGraphPath(root);\n // A custom --graph is an explicit artifact — never rebuild over it.\n const refresh = opts.refresh !== false && !global.graph;\n // Sharing needs the network, so `--local` (air-gapped) hard-disables the\n // upload — but still lets `--savings` record locally. Sharing implies\n // recording so there's something to send.\n const local = global.local === true;\n // The universal DO_NOT_TRACK opt-out (and VIBGRATE_TELEMETRY=0) wins even\n // over an explicit --share-stats: the env is how operators of shared or\n // managed machines say \"never upload\", and CI passes flags mechanically.\n const optOut = telemetryOptOut();\n const shareStats = opts.shareStats === true && !local && optOut === null;\n // Live session stats (in-memory only — nothing persisted or uploaded, so\n // no opt-in needed): uptime, which AI is calling, per-tool calls/timing,\n // and the context-vs-grep-baseline estimate, rendered to stderr while the\n // server runs. `--quiet` turns the whole display off.\n const quiet = global.quiet === true;\n const stats = quiet ? undefined : new SessionStats();\n if (!quiet) {\n // Brand banner for a human at a TTY, same as the scanner (printLogo\n // no-ops under a pipe, so assistant-spawned stdio stays clean).\n printLogo(root, { product: 'AI Context', tagline: 'Local-first MCP for your AI' });\n }\n const serveOpts: ServeOptions = {\n // A *requested* --share-stats always implies local recording, even when\n // the upload itself is suppressed (--local / env opt-out) — the local\n // ledger never leaves the machine, and the disclosure messages below\n // promise \"recording locally\".\n savings: opts.savings === true || opts.shareStats === true,\n shareStats,\n local,\n dedup: opts.dedup === true,\n refresh,\n stats,\n };\n\n // Check the map is up to date and, when it isn't, run the build before we\n // start serving — build a missing map from scratch, rebuild a stale one\n // incrementally. Skipped under `--no-refresh`/`--graph`, which serve the\n // map exactly as built.\n await ensureServableGraph(root, graphPath, global, refresh);\n\n if (opts.shareStats === true && local) {\n info(c.dim('vg · --share-stats ignored under --local (air-gapped): recording locally, not uploading.'));\n } else if (opts.shareStats === true && optOut !== null) {\n info(c.dim(`vg · --share-stats disabled by ${optOut}: recording locally, not uploading.`));\n }\n if (shareStats) startSharing(root);\n\n // Cross-process live stats, split by role so nothing double-counts:\n // an assistant-spawned (non-interactive) serve PUBLISHES its counts to\n // the ephemeral bus; the operator's terminal (interactive) serve\n // AGGREGATES — it folds sibling snapshots and the CLI `--client` ledger\n // into its display. See mcp/live-stats.ts and mcp/ledger-tail.ts.\n const interactive = process.stderr.isTTY === true;\n const bus = stats ? new LiveStatsBus(liveStatsDir(root), stats) : undefined;\n if (bus && !interactive) bus.start();\n // The display starts only after the startup lines are printed, so they\n // stay in scroll history above the repainted status block.\n const display = stats\n ? new ServeStatusDisplay(stats, process.stderr, bus && interactive ? () => bus.siblings() : undefined)\n : undefined;\n // Fold in CLI navigation calls (`vg <cmd> --client=<ai>`) made while\n // serving: they land in the local ledger from a separate process, so the\n // watching display tails it — otherwise an agent that shells out to the\n // CLI would leave this dashboard frozen at zero. Interactive-only: if a\n // publisher folded them too, the aggregate would count each call twice.\n if (stats && interactive) new LedgerTail(savingsLedgerPath(root), stats).start();\n const freshness = refresh ? 'auto-refresh' : 'as built';\n if (opts.http) {\n await serveHttp(graphPath, opts.host ?? '127.0.0.1', Number(opts.port) || 7437, serveOpts, freshness, () => display?.start());\n } else {\n // stdio: NOTHING may go to stdout except the protocol stream.\n info(c.dim(`vg · MCP server on stdio (read-only, ${freshness}). Connect your assistant to this process.`));\n await serveStdio(graphPath, serveOpts);\n display?.start();\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/**\n * Ensure there is an up-to-date map to serve before the MCP server starts.\n *\n * When auto-refresh is on (the default; disabled by `--no-refresh` or a pinned\n * `--graph`):\n * - **No map yet** → run the ordinary `vg build` so a fresh checkout can `vg\n * serve` without a separate build step first. Forced out of `--json` so the\n * build summary never lands on stdout — under stdio that channel is the MCP\n * protocol stream and carries nothing else.\n * - **Map present but stale** → the incremental refresh (`refreshIfStale`),\n * replaying the last build's scope. Fail-soft: a refresh error degrades to\n * serving the last built map rather than refusing to start.\n *\n * With auto-refresh off we serve the map exactly as built and only verify one\n * exists. Either way, if there is still no map afterwards we stop with an\n * actionable error instead of starting a server with nothing to answer from.\n *\n * `opts.inline` forces single-threaded build/refresh (tests only).\n */\nexport async function ensureServableGraph(\n root: string,\n graphPath: string,\n global: GlobalOpts,\n refresh: boolean,\n opts: { inline?: boolean } = {},\n): Promise<void> {\n if (refresh) {\n if (!fs.existsSync(graphPath)) {\n info(c.dim('vg · no map found — building it before serving…'));\n await runBuild(\n [],\n { html: false, report: false, jobs: opts.inline ? '1' : undefined },\n { ...global, json: false },\n );\n } else {\n const refreshed = await refreshIfStale(root, { inline: opts.inline });\n if (refreshed.status === 'refreshed') {\n const n = driftCount(refreshed.drift);\n info(c.dim(`vg · map refreshed before serving — ${n} file(s) drifted (${(refreshed.ms / 1000).toFixed(2)}s)`));\n } else if (refreshed.status === 'error') {\n info(c.yellow(`vg · map refresh failed (${refreshed.message}) — serving the last built map`));\n }\n }\n }\n\n if (!fs.existsSync(graphPath)) {\n throw new CliError(\n `no map found at ${graphPath} — run \\`vg\\` to build one first`,\n ExitCode.NOT_FOUND,\n );\n }\n}\n\n/**\n * Start the opt-in usage-stats upload for this serve session: a clear one-time\n * disclosure, a periodic flush of the counts-only ledger, and a final flush when\n * the process is asked to stop. Everything is best-effort — a network problem\n * never affects serving. Nothing here is reached unless the operator passed\n * `--share-stats` (and is not `--local`).\n */\nfunction startSharing(root: string): void {\n const sharer = new StatsSharer(root);\n // Transparency (GUARDRAILS §3.4): say exactly what is shared, where, and how to\n // stop. To stderr, so it never pollutes the stdio protocol stream.\n info(\n c.dim(\n `vg · sharing counts-only usage stats with Vibgrate (${statsEndpoint()}) to improve the local MCP. ` +\n 'No code, paths, or questions are sent. Stop by omitting --share-stats.',\n ),\n );\n const timer = setInterval(() => void sharer.flush(), SHARE_FLUSH_INTERVAL_MS);\n timer.unref?.(); // the server, not this timer, keeps the process alive\n\n let flushed = false;\n const finalFlush = (): void => {\n if (flushed) return;\n flushed = true;\n void sharer.flush();\n };\n process.once('SIGINT', () => {\n finalFlush();\n process.exit(0);\n });\n process.once('SIGTERM', () => {\n finalFlush();\n process.exit(0);\n });\n process.once('beforeExit', finalFlush);\n}\n\nasync function serveHttp(\n graphPath: string,\n host: string,\n port: number,\n opts: ServeOptions,\n freshness: string,\n onReady?: () => void,\n): Promise<void> {\n const { createServer: createHttp } = await import('node:http');\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp.js'\n );\n\n // One graph source for the whole process: the parsed graph, hot-reload state,\n // and refresh debounce live across requests (re-parsing per request would be\n // wasteful and would probe freshness on every call).\n const source = new GraphSource(graphPath, opts.refresh !== false);\n\n const httpServer = createHttp(async (req, res) => {\n if (req.url !== '/mcp') {\n res.writeHead(404).end('not found');\n return;\n }\n // DNS-rebinding protection (MCP 2025-11-25): a browser-set Origin must be\n // loopback or explicitly allowlisted; absent Origin (CLI clients) passes.\n // See util/origin.ts.\n const origin = req.headers.origin;\n if (!originAllowed(origin, process.env.VIBGRATE_ALLOWED_ORIGINS)) {\n res.writeHead(403, { 'Content-Type': 'text/plain' }).end(\n 'forbidden origin — vg serve only accepts browser requests from loopback origins. ' +\n 'Set VIBGRATE_ALLOWED_ORIGINS to allow others.',\n );\n return;\n }\n try {\n // Stateless: a fresh server+transport per request (no session state) —\n // simple and robust for a local single-user endpoint. (Per-request, so\n // `--dedup` only accumulates within stdio sessions, not across HTTP calls.)\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n const server = createServer(source, opts);\n res.on('close', () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res);\n } catch (err) {\n if (!res.headersSent) res.writeHead(500).end('internal error');\n info(c.red(`vg serve: request error: ${(err as Error).message}`));\n }\n });\n\n await new Promise<void>((resolve) => httpServer.listen(port, host, resolve));\n info(c.dim(`vg · MCP server on http://${host}:${port}/mcp (read-only, local, ${freshness})`));\n // Live status display, once the listen line is safely in scroll history.\n onReady?.();\n // Keep the process alive until killed.\n await new Promise<never>(() => {});\n}\n","/**\n * Minimal LSP transport — JSON-RPC 2.0 over stdio with `Content-Length` framing.\n *\n * Deliberately zero-dependency. Vibgrate's whole thesis is dependency currency;\n * pulling `vscode-languageserver` (and its tree) into the published CLI to move\n * a few hundred bytes of JSON would be a poor advertisement for the product.\n * The surface we need is small and the framing is fully specified by LSP §3.\n *\n * See `docs/IDE-INTEGRATION-PLAN.md` §3.\n */\n\nexport interface RpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type RequestHandler = (method: string, params: unknown) => unknown | Promise<unknown>;\nexport type NotificationHandler = (method: string, params: unknown) => void | Promise<void>;\n\n/** LSP error codes we actually use (LSP §3.16.1). */\nexport const ErrorCodes = {\n MethodNotFound: -32601,\n InternalError: -32603,\n} as const;\n\n/**\n * Reads `Content-Length`-framed JSON-RPC messages from a byte stream.\n *\n * Buffers on a Buffer (not a string) because `Content-Length` counts *bytes*,\n * not characters: a header saying 120 bytes over a body with any multi-byte\n * UTF-8 in it (a package name with a non-ASCII char, an EOL date with an\n * en-dash) would be mis-sliced by string-length accounting, and every message\n * after it in the stream would be shifted. This is the classic LSP framing bug.\n */\nexport class MessageReader {\n private buf: Buffer = Buffer.alloc(0);\n\n /** Feed a chunk; returns every complete message now available. */\n push(chunk: Buffer): RpcMessage[] {\n this.buf = this.buf.length === 0 ? chunk : Buffer.concat([this.buf, chunk]);\n const out: RpcMessage[] = [];\n\n for (;;) {\n const headerEnd = this.buf.indexOf('\\r\\n\\r\\n');\n if (headerEnd === -1) break;\n\n const header = this.buf.subarray(0, headerEnd).toString('ascii');\n const match = /content-length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n // Unrecoverable: a frame with no length. Drop the header and resync\n // rather than spin forever on the same bytes.\n this.buf = this.buf.subarray(headerEnd + 4);\n continue;\n }\n\n const length = Number(match[1]);\n const bodyStart = headerEnd + 4;\n if (this.buf.length < bodyStart + length) break; // body not fully arrived\n\n const body = this.buf.subarray(bodyStart, bodyStart + length).toString('utf8');\n this.buf = this.buf.subarray(bodyStart + length);\n\n try {\n out.push(JSON.parse(body) as RpcMessage);\n } catch {\n // A malformed body is not worth killing the server over — the editor\n // will re-request. Skip it.\n }\n }\n\n return out;\n }\n}\n\n/** Writes `Content-Length`-framed JSON-RPC messages to a stream. */\nexport class MessageWriter {\n constructor(private readonly out: NodeJS.WritableStream) {}\n\n write(msg: RpcMessage): void {\n const body = Buffer.from(JSON.stringify(msg), 'utf8');\n this.out.write(`Content-Length: ${body.length}\\r\\n\\r\\n`);\n this.out.write(body);\n }\n}\n\n/**\n * A tiny JSON-RPC connection: dispatches requests and notifications, and lets\n * the server push notifications back to the client.\n */\nexport class Connection {\n private readonly reader = new MessageReader();\n private readonly writer: MessageWriter;\n private readonly requests = new Map<string, RequestHandler>();\n private readonly notifications = new Map<string, NotificationHandler>();\n\n constructor(\n input: NodeJS.ReadableStream = process.stdin,\n output: NodeJS.WritableStream = process.stdout,\n ) {\n this.writer = new MessageWriter(output);\n input.on('data', (chunk: Buffer) => {\n for (const msg of this.reader.push(chunk)) void this.dispatch(msg);\n });\n }\n\n onRequest(method: string, handler: RequestHandler): void {\n this.requests.set(method, handler);\n }\n\n onNotification(method: string, handler: NotificationHandler): void {\n this.notifications.set(method, handler);\n }\n\n /** Push a server→client notification (diagnostics, `vibgrate/score`, …). */\n notify(method: string, params: unknown): void {\n this.writer.write({ jsonrpc: '2.0', method, params });\n }\n\n private async dispatch(msg: RpcMessage): Promise<void> {\n if (!msg.method) return; // a response to something we sent; we send no requests\n\n const isRequest = msg.id !== undefined && msg.id !== null;\n\n if (!isRequest) {\n const handler = this.notifications.get(msg.method);\n if (handler) {\n try {\n await handler(msg.method, msg.params);\n } catch {\n // A failed notification must never take the server down: the editor\n // would show \"server crashed\" and the user would uninstall us.\n }\n }\n return;\n }\n\n const handler = this.requests.get(msg.method);\n if (!handler) {\n this.writer.write({\n jsonrpc: '2.0',\n id: msg.id,\n error: { code: ErrorCodes.MethodNotFound, message: `Unhandled method: ${msg.method}` },\n });\n return;\n }\n\n try {\n const result = await handler(msg.method, msg.params);\n this.writer.write({ jsonrpc: '2.0', id: msg.id, result: result ?? null });\n } catch (err) {\n this.writer.write({\n jsonrpc: '2.0',\n id: msg.id,\n error: {\n code: ErrorCodes.InternalError,\n message: err instanceof Error ? err.message : 'Internal error',\n },\n });\n }\n }\n}\n","/**\n * Maps a dependency name to the line it is declared on, inside a manifest.\n *\n * This is the one thing the scan engine cannot tell us: it reports *what* is\n * drifted, not *where the text is*. The editor needs a line to hang a\n * decoration, a hover, or a diagnostic on.\n *\n * Deliberately lexical, not a full parse. We are matching a declaration line in\n * a file the user is looking at; a tolerant regex over the exact text in the\n * editor buffer beats a parser that fails on a half-typed edit. If we can't\n * find a line, we return nothing and the surface silently doesn't render —\n * which is the correct failure mode for an ambient feature.\n */\n\nexport type ManifestKind =\n | 'package.json'\n | 'go.mod'\n | 'requirements.txt'\n | 'pyproject.toml'\n | 'Cargo.toml'\n | 'pom.xml'\n | 'build.gradle'\n | 'Gemfile'\n | 'composer.json'\n | 'pubspec.yaml'\n | 'mix.exs'\n | 'csproj'\n | 'Dockerfile'\n | 'unknown';\n\n/** Classify a path so we know which matcher to use. Case-insensitive on the basename. */\nexport function manifestKind(filePath: string): ManifestKind {\n const base = (filePath.split(/[\\\\/]/).pop() ?? '').toLowerCase();\n if (base === 'package.json') return 'package.json';\n if (base === 'go.mod') return 'go.mod';\n if (base === 'requirements.txt' || /^requirements.*\\.txt$/.test(base)) return 'requirements.txt';\n if (base === 'pyproject.toml') return 'pyproject.toml';\n if (base === 'cargo.toml') return 'Cargo.toml';\n if (base === 'pom.xml') return 'pom.xml';\n if (base === 'build.gradle' || base === 'build.gradle.kts') return 'build.gradle';\n if (base === 'gemfile') return 'Gemfile';\n if (base === 'composer.json') return 'composer.json';\n if (base === 'pubspec.yaml') return 'pubspec.yaml';\n if (base === 'mix.exs') return 'mix.exs';\n if (base.endsWith('.csproj') || base.endsWith('.fsproj') || base.endsWith('.vbproj')) return 'csproj';\n if (base === 'dockerfile' || base.startsWith('dockerfile.')) return 'Dockerfile';\n return 'unknown';\n}\n\n/** True when this file is one the LSP should attach surfaces to. */\nexport function isManifest(filePath: string): boolean {\n return manifestKind(filePath) !== 'unknown';\n}\n\n/** Escape a package name for safe embedding in a RegExp. */\nfunction esc(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Find the 0-based line index on which `pkg` is declared in `text`.\n * Returns -1 when not found.\n */\nexport function findPackageLine(text: string, pkg: string, kind: ManifestKind): number {\n const lines = text.split(/\\r?\\n/);\n const p = esc(pkg);\n\n // Ordered candidate matchers. The first that hits wins.\n const patterns: RegExp[] = (() => {\n switch (kind) {\n case 'package.json':\n case 'composer.json':\n // \"react\": \"^17.0.2\" — the key, quoted, followed by a colon\n return [new RegExp(`^\\\\s*\"${p}\"\\\\s*:`)];\n\n case 'go.mod':\n // \tgithub.com/foo/bar v1.2.3 (inside a require block, or `require x v1`)\n return [new RegExp(`^\\\\s*(?:require\\\\s+)?${p}\\\\s+v?\\\\d`)];\n\n case 'requirements.txt':\n // requests==2.31.0 · requests>=2 · requests[security]==2 · requests\n return [new RegExp(`^\\\\s*${p}\\\\s*(?:\\\\[[^\\\\]]*\\\\])?\\\\s*(?:[=<>!~]|$)`, 'i')];\n\n case 'pyproject.toml':\n case 'Cargo.toml':\n // foo = \"1.2\" · foo = { version = \"1.2\" } · \"foo>=1.2\" (poetry/pep621 arrays)\n return [\n new RegExp(`^\\\\s*${p}\\\\s*=`),\n new RegExp(`^\\\\s*\"${p}\\\\s*(?:[=<>!~\\\\[]|\")`),\n ];\n\n case 'pom.xml':\n // <artifactId>spring-boot</artifactId>\n return [new RegExp(`<artifactId>\\\\s*${p}\\\\s*</artifactId>`)];\n\n case 'build.gradle':\n // implementation 'com.foo:bar:1.2' · implementation(\"com.foo:bar:1.2\")\n return [new RegExp(`[\"']${p}(?:[\"':])`)];\n\n case 'Gemfile':\n // gem 'rails', '~> 7.0'\n return [new RegExp(`^\\\\s*gem\\\\s+[\"']${p}[\"']`)];\n\n case 'pubspec.yaml':\n return [new RegExp(`^\\\\s*${p}\\\\s*:`)];\n\n case 'mix.exs':\n // {:phoenix, \"~> 1.7\"}\n return [new RegExp(`\\\\{\\\\s*:${p}\\\\s*,`)];\n\n case 'csproj':\n // <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.1\" />\n return [new RegExp(`Include\\\\s*=\\\\s*\"${p}\"`, 'i')];\n\n case 'Dockerfile':\n // FROM node:18-alpine — the \"package\" here is the base image\n return [new RegExp(`^\\\\s*FROM\\\\s+.*${p}`, 'i')];\n\n default:\n return [];\n }\n })();\n\n for (const re of patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i])) return i;\n }\n }\n\n return -1;\n}\n\n/**\n * The line a *runtime* constraint sits on — `engines.node`, `go 1.21`,\n * `<java.version>`, `FROM node:18`. Used to place the EOL-runtime diagnostic on\n * the actual offending line instead of dumping it at the top of the file.\n * Returns -1 when we can't place it (caller falls back to line 0).\n */\nexport function findRuntimeLine(text: string, kind: ManifestKind): number {\n const lines = text.split(/\\r?\\n/);\n const patterns: RegExp[] = (() => {\n switch (kind) {\n case 'package.json':\n return [/^\\s*\"node\"\\s*:/, /^\\s*\"engines\"\\s*:/];\n case 'go.mod':\n return [/^\\s*go\\s+\\d/];\n case 'pyproject.toml':\n return [/^\\s*(?:requires-python|python)\\s*=/];\n case 'pom.xml':\n return [/<(?:java\\.version|maven\\.compiler\\.(?:source|target|release))>/];\n case 'build.gradle':\n return [/(?:sourceCompatibility|targetCompatibility|JavaVersion)/];\n case 'csproj':\n return [/<TargetFrameworks?>/i];\n case 'Dockerfile':\n return [/^\\s*FROM\\s+/i];\n default:\n return [];\n }\n })();\n\n for (const re of patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i])) return i;\n }\n }\n\n return -1;\n}\n\n/** The end-of-line column for a given line — where an `after` decoration lands. */\nexport function endOfLine(text: string, line: number): number {\n const lines = text.split(/\\r?\\n/);\n return (lines[line] ?? '').length;\n}\n","/**\n * Drift-scan result cache for `vg lsp`.\n *\n * `runCoreScan` is the expensive part of a scan (per-package registry lookups),\n * not reading the manifest/lockfile — so on every editor activation, hashing\n * just the manifest+lockfile bytes first and comparing to the last successful\n * scan's hash lets an unchanged repo skip `runCoreScan` entirely and replay the\n * cached result instantly. Only a real dependency change (any manifest or\n * lockfile byte differs) pays for a fresh scan.\n *\n * Lives under `.vibgrate/cache/` (gitignored, machine-local) alongside the\n * graph's parse cache and freshness snapshot — same convention, same directory.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { hashBytes, hashString, canonicalize } from '../engine/hash.js';\nimport { cacheDir } from '../engine/cache.js';\nimport { stableStringify } from '../engine/serialize.js';\nimport { SKIP_DIRS, SKIP_FILES } from '../engine/discover.js';\nimport { isManifest } from './manifest-positions.js';\nimport type { ScanArtifact } from '../core-open/index.js';\n\n// Bumped: v1 caches carried no `toolVersion`/`offline` guard, so a scan cached\n// under an older engine build (or under `--local`, before registry access was\n// available) replayed forever once the manifest stopped changing — even after\n// an upgrade or the network came back. Bumping discards every v1 cache on read.\nconst CACHE_VERSION = 'vg-lsp-scan-cache/2';\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'lsp-scan.json');\n}\n\n/**\n * Hash every manifest (`package.json`, `go.mod`, …) and lockfile\n * (`package-lock.json`, `go.sum`, …) under `root`, combined into one stable\n * digest. A cheap stat+read walk — no registry calls, no dependency\n * resolution — so it is safe to run before every scan as a gate.\n */\nexport function manifestHash(root: string): string {\n const files: { rel: string; hash: string }[] = [];\n\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return; // unreadable dir — skip rather than crash the probe\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n const base = entry.name.toLowerCase();\n if (!isManifest(abs) && !SKIP_FILES.has(base)) continue;\n try {\n const rel = path.relative(root, abs).split(path.sep).join('/');\n files.push({ rel, hash: hashBytes(fs.readFileSync(abs)) });\n } catch {\n // Unreadable/raced-away file — leave it out; worst case is an extra\n // rescan next time, never a wrong cache hit.\n }\n }\n };\n walk(root);\n\n files.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));\n return hashString(canonicalize(files));\n}\n\nexport interface ScanCacheEntry {\n manifestHash: string;\n artifact: ScanArtifact;\n}\n\n/**\n * A cache hit must match on more than the manifest bytes: `toolVersion` guards\n * against an engine upgrade changing what a scan produces (mirrors the parse\n * cache's `toolVersion` invalidation in `engine/cache.ts`), and `offline`\n * guards against replaying an offline scan's unresolved drift once the\n * network — or `vibgrate.offline` — changes. Both are cheap to compare and\n * cheap to get wrong, so they are required, not optional.\n */\nexport interface ScanCacheKey {\n manifestHash: string;\n toolVersion: string;\n offline: boolean;\n}\n\n/** Best-effort read. Returns null on a missing, corrupt, stale-version, or non-matching-key cache. */\nexport function loadScanCache(root: string, key: ScanCacheKey): ScanCacheEntry | null {\n try {\n const raw = JSON.parse(fs.readFileSync(cachePath(root), 'utf8')) as {\n version?: string;\n manifestHash?: string;\n toolVersion?: string;\n offline?: boolean;\n artifact?: ScanArtifact;\n };\n if (\n raw.version === CACHE_VERSION &&\n raw.manifestHash === key.manifestHash &&\n raw.toolVersion === key.toolVersion &&\n raw.offline === key.offline &&\n raw.artifact\n ) {\n return { manifestHash: raw.manifestHash, artifact: raw.artifact };\n }\n } catch {\n /* missing/corrupt — treat as no cache */\n }\n return null;\n}\n\n/** Best-effort write (a read-only checkout etc. just means no cache next time). */\nexport function writeScanCache(root: string, key: ScanCacheKey, artifact: ScanArtifact): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(\n cachePath(root),\n stableStringify(\n { version: CACHE_VERSION, manifestHash: key.manifestHash, toolVersion: key.toolVersion, offline: key.offline, artifact },\n 0,\n ),\n );\n } catch {\n /* best-effort only */\n }\n}\n","/**\n * `vibgrate/graph/query` — the graph-command surface for editor clients.\n *\n * Every mode here calls the exact same engine functions the CLI commands\n * (`vg ask`, `vg areas`, `vg hubs`, `vg impact`, `vg path`, `vg show`,\n * `vg tree`) call — no re-implementation, no shelling out to a second `vg`\n * process. That is what keeps \"ONE ENGINE, MANY THIN CLIENTS\" (see\n * `server.ts` file header) true for the graph, not just the DriftScore.\n *\n * Unlike the CLI commands, a lookup failure here returns a typed result\n * instead of throwing `CliError` — this is a long-lived server, not a\n * one-shot process that exits on error.\n */\n\nimport { queryGraph, queryGraphSemantic, type QueryResult } from '../engine/query.js';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { impactOf } from '../engine/impact.js';\nimport { shortestPath } from '../engine/paths.js';\nimport { indexFor } from '../engine/relations.js';\nimport { toJsonTree } from '../commands/tree.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\nexport type GraphQueryMode = 'ask' | 'areas' | 'hubs' | 'impact' | 'path' | 'show' | 'tree';\n\nexport interface GraphQueryParams {\n mode: GraphQueryMode;\n question?: string;\n semantic?: boolean;\n budget?: number;\n limit?: number;\n name?: string;\n depth?: number;\n a?: string;\n b?: string;\n callers?: boolean;\n}\n\nexport interface GraphQueryContext {\n root: string;\n /** Mirrors `vg ask --local` — skip the embedding download even if `semantic` was requested. */\n offline: boolean;\n /** Mirrors `vg ask --no-semantic` — `false` forces lexical search regardless of the request. */\n semantic?: boolean;\n}\n\ninterface CandidateSummary {\n name: string;\n kind: string;\n file: string;\n line: number;\n}\n\nexport type GraphQueryResult =\n | { ok: true; mode: GraphQueryMode; data: unknown }\n | {\n ok: false;\n mode: GraphQueryMode;\n error: 'ambiguous' | 'not-found' | 'bad-request' | 'disabled';\n message: string;\n candidates?: CandidateSummary[];\n };\n\nexport async function runGraphQuery(\n graph: VgGraph,\n params: GraphQueryParams,\n ctx: GraphQueryContext,\n): Promise<GraphQueryResult> {\n switch (params.mode) {\n case 'ask':\n return runAsk(graph, params, ctx);\n case 'areas':\n return runAreas(graph, params);\n case 'hubs':\n return runHubs(graph, params);\n case 'impact':\n return runImpact(graph, params);\n case 'path':\n return runPath(graph, params);\n case 'show':\n return runShow(graph, params);\n case 'tree':\n return runTree(graph, params);\n default:\n return { ok: false, mode: params.mode, error: 'bad-request', message: `unknown mode \"${String(params.mode)}\"` };\n }\n}\n\nasync function runAsk(graph: VgGraph, params: GraphQueryParams, ctx: GraphQueryContext): Promise<GraphQueryResult> {\n const question = (params.question ?? '').trim();\n if (!question) return { ok: false, mode: 'ask', error: 'bad-request', message: 'question is required' };\n\n const budget = params.budget ?? 2000;\n const wantSemantic = !!params.semantic && !ctx.offline && ctx.semantic !== false;\n\n let result: QueryResult;\n let mode = 'lexical';\n let note: string | undefined;\n\n if (wantSemantic) {\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({ onUnavailable: (r) => (reason = r) });\n if (embedder) {\n const vectors = await getNodeEmbeddings(graph, embedder, ctx.root);\n result = await queryGraphSemantic(graph, question, { budget, embedder, nodeVectors: vectors });\n mode = `semantic (${embedder.id})`;\n } else {\n result = queryGraph(graph, question, { budget });\n note = reason ? unavailableMessage(reason) : 'semantic unavailable; used lexical';\n }\n } else {\n result = queryGraph(graph, question, { budget });\n if (params.semantic && ctx.semantic === false) note = 'semantic search is turned off — used lexical';\n else if (params.semantic && ctx.offline) note = 'semantic skipped — Vibgrate is running offline';\n }\n\n return {\n ok: true,\n mode: 'ask',\n data: {\n question: result.question,\n mode,\n note,\n tokensEstimate: result.tokensEstimate,\n matches: result.matches.map((m) => ({\n name: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span.start,\n score: m.score,\n why: m.why,\n })),\n context: result.context,\n },\n };\n}\n\nfunction runAreas(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const limit = params.limit ?? 30;\n const list = [...graph.areas].sort((a, b) => b.size - a.size || a.id - b.id).slice(0, limit);\n return { ok: true, mode: 'areas', data: list };\n}\n\nfunction runHubs(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const limit = params.limit ?? 20;\n const list = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, limit)\n .map(nodeSummary);\n return { ok: true, mode: 'hubs', data: list };\n}\n\nfunction nodeSummary(n: GraphNode) {\n return {\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n isHub: n.isHub,\n area: n.area,\n };\n}\n\n/** Resolve a name to one node, or a typed not-found/ambiguous result. */\nfunction resolveOrError(\n graph: VgGraph,\n name: string,\n mode: GraphQueryMode,\n): { node: GraphNode } | GraphQueryResult {\n const { node, candidates } = resolveOne(graph, name);\n if (node) return { node };\n if (candidates.length === 0) {\n return { ok: false, mode, error: 'not-found', message: `no node matches \"${name}\"` };\n }\n return {\n ok: false,\n mode,\n error: 'ambiguous',\n message: `\"${name}\" is ambiguous`,\n candidates: candidates.slice(0, 10).map((n) => ({ name: n.qualifiedName, kind: n.kind, file: n.file, line: n.span.start })),\n };\n}\n\nfunction runImpact(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'impact', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'impact');\n if (!('node' in resolved)) return resolved;\n const result = impactOf(graph, resolved.node.id, { depth: params.depth ?? 4 });\n return { ok: true, mode: 'impact', data: result };\n}\n\nfunction runPath(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const a = (params.a ?? '').trim();\n const b = (params.b ?? '').trim();\n if (!a || !b) return { ok: false, mode: 'path', error: 'bad-request', message: 'a and b are required' };\n\n const ra = resolveOrError(graph, a, 'path');\n if (!('node' in ra)) return ra;\n const rb = resolveOrError(graph, b, 'path');\n if (!('node' in rb)) return rb;\n\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n if (!result) {\n return {\n ok: false,\n mode: 'path',\n error: 'not-found',\n message: `no path between ${ra.node.qualifiedName} and ${rb.node.qualifiedName}`,\n };\n }\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const names = result.ids.map((id) => byId.get(id)?.qualifiedName ?? id);\n return {\n ok: true,\n mode: 'path',\n data: { from: ra.node.qualifiedName, to: rb.node.qualifiedName, hops: names.length - 1, direction: result.direction, path: names },\n };\n}\n\nfunction runShow(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'show', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'show');\n if (!('node' in resolved)) return resolved;\n\n const node = resolved.node;\n const index = indexFor(graph);\n const callees = dedupeNodes(index.callees(node.id).map((x) => x.node));\n const callers = dedupeNodes(index.callers(node.id).map((x) => x.node));\n const extendsEdges = index.out(node.id, 'extends').concat(index.out(node.id, 'implements'));\n const supertypes = extendsEdges.map((e) => index.node(e.dst)?.qualifiedName).filter(Boolean);\n const area = graph.areas.find((a) => a.id === node.area);\n\n return {\n ok: true,\n mode: 'show',\n data: {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n centrality: node.centrality,\n isHub: node.isHub,\n area: node.area,\n areaLabel: area?.label ?? null,\n tested: node.tested,\n calls: callees.map((n) => n.qualifiedName),\n calledBy: callers.map((n) => n.qualifiedName),\n extends: supertypes,\n },\n };\n}\n\nfunction dedupeNodes(nodes: GraphNode[]): GraphNode[] {\n const seen = new Set<string>();\n const out: GraphNode[] = [];\n for (const n of nodes) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out;\n}\n\nfunction runTree(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'tree', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'tree');\n if (!('node' in resolved)) return resolved;\n\n const index = indexFor(graph);\n const direction = params.callers ? 'callers' : 'callees';\n const maxDepth = Math.max(1, params.depth ?? 3);\n const data = toJsonTree(index, resolved.node, direction, maxDepth, new Set());\n return { ok: true, mode: 'tree', data };\n}\n","/**\n * Vulnerability enrichment for the panel accordion, from OSV.dev.\n *\n * OSV.dev is the ecosystem-agnostic vulnerability API: one endpoint keyed by an\n * ecosystem slug (npm, PyPI, Go, Maven, crates.io, …) and a version, so a single\n * client covers every package manager the scanner supports. This is deliberately\n * NOT Vibgrate's own API — the editor enriches straight from the public source,\n * so nothing about your dependencies is sent to us.\n *\n * Lazy + cached: called only when the user expands a package in the accordion,\n * and each `ecosystem:name@version` result is cached for the session so a\n * re-expand (or the CVE-count overlay) is instant. Honours `--local`: an offline\n * server never reaches the network and reports `offline`.\n */\n\n/** A single advisory, trimmed to what the accordion shows. */\nexport interface VulnSummary {\n /** OSV id (often a GHSA), the stable key. */\n id: string;\n /** CVE aliases, for the count and cross-reference. */\n cves: string[];\n /** One-line summary (OSV `summary`, else the start of `details`). */\n summary: string;\n /** Normalised severity band, best-effort from OSV data. */\n severity: 'critical' | 'high' | 'moderate' | 'low' | 'unknown';\n}\n\nexport interface EnrichResult {\n vulns: VulnSummary[];\n /** Distinct CVE count across all advisories (for the overlay badge). */\n cveCount: number;\n /** Where the answer came from — surfaced for honesty, never a spinner lie. */\n source: 'osv' | 'cache' | 'offline' | 'error';\n}\n\nconst OSV_QUERY_URL = 'https://api.osv.dev/v1/query';\nconst cache = new Map<string, EnrichResult>();\n\nfunction key(ecosystem: string, name: string, version: string): string {\n return `${ecosystem}:${name}@${version}`;\n}\n\n/** Normalise OSV severity signals (database_specific.severity or a CVSS vector). */\nfunction severityOf(v: Record<string, unknown>): VulnSummary['severity'] {\n const dbSpecific = v.database_specific as Record<string, unknown> | undefined;\n const label = typeof dbSpecific?.severity === 'string' ? dbSpecific.severity.toLowerCase() : '';\n if (label.includes('critical')) return 'critical';\n if (label.includes('high')) return 'high';\n if (label.includes('moderate') || label.includes('medium')) return 'moderate';\n if (label.includes('low')) return 'low';\n // Fall back to a CVSS base score if present.\n const sev = Array.isArray(v.severity) ? (v.severity as Record<string, unknown>[]) : [];\n const cvss = sev.find((s) => typeof s.score === 'string' && String(s.type).startsWith('CVSS'));\n if (cvss) {\n const m = /\\/AV:.*$/.test(String(cvss.score)) ? null : Number(cvss.score);\n if (m != null && !Number.isNaN(m)) {\n if (m >= 9) return 'critical';\n if (m >= 7) return 'high';\n if (m >= 4) return 'moderate';\n if (m > 0) return 'low';\n }\n }\n return 'unknown';\n}\n\nfunction toSummary(raw: unknown): VulnSummary {\n const v = (raw ?? {}) as Record<string, unknown>;\n const aliases = Array.isArray(v.aliases) ? v.aliases.map(String) : [];\n const details = typeof v.details === 'string' ? v.details : '';\n const summary =\n (typeof v.summary === 'string' && v.summary) ||\n (details ? details.split('\\n')[0]!.slice(0, 140) : '') ||\n 'Advisory';\n return {\n id: String(v.id ?? 'unknown'),\n cves: aliases.filter((a) => a.startsWith('CVE-')),\n summary,\n severity: severityOf(v),\n };\n}\n\n/**\n * Query OSV.dev for advisories affecting `name@version` in `ecosystem`.\n * Returns cached results instantly; never throws (a failed lookup degrades to an\n * empty, `error`-sourced result so the accordion just shows \"no known vulns\").\n */\nexport async function enrichVulns(\n ecosystem: string | null,\n name: string,\n version: string | null,\n opts: { offline: boolean } = { offline: false },\n): Promise<EnrichResult> {\n if (!ecosystem || !version) return { vulns: [], cveCount: 0, source: 'error' };\n if (opts.offline) return { vulns: [], cveCount: 0, source: 'offline' };\n\n const k = key(ecosystem, name, version);\n const cached = cache.get(k);\n if (cached) return { ...cached, source: 'cache' };\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n const res = await fetch(OSV_QUERY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ version, package: { name, ecosystem } }),\n signal: controller.signal,\n }).finally(() => clearTimeout(timer));\n\n if (!res.ok) return { vulns: [], cveCount: 0, source: 'error' };\n const data = (await res.json()) as { vulns?: unknown[] };\n const vulns = (data.vulns ?? []).map(toSummary);\n const cveCount = new Set(vulns.flatMap((v) => v.cves)).size;\n const result: EnrichResult = { vulns, cveCount, source: 'osv' };\n cache.set(k, result);\n return result;\n } catch {\n return { vulns: [], cveCount: 0, source: 'error' };\n }\n}\n","/**\n * `vg lsp` — the Vibgrate language server.\n *\n * ONE ENGINE, MANY THIN CLIENTS. This process is the only thing that knows how\n * to score drift. Every editor client (Vibgrate for VS Code, Vibgrate for\n * JetBrains) is a renderer over the messages defined here. If you find yourself\n * adding scoring, banding, or thresholding logic to a client, it belongs here\n * instead — see `docs/IDE-INTEGRATION-PLAN.md` §3, §4.\n *\n * Two rules this file exists to enforce:\n *\n * 1. **The wire carries a `band`, never a colour.** Clients map band → their\n * own native theme colour. Ship a hex from here and every client inherits\n * the light-mode bug (plan §5.0).\n * 2. **Never emit an Error-severity diagnostic.** Vibgrate is not a gate.\n * The engine's findings use `error` for EOL runtimes; we deliberately clamp\n * that to Warning on the way out (plan §8.2). Erroring in the Problems panel\n * is how an ambient tool gets uninstalled.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { pathToFileURL, fileURLToPath } from 'node:url';\n\nimport { runCoreScan } from '../core-open/index.js';\nimport type { ScanArtifact, ScanOptions, DependencyRow, ProjectScan, DriftScore } from '../core-open/index.js';\nimport { loadAdvancedScanHook } from '../reporting/advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { Connection } from './protocol.js';\nimport {\n findPackageLine,\n findRuntimeLine,\n endOfLine,\n isManifest,\n manifestKind,\n} from './manifest-positions.js';\nimport { buildGraph } from '../engine/build.js';\nimport { loadGraph } from '../engine/load.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { manifestHash, loadScanCache, writeScanCache } from './scan-cache.js';\nimport { runGraphQuery, type GraphQueryParams, type GraphQueryResult } from './graph-query.js';\nimport { enrichVulns, type EnrichResult } from './enrich.js';\nimport type { VgGraph } from '../schema.js';\n\n// ── Wire types (the contract every client renders) ─────────────────────────\n\n/** DriftScore band. Mirrors the engine — clients must never re-derive it. */\nexport type Band = 'low' | 'moderate' | 'high';\n\n/** `vibgrate/score` — pushed whenever the score changes. Drives the status bar. */\nexport interface ScoreNotification {\n score: number;\n /** DRIFTSCORE-V3-SPEC §5. Clients map band → theme colour; we never send one. */\n band: Band;\n /** `estimated` renders with a leading `~` (v3 §2.4). Offline is NOT estimated. */\n mode: 'verified' | 'estimated';\n /** Clients must break trend lines across a change here (v3 version-tag note). */\n methodology: string;\n scale: '0 best, 100 worst';\n counts: { behind: number; eol: number; unmaintained: number; total: number };\n rootPath: string;\n scannedAt: string;\n /**\n * Per-package contribution breakdown for the panel accordion — the packages\n * actually driving the score (drift > 0), ranked worst-first. Built from the\n * driftscore-3.0 envelope (`drift.dependencyDrift.top`) enriched with the row\n * detail. Absent when nothing is drifting (e.g. an offline scan that can't\n * resolve latest versions). Vulnerability + registry enrichment is fetched\n * lazily on expand, not carried here.\n */\n breakdown?: BreakdownItem[];\n}\n\n/** One dependency's contribution to the score, for the panel accordion. */\nexport interface BreakdownItem {\n package: string;\n section: string;\n /**\n * OSV.dev ecosystem slug for this dependency (npm, PyPI, Go, Maven, crates.io,\n * RubyGems, NuGet, Packagist, Pub, …), from the owning project's type. Null\n * when the ecosystem has no OSV mapping — the client then skips enrichment.\n */\n ecosystem: string | null;\n /** 0–100 drift contribution for this dependency. */\n drift: number;\n /** Band for `drift` — the client maps it to a colour; it never re-derives it. */\n band: Band;\n currentSpec: string;\n resolvedVersion: string | null;\n latestStable: string | null;\n majorsBehind: number | null;\n ageDays: number | null;\n mode: 'verified' | 'estimated';\n unsupported: boolean;\n abandoned: boolean;\n /** Data-quality guards that fired (canary-latest, scheme-jump, high-cadence…). */\n flags: string[];\n}\n\n/** One coloured end-of-line decoration. `vibgrate/inline`, pushed per open manifest. */\nexport interface InlineItem {\n line: number;\n endCol: number;\n text: string;\n band: Band;\n package: string;\n}\n\nexport interface InlineNotification {\n uri: string;\n items: InlineItem[];\n}\n\n/**\n * `vibgrate/status` — a scan lifecycle signal that carries no score. Currently\n * only `error`, pushed when a scan fails, so a client never sits on a \"scanning\"\n * placeholder forever. Deliberately minimal and non-alarming (the client shows a\n * quiet state, never a toast).\n */\nexport interface StatusNotification {\n state: 'error';\n}\n\n/**\n * `vibgrate/graph/status` — mirrors `vibgrate/status` but for the code map:\n * lets a client show a \"building the map…\" placeholder for the Graph section\n * the first time it runs on a repo, without blocking the drift score.\n */\nexport interface GraphStatusNotification {\n /** `disabled` = the client launched with `--no-graph` (the Graph setting is off). */\n state: 'building' | 'ready' | 'error' | 'disabled';\n message?: string;\n}\n\n// ── Band + severity mapping ────────────────────────────────────────────────\n\n/**\n * Per-dependency band, from the engine's drift classification.\n *\n * NOTE (P0, plan §0.3): the repo currently ships two band systems — the score\n * bands here (low ≤30 / moderate ≤60 / high >60, `drift-score.ts`) and the\n * badge/dashboard bands (green ≤20 / amber ≤50 / red >50, `drift-badge.ts`).\n * They disagree for scores in 21–30 and 51–60. DRIFTSCORE-V3-SPEC §6 item 5\n * schedules the reconciliation. When it lands, this is the ONLY place in the\n * IDE stack that changes — which is the entire reason clients are forbidden\n * from deriving a band themselves.\n */\nfunction bandForDependency(dep: DependencyRow): Band {\n if (dep.drift === 'major-behind') {\n return (dep.majorsBehind ?? 1) >= 2 ? 'high' : 'moderate';\n }\n if (dep.drift === 'minor-behind') return 'moderate';\n return 'low';\n}\n\n/**\n * The engine emits `error` for an EOL runtime. The editor must not.\n * See the file header, rule 2.\n */\nfunction severityFor(level: 'warning' | 'error' | 'note'): 1 | 2 | 3 | 4 {\n // LSP DiagnosticSeverity: 1 Error · 2 Warning · 3 Information · 4 Hint\n if (level === 'note') return 3;\n return 2; // both `warning` and `error` clamp to Warning. Never 1.\n}\n\n/**\n * Only hard facts reach the Problems panel, and only when the user opts in.\n * \"You are two minors behind\" is not a defect and does not belong here\n * (plan §8.2).\n */\nconst DIAGNOSTIC_RULES = new Set([\n 'vibgrate/runtime-eol',\n 'vibgrate/runtime-lag',\n 'vibgrate/unmaintained',\n 'vibgrate/abandoned',\n 'vibgrate/license-change',\n 'vibgrate/eol',\n]);\n\n// ── Server ─────────────────────────────────────────────────────────────────\n\ninterface ServerOptions {\n root: string;\n offline: boolean;\n /** Problems-panel diagnostics. OFF unless the client asks (plan §8.1). */\n diagnostics: boolean;\n /** The local Vibgrate Graph. `false` (`--no-graph`) skips the background build and disables graph queries. */\n graph: boolean;\n /** Semantic search over the graph. `false` (`--no-semantic`) forces lexical and never downloads the embedding model. */\n semantic: boolean;\n}\n\nexport class VibgrateLanguageServer {\n private readonly conn: Connection;\n private readonly docs = new Map<string, string>(); // uri → text\n private artifact: ScanArtifact | null = null;\n private scanning = false;\n private queued = false;\n private debounce: NodeJS.Timeout | null = null;\n private shuttingDown = false;\n private graph: VgGraph | null = null;\n private graphBuilding = false;\n\n constructor(\n private readonly opts: ServerOptions,\n output: NodeJS.WritableStream = process.stdout,\n ) {\n this.conn = new Connection(process.stdin, output);\n this.register();\n }\n\n private register(): void {\n this.conn.onRequest('initialize', () => ({\n capabilities: {\n // 1 = Full sync. We only actually act on save, but full sync keeps our\n // buffer honest so hovers land on the text the user is looking at.\n textDocumentSync: 1,\n hoverProvider: true,\n codeLensProvider: { resolveProvider: false },\n executeCommandProvider: {\n commands: ['vibgrate.rescan', 'vibgrate.explain', 'vibgrate.routeFix'],\n },\n },\n serverInfo: { name: 'Vibgrate', version: VERSION },\n }));\n\n this.conn.onNotification('initialized', () => {\n this.scheduleScan(0);\n // Independent of the drift scan — a slow first graph build must not\n // delay the score the status bar/panel are waiting on.\n void this.ensureGraph();\n });\n\n this.conn.onNotification('textDocument/didOpen', (_m, params) => {\n const p = params as { textDocument?: { uri?: string; text?: string } };\n const uri = p.textDocument?.uri;\n if (!uri || !isManifest(uriToPath(uri))) return;\n this.docs.set(uri, p.textDocument?.text ?? '');\n // Already scanned? Render immediately — don't make the user wait on a\n // rescan just because they opened a second manifest.\n if (this.artifact) this.publishForDoc(uri);\n else this.scheduleScan(0);\n });\n\n this.conn.onNotification('textDocument/didChange', (_m, params) => {\n const p = params as {\n textDocument?: { uri?: string };\n contentChanges?: { text?: string }[];\n };\n const uri = p.textDocument?.uri;\n if (!uri || !this.docs.has(uri)) return;\n const full = p.contentChanges?.[p.contentChanges.length - 1]?.text;\n if (typeof full === 'string') this.docs.set(uri, full);\n // Do NOT rescan on keystroke — that is how you get a tool that heats a\n // laptop. Re-anchor the existing decorations against the new text only.\n if (this.artifact) this.publishForDoc(uri);\n });\n\n this.conn.onNotification('textDocument/didSave', (_m, params) => {\n const p = params as { textDocument?: { uri?: string } };\n const uri = p.textDocument?.uri;\n if (!uri || !this.docs.has(uri)) return;\n this.scheduleScan(400);\n });\n\n this.conn.onNotification('textDocument/didClose', (_m, params) => {\n const p = params as { textDocument?: { uri?: string } };\n if (p.textDocument?.uri) this.docs.delete(p.textDocument.uri);\n });\n\n this.conn.onRequest('textDocument/hover', (_m, params) => this.onHover(params));\n this.conn.onRequest('textDocument/codeLens', (_m, params) => this.onCodeLens(params));\n\n this.conn.onRequest('vibgrate/graph/query', (_m, params) => this.onGraphQuery(params));\n this.conn.onRequest('vibgrate/score/forFile', (_m, params) => this.onScoreForFile(params));\n this.conn.onRequest('vibgrate/enrich', (_m, params) => this.onEnrich(params));\n\n this.conn.onRequest('workspace/executeCommand', (_m, params) => {\n const p = params as { command?: string };\n if (p.command === 'vibgrate.rescan') {\n this.scheduleScan(0);\n return { ok: true };\n }\n return null;\n });\n\n this.conn.onRequest('shutdown', () => {\n this.shuttingDown = true;\n if (this.debounce) clearTimeout(this.debounce);\n return null;\n });\n\n this.conn.onNotification('exit', () => {\n process.exit(this.shuttingDown ? 0 : 1);\n });\n }\n\n // ── Scanning ─────────────────────────────────────────────────────────────\n\n private scheduleScan(delayMs: number): void {\n if (this.debounce) clearTimeout(this.debounce);\n this.debounce = setTimeout(() => void this.scan(), delayMs);\n }\n\n private async scan(): Promise<void> {\n if (this.scanning) {\n this.queued = true;\n return;\n }\n this.scanning = true;\n\n try {\n // The expensive part of a scan is the per-package registry lookups, not\n // reading the manifest/lockfile — so hash just those first (cheap: no\n // network) and skip `runCoreScan` entirely when nothing a scan cares\n // about has changed since the last successful scan on this machine.\n // `toolVersion`/`offline` are part of the key too: an engine upgrade or a\n // flip of `vibgrate.offline` must not replay a scan from before it.\n const cacheKey = { manifestHash: manifestHash(this.opts.root), toolVersion: VERSION, offline: this.opts.offline };\n const cached = loadScanCache(this.opts.root, cacheKey);\n\n if (cached) {\n this.artifact = cached.artifact;\n } else {\n const scanOpts: ScanOptions = {\n format: 'json',\n concurrency: 8,\n offline: this.opts.offline,\n noLocalArtifacts: true, // an editor scan must not litter the repo\n noGraph: true, // the code map is not needed to score drift; skip the cost\n quiet: true, // no spinners, no artifact dump — an editor is not a terminal\n vibgrateVersion: VERSION,\n } as ScanOptions;\n\n // Same hook `vg scan` uses, so the number the editor shows is the number\n // the CLI shows — by construction, not by coincidence (plan §8.3).\n const advanced = await loadAdvancedScanHook();\n this.artifact = await runCoreScan(this.opts.root, scanOpts, advanced);\n writeScanCache(this.opts.root, cacheKey, this.artifact);\n }\n\n this.publishScore();\n for (const uri of this.docs.keys()) this.publishForDoc(uri);\n } catch (err) {\n // A failed scan is silent — no red banner because a lockfile was mid-write.\n // But it must not be INVISIBLE: without a signal the client sits on its\n // \"scanning…\" placeholder forever. The reason goes to the log; a minimal\n // `error` status tells the client to stop pretending it is still working.\n this.conn.notify('window/logMessage', {\n type: 3,\n message: `Vibgrate scan failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n this.conn.notify('vibgrate/status', { state: 'error' } satisfies StatusNotification);\n } finally {\n this.scanning = false;\n if (this.queued) {\n this.queued = false;\n this.scheduleScan(0);\n }\n }\n }\n\n // ── Publishing ───────────────────────────────────────────────────────────\n\n private publishScore(): void {\n const a = this.artifact;\n if (!a) return;\n\n let behind = 0;\n let unmaintained = 0;\n let total = 0;\n for (const proj of a.projects ?? []) {\n for (const dep of proj.dependencies ?? []) {\n total++;\n if (dep.drift === 'major-behind' || dep.drift === 'minor-behind') behind++;\n }\n }\n const eol = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol',\n ).length;\n unmaintained = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/unmaintained' || f.ruleId === 'vibgrate/abandoned',\n ).length;\n\n // `riskLevel` is what `driftscore-2.0` ships; v3 renames it `band` (§5\n // envelope). We normalise to `band` on the wire so clients are already\n // speaking v3 and need no change when the engine catches up.\n const band = (a.drift.riskLevel ?? 'low') as Band;\n\n const payload: ScoreNotification = {\n score: a.drift.score,\n band,\n // v3 §2.4: `estimated` means \"no timestamps at all\" — it is NOT an\n // offline marker. An air-gapped scan against a dated snapshot is Verified.\n // The score now carries the authoritative provenance (driftscore-3.0\n // envelope); fall back to the artifact heuristic for pre-v3 engines.\n mode: a.drift.mode ?? (hasReleaseDates(a) ? 'verified' : 'estimated'),\n methodology: a.drift.methodologyVersion ?? 'unknown',\n scale: '0 best, 100 worst',\n counts: { behind, eol, unmaintained, total },\n rootPath: a.rootPath,\n scannedAt: a.timestamp,\n ...(buildBreakdown(a.drift, a.projects ?? []) ? { breakdown: buildBreakdown(a.drift, a.projects ?? []) } : {}),\n };\n\n this.conn.notify('vibgrate/score', payload);\n }\n\n /** Decorations + (optionally) diagnostics for one open manifest. */\n private publishForDoc(uri: string): void {\n const a = this.artifact;\n const text = this.docs.get(uri);\n if (!a || text === undefined) return;\n\n const filePath = uriToPath(uri);\n const kind = manifestKind(filePath);\n const project = projectForFile(this.opts.root, a, filePath);\n\n // ── inline decorations ──\n const items: InlineItem[] = [];\n for (const dep of project?.dependencies ?? []) {\n if (dep.drift === 'current' || dep.drift === 'unknown') continue;\n const line = findPackageLine(text, dep.package, kind);\n if (line === -1) continue;\n items.push({\n line,\n endCol: endOfLine(text, line),\n text: inlineLabel(dep),\n band: bandForDependency(dep),\n package: dep.package,\n });\n }\n this.conn.notify('vibgrate/inline', { uri, items } satisfies InlineNotification);\n\n // ── diagnostics (off unless the client asked) ──\n if (!this.opts.diagnostics) {\n this.conn.notify('textDocument/publishDiagnostics', { uri, diagnostics: [] });\n return;\n }\n\n const diagnostics = (a.findings ?? [])\n .filter((f) => DIAGNOSTIC_RULES.has(f.ruleId))\n .filter((f) => project && sameProject(f.location, project.path))\n .map((f) => {\n const line = Math.max(0, findRuntimeLine(text, kind));\n return {\n range: {\n start: { line, character: 0 },\n end: { line, character: endOfLine(text, line) },\n },\n severity: severityFor(f.level), // never 1 — see file header\n source: 'vibgrate',\n code: f.ruleId,\n message: f.message,\n };\n });\n\n this.conn.notify('textDocument/publishDiagnostics', { uri, diagnostics });\n }\n\n // ── Requests ─────────────────────────────────────────────────────────────\n\n private onHover(params: unknown): unknown {\n const p = params as {\n textDocument?: { uri?: string };\n position?: { line?: number; character?: number };\n };\n const uri = p.textDocument?.uri;\n const line = p.position?.line;\n const a = this.artifact;\n const text = uri ? this.docs.get(uri) : undefined;\n if (!uri || line === undefined || !a || text === undefined) return null;\n\n const filePath = uriToPath(uri);\n const kind = manifestKind(filePath);\n const project = projectForFile(this.opts.root, a, filePath);\n\n const dep = (project?.dependencies ?? []).find(\n (d) => findPackageLine(text, d.package, kind) === line,\n );\n if (!dep) return null;\n\n const contribution = a.drift.dependencyDrift?.top.find((t) => t.package === dep.package)?.drift ?? null;\n return {\n contents: { kind: 'markdown', value: hoverMarkdown(dep, contribution) },\n };\n }\n\n private onCodeLens(params: unknown): unknown {\n const p = params as { textDocument?: { uri?: string } };\n const uri = p.textDocument?.uri;\n const a = this.artifact;\n if (!uri || !a || !this.docs.has(uri)) return [];\n\n // ONE lens, at the top of the file. A per-dependency lens would double the\n // height of package.json — and a CodeLens cannot carry colour anyway, which\n // is why the per-dependency detail is an inline decoration (plan §5.2).\n const behind = (a.projects ?? []).reduce(\n (n, proj) =>\n n +\n (proj.dependencies ?? []).filter(\n (d) => d.drift === 'major-behind' || d.drift === 'minor-behind',\n ).length,\n 0,\n );\n const eol = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol',\n ).length;\n\n const estimated = (a.drift.mode ?? (hasReleaseDates(a) ? 'verified' : 'estimated')) === 'estimated';\n const mode = estimated ? '~' : '';\n const title =\n `Vibgrate · drift ${mode}${a.drift.score} (${a.drift.riskLevel}) · ` +\n `${behind} behind · ${eol} EOL`;\n\n return [\n {\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },\n command: { title, command: 'vibgrate.openPanel', arguments: [] },\n },\n ];\n }\n\n // ── Graph ────────────────────────────────────────────────────────────────\n\n /**\n * Load the committed map if one exists, else build it once (this is the\n * \"first activation sets up the graph\" step). Fire-and-forget from\n * `initialized` so it never blocks the drift score; a query that arrives\n * mid-build awaits the same in-flight promise via the `graphBuilding` guard.\n */\n private async ensureGraph(): Promise<void> {\n if (!this.opts.graph) {\n // Turned off by the user (`--no-graph`). Say so once, quietly — the\n // client's Graph section renders the off state instead of \"building…\".\n this.conn.notify('vibgrate/graph/status', { state: 'disabled' } satisfies GraphStatusNotification);\n return;\n }\n if (this.graph || this.graphBuilding) return;\n this.graphBuilding = true;\n try {\n const existing = loadGraph(this.opts.root);\n if (existing) {\n this.graph = existing;\n this.conn.notify('vibgrate/graph/status', { state: 'ready' } satisfies GraphStatusNotification);\n return;\n }\n\n this.conn.notify('vibgrate/graph/status', { state: 'building' } satisfies GraphStatusNotification);\n const result = await buildGraph({ root: this.opts.root });\n // Leaves `.vibgrate/graph.json` exactly as a manual `vg build` would, so\n // `vg ask` from a terminal afterward sees the same map.\n writeArtifacts(result.graph, { root: this.opts.root, html: false, report: false });\n writeSnapshot(this.opts.root, result.graph.provenance.corpusHash, result.fileStats, {});\n this.graph = result.graph;\n this.conn.notify('vibgrate/graph/status', { state: 'ready' } satisfies GraphStatusNotification);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.conn.notify('window/logMessage', { type: 3, message: `Vibgrate graph build failed: ${message}` });\n this.conn.notify('vibgrate/graph/status', { state: 'error', message } satisfies GraphStatusNotification);\n } finally {\n this.graphBuilding = false;\n }\n }\n\n /** The graph, refreshed if the working tree drifted since the last build (same probe `vg ask` uses). */\n private async graphForQuery(): Promise<VgGraph | null> {\n await this.ensureGraph();\n if (!this.graph) return null;\n const refreshed = await refreshIfStale(this.opts.root);\n if (refreshed.status === 'refreshed' && refreshed.wrote) {\n const reloaded = loadGraph(this.opts.root);\n if (reloaded) this.graph = reloaded;\n }\n return this.graph;\n }\n\n private async onGraphQuery(params: unknown): Promise<GraphQueryResult> {\n const p = params as GraphQueryParams;\n if (!this.opts.graph) {\n return { ok: false, mode: p.mode, error: 'disabled', message: 'the local Vibgrate Graph is turned off' };\n }\n const graph = await this.graphForQuery();\n if (!graph) {\n return { ok: false, mode: p.mode, error: 'not-found', message: 'no code map yet — it is still building' };\n }\n return runGraphQuery(graph, p, { root: this.opts.root, offline: this.opts.offline, semantic: this.opts.semantic });\n }\n\n /**\n * `vibgrate/enrich` — lazy vulnerability enrichment for one expanded package,\n * straight from OSV.dev (never our API). Honours the server's offline flag.\n */\n private onEnrich(params: unknown): Promise<EnrichResult> {\n const p = (params ?? {}) as { ecosystem?: string | null; package?: string; version?: string | null };\n return enrichVulns(p.ecosystem ?? null, p.package ?? '', p.version ?? null, { offline: this.opts.offline });\n }\n\n private onScoreForFile(params: unknown): ScoreNotification | null {\n const p = params as { uri?: string };\n const a = this.artifact;\n if (!a || !p.uri) return null;\n const project = projectForFile(this.opts.root, a, uriToPath(p.uri));\n return project ? scoreForProject(a, project) : null;\n }\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction uriToPath(uri: string): string {\n try {\n return fileURLToPath(uri);\n } catch {\n return uri;\n }\n}\n\n/**\n * Which scanned project owns this manifest file?\n *\n * Resolve against the *server's* root, not `artifact.rootPath`. The artifact\n * deliberately carries a relative, portable root (it is uploaded and compared\n * across machines), so resolving against it lands on the process cwd — which is\n * wherever the editor happened to spawn us from, and is not the workspace.\n * That mismatch silently produces zero decorations and zero diagnostics: the\n * score renders fine and every in-editor surface is empty.\n */\nfunction projectForFile(root: string, a: ScanArtifact, filePath: string): ProjectScan | undefined {\n const dir = path.dirname(path.resolve(filePath));\n let best: ProjectScan | undefined;\n let bestLen = -1;\n for (const proj of a.projects ?? []) {\n const projDir = path.resolve(root, proj.path);\n // Longest matching prefix wins — correct in a monorepo, where the root\n // package.json and packages/foo/package.json both \"contain\" the file.\n if ((dir === projDir || dir.startsWith(projDir + path.sep)) && projDir.length > bestLen) {\n best = proj;\n bestLen = projDir.length;\n }\n }\n return best;\n}\n\nfunction sameProject(location: string, projectPath: string): boolean {\n return path.normalize(location) === path.normalize(projectPath);\n}\n\n/** Does the artifact carry release-date data? Drives Verified vs Estimated. */\nfunction hasReleaseDates(a: ScanArtifact): boolean {\n for (const proj of a.projects ?? []) {\n for (const dep of proj.dependencies ?? []) {\n if (dep.ageDays !== null && dep.ageDays !== undefined) return true;\n }\n }\n return false;\n}\n\n/**\n * `vibgrate/score/forFile` payload for one project — same shape as the\n * whole-repo `ScoreNotification`, scoped to a single manifest. Reuses the\n * per-project `drift` the scan already computed (`ProjectScan.drift`) rather\n * than re-deriving a score client-side, for the same \"one engine\" reason the\n * whole-repo score is never recomputed in a client.\n */\nfunction scoreForProject(a: ScanArtifact, proj: ProjectScan): ScoreNotification | null {\n if (!proj.drift) return null;\n\n let behind = 0;\n let total = 0;\n for (const dep of proj.dependencies ?? []) {\n total++;\n if (dep.drift === 'major-behind' || dep.drift === 'minor-behind') behind++;\n }\n const projFindings = (a.findings ?? []).filter((f) => sameProject(f.location, proj.path));\n const eol = projFindings.filter((f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol').length;\n const unmaintained = projFindings.filter(\n (f) => f.ruleId === 'vibgrate/unmaintained' || f.ruleId === 'vibgrate/abandoned',\n ).length;\n const hasDates = (proj.dependencies ?? []).some((d) => d.ageDays !== null && d.ageDays !== undefined);\n\n return {\n score: proj.drift.score,\n band: (proj.drift.riskLevel ?? 'low') as Band,\n mode: proj.drift.mode ?? (hasDates ? 'verified' : 'estimated'),\n methodology: proj.drift.methodologyVersion ?? a.drift.methodologyVersion ?? 'unknown',\n scale: '0 best, 100 worst',\n counts: { behind, eol, unmaintained, total },\n rootPath: proj.path,\n scannedAt: a.timestamp,\n ...(buildBreakdown(proj.drift, [proj]) ? { breakdown: buildBreakdown(proj.drift, [proj]) } : {}),\n };\n}\n\n/** Band for a 0–100 drift number — the reconciled score bands (§6.5). The\n * server sends the band; the client never re-derives one. */\nfunction bandForScore(n: number): Band {\n if (n <= 30) return 'low';\n if (n <= 60) return 'moderate';\n return 'high';\n}\n\n/**\n * The per-package contribution breakdown for the panel accordion. Built from the\n * driftscore-3.0 envelope's ranked `top` (authoritative — the same per-dependency\n * drift the aggregate used), enriched with the row detail (spec, resolved,\n * latest, age). Only contributing packages (drift > 0); empty when nothing\n * drifts (e.g. offline, where latest versions can't be resolved).\n */\nfunction buildBreakdown(drift: DriftScore, projects: ProjectScan[]): BreakdownItem[] | undefined {\n const top = drift.dependencyDrift?.top;\n if (!top || top.length === 0) return undefined;\n\n const byPkg = new Map<string, { row: DependencyRow; ecosystem: string | null }>();\n for (const p of projects) {\n const ecosystem = osvEcosystem(p.type);\n for (const d of p.dependencies ?? []) if (!byPkg.has(d.package)) byPkg.set(d.package, { row: d, ecosystem });\n }\n\n const items = top\n .filter((t) => t.drift > 0)\n .map((t): BreakdownItem => {\n const found = byPkg.get(t.package);\n const row = found?.row;\n return {\n package: t.package,\n section: row?.section ?? 'dependencies',\n ecosystem: found?.ecosystem ?? null,\n drift: t.drift,\n band: bandForScore(t.drift),\n currentSpec: row?.currentSpec ?? '',\n resolvedVersion: row?.resolvedVersion ?? null,\n latestStable: row?.latestStable ?? null,\n majorsBehind: row?.majorsBehind ?? null,\n ageDays: row?.ageDays ?? null,\n mode: t.mode,\n unsupported: t.unsupported,\n abandoned: t.flags.includes('abandoned-floor'),\n flags: t.flags,\n };\n });\n\n return items.length > 0 ? items : undefined;\n}\n\n/** Map a scanned project type to its OSV.dev ecosystem slug (null = no OSV\n * coverage, so the client skips vulnerability enrichment). */\nfunction osvEcosystem(type: ProjectScan['type']): string | null {\n switch (type) {\n case 'node':\n case 'typescript': return 'npm';\n case 'python': return 'PyPI';\n case 'java':\n case 'kotlin':\n case 'scala':\n case 'groovy': return 'Maven';\n case 'go': return 'Go';\n case 'rust': return 'crates.io';\n case 'ruby': return 'RubyGems';\n case 'php': return 'Packagist';\n case 'dotnet': return 'NuGet';\n case 'dart': return 'Pub';\n case 'swift': return 'SwiftURL';\n case 'elixir': return 'Hex';\n default: return null;\n }\n}\n\n/** The end-of-line decoration text. Terse: it sits in the user's code. */\nfunction inlineLabel(dep: DependencyRow): string {\n const bits: string[] = [];\n if (dep.drift === 'major-behind') {\n const n = dep.majorsBehind ?? 1;\n bits.push(`${n} major behind`);\n } else if (dep.drift === 'minor-behind') {\n bits.push('minor behind');\n }\n if (dep.latestStable) bits.push(dep.latestStable);\n // ageDays is fractional off the wire — round it. \"1,896.836d stale\" in the\n // margin of someone's package.json is the kind of detail that reads as sloppy.\n if (dep.ageDays != null && dep.ageDays >= 1) {\n bits.push(`${Math.round(dep.ageDays).toLocaleString('en-US')}d stale`);\n }\n return bits.join(' · ');\n}\n\n/** `command:` URI for a `MarkdownString` link — one JSON-encoded arg object, matching `executeCommand`. */\nfunction commandUri(command: string, args: unknown): string {\n return `command:${command}?${encodeURIComponent(JSON.stringify([args]))}`;\n}\n\n/** \"2 majors behind\" / \"minor behind\" — the hover card's badge text. Mirrors `inlineLabel`'s drift wording. */\nfunction driftBadge(dep: DependencyRow): string | null {\n if (dep.drift === 'major-behind') {\n const n = dep.majorsBehind ?? 1;\n return `${n} major${n === 1 ? '' : 's'} behind`;\n }\n if (dep.drift === 'minor-behind') return 'minor behind';\n return null;\n}\n\n/**\n * \"17.x → 18.x → 19.x\" — a plain-text stand-in for the wireframe's version\n * ladder graphic (hover markdown can't draw one). Built only from the real\n * major-version numbers in `yours`/`latest`; long jumps are truncated with\n * `…` rather than listing every major, so a package that is a decade behind\n * doesn't produce a wall of numbers. Returns null when either version isn't\n * a parseable `<major>.x` (so nothing is shown rather than something wrong).\n */\nfunction versionJourney(yours: string, latest: string): string | null {\n const from = Number(/^(\\d+)/.exec(yours)?.[1]);\n const to = Number(/^(\\d+)/.exec(latest)?.[1]);\n if (!Number.isFinite(from) || !Number.isFinite(to) || to <= from) return null;\n\n const majors: number[] = [];\n for (let m = from; m <= to; m++) majors.push(m);\n const shown = majors.length > 5 ? [majors[0], majors[1], -1, majors[majors.length - 2], majors[majors.length - 1]] : majors;\n return shown.map((m) => (m === -1 ? '…' : `${m}.x`)).join(' → ');\n}\n\n/**\n * The hover card (docs/ide-integration/wireframes/02-hover-card.svg). Shows\n * the facts we actually have: version currency, this dependency's real\n * contribution to the score, and real maintenance flags (`unsupported`/\n * `abandoned`).\n *\n * The wireframe also lists upstream release cadence, a last-commit date, a\n * breaking-change count, and transitive blast radius. None of those are\n * backed by real data today — no release-history or changelog source is\n * scanned, and the graph does not track per-npm-package import edges — so\n * they are left out rather than approximated. Fabricating them would violate\n * the same rule that keeps marketing visuals honest (no invented product\n * output); a hover card is not exempt.\n *\n * Two links, both real, not aspirational: \"Route this fix →\" opens the\n * existing ranked, vendor-neutral remediation menu (`routeFix.ts`) — per the\n * wireframe's own design notes, that is explicitly not a \"Fix\" button, so it\n * does not conflict with \"no fix affordance\" (plan §0.1). \"Explain this\n * drift\" focuses the panel and expands this dependency's breakdown row,\n * which already carries the full explanation (guards, floors, age).\n */\nfunction hoverMarkdown(dep: DependencyRow, contribution: number | null): string {\n const lines: string[] = [];\n const badge = driftBadge(dep);\n const contributionText = contribution != null ? ` · contributes +${Math.round(contribution)} to drift` : '';\n lines.push(badge ? `**${dep.package}** \\`${badge}\\`${contributionText}` : `**${dep.package}**`);\n lines.push('');\n\n const yours = dep.resolvedVersion ?? dep.currentSpec;\n const drifted = dep.drift === 'major-behind' || dep.drift === 'minor-behind';\n\n if (dep.latestStable && dep.latestStable !== yours) {\n lines.push('**Currency**');\n lines.push(`| | |`);\n lines.push(`|---|---|`);\n lines.push(`| yours | \\`${yours}\\` |`);\n lines.push(`| latest | \\`${dep.latestStable}\\` |`);\n const journey = versionJourney(yours, dep.latestStable);\n if (journey) lines.push(`| journey | ${journey} |`);\n if (dep.majorsBehind) lines.push(`| majors behind | ${dep.majorsBehind} |`);\n if (dep.ageDays != null && dep.ageDays >= 1) {\n lines.push(`| age | ${Math.round(dep.ageDays).toLocaleString('en-US')} days |`);\n }\n if (dep.libyears != null && dep.libyears >= 0.01) {\n lines.push(`| libyears | ${dep.libyears.toFixed(2)} |`);\n }\n const license = dep.license?.spdxId ?? dep.license?.raw;\n if (license) lines.push(`| license | ${license} |`);\n } else {\n lines.push(`\\`${yours}\\` — current.`);\n }\n\n if (dep.unsupported || dep.abandoned) {\n lines.push('');\n lines.push('**Maintenance**');\n if (dep.unsupported) lines.push('$(warning) Unsupported / deprecated — floored at 70.');\n if (dep.abandoned) lines.push('$(warning) Abandoned — no recent releases — floored at 50.');\n }\n\n if (drifted) {\n lines.push('');\n lines.push('---');\n const routeFixUri = commandUri('vibgrate.routeFix', {\n package: dep.package,\n from: yours,\n to: dep.latestStable ?? yours,\n majorsBehind: dep.majorsBehind ?? 0,\n });\n const explainUri = commandUri('vibgrate.explain', { package: dep.package });\n lines.push(`[Route this fix →](${routeFixUri}) · [Explain this drift](${explainUri})`);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('$(shield) Resolved locally from your lockfile. No source uploaded.');\n return lines.join('\\n');\n}\n\n// ── Entry point ────────────────────────────────────────────────────────────\n\nexport function startLanguageServer(opts: ServerOptions): void {\n if (!fs.existsSync(opts.root)) {\n process.stderr.write(`vg lsp: root does not exist: ${opts.root}\\n`);\n process.exit(1);\n }\n\n /*\n * stdout is the protocol channel, and nothing else may touch it.\n *\n * A single stray `console.log` from anywhere in the scanner tree — a debug\n * line, a deprecation warning, a progress spinner — lands in the middle of a\n * framed message, desynchronises the reader, and the editor reports the\n * server as crashed. This is the most common way an LSP integration fails,\n * and it fails intermittently, which is worse.\n *\n * So we take the real stdout writer for ourselves, hand it to the protocol,\n * and then redirect `process.stdout` to stderr for the rest of the process.\n * After this point it is not possible for anything else to write to the\n * protocol stream, however deep in the call tree it lives.\n */\n const realWrite = process.stdout.write.bind(process.stdout);\n\n const protocolOut = {\n write(chunk: string | Uint8Array): boolean {\n return realWrite(chunk as never);\n },\n } as NodeJS.WritableStream;\n\n process.stdout.write = ((chunk: never, ...rest: never[]) =>\n process.stderr.write(chunk, ...rest)) as typeof process.stdout.write;\n\n process.stderr.write(\n `vg lsp ${VERSION} — serving ${pathToFileURL(opts.root).href}` +\n `${opts.offline ? ' (offline)' : ''}\\n`,\n );\n\n new VibgrateLanguageServer(opts, protocolOut);\n}\n","import { Command } from 'commander';\nimport { startLanguageServer } from '../lsp/server.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\n\n/**\n * `vg lsp` — the Vibgrate language server (stdio).\n *\n * Editors spawn this; humans generally don't. It is the single engine behind\n * **Vibgrate for VS Code** and **Vibgrate for JetBrains** — one scanner, many\n * thin clients, exactly the architecture Snyk uses and for the same reason:\n * a new IDE should be a new client, never a new scanner.\n *\n * The server speaks standard LSP (diagnostics, hover, CodeLens) plus one\n * custom notification, `vibgrate/score`, which carries the DriftScore and its\n * **band** — never a colour. Clients map band → their own theme colour, which\n * is what keeps light mode, dark mode, high contrast, and JetBrains all honest\n * from a single source of truth.\n *\n * See `docs/IDE-INTEGRATION-PLAN.md` §3.\n */\nexport function registerLsp(program: Command): void {\n const cmd = program\n .command('lsp')\n .description('start the Vibgrate language server (stdio) — the engine behind the IDE extensions')\n .option(\n '--diagnostics',\n 'also publish Problems-panel diagnostics (EOL runtime, unmaintained, license change). Off by default: drift is not a defect, and the Problems panel is not ours to fill',\n false,\n )\n .option('--no-graph', 'skip the local Vibgrate Graph entirely: no background build, and graph queries report it as turned off')\n .option('--no-semantic', 'never use semantic search for graph queries (lexical only; the embedding model is not downloaded)')\n .action(async function (this: Command, opts: { diagnostics?: boolean; graph?: boolean; semantic?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n startLanguageServer({\n root,\n // `--local` is the established air-gap flag across the CLI; honour it\n // here too, so an offline editor session stays offline.\n offline: global.local === true,\n diagnostics: opts.diagnostics === true,\n graph: opts.graph !== false,\n semantic: opts.semantic !== false,\n });\n\n // The server owns the process from here: it lives on stdin/stdout until\n // the client sends `shutdown` + `exit`. Returning from the action must\n // not let the CLI exit, so we never resolve.\n await new Promise<never>(() => {});\n });\n\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { ASSISTANTS, SMALL_REPO_FILES, assistantById, detectAssistants, detectServeLaunch, installAssistant, uninstallAssistant, writeNavigationConfig } from '../install/registry.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg install <tool…>` (VG-CLI-SPEC §3.7) — wire vg into AI assistants: a skill,\n * an advisory (opt-out) nudge, and an MCP registration where supported.\n * Idempotent; repo-local (the team-shareable default). On small repos the nudge\n * honestly says searching is fine.\n */\nexport function registerInstall(program: Command): void {\n const install = program\n .command('install')\n .description('add vg to your AI assistant(s): skill + MCP + advisory nudge')\n .argument('[tools...]', `assistant ids: ${ASSISTANTS.map((a) => a.id).join(', ')}`)\n .option('--all', 'install for every supported assistant')\n .option('--detect', 'detect assistants in use (repo footprint, home config, PATH) and install for those; with --list, only report what was detected')\n .option('--list', 'show the support matrix and exit')\n .option('--no-hook', 'skip the advisory nudge')\n .action(function (this: Command, tools: string[], opts: { all?: boolean; detect?: boolean; list?: boolean; hook?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n const detected = opts.detect ? detectAssistants(root) : [];\n\n if (opts.list) {\n if (opts.detect) {\n // Detection report only — nothing is written. This is what editor\n // integrations poll before deciding to run an install.\n if (global.json) {\n json(detected.map((d) => ({ id: d.assistant.id, label: d.assistant.label, via: d.via, marker: d.marker })));\n } else if (detected.length === 0) {\n info(`${c.cyan('vg install')} · no AI assistants detected here`);\n } else {\n info(`${c.cyan('vg install')} · detected assistants`);\n const pad = Math.max(...detected.map((d) => d.assistant.id.length)) + 2;\n for (const d of detected) {\n info(` ${c.bold(d.assistant.id.padEnd(pad))} ${d.assistant.label} ${c.dim(`via ${d.via}: ${d.marker}`)}`);\n }\n }\n return;\n }\n if (global.json) {\n json(ASSISTANTS.map((a) => ({ id: a.id, label: a.label, mcp: !!a.mcp, skill: !!a.skill, nudge: !!a.nudge })));\n } else {\n info(`${c.cyan('vg install')} · supported assistants`);\n const pad = Math.max(...ASSISTANTS.map((a) => a.id.length)) + 2;\n for (const a of ASSISTANTS) {\n info(` ${c.bold(a.id.padEnd(pad))} ${a.label} ${c.dim(`mcp:${a.mcp ? '✓' : '—'} skill:${a.skill ? '✓' : '—'} nudge:${a.nudge ? '✓' : '—'}`)}`);\n }\n }\n return;\n }\n\n const targets = opts.all ? ASSISTANTS : opts.detect ? detected.map((d) => d.assistant) : tools.map(resolve);\n if (targets.length === 0) {\n if (opts.detect) {\n // Detecting nothing is a clean no-op, not a usage mistake.\n if (global.json) json({ root, detected: [], results: [] });\n else info(`${c.cyan('vg install')} · no AI assistants detected here — name one (e.g. \\`vg install claude\\`) or use --all`);\n return;\n }\n throw usageError('name an assistant (e.g. `vg install claude`) or use --all / --detect / --list');\n }\n\n const graph = loadGraph(root, global.graph);\n const fileCount = graph ? graph.nodes.filter((n) => n.kind === 'file').length : 0;\n const smallRepo = graph !== null && fileCount > 0 && fileCount < SMALL_REPO_FILES;\n\n // Detect once — every target registers the same launch command.\n const launch = detectServeLaunch();\n const results = targets.map((a) => ({ id: a.id, ...installAssistant(a, { root, hook: opts.hook, smallRepo, launch }) }));\n // Write the deferred-loading navigation config once (P3): a client-side\n // loading config for Claude-API agents that support defer_loading — the\n // server tool set is unchanged.\n const navConfig = writeNavigationConfig(root);\n\n if (global.json) {\n json({ root, smallRepo, navConfig, launch: { command: launch.command, args: launch.args, note: launch.note ?? null }, results });\n return;\n }\n for (const r of results) {\n info(`${c.green('✔')} ${c.bold(r.id)} — wrote ${r.wrote.join(', ')}${r.skipped.length ? c.dim(` (skipped ${r.skipped.join(', ')})`) : ''}`);\n }\n if (launch.note && results.some((r) => r.note)) info(`${c.yellow('!')} ${launch.note}`);\n if (smallRepo) info(c.dim(` note: small repo (${fileCount} files) — nudge says searching is fine; vg is still used for impact/tests`));\n info(c.dim(` wrote ${navConfig} — deferred-loading config for Claude-API agents (lower per-step token cost)`));\n info(c.dim(' run `vg serve` is wired via MCP; build the map with `vg` if you have not yet'));\n });\n applyGlobalOptions(install);\n\n const uninstall = program\n .command('uninstall')\n .description('remove vg from an AI assistant')\n .argument('<tools...>', 'assistant ids')\n .option('--purge', 'also delete the skill file')\n .action(function (this: Command, tools: string[], opts: { purge?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const results = tools.map(resolve).map((a) => ({ id: a.id, removed: uninstallAssistant(a, root, !!opts.purge) }));\n if (global.json) {\n json({ root, results });\n return;\n }\n for (const r of results) {\n info(`${c.green('✔')} ${c.bold(r.id)} — removed ${r.removed.length ? r.removed.join(', ') : c.dim('nothing (not installed)')}`);\n }\n });\n applyGlobalOptions(uninstall);\n}\n\nfunction resolve(id: string) {\n const a = assistantById(id);\n if (!a) {\n const near = ASSISTANTS.filter(\n (x) => x.id.startsWith(id) || id.startsWith(x.id) || x.id.includes(id) || x.label.toLowerCase().includes(id.toLowerCase()),\n ).map((x) => x.id);\n const hint = near.length ? ` Did you mean: ${near.join(', ')}?` : '';\n throw new CliError(\n `unknown assistant \"${id}\".${hint} Supported: ${ASSISTANTS.map((x) => x.id).join(', ')} (see \\`vg install --list\\`)`,\n ExitCode.USAGE_ERROR,\n );\n }\n return a;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { Command } from 'commander';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info } from '../util/output.js';\n\n/**\n * `vg share` (VG-CLI-SPEC §3.8) — make the map committable + self-updating for\n * the team. Installs:\n * - a pre-commit hook that rebuilds and stages `graph.json` *only when it\n * changed* (deterministic, no LLM → no token burn, no churn on no-op commits);\n * - a deterministic merge driver: on conflict it rebuilds the graph from the\n * merged code (the graph is a pure function of code) instead of corrupting\n * JSON with a naive union;\n * - `.vibgrate/.gitignore` keeping `cache/` and volatile artifacts out of git\n * while committing the stable `graph.json` (prompt-cache safe).\n */\n\nconst HOOK_BEGIN = '# vg:begin';\nconst HOOK_END = '# vg:end';\n\nexport function registerShare(program: Command): void {\n const cmd = program\n .command('share')\n .description('make the map committable + auto-updating for your team (git)')\n .option('--undo', 'reverse what `vg share` installed')\n .option('--reports', 'also commit graph.html / GRAPH_REPORT.md (default: gitignored)')\n .action(function (this: Command, opts: { undo?: boolean; reports?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const gitDir = path.join(root, '.git');\n if (!fs.existsSync(gitDir)) {\n throw new CliError('not a git repository — run `vg share` inside a git repo', ExitCode.USAGE_ERROR);\n }\n\n if (opts.undo) {\n undo(root);\n info(`${c.cyan('vg share')} ${c.dim('--undo')} · removed hooks, merge driver, and attributes`);\n return;\n }\n\n writeVibgrateGitignore(root, !!opts.reports);\n writeGitAttributes(root);\n configureMergeDriver(root);\n installPreCommitHook(root);\n\n info(`${c.cyan('vg share')} · the map is now committable + auto-updating`);\n info(` ${c.green('✔')} .vibgrate/.gitignore (cache + volatile artifacts ignored, graph.json committed)`);\n info(` ${c.green('✔')} pre-commit hook (rebuilds + stages graph.json only when it changed)`);\n info(` ${c.green('✔')} deterministic merge driver for .vibgrate/graph.json (rebuild on conflict)`);\n info(c.dim(' commit .vibgrate/graph.json so teammates inherit the map on pull'));\n });\n applyGlobalOptions(cmd);\n}\n\nfunction writeVibgrateGitignore(root: string, reports: boolean): void {\n const dir = path.join(root, '.vibgrate');\n fs.mkdirSync(dir, { recursive: true });\n const lines = ['# Managed by `vg share` — keep graph.json committed, ignore the rest', 'cache/', 'facts.jsonl'];\n if (!reports) lines.push('graph.html', 'GRAPH_REPORT.md');\n fs.writeFileSync(path.join(dir, '.gitignore'), `${lines.join('\\n')}\\n`);\n}\n\nfunction writeGitAttributes(root: string): void {\n const file = path.join(root, '.gitattributes');\n const line = '.vibgrate/graph.json merge=vg';\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n if (!content.split('\\n').some((l) => l.trim() === line)) {\n content = content.length ? `${content.replace(/\\s*$/, '')}\\n${line}\\n` : `${line}\\n`;\n fs.writeFileSync(file, content);\n }\n}\n\nfunction configureMergeDriver(root: string): void {\n // The graph is a pure function of code, so the correct merge is a rebuild.\n git(root, ['config', 'merge.vg.name', 'vg deterministic graph rebuild']);\n git(root, ['config', 'merge.vg.driver', 'vg build >/dev/null 2>&1; cp .vibgrate/graph.json %A']);\n}\n\nfunction installPreCommitHook(root: string): void {\n const hooksDir = hookDir(root);\n fs.mkdirSync(hooksDir, { recursive: true });\n const file = path.join(hooksDir, 'pre-commit');\n const block = [\n HOOK_BEGIN,\n 'if command -v vg >/dev/null 2>&1; then',\n ' vg build >/dev/null 2>&1 || true',\n ' git add .vibgrate/graph.json >/dev/null 2>&1 || true',\n 'fi',\n HOOK_END,\n ].join('\\n');\n\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '#!/bin/sh\\n';\n const re = new RegExp(`${escapeRe(HOOK_BEGIN)}[\\\\s\\\\S]*?${escapeRe(HOOK_END)}`);\n if (re.test(content)) content = content.replace(re, block);\n else content = `${content.replace(/\\s*$/, '')}\\n\\n${block}\\n`;\n if (!content.startsWith('#!')) content = `#!/bin/sh\\n${content}`;\n fs.writeFileSync(file, content);\n fs.chmodSync(file, 0o755);\n}\n\nfunction undo(root: string): void {\n // Remove hook block.\n const hookFile = path.join(hookDir(root), 'pre-commit');\n if (fs.existsSync(hookFile)) {\n const re = new RegExp(`\\\\n*${escapeRe(HOOK_BEGIN)}[\\\\s\\\\S]*?${escapeRe(HOOK_END)}\\\\n*`);\n const next = fs.readFileSync(hookFile, 'utf8').replace(re, '\\n');\n if (next.trim() === '#!/bin/sh') fs.rmSync(hookFile);\n else fs.writeFileSync(hookFile, next);\n }\n // Remove .gitattributes line.\n const attr = path.join(root, '.gitattributes');\n if (fs.existsSync(attr)) {\n const next = fs\n .readFileSync(attr, 'utf8')\n .split('\\n')\n .filter((l) => l.trim() !== '.vibgrate/graph.json merge=vg')\n .join('\\n');\n fs.writeFileSync(attr, next);\n }\n // Drop git config (ignore errors if absent).\n try {\n git(root, ['config', '--remove-section', 'merge.vg']);\n } catch {\n /* section may not exist */\n }\n}\n\nfunction hookDir(root: string): string {\n // Respect a configured hooks path (e.g. husky) when set.\n try {\n const configured = git(root, ['config', '--get', 'core.hooksPath']).trim();\n if (configured) return path.resolve(root, configured);\n } catch {\n /* not set */\n }\n return path.join(root, '.git', 'hooks');\n}\n\nfunction git(root: string, args: string[]): string {\n return execFileSync('git', args, { cwd: root, encoding: 'utf8' });\n}\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { queryGraph } from '../engine/query.js';\nimport { discover } from '../engine/discover.js';\nimport { resolveLimits, type ResourceLimits } from '../engine/limits.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * `vg benchmark` (VG-ENGINE-TEARDOWN §6) — reproducible, cache-aware,\n * honest-estimate benchmark on the current repo:\n * - cold vs incremental build time, plus throughput (files/s, MB/s);\n * - memory: peak RSS/heap sampled across the cold build, heap retained by\n * the loaded graph, serialized artifact size (all labelled approximate —\n * GC timing and OS accounting make them indicative, not exact);\n * - determinism (two pinned builds must be byte-identical);\n * - token reduction: vg's context block vs a grep/read baseline, per question;\n * - the effective resource limits (VG_MAX_FILE_BYTES etc.) the run built under.\n *\n * Token figures are clearly-labelled estimates (~4 chars/token), scaling with\n * repo size — never a hero number.\n */\nconst PIN = '2020-01-01T00:00:00.000Z';\n\nexport interface BenchmarkResult {\n repo: { files: number; nodes: number; edges: number };\n build: { coldMs: number; incrementalMs: number; reusedOnWarm: number };\n throughput: { corpusBytes: number; filesPerSec: number; mbPerSec: number };\n memory: {\n baselineRssMb: number;\n peakRssMb: number;\n peakHeapMb: number;\n retainedHeapMb: number;\n graphJsonBytes: number;\n bytesPerNode: number;\n note: string;\n };\n limits: ResourceLimits;\n determinism: { byteIdentical: boolean };\n tokenReduction: {\n questions: { question: string; vgTokens: number; baselineTokens: number; ratio: number }[];\n aggregateRatio: number;\n note: string;\n };\n}\n\nexport function registerBenchmark(program: Command): void {\n const cmd = program\n .command('benchmark')\n .description('reproducible build + memory + token-reduction benchmark (honest estimates)')\n .option('--budget <n>', 'token budget for vg answers', '2000')\n .action(async function (this: Command, opts: { budget?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const budget = Number(opts.budget) || 2000;\n const result = await runBenchmarkSuite(root, budget);\n\n if (global.json) {\n json(result);\n return;\n }\n\n const { repo, build, throughput, memory, determinism, tokenReduction } = result;\n info(`${c.cyan('vg benchmark')} · ${repo.files} files · ${repo.nodes} nodes`);\n info(` build cold ${build.coldMs.toFixed(0)}ms · incremental ${build.incrementalMs.toFixed(0)}ms (reused ${build.reusedOnWarm})`);\n info(` speed ${throughput.filesPerSec.toFixed(0)} files/s · ${throughput.mbPerSec.toFixed(1)} MB/s (cold, ${mb(throughput.corpusBytes).toFixed(1)} MB corpus)`);\n info(\n ` memory peak rss ${memory.peakRssMb.toFixed(0)} MB (baseline ${memory.baselineRssMb.toFixed(0)} MB) · ` +\n `peak heap ${memory.peakHeapMb.toFixed(0)} MB · graph retains ~${memory.retainedHeapMb.toFixed(0)} MB ${c.dim('(approximate)')}`,\n );\n info(` graph ${mb(memory.graphJsonBytes).toFixed(1)} MB serialized · ${memory.bytesPerNode.toFixed(0)} B/node`);\n info(` determinism ${determinism.byteIdentical ? c.green('byte-identical ✓') : c.red('NON-DETERMINISTIC ✗')}`);\n if (tokenReduction.questions.length) {\n info(` token reduction vs grep/read baseline (${c.dim('estimates')}):`);\n for (const q of tokenReduction.questions) {\n info(` ${pad(`${q.ratio.toFixed(1)}×`, 6)} ${c.dim(`vg ${q.vgTokens} vs ~${q.baselineTokens}`)} \"${q.question}\"`);\n }\n info(` ${c.bold(`aggregate ≈ ${tokenReduction.aggregateRatio.toFixed(1)}× fewer tokens`)} ${c.dim('(honest estimate, scales with repo size)')}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/**\n * The benchmark body, exported for tests. Timings and memory figures are\n * environment-dependent by nature (the graph artifact stays deterministic; the\n * measurements of producing it are not).\n */\nexport async function runBenchmarkSuite(root: string, budget: number): Promise<BenchmarkResult> {\n // 1. cold build (no cache), with peak-memory sampling across it.\n const baseline = process.memoryUsage();\n const sampler = startMemorySampler();\n const t0 = now();\n const cold = await buildGraph({ root, generatedAt: PIN, noCache: true });\n const coldMs = now() - t0;\n\n // 2. incremental build (warm cache)\n const t1 = now();\n const warm = await buildGraph({ root, generatedAt: PIN });\n const warmMs = now() - t1;\n\n // 3. determinism: two pinned builds byte-identical\n const a = serializeGraph(cold.graph);\n const b = serializeGraph((await buildGraph({ root, generatedAt: PIN, noCache: true })).graph);\n const peak = sampler.stop();\n const deterministic = a === b;\n\n const after = process.memoryUsage();\n const corpusBytes = cold.fileStats.reduce((s, f) => s + f.size, 0);\n const graphJsonBytes = Buffer.byteLength(a, 'utf8');\n const nodes = cold.graph.meta.counts.nodes;\n\n // 4. token reduction vs a grep/read baseline\n const questions = deriveQuestions(cold.graph);\n const fileSizes = fileSizeIndex(root);\n const perQuestion = questions.map((q) => {\n const vgTokens = queryGraph(cold.graph, q, { budget }).tokensEstimate;\n const baseTokens = grepBaselineTokens(q, fileSizes);\n return { question: q, vgTokens, baselineTokens: baseTokens, ratio: baseTokens > 0 ? round(baseTokens / Math.max(vgTokens, 1)) : 1 };\n });\n const totalVg = perQuestion.reduce((s, x) => s + x.vgTokens, 0);\n const totalBase = perQuestion.reduce((s, x) => s + x.baselineTokens, 0);\n const aggregateRatio = totalVg > 0 ? round(totalBase / totalVg) : 0;\n\n return {\n repo: { files: cold.totalFiles, nodes, edges: cold.graph.meta.counts.edges },\n build: { coldMs: round(coldMs), incrementalMs: round(warmMs), reusedOnWarm: warm.reused },\n throughput: {\n corpusBytes,\n filesPerSec: coldMs > 0 ? round((cold.totalFiles / coldMs) * 1000) : 0,\n // 6-decimal precision: a small corpus at 3 decimals would round to 0.\n mbPerSec: coldMs > 0 ? round6((mb(corpusBytes) / coldMs) * 1000) : 0,\n },\n memory: {\n baselineRssMb: round(mb(baseline.rss)),\n peakRssMb: round(mb(Math.max(peak.rss, baseline.rss))),\n peakHeapMb: round(mb(Math.max(peak.heapUsed, baseline.heapUsed))),\n // Heap growth across the run ≈ what the loaded graphs + caches retain.\n retainedHeapMb: round(Math.max(0, mb(after.heapUsed - baseline.heapUsed))),\n graphJsonBytes,\n bytesPerNode: nodes > 0 ? round(graphJsonBytes / nodes) : 0,\n note: 'sampled at 25ms + phase boundaries; GC timing makes these approximate',\n },\n limits: resolveLimits(),\n determinism: { byteIdentical: deterministic },\n tokenReduction: { questions: perQuestion, aggregateRatio, note: 'estimates (~4 chars/token); scales with repo size' },\n };\n}\n\n/**\n * Track peak RSS / heapUsed while the build runs: a 25ms sampling interval\n * (unref'd so it never holds the process open) catches the high-water mark\n * between phase boundaries; `stop()` takes one final sample so short runs\n * that finish inside one interval still register.\n */\nfunction startMemorySampler(): { stop: () => { rss: number; heapUsed: number } } {\n let rss = 0;\n let heapUsed = 0;\n const sample = (): void => {\n const m = process.memoryUsage();\n if (m.rss > rss) rss = m.rss;\n if (m.heapUsed > heapUsed) heapUsed = m.heapUsed;\n };\n const timer = setInterval(sample, 25);\n timer.unref?.();\n return {\n stop: () => {\n clearInterval(timer);\n sample();\n return { rss, heapUsed };\n },\n };\n}\n\nfunction deriveQuestions(graph: VgGraph): string[] {\n // Deterministic, repo-derived question set: the top hub names. Reproducible\n // and meaningful without hardcoding anything repo-specific.\n return graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 5)\n .map((n) => n.name);\n}\n\nfunction fileSizeIndex(root: string): { rel: string; abs: string; size: number }[] {\n return discover({ root }).map((f) => ({ rel: f.rel, abs: f.abs, size: safeSize(f.abs) }));\n}\n\nfunction grepBaselineTokens(term: string, files: { abs: string; size: number }[]): number {\n // Baseline = an agent greps for the term and reads every matching file.\n const lower = term.toLowerCase();\n let bytes = 0;\n for (const f of files) {\n if (f.size > 512 * 1024) continue; // skip huge files in the baseline\n let content = '';\n try {\n content = fs.readFileSync(f.abs, 'utf8');\n } catch {\n continue;\n }\n if (content.toLowerCase().includes(lower)) bytes += content.length;\n }\n return Math.ceil(bytes / 4);\n}\n\nfunction safeSize(abs: string): number {\n try {\n return fs.statSync(abs).size;\n } catch {\n return 0;\n }\n}\n\nfunction mb(bytes: number): number {\n return bytes / (1024 * 1024);\n}\nfunction now(): number {\n return Number(process.hrtime.bigint() / 1000n) / 1000;\n}\nfunction round(x: number): number {\n return Math.round(x * 1000) / 1000;\n}\nfunction round6(x: number): number {\n return Math.round(x * 1_000_000) / 1_000_000;\n}\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import { execSync } from 'node:child_process';\nimport { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { coveringTests, detectRunner } from '../engine/test-query.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg tests <name>` (VG-CLI-SPEC §3.4) — which tests cover it, with the linkage\n * basis and confidence. `--missing` flips to untested nodes nearby; `--run`\n * prints (or `--exec` runs) the minimal command to exercise exactly those tests.\n */\nexport function registerTests(program: Command): void {\n const cmd = program\n .command('tests')\n .description('which tests cover a node (call/coverage linkage)')\n .argument('<name>', 'node to inspect')\n .option('--missing', 'show untested nodes nearby instead')\n .option('--run', 'print the command to run exactly these tests')\n .option('--exec', 'run that command')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { missing?: boolean; run?: boolean; exec?: boolean; pick?: string }) {\n const global = readGlobal(this);\n const { root, graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n if (opts.missing) {\n const nearby = graph.nodes\n .filter((n) => n.file === node.file && (n.kind === 'function' || n.kind === 'method') && n.tested === false)\n .sort((a, b) => b.importance - a.importance);\n if (global.json) {\n json({ file: node.file, untested: nearby.map((n) => ({ name: n.qualifiedName, line: n.span.start })) });\n return;\n }\n info(`${c.cyan('vg tests --missing')} · untested in ${node.file} (${nearby.length})`);\n for (const n of nearby) info(` ${c.yellow('○')} ${n.qualifiedName} ${c.dim(`:${n.span.start}`)}`);\n return;\n }\n\n const covers = coveringTests(graph, node);\n const testFiles = covers.filter((c) => c.basis === 'call').map((c) => c.file);\n\n if (opts.run || opts.exec) {\n const runner = detectRunner(rootOf(global), node.lang);\n const command = runner.command(testFiles);\n if (opts.exec) {\n info(c.dim(`$ ${command}`));\n execSync(command, { cwd: root, stdio: 'inherit' });\n return;\n }\n if (global.json) json({ runner: runner.name, command, testFiles });\n else info(command);\n return;\n }\n\n if (global.json) {\n json({ node: node.qualifiedName, tested: node.tested, coverage: node.coverage ?? null, covers });\n return;\n }\n\n info(`${c.cyan('vg tests')} · ${c.bold(node.qualifiedName)} ${node.tested ? c.green('tested') : c.yellow('untested')}`);\n if (typeof node.coverage === 'number') info(c.dim(` line coverage ${(node.coverage * 100).toFixed(0)}%`));\n if (covers.length === 0) {\n info(c.dim(' no covering tests found'));\n return;\n }\n for (const t of covers) {\n info(` ${c.green('✔')} ${t.file} ${c.dim(`(${t.basis}, conf ${t.confidence.toFixed(2)})`)}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg facts <name>` (VG-CLI-SPEC §5) — the deterministic open facts for a node,\n * epistemic-typed (declared/static → Observed/Derived; never learned/Hypothesized).\n * Facts are derived with `--deep`.\n */\nexport function registerFacts(program: Command): void {\n const cmd = program\n .command('facts')\n .description('the deterministic facts for a node (contract / invariant / characterization)')\n .argument('<name>', 'node to inspect')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n if (!graph.facts) {\n if (global.json) json({ node: node.qualifiedName, facts: [], note: 'facts require a --deep build' });\n else info(`${c.cyan('vg facts')} · run ${c.bold('vg --deep')} to derive facts (none in this map)`);\n return;\n }\n\n const facts = graph.facts.filter((f) => f.subjectIds.includes(node.id));\n if (global.json) {\n json({ node: node.qualifiedName, facts });\n return;\n }\n info(`${c.cyan('vg facts')} · ${c.bold(node.qualifiedName)} (${facts.length})`);\n if (facts.length === 0) {\n info(c.dim(' no facts derived for this node'));\n return;\n }\n for (const f of facts) {\n info(` ${c.bold(f.kind)} ${c.dim(`[${f.derivedBy}→${f.confidence}]`)}: ${summarize(f.predicate)}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction summarize(predicate: unknown): string {\n if (predicate && typeof predicate === 'object') {\n const o = predicate as Record<string, unknown>;\n if (typeof o.signature === 'string') return o.signature;\n if (typeof o.guard === 'string') return `guards: ${o.guard}`;\n if (Array.isArray(o.pinnedBy)) return `pinned by ${(o.pinnedBy as string[]).join(', ')}`;\n }\n return JSON.stringify(predicate);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { FREE_PACK } from '../grounding/pack.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg guide <name>` (VG-CLI-SPEC §5) — cited relevant standards/practices for a\n * node from the free knowledge pack (own content + OWASP/CWE/NIST). Honest about\n * recommended vs conjectured, with citations.\n */\nexport function registerGuide(program: Command): void {\n const cmd = program\n .command('guide')\n .description('cited relevant standards/practices for a node (free pack)')\n .argument('<name>', 'node to inspect')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const entries = new Map(FREE_PACK.entries.map((e) => [e.id, e]));\n const grounding = (graph.grounding ?? []).filter((g) => g.src === node.id);\n\n if (global.json) {\n json({\n node: node.qualifiedName,\n guidance: grounding.map((g) => ({\n kind: g.kind,\n rationale: g.rationale,\n confidence: g.confidence,\n topic: entries.get(g.packEntryId)?.topic ?? g.packEntryId,\n summary: entries.get(g.packEntryId)?.summary ?? '',\n citation: g.citation,\n })),\n });\n return;\n }\n\n info(`${c.cyan('vg guide')} · ${c.bold(node.qualifiedName)} (${grounding.length})`);\n if (grounding.length === 0) {\n info(c.dim(' no matching guidance (no security-relevant signals detected)'));\n return;\n }\n for (const g of grounding) {\n const entry = entries.get(g.packEntryId);\n const tag = g.rationale === 'recommended' ? c.green(g.kind) : c.yellow(g.kind);\n info(` ${tag} ${c.dim(`(${g.rationale}, conf ${g.confidence.toFixed(2)})`)}`);\n if (entry) {\n info(` ${entry.summary}`);\n info(c.dim(` ${entry.citation.title} — ${entry.citation.url}`));\n }\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { buildVersionTimelines, findPackageAnyEcosystem, gitHistoryAvailable } from '../core-open/index.js';\nimport { readScanArtifact } from '../mcp/vuln-data.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg why <package>` — who introduced a dependency, and any open vulnerabilities\n * it carries, from git history. Thin blame/why surface over the Phase-0 version\n * timeline plus the last scan's attributed vulnerability data. Offline + local.\n */\nexport function registerWhy(program: Command): void {\n const cmd = program\n .command('why')\n .description('who introduced a dependency (and any open vulnerabilities), from git history')\n .argument('<package>', 'package name to explain')\n .action(async function (this: Command, pkg: string) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n if (!(await gitHistoryAvailable(root))) {\n throw new CliError(\n 'git history is required for `vg why` (not a git repository, or git is unavailable)',\n ExitCode.USAGE_ERROR,\n );\n }\n\n const timelines = await buildVersionTimelines(root);\n const pt = timelines ? findPackageAnyEcosystem(timelines, pkg) ?? null : null;\n\n // Open vulnerabilities for this package, from the last `vg scan --vulns`.\n const artifact = readScanArtifact(root);\n const vulnPkg = artifact?.extended?.vulnerabilities?.packages.find((p) => p.package === pkg) ?? null;\n\n if (global.json) {\n json({ package: pkg, history: pt?.changes ?? [], vulnerabilities: vulnPkg?.advisories ?? [] });\n return;\n }\n\n info(`${c.cyan('vg why')} ${c.bold(pkg)}`);\n if (!pt || pt.changes.length === 0) {\n info(c.dim(' no git history found for this package (npm lockfile). It may not be an npm dependency,'));\n info(c.dim(' or the lockfile predates its introduction.'));\n } else {\n for (let i = 0; i < pt.changes.length; i++) {\n const ch = pt.changes[i];\n const verb = i === 0 ? c.green('added') : c.yellow('→');\n const date = ch.commit.date.slice(0, 10);\n info(\n ` ${verb} ${c.bold(ch.version)} ${c.dim(`${ch.commit.shortSha} ${date} ${ch.commit.authorName}`)}`,\n );\n info(c.dim(` ${ch.commit.subject}`));\n }\n }\n\n if (vulnPkg && vulnPkg.advisories.length) {\n info('');\n info(c.red(` ${vulnPkg.advisories.length} open vulnerabilit${vulnPkg.advisories.length === 1 ? 'y' : 'ies'} at ${pkg}@${vulnPkg.version}:`));\n for (const adv of vulnPkg.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 cvss = adv.cvss != null ? ` cvss ${adv.cvss}` : '';\n const fixed = adv.fixedVersions.length ? ` — fixed in ${adv.fixedVersions.join(', ')}` : ' — no fix available';\n info(` ${severityTag(adv.severity)} ${idLabel}${c.dim(cvss)}${c.dim(fixed)}`);\n if (adv.introduced) {\n const exposure = adv.exposureDays != null ? `, ${adv.exposureDays}d exposed` : '';\n info(\n c.dim(\n ` introduced by ${adv.introduced.authorName} in ${adv.introduced.shortSha} on ${adv.introduced.date.slice(0, 10)}${exposure}`,\n ),\n );\n }\n }\n } else if (artifact?.extended?.vulnerabilities) {\n info('');\n info(c.green(' no known vulnerabilities for this package in the last scan'));\n } else {\n info('');\n info(c.dim(' run `vg scan --vulns` to check this package for known vulnerabilities'));\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction severityTag(severity: string): string {\n switch (severity) {\n case 'critical':\n return c.red('critical');\n case 'high':\n return c.red('high');\n case 'moderate':\n return c.yellow('moderate');\n case 'low':\n return c.dim('low');\n default:\n return c.dim(severity);\n }\n}\n","import { Command } from 'commander';\nimport {\n buildVersionTimelines,\n findPackageAnyEcosystem,\n findVersionCrossings,\n gitHistoryAvailable,\n normalizeConstraint,\n versionSatisfies,\n type VersionCrossing,\n} from '../core-open/index.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg bisect <package> <constraint>` — pinpoint the commit where a dependency\n * crossed a version line, from git history. Where `vg why` narrates every version\n * transition, `bisect` answers a targeted question: \"when did we cross *this*\n * line\" — e.g. when a vulnerable dependency was finally patched past the fixed\n * version, or when a major was adopted. A thin surface over the same offline,\n * no-checkout version timeline that attribution uses. Offline + local.\n *\n * `--assert` turns it into a CI gate: exit non-zero when the current resolved\n * version does NOT satisfy the constraint (the fix has not been adopted yet).\n */\nexport function registerBisect(program: Command): void {\n const cmd = program\n .command('bisect')\n .description('pinpoint the commit where a dependency crossed a version line, from git history')\n .argument('<package>', 'package name to bisect')\n .argument('<constraint>', 'target version or semver range (a bare version means \">=\" that version)')\n .option('--assert', 'exit non-zero when the current version does not satisfy the constraint (CI gate)')\n .action(async function (this: Command, pkg: string, constraintArg: string) {\n const global = readGlobal(this);\n const opts = this.opts<{ assert?: boolean }>();\n const root = rootOf(global);\n\n if (!(await gitHistoryAvailable(root))) {\n throw new CliError(\n 'git history is required for `vg bisect` (not a git repository, or git is unavailable)',\n ExitCode.USAGE_ERROR,\n );\n }\n\n const range = normalizeConstraint(constraintArg);\n if (!range) {\n throw new CliError(\n `not a valid version or semver range: ${constraintArg}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const timelines = await buildVersionTimelines(root);\n const pt = timelines ? findPackageAnyEcosystem(timelines, pkg) ?? null : null;\n\n // No history for this package (not an npm/pip/... dependency, or the\n // lockfile predates it) — distinct from \"found, but never crossed\".\n if (!pt || pt.changes.length === 0) {\n if (global.json) {\n json({ package: pkg, constraint: range, found: false, satisfiedNow: false, crossings: [] });\n return;\n }\n info(`${c.cyan('vg bisect')} ${c.bold(pkg)} ${c.dim(range)}`);\n info(c.dim(' no git history found for this package (lockfile). It may not be a resolved'));\n info(c.dim(' dependency in a supported ecosystem, or the lockfile predates its introduction.'));\n throw new CliError(`no version history for ${pkg}`, ExitCode.NOT_FOUND);\n }\n\n const crossings = findVersionCrossings(pt, range);\n const current = pt.changes[pt.changes.length - 1];\n const satisfiedNow = versionSatisfies(current.version, range);\n const firstEntered = crossings.find((cr) => cr.kind === 'entered') ?? null;\n\n if (global.json) {\n json({\n package: pt.name,\n ecosystem: pt.ecosystem,\n constraint: range,\n currentVersion: current.version,\n satisfiedNow,\n firstEntered,\n crossings,\n });\n } else {\n info(`${c.cyan('vg bisect')} ${c.bold(pt.name)} ${c.dim(range)}`);\n const verdict = satisfiedNow\n ? c.green(`current ${current.version} satisfies ${range}`)\n : c.yellow(`current ${current.version} does not satisfy ${range}`);\n info(` ${verdict}`);\n info('');\n\n if (!firstEntered) {\n info(c.dim(` never crossed ${range} in git history`));\n info(\n c.dim(\n ` latest in history: ${current.version} ${c.dim(`(${current.commit.shortSha} ${current.commit.date.slice(0, 10)})`)}`,\n ),\n );\n } else {\n info(` ${c.bold('first reached')} ${range}:`);\n printCrossing(firstEntered, true);\n // Surface later flips (a downgrade that left the line, a re-bump) so a\n // regression after the fix isn't silently hidden behind the first hit.\n const rest = crossings.slice(crossings.indexOf(firstEntered) + 1);\n if (rest.length) {\n info('');\n info(c.dim(` ${rest.length} later crossing${rest.length === 1 ? '' : 's'}:`));\n for (const cr of rest) printCrossing(cr, false);\n }\n }\n }\n\n if (opts.assert && !satisfiedNow) {\n throw new CliError(\n `${pt.name}@${current.version} does not satisfy ${range}`,\n ExitCode.GATE_FAILED,\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction printCrossing(cr: VersionCrossing, primary: boolean): void {\n const arrow = cr.kind === 'entered' ? c.green('→') : c.yellow('↓');\n const date = cr.commit.date.slice(0, 10);\n const from = cr.previousVersion ? c.dim(` from ${cr.previousVersion}`) : c.dim(' (added)');\n const ver = primary ? c.bold(cr.version) : cr.version;\n info(` ${arrow} ${ver}${from} ${c.dim(`${cr.commit.shortSha} ${date} ${cr.commit.authorName}`)}`);\n info(c.dim(` ${cr.commit.subject}`));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Enterprise standards gate (VG-LIB-SUPERSET-PLAN §8/§9 S5 / D9) — the LOCAL, committable half\n * of enterprise sovereignty that complements the hosted `enterprise_strict` rerank (S5.1).\n *\n * A team commits a `.vibgrate/standards.json` policy of BANNED packages, each pointing at the\n * APPROVED alternative + a reason. `vg drift --fail-on standards` checks the project's resolved\n * inventory against it and exits non-zero with remediation on any planted violation — so the\n * banned-→-approved rule is enforced in CI, offline, no key, no platform call.\n *\n * Pure + offline: a tolerant loader (sync fs) + a deterministic checker over the drift inventory.\n */\n\nexport interface StandardRule {\n /** Optional ecosystem scope (npm|pypi|…). When set, only that ecosystem matches. */\n ecosystem?: string;\n /** Banned package name (exact, case-insensitive). */\n name: string;\n /** The approved alternative — the remediation surfaced to the developer. */\n use?: string;\n /** Why it's banned. */\n reason?: string;\n}\n\nexport interface StandardsPolicy {\n banned: StandardRule[];\n}\n\nexport interface StandardViolation {\n ecosystem: string;\n name: string;\n installed: string | null;\n use: string | null;\n reason: string | null;\n}\n\n/** Where a committed policy lives, in precedence order. */\nexport const STANDARDS_FILES = ['.vibgrate/standards.json', 'vibgrate.standards.json'];\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' && v.trim() ? v.trim() : undefined;\n}\n\n/** Tolerant parse: accepts `{ banned: [...] }` or a bare array; drops malformed rules (need a name). */\nexport function normalizeStandards(raw: unknown): StandardsPolicy {\n const list = Array.isArray(raw) ? raw : Array.isArray((raw as { banned?: unknown })?.banned) ? (raw as { banned: unknown[] }).banned : [];\n const seen = new Set<string>();\n const banned: StandardRule[] = [];\n for (const item of list) {\n if (!item || typeof item !== 'object') continue;\n const r = item as Record<string, unknown>;\n const name = asString(r.name);\n if (!name) continue;\n const ecosystem = asString(r.ecosystem)?.toLowerCase();\n const key = `${ecosystem ?? '*'}\\0${name.toLowerCase()}`;\n if (seen.has(key)) continue;\n seen.add(key);\n banned.push({ name, ...(ecosystem ? { ecosystem } : {}), ...(asString(r.use) ? { use: asString(r.use) } : {}), ...(asString(r.reason) ? { reason: asString(r.reason) } : {}) });\n }\n return { banned };\n}\n\n/** Find + load the nearest committed standards policy from `root`. Returns null if none/invalid. */\nexport function loadStandards(root: string): { policy: StandardsPolicy | null; path: string | null } {\n for (const rel of STANDARDS_FILES) {\n const p = path.join(root, rel);\n let text: string;\n try {\n text = fs.readFileSync(p, 'utf8');\n } catch {\n continue;\n }\n try {\n return { policy: normalizeStandards(JSON.parse(text)), path: p };\n } catch {\n // present but malformed JSON — surface it as a usage problem at the call site\n return { policy: null, path: p };\n }\n }\n return { policy: null, path: null };\n}\n\n/** Deterministic check of the inventory against the policy. One violation per matched dependency. */\nexport function checkStandards(policy: StandardsPolicy, records: DepRecord[]): StandardViolation[] {\n const out: StandardViolation[] = [];\n for (const r of records) {\n const rule = policy.banned.find((b) => b.name.toLowerCase() === r.name.toLowerCase() && (!b.ecosystem || b.ecosystem === r.ecosystem));\n if (rule) out.push({ ecosystem: r.ecosystem, name: r.name, installed: r.installed ?? null, use: rule.use ?? null, reason: rule.reason ?? null });\n }\n return out.sort((a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.name.localeCompare(b.name));\n}\n","import { Command } from 'commander';\nimport { inventory, enrichOnline, ECOSYSTEMS } from '../engine/drift.js';\nimport { loadStandards, checkStandards, STANDARDS_FILES, type StandardViolation } from '../engine/standards.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg drift` (VG-CLI-SPEC §5) — dependency currency. Offline by default\n * (inventory + installed versions); `--online` opt-in queries the npm registry\n * for latest versions. Full CVE/EOL governance is the Vibgrate platform.\n */\nexport function registerDrift(program: Command): void {\n const cmd = program\n .command('drift')\n .description('what is outdated across dependencies (offline; --online for currency)')\n .option('--online', 'query the npm registry for latest versions (opt-in network)')\n .option('--fail-on <level>', 'exit 2 on violations — major|minor (version drift) or standards (enterprise policy)')\n .action(async function (this: Command, opts: { online?: boolean; failOn?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n if (opts.online && global.local) {\n throw new CliError('--online conflicts with --local (no network in local mode)', ExitCode.USAGE_ERROR);\n }\n if (opts.failOn && !['major', 'minor', 'standards'].includes(opts.failOn)) {\n throw new CliError(`--fail-on must be one of: major, minor, standards (got \"${opts.failOn}\")`, ExitCode.USAGE_ERROR);\n }\n const inv = inventory(root);\n if (opts.online && !global.local) await enrichOnline(inv.records);\n\n // Enterprise standards gate (D9/S5.2): check the inventory against the committed policy.\n let standards: { policyPath: string | null; defined: boolean; violations: StandardViolation[] } | null = null;\n if (opts.failOn === 'standards') {\n const loaded = loadStandards(root);\n if (loaded.path && !loaded.policy) {\n throw new CliError(`standards policy at ${loaded.path} is not valid JSON`, ExitCode.USAGE_ERROR);\n }\n standards = { policyPath: loaded.path, defined: !!loaded.policy, violations: loaded.policy ? checkStandards(loaded.policy, inv.records) : [] };\n }\n\n if (global.json) {\n json(standards ? { ...inv, standards } : inv);\n } else {\n const breakdown = ECOSYSTEMS.filter((e) => inv.counts[e] > 0).map((e) => `${e} ${inv.counts[e]}`).join(' · ');\n info(`${c.cyan('vg drift')} · ${inv.counts.total} dependencies${breakdown ? ` (${breakdown})` : ''}`);\n if (opts.online) {\n const drifted = inv.records.filter((r) => r.drift && r.drift !== 'current' && r.drift !== 'unknown');\n if (drifted.length === 0) info(c.green(' all checked dependencies are current'));\n for (const r of drifted.sort((a, b) => rank(b.drift) - rank(a.drift))) {\n const tag = r.drift === 'major' ? c.red('major') : r.drift === 'minor' ? c.yellow('minor') : c.dim('patch');\n info(` ${tag} ${r.name} ${c.dim(`${r.installed} → ${r.latest}`)}`);\n }\n } else {\n info(c.dim(' offline inventory — run with --online for currency vs the npm registry'));\n info(c.dim(' CVE/EOL/governance: the Vibgrate platform (vg push)'));\n }\n if (standards) printStandards(standards);\n }\n\n if (standards && standards.violations.length) {\n throw new CliError(`${standards.violations.length} banned dependency(ies) violate standards`, ExitCode.GATE_FAILED);\n }\n if (opts.failOn && opts.failOn !== 'standards') {\n const threshold = opts.failOn === 'minor' ? 2 : 3; // minor includes major\n const bad = inv.records.filter((r) => rank(r.drift) >= threshold);\n if (bad.length) {\n throw new CliError(`${bad.length} dependency(ies) drift at/above ${opts.failOn}`, ExitCode.GATE_FAILED);\n }\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction rank(drift?: string): number {\n return drift === 'major' ? 3 : drift === 'minor' ? 2 : drift === 'patch' ? 1 : 0;\n}\n\nfunction printStandards(s: { defined: boolean; violations: StandardViolation[] }): void {\n if (!s.defined) {\n info(c.dim(` no standards policy (${STANDARDS_FILES.join(' or ')}) — nothing to enforce`));\n return;\n }\n if (s.violations.length === 0) {\n info(c.green(' standards: no banned dependencies in use'));\n return;\n }\n info(c.red(` standards: ${s.violations.length} banned dependency(ies)`));\n for (const v of s.violations) {\n const fix = v.use ? c.dim(` → use ${v.use}`) : '';\n const why = v.reason ? c.dim(` (${v.reason})`) : '';\n info(` ${c.red('banned')} ${v.ecosystem}:${v.name}${v.installed ? c.dim(` ${v.installed}`) : ''}${fix}${why}`);\n }\n}\n","import { Command } from 'commander';\nimport { discoverModels } from '../engine/models.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg models` (VG-CLI-SPEC §5) — the local-model fleet discovered on disk\n * (Ollama / LM Studio / llama.cpp gguf). Offline, no network, no launch.\n */\nexport function registerModels(program: Command): void {\n const cmd = program\n .command('models')\n .description('the local model fleet (Ollama / LM Studio / gguf), discovered offline')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const models = discoverModels();\n if (global.json) {\n json({ models });\n return;\n }\n info(`${c.cyan('vg models')} · ${models.length} local model(s) discovered`);\n if (models.length === 0) {\n info(c.dim(' none found (looked in ~/.ollama, ~/.lmstudio, ~/models, ~/.cache)'));\n return;\n }\n for (const m of models) info(` ${c.bold(m.runtime.padEnd(10))} ${m.name}`);\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { readSavings, readUsage, type UsageReport } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg savings` (VG-DEVELOPMENT-PLAN §5) — a local, privacy-safe, honestly\n * estimated report of context tokens / $ saved vs a grep/read baseline.\n * Nothing leaves the machine. Recording is opt-in via `vg serve --savings`.\n */\nexport function registerSavings(program: Command): void {\n const cmd = program\n .command('savings')\n .description('local, privacy-safe report of tokens/$ saved vs a grep baseline (estimates)')\n .option('--days <n>', 'window in days', '30')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const days = Number(this.opts().days) || 30;\n const root = rootOf(global);\n const now = Date.now();\n const report = readSavings(root, days, now);\n const usage = readUsage(root, days, now);\n\n if (global.json) {\n json({ ...report, usage });\n return;\n }\n\n info(`${c.cyan('vg savings')} · last ${days} days ${c.dim('(local, nothing left your machine)')}`);\n if (usage.totals.calls === 0) {\n info(\n c.dim(\n report.enabled\n ? ' no calls recorded yet in this window'\n : ' recording is off. Enable it for MCP with `vg serve --savings`, and for CLI calls by passing `--client=<ai>` to vg.',\n ),\n );\n return;\n }\n\n // Token-savings summary — only the grep-baseline tools (query_graph / get_node).\n if (report.queries > 0) {\n info(` queries ${report.queries} · context tokens ${fmt(report.vgTokens)} (grep/read baseline ≈ ${fmt(report.baselineTokens)}) → ${report.ratio}× fewer`);\n info(` est. cost (${report.rateLabel}): $${report.estCostVg} vs $${report.estCostBaseline} → saved ≈ $${report.saved}`);\n info(c.dim(' estimates with stated assumptions (~4 chars/token; ~400 tokens/file baseline); scales with repo size.'));\n }\n\n // Per-command breakdown — every recorded tool, its outcomes, and success rate.\n printBreakdown(usage);\n // The command-vs-MCP split and which AI is calling.\n printSplit(usage);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction fmt(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\n/** Render the per-command usage table: calls, complete/partial/miss, success %. */\nfunction printBreakdown(usage: UsageReport): void {\n info('');\n info(c.bold(' by command') + c.dim(' (complete = full result · partial = capped/paginated · miss = no result)'));\n const nameW = Math.max(7, ...usage.commands.map((cmd) => cmd.tool.length));\n const header =\n ' ' +\n 'command'.padEnd(nameW) +\n ['calls', 'complete', 'partial', 'miss', 'success%', 'avg ms'].map((h) => h.padStart(9)).join('');\n info(c.dim(header));\n for (const cmd of usage.commands) {\n info(\n ' ' +\n cmd.tool.padEnd(nameW) +\n String(cmd.calls).padStart(9) +\n String(cmd.complete).padStart(9) +\n String(cmd.partial).padStart(9) +\n String(cmd.miss).padStart(9) +\n `${cmd.successPct}%`.padStart(9) +\n // Absent ≠ zero: calls recorded before timing existed show '—'.\n (cmd.avgMs === null ? '—' : String(cmd.avgMs)).padStart(9),\n );\n }\n const t = usage.totals;\n info(c.dim(' ' + '─'.repeat(nameW + 54)));\n info(\n ' ' +\n c.bold('total'.padEnd(nameW)) +\n String(t.calls).padStart(9) +\n String(t.complete).padStart(9) +\n String(t.partial).padStart(9) +\n String(t.miss).padStart(9) +\n ''.padStart(9) +\n ''.padStart(9),\n );\n info(c.dim(` avg success across commands: ${usage.avgSuccessPct}%`));\n}\n\n/**\n * Render the command-vs-MCP split (how calls arrived) and which AI client made\n * them — the signals that show whether assistants use the MCP tools or shell out\n * to `vg`, and that feed the opt-in share-stats upload.\n */\nfunction printSplit(usage: UsageReport): void {\n const label = (key: string): string => (key === 'mcp' ? 'MCP tools' : key === 'cli' ? 'vg CLI' : key);\n if (usage.sources.length) {\n info('');\n info(c.bold(' by source') + c.dim(' (how the call arrived)'));\n for (const s of usage.sources) {\n const pct = usage.totals.calls ? Math.round((s.calls / usage.totals.calls) * 100) : 0;\n info(` ${label(s.key).padEnd(12)} ${String(s.calls).padStart(6)} calls ${c.dim(`(${pct}%)`)}`);\n }\n }\n if (usage.clients.length) {\n info('');\n info(c.bold(' by client') + c.dim(' (which AI is calling; pass --client to vg to attribute CLI calls)'));\n for (const cl of usage.clients) {\n info(` ${cl.key.padEnd(12)} ${String(cl.calls).padStart(6)} calls`);\n }\n }\n}\n","import { Command } from 'commander';\nimport {\n loadCatalog,\n resolveLib,\n addLibrary,\n readDoc,\n driftFor,\n resolveVersion,\n localPackageDocs,\n localApiSurface,\n libId,\n} from '../engine/lib.js';\nimport type { DriftNote } from '../engine/lib.js';\nimport { selectForBudget, symbolsFromApi } from '../engine/select.js';\nimport { assessDocQuality } from '../engine/quality.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { publishPrivateLibrary, type HostedDocsResult } from '../engine/hosted.js';\nimport { fetchHostedDocsCached } from '../engine/hosted-cache.js';\nimport { resolveDsn } from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, json, out } from '../util/output.js';\n\n/**\n * `vg lib` (VG-CLI-SPEC §5) — library currency: version-correct, drift-annotated\n * usage docs. Family:\n * vg lib list the catalog\n * vg lib <name> version-correct, drift-annotated docs for <name>\n * vg lib add <source> ingest docs (local path; --online for a URL/llms.txt/git repo)\n * vg lib resolve <name> name → catalog id + version\n * vg lib refresh re-ingest local sources\n */\nexport function registerLib(program: Command): void {\n const cmd = program\n .command('lib')\n .description('library currency: version-correct, drift-annotated usage docs')\n .argument('[args...]', 'a library name, or: add <source> | publish <name> | resolve <name> | refresh')\n .option('--name <name>', 'library name for `add`')\n .option('--version <v>', 'pin the doc version for `add`/`publish`')\n .option('--online', '(deprecated; network is on by default) allow network for add/refresh URL sources')\n .option('-b, --budget <n>', 'trim docs to ~N tokens')\n .option('--readme <path>', 'README path for `publish` (default ./README.md)')\n .option('--dts <path>', 'TypeScript declaration (.d.ts) path for `publish`')\n .option('--language <lang>', 'primary language for `publish`')\n .option('--region <region>', 'data-residency region for the hosted catalog (same as scans; default us)')\n .option('--ingest <url>', 'hosted catalog/ingest URL override (host extracted; wins over --region)')\n .action(async function (this: Command, args: string[], opts: { name?: string; version?: string; online?: boolean; budget?: string; readme?: string; dts?: string; language?: string; region?: string; ingest?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const [verb, ...rest] = args;\n\n // Network is ON BY DEFAULT (local-first, hosted-on-miss). `--local` is the hard airgap:\n // no network ever. `--online` is kept only as a back-compat no-op for add/refresh sources.\n const network = !global.local;\n if (!verb) return listCatalog(root, global.json);\n // add/refresh still gate URL/git fetching behind --online (or network default) to avoid surprise fetches.\n const online = (Boolean(opts.online) || network) && !global.local;\n if (verb === 'add') return addCmd(root, rest, { ...opts, online }, global.json);\n if (verb === 'publish') return publishCmd(root, rest, opts, global, global.json);\n if (verb === 'resolve') return resolveCmd(root, rest, global.json);\n if (verb === 'refresh') return refreshCmd(root, { online }, global.json);\n // `vg lib <name>`: local-first; on a thin/missing local doc, fall through to the hosted\n // catalog automatically unless --local. No flag required.\n return showCmd(root, args.join(' '), opts.budget ? Number(opts.budget) : undefined, global.json, {\n online: network, // hosted-on-miss allowed unless --local\n region: opts.region,\n ingest: opts.ingest,\n });\n });\n applyGlobalOptions(cmd);\n}\n\nfunction listCatalog(root: string, asJson?: boolean): void {\n const catalog = loadCatalog(root);\n const libs = Object.values(catalog.libraries).sort((a, b) => a.name.localeCompare(b.name));\n if (asJson) {\n json(libs.map((l) => ({ id: l.id, name: l.name, version: l.version, source: l.source.type })));\n return;\n }\n info(`${c.cyan('vg lib')} · ${libs.length} library(ies) in the catalog`);\n for (const l of libs) {\n const d = driftFor(root, l);\n const tag = d.drift === 'behind' ? c.yellow(' (docs behind your version)') : d.drift === 'ahead' ? c.dim(' (docs ahead)') : '';\n info(` ${c.bold(l.name)} ${c.dim(`@${l.version}`)} ${c.dim(`[${l.source.type}]`)}${tag}`);\n }\n if (!libs.length) info(c.dim(' empty — add docs with `vg lib add <path|url>`'));\n}\n\nasync function addCmd(root: string, rest: string[], opts: { name?: string; version?: string; online?: boolean }, asJson?: boolean): Promise<void> {\n const source = rest[0];\n if (!source) throw usageError('usage: vg lib add <path|url|git> [--name <name>] [--version <v>] [--online]');\n let entry;\n try {\n entry = await addLibrary(source, { root, name: opts.name, version: opts.version, allowNetwork: opts.online });\n } catch (err) {\n throw new CliError((err as Error).message, ExitCode.ERROR);\n }\n if (asJson) {\n json(entry);\n return;\n }\n info(`${c.green('✔')} added ${c.bold(entry.name)} ${c.dim(`@${entry.version}`)} (${entry.bytes} bytes) → ${entry.docFile}`);\n}\n\nfunction readPackageVersion(root: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as { version?: unknown };\n return typeof pkg.version === 'string' ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\nfunction readOptionalFile(p: string): string | undefined {\n try {\n const t = fs.readFileSync(p, 'utf8');\n return t.trim() ? t : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * `vg lib publish <name>` (S6) — upload a PRIVATE library's docs to the hosted catalog. Requires a\n * DSN (workspace identity) and a paid plan; the index token cost is billed to the MCP-token meter.\n * Reads local README (+ optional .d.ts); private docs stay tenant-isolated.\n */\nasync function publishCmd(\n root: string,\n rest: string[],\n opts: { name?: string; version?: string; readme?: string; dts?: string; language?: string; region?: string; ingest?: string },\n global: { local?: boolean },\n asJson?: boolean,\n): Promise<void> {\n if (global.local) throw usageError('vg lib publish uploads to the hosted catalog — it needs network (remove --local)');\n const name = (rest.join(' ') || opts.name || '').trim();\n if (!name) throw usageError('usage: vg lib publish <name> [--version <v>] [--readme <path>] [--dts <path>] [--language <lang>]');\n\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n if (!parsed) throw new CliError('publishing a private library requires a DSN — run `vibgrate login` or set VIBGRATE_DSN', ExitCode.USAGE_ERROR);\n\n const version = (opts.version || readPackageVersion(root) || '').trim();\n if (!version) throw usageError('a --version is required (or run from a package whose package.json has a version)');\n\n const readme = readOptionalFile(opts.readme ? path.resolve(opts.readme) : path.join(root, 'README.md'));\n const dts = opts.dts ? readOptionalFile(path.resolve(opts.dts)) : undefined;\n if (!readme && !dts) throw usageError('nothing to publish — no README.md found and no --dts given');\n\n const result = await publishPrivateLibrary(\n { name, version, readme, dts, language: opts.language },\n { region: opts.region, ingest: opts.ingest, auth: { keyId: parsed.keyId, secret: parsed.secret } },\n );\n if (!result.ok) {\n const msg = result.message || result.error || `publish failed (HTTP ${result.status})`;\n const code = result.status === 402 ? ExitCode.GATE_FAILED : result.status === 401 ? ExitCode.USAGE_ERROR : ExitCode.ERROR;\n throw new CliError(msg, code);\n }\n if (asJson) {\n json(result);\n return;\n }\n info(`${c.green('✔')} published ${c.bold(name)} ${c.dim(`@${version}`)} · ${result.entities} entities · ${result.indexedTokens} tokens indexed (MCP-token meter)`);\n info(c.dim(` private to your workspace · targetId ${result.targetId}`));\n}\n\nfunction resolveCmd(root: string, rest: string[], asJson?: boolean): void {\n const name = rest.join(' ');\n if (!name) throw usageError('usage: vg lib resolve <name>');\n const entry = resolveLib(loadCatalog(root), name);\n if (!entry) throw new CliError(`no library matches \"${name}\" (id ${libId(name)})`, ExitCode.NOT_FOUND);\n if (asJson) json({ id: entry.id, name: entry.name, version: entry.version });\n else info(`${entry.id} ${c.dim(`(${entry.name}@${entry.version})`)}`);\n}\n\nasync function refreshCmd(root: string, opts: { online?: boolean }, asJson?: boolean): Promise<void> {\n const catalog = loadCatalog(root);\n const results: { name: string; ok: boolean }[] = [];\n for (const entry of Object.values(catalog.libraries)) {\n try {\n await addLibrary(entry.source.location, { root, name: entry.name, version: entry.version, allowNetwork: opts.online });\n results.push({ name: entry.name, ok: true });\n } catch {\n results.push({ name: entry.name, ok: false });\n }\n }\n if (asJson) json({ refreshed: results });\n else info(`${c.cyan('vg lib refresh')} · ${results.filter((r) => r.ok).length}/${results.length} re-ingested`);\n}\n\ninterface ShowOpts {\n online?: boolean;\n region?: string;\n ingest?: string;\n}\n\nasync function showCmd(root: string, name: string, budget: number | undefined, asJson?: boolean, opts: ShowOpts = {}): Promise<void> {\n const online = opts.online;\n const catalog = loadCatalog(root);\n const entry = resolveLib(catalog, name);\n const ver = resolveVersion(root, name);\n\n const displayName = entry?.name ?? name;\n let localDoc: string | undefined;\n let docVersion = ver.served ?? '*';\n let docSource: string | undefined;\n let drift: DriftNote | undefined;\n\n if (entry) {\n // 1. Committed catalog (drift-annotated).\n localDoc = readDoc(root, entry);\n docVersion = entry.version;\n drift = driftFor(root, entry);\n } else {\n // 2. Local-first: docs from the installed package on disk, version-correct, offline.\n const local = localPackageDocs(root, name);\n if (local) {\n localDoc = local.docs;\n docVersion = local.version ?? ver.served ?? '*';\n docSource = local.source;\n }\n }\n\n // Quality gate (D18): assess the full local extraction. An insufficient doc (no example /\n // stub / off-topic) — or no local doc at all — is a candidate for hosted escalation.\n const apiSurface = localApiSurface(root, displayName);\n const quality =\n localDoc !== undefined\n ? assessDocQuality([localDoc, apiSurface].filter(Boolean).join('\\n\\n'), { name: displayName, symbols: symbolsFromApi(apiSurface) })\n : { sufficient: false, score: 0, reasons: ['no local docs'] };\n\n // D18 escalation (D7 no-key funnel): only when --online AND local is missing/insufficient.\n // Disk-cached (`.vibgrate/cache/hosted-docs.json`, 24h TTL) so repeat lookups answer instantly;\n // fetchHostedDocsCached fails closed to null, so the local path never breaks.\n let hosted: HostedDocsResult | null = null;\n if (online && !quality.sufficient) {\n // Identify with the stored DSN (if any) so CLI users get the workspace tier; anon otherwise.\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n hosted = await fetchHostedDocsCached(\n root,\n { name: displayName, query: name, maxTokens: budget },\n { region: opts.region, ingest: opts.ingest, auth: parsed ? { keyId: parsed.keyId, secret: parsed.secret } : undefined },\n );\n }\n\n if (localDoc === undefined && !hosted) {\n throw new CliError(\n `no library docs for \"${name}\" — add with \\`vg lib add <path|url> --name ${name}\\` or install the package${online ? '' : ' (or retry with --online for the hosted catalog)'}`,\n ExitCode.NOT_FOUND,\n );\n }\n\n let doc: string;\n if (hosted) {\n doc = hosted.content;\n docSource = 'hosted';\n docVersion = hosted.version ?? docVersion;\n } else {\n doc = selectForBudget({ readme: localDoc!, apiSurface, budget }).text;\n }\n\n if (asJson) {\n json({\n id: entry?.id,\n name: displayName,\n version: docVersion,\n source: docSource ?? 'catalog',\n drift: drift ?? null,\n version_mismatch: ver.mismatch ?? null,\n quality: { sufficient: quality.sufficient, score: quality.score, reasons: quality.reasons },\n escalate: quality.sufficient ? null : 'hosted',\n escalated: Boolean(hosted),\n docs: doc,\n });\n return;\n }\n info(`${c.cyan('vg lib')} · ${c.bold(displayName)} ${c.dim(`@${docVersion}`)}${docSource ? c.dim(` (from ${docSource})`) : ''}`);\n if (ver.mismatch) info(c.yellow(` ⚠ ${ver.mismatch.note}`));\n if (hosted) info(c.green(' ✔ local docs were thin — served richer docs from the hosted catalog'));\n else if (!quality.sufficient) info(c.yellow(` ⚠ local docs look thin (${quality.reasons.join(', ')})${online ? ' — hosted catalog had nothing better' : ' — run without --local for the hosted catalog'}`));\n if (drift?.drift === 'behind') info(c.yellow(` ⚠ docs are for ${drift.cataloged}, but your installed version is ${drift.installed} — refresh the docs`));\n else if (drift?.drift === 'current') info(c.green(` ✔ docs match your installed version (${drift.installed})`));\n info('');\n out(doc);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { exportGraph, formatForExt, type ExportFormat } from '../engine/export.js';\nimport { inventory } from '../engine/drift.js';\nimport { discoverModels } from '../engine/models.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { usageError } from '../util/exit.js';\nimport { c, info, out } from '../util/output.js';\n\n/**\n * `vg export <file>` (VG-CLI-SPEC §4.2) — one verb, format inferred from the\n * extension: json · ndjson · graphml · dot · cypher · sql · md · html · cdx.json\n * (CycloneDX SBOM/AI-BOM) · spdx.json. `-` writes to stdout.\n */\nexport function registerExport(program: Command): void {\n const cmd = program\n .command('export')\n .description('export the map (format inferred: json|ndjson|graphml|dot|cypher|sql|md|html|cdx.json|spdx.json)')\n .argument('[file]', 'target file (or - for stdout)', 'map.json')\n .action(function (this: Command, file: string) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const root = rootOf(global);\n\n const format = detectFormat(file);\n if (!format) throw usageError(`unknown export format for \"${file}\"`);\n\n const needsDeps = format === 'cyclonedx' || format === 'spdx';\n const content = exportGraph(format, {\n graph,\n deps: needsDeps ? inventory(root).records : undefined,\n models: needsDeps && !global.local ? discoverModels() : undefined,\n generatedAt: graph.generatedAt,\n });\n\n if (file === '-') {\n out(content.trimEnd());\n return;\n }\n fs.mkdirSync(path.dirname(path.resolve(file)), { recursive: true });\n fs.writeFileSync(file, content);\n info(`${c.green('✔')} wrote ${file} ${c.dim(`(${format})`)}`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction detectFormat(file: string): ExportFormat | null {\n const lower = file.toLowerCase();\n if (lower.endsWith('.cdx.json')) return 'cyclonedx';\n if (lower.endsWith('.spdx.json')) return 'spdx';\n if (file === '-') return 'json';\n return formatForExt(path.extname(file));\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { resolvedGrammarFiles, grammarSetVersion } from '../engine/grammars.js';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { catalogPath, libDir } from '../engine/lib.js';\nimport { stableStringify } from '../engine/serialize.js';\nimport { VERSION } from '../version.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg bundle --offline -o <dir>` (VG-INSTALL-MATRIX §9) — assemble an air-gapped\n * bundle: the grammar .wasm set, the current graph, and the library catalog,\n * plus a manifest. Point an offline machine at it with `vg build --grammars`.\n * Deterministic; no network.\n */\nexport function registerBundle(program: Command): void {\n const cmd = program\n .command('bundle')\n .description('build an air-gapped bundle (grammars + graph + library catalog)')\n .option('--offline', 'offline bundle (default; present for clarity)')\n .option('-o, --out <dir>', 'output directory', 'vg-bundle')\n .action(function (this: Command, opts: { out?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const outDir = path.resolve(root, opts.out ?? 'vg-bundle');\n\n // Per-language resolution (not a directory copy) so the bundle carries\n // the exact grammar files a scan would load — including any vendored\n // overlay that replaces a defective prebuilt.\n let grammarFiles;\n try {\n grammarFiles = resolvedGrammarFiles();\n } catch {\n throw new CliError('no grammars found to bundle (run a build first)', ExitCode.ERROR);\n }\n fs.mkdirSync(path.join(outDir, 'grammars'), { recursive: true });\n let grammarCount = 0;\n for (const { fileName, absPath } of grammarFiles) {\n fs.copyFileSync(absPath, path.join(outDir, 'grammars', fileName));\n grammarCount++;\n }\n\n const included: string[] = [`grammars/ (${grammarCount} .wasm)`];\n\n const graphSrc = global.graph ?? defaultGraphPath(root);\n if (fs.existsSync(graphSrc)) {\n fs.copyFileSync(graphSrc, path.join(outDir, 'graph.json'));\n included.push('graph.json');\n }\n\n const cat = catalogPath(root);\n if (fs.existsSync(cat)) {\n fs.copyFileSync(cat, path.join(outDir, 'vibgrate.lib.json'));\n included.push('vibgrate.lib.json');\n if (fs.existsSync(libDir(root))) {\n fs.cpSync(libDir(root), path.join(outDir, 'lib'), { recursive: true });\n included.push('lib/');\n }\n }\n\n const manifest = {\n tool: 'vg',\n version: VERSION,\n grammars: grammarSetVersion(),\n grammarCount,\n included,\n usage: 'Run `vg build --grammars <this dir>/grammars` to build fully offline.',\n };\n fs.writeFileSync(path.join(outDir, 'MANIFEST.json'), `${stableStringify(manifest, 2)}\\n`);\n\n if (global.json) {\n json({ out: path.relative(root, outDir), ...manifest });\n return;\n }\n info(`${c.cyan('vg bundle')} · wrote ${path.relative(root, outDir)}/`);\n for (const i of included) info(` ${c.green('✔')} ${i}`);\n info(c.dim(` offline: vg build --grammars \"${path.relative(root, outDir)}/grammars\"`));\n });\n applyGlobalOptions(cmd);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { probeFreshness, driftCount } from '../engine/freshness.js';\nimport { loadCatalog, catalogPath } from '../engine/lib.js';\nimport { hostedBase } from '../engine/hosted.js';\nimport { telemetryOptOut, isCI, statsEndpoint } from '../engine/stats-share.js';\nimport { detectServeLaunch } from '../install/registry.js';\nimport {\n credentialsPath,\n readStoredCredentials,\n homeCredentialsPath,\n projectCredentialsPath,\n} from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { VERSION } from '../version.js';\nimport { c, info, json } from '../util/output.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\nimport { rootOf } from './util.js';\n\n/**\n * `vg doctor` — one read-only diagnostic pass over everything a support thread\n * would otherwise ask for one item at a time: which config file won, which\n * credential source won, is there a map and is it fresh, can the hosted catalog\n * be reached, what would `vg install` register as the MCP launch, and what the\n * telemetry opt-outs currently say. Prints state; changes nothing.\n *\n * Secrets never appear in the output (GUARDRAILS §1.1): for a configured DSN we\n * show only its source, host, and workspace id — never the key id or secret.\n */\nexport function registerDoctor(program: Command): void {\n const cmd = program\n .command('doctor')\n .description('diagnose your setup: config, credentials, map freshness, hosted reachability, MCP launch')\n .action(async function (this: Command) {\n await runDoctor(readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\n/** How long the hosted reachability probe waits before reporting unreachable. */\nconst REACH_TIMEOUT_MS = 3000;\n\nconst CONFIG_BASENAMES = ['vibgrate.config.ts', 'vibgrate.config.js', 'vibgrate.config.json'];\n\ninterface Diagnosis {\n version: string;\n node: string;\n platform: string;\n root: string;\n configFile: string | null;\n map: {\n path: string;\n built: boolean;\n generatedAt: string | null;\n staleFiles: number | null;\n };\n libCatalog: { path: string; present: boolean; libraries: number };\n credentials: {\n source: 'env' | 'project' | 'home' | 'none';\n path: string | null;\n host: string | null;\n workspaceId: string | null;\n };\n hosted: { base: string; checked: boolean; reachable: boolean | null };\n mcpLaunch: { command: string; args: string[]; note: string | null };\n telemetry: { optOut: string | null; ci: boolean; endpoint: string };\n}\n\nasync function runDoctor(global: GlobalOpts): Promise<void> {\n const root = rootOf(global);\n const local = global.local === true;\n const graphPath = global.graph ?? defaultGraphPath(root);\n\n const configFile = CONFIG_BASENAMES.find((f) => fs.existsSync(path.join(root, f))) ?? null;\n\n const graph = loadGraph(root, graphPath);\n let staleFiles: number | null = null;\n if (graph) {\n // Exact when the freshness snapshot exists (written by every build);\n // otherwise unknown — doctor stays cheap and never walks the whole tree.\n const probe = probeFreshness(root);\n if (probe) staleFiles = driftCount(probe.drift);\n }\n\n const catalog = loadCatalog(root);\n const libCount = Object.keys(catalog.libraries).length;\n\n const creds = diagnoseCredentials(root);\n const base = hostedBase();\n const reachable = local ? null : await probeReachable(base);\n const launch = detectServeLaunch();\n const optOut = telemetryOptOut();\n\n const d: Diagnosis = {\n version: VERSION,\n node: process.version,\n platform: `${process.platform}/${process.arch}`,\n root,\n configFile,\n map: {\n path: path.relative(root, graphPath),\n built: graph !== null,\n generatedAt: graph?.generatedAt ?? null,\n staleFiles,\n },\n libCatalog: {\n path: path.relative(root, catalogPath(root)),\n present: fs.existsSync(catalogPath(root)),\n libraries: libCount,\n },\n credentials: creds,\n hosted: { base, checked: !local, reachable },\n mcpLaunch: { command: launch.command, args: launch.args, note: launch.note ?? null },\n telemetry: { optOut, ci: isCI(), endpoint: statsEndpoint() },\n };\n\n if (global.json) {\n json(d);\n return;\n }\n\n info(`${c.cyan('vg')} doctor · v${d.version} · node ${d.node} · ${d.platform}`);\n info(` root ${d.root}`);\n info(` config ${d.configFile ? c.green(d.configFile) : c.dim('none (defaults) — `vg init` writes one')}`);\n\n if (!d.map.built) {\n info(` map ${c.yellow('none')} — run ${c.bold('vg')} to build ${c.dim(d.map.path)}`);\n } else {\n const fresh =\n d.map.staleFiles == null\n ? c.dim('freshness unknown (no snapshot)')\n : d.map.staleFiles === 0\n ? c.green('up to date')\n : c.yellow(`${d.map.staleFiles} file(s) stale — auto-refreshes on next query`);\n info(` map ${c.green('built')} ${c.dim(d.map.generatedAt ?? '')} · ${fresh}`);\n }\n\n info(\n ` lib ${\n d.libCatalog.present\n ? `${c.green(String(d.libCatalog.libraries))} librar${d.libCatalog.libraries === 1 ? 'y' : 'ies'} in ${d.libCatalog.path}`\n : c.dim('no catalog — `vg lib add <source>` starts one; `vg lib <name>` works without it')\n }`,\n );\n\n if (d.credentials.source === 'none') {\n info(` auth ${c.dim('anonymous — fine for everything local; `vg login` enables push/publish')}`);\n } else {\n info(\n ` auth ${c.green(d.credentials.source)} ${c.dim(d.credentials.path ?? '')} · workspace ${d.credentials.workspaceId ?? '?'} · ${d.credentials.host ?? '?'}`,\n );\n }\n\n if (!d.hosted.checked) {\n info(` hosted ${c.dim(`skipped under --local (${d.hosted.base})`)}`);\n } else {\n info(\n ` hosted ${d.hosted.base} · ${d.hosted.reachable ? c.green('reachable') : c.yellow('unreachable — local answers still work')}`,\n );\n }\n\n info(\n ` mcp ${c.bold(`${d.mcpLaunch.command} ${d.mcpLaunch.args.join(' ')}`)}${d.mcpLaunch.note ? c.dim(` (${d.mcpLaunch.note})`) : ''}`,\n );\n\n const tel = d.telemetry.optOut\n ? c.green(`opted out via ${d.telemetry.optOut}`)\n : 'off by default — only `vg serve --share-stats` ever uploads';\n info(` telemetry ${tel}${d.telemetry.ci ? c.dim(' · CI detected') : ''}`);\n}\n\nfunction diagnoseCredentials(root: string): Diagnosis['credentials'] {\n const none = { source: 'none' as const, path: null, host: null, workspaceId: null };\n // Mirror resolveDsn()'s precedence (env → store), reporting the source instead\n // of the value. The secret itself is never read into the output.\n if (process.env.VIBGRATE_DSN) {\n const parsed = parseDsn(process.env.VIBGRATE_DSN);\n return { source: 'env', path: null, host: parsed?.host ?? null, workspaceId: parsed?.workspaceId ?? null };\n }\n const stored = readStoredCredentials({ cwd: root });\n if (!stored) return none;\n const file = credentialsPath({ cwd: root });\n const source =\n process.env.VIBGRATE_CREDENTIALS ? 'env' : file === projectCredentialsPath(root) ? 'project' : 'home';\n const parsed = parseDsn(stored.dsn);\n return {\n source,\n path: shortenHome(file),\n host: stored.ingestHost ?? parsed?.host ?? null,\n workspaceId: stored.workspaceId ?? parsed?.workspaceId ?? null,\n };\n}\n\n/** ~-abbreviate a path under the home dir for display. */\nfunction shortenHome(p: string): string {\n const home = homeCredentialsPath().slice(0, -'/.vibgrate/credentials.json'.length);\n return p.startsWith(home) ? `~${p.slice(home.length)}` : p;\n}\n\n/**\n * Reachability = \"we got ANY HTTP response from the host\" — a 404 proves the\n * network path works just as well as a 200 does. Only a transport-level failure\n * (DNS, TLS, timeout) reports unreachable. Never throws.\n */\nasync function probeReachable(base: string): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REACH_TIMEOUT_MS);\n timer.unref?.();\n try {\n await fetch(base, { method: 'HEAD', signal: controller.signal });\n return true;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ensureDir, pathExists } from '../utils/fs.js';\nimport { writeDefaultConfig } from '../../core-open/index.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize vibgrate in a project')\n .argument('[path]', 'Path to initialize', '.')\n .option('--baseline', 'Create initial baseline after init')\n .option('--yes', 'Skip confirmation prompts')\n .action(async (targetPath: string, opts: { baseline?: boolean; yes?: boolean }) => {\n const rootDir = path.resolve(targetPath);\n const vibgrateDir = path.join(rootDir, '.vibgrate');\n\n await ensureDir(vibgrateDir);\n console.log(chalk.green('✔') + ` Created ${chalk.bold('.vibgrate/')} directory`);\n\n const configPath = path.join(rootDir, 'vibgrate.config.ts');\n if (await pathExists(configPath)) {\n console.log(chalk.dim(' vibgrate.config.ts already exists, skipping'));\n } else {\n await writeDefaultConfig(rootDir);\n console.log(chalk.green('✔') + ` Created ${chalk.bold('vibgrate.config.ts')}`);\n }\n\n if (opts.baseline) {\n const { runBaseline } = await import('./baseline.js');\n await runBaseline(rootDir);\n }\n\n console.log('');\n console.log(chalk.bold('Next steps:'));\n console.log(` ${chalk.cyan('vibgrate scan')} Scan for upgrade drift`);\n console.log(` ${chalk.cyan('vibgrate baseline')} Create a drift baseline`);\n console.log('');\n });\n","/**\n * Local vulnerable-symbol reachability analysis.\n *\n * Matches the risky-symbol manifest (from `POST /v1/ingest/scan/preflight/symbols`)\n * against the LOCAL code map (`vg` graph): is the vulnerable package imported\n * anywhere, and is any of its vulnerable symbols referenced from an importing\n * file? Source never leaves the machine — only the tier verdicts and the\n * module-import evidence are attached to the scan artifact.\n *\n * Tier semantics (kept deliberately conservative — precision only ever\n * resolves UP toward \"reachable\", never down):\n * - reachable — the package is imported AND a vulnerable symbol is\n * referenced in an importing file (lexical match,\n * confidence-scaled; dynamic access can't be ruled in\n * or out, hence < 1.0 confidence).\n * - potentially_reachable — the package is imported but the symbols could not\n * be resolved (no symbol data, or names too generic\n * to match safely).\n * - not_reached — the package appears in no import in the code map\n * (or none of its vulnerable symbols is referenced).\n * - unknown — no code map, or an ecosystem the import matcher\n * does not support. Inert in scoring: unknown ≠ safe.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n ScanReachabilityResult,\n ScanReachabilityFinding,\n ReachabilityTier,\n RiskySymbolManifestEntry,\n SymbolsPreflightDependency,\n} from '../core-open/index.js';\nimport type { VgGraph, GraphNode } from '../schema.js';\nimport { indexFor } from '../engine/relations.js';\n\nexport const REACHABILITY_ANALYZER_VERSION = 'vg-reach-1.0';\n\n/** Base confidence of the per-ecosystem import matcher (specifier ↔ package). */\nconst ECOSYSTEM_MATCH_CONFIDENCE: Record<string, number> = {\n npm: 0.8,\n Go: 0.8,\n 'crates.io': 0.7,\n PyPI: 0.65,\n RubyGems: 0.6,\n};\n\n/** Symbol names too generic for a lexical match to mean anything. */\nconst GENERIC_SYMBOL_NAMES = new Set([\n 'get', 'set', 'run', 'main', 'init', 'call', 'apply', 'exec', 'send', 'open',\n 'read', 'write', 'parse', 'load', 'save', 'start', 'stop', 'new', 'create',\n 'update', 'delete', 'handle', 'process', 'render', 'value', 'data', 'next',\n]);\n\nconst MAX_FILES_PER_PACKAGE = 25;\nconst MAX_FILE_BYTES = 256 * 1024;\nconst MAX_MODULES_PER_PACKAGE = 50;\nconst MAX_IMPORTED_MODULE_PACKAGES = 500;\nconst MAX_FINDINGS = 1000;\n\ninterface PackageImportEvidence {\n /** Whether the matcher supports this ecosystem at all. */\n supported: boolean;\n /** Matched import specifiers (external node names). */\n modules: string[];\n /** Repo-relative paths of files importing the package. */\n importingFiles: string[];\n}\n\nfunction normalizePython(name: string): string {\n return name.toLowerCase().replace(/[-.]/g, '_');\n}\n\n/** Does this import specifier belong to the given package, per ecosystem rules? */\nexport function specifierMatchesPackage(ecosystem: string, pkg: string, spec: string): boolean {\n switch (ecosystem) {\n case 'npm':\n case 'Go':\n case 'RubyGems':\n return spec === pkg || spec.startsWith(`${pkg}/`);\n case 'PyPI': {\n const top = spec.split('.')[0] ?? spec;\n return normalizePython(top) === normalizePython(pkg);\n }\n case 'crates.io': {\n const top = (spec.split('::')[0] ?? spec).toLowerCase().replace(/-/g, '_');\n return top === pkg.toLowerCase().replace(/-/g, '_');\n }\n default:\n return false;\n }\n}\n\n/** The identifier a lexical reference to a vulnerable symbol would use. */\nexport function symbolIdentifier(symbol: string): string {\n const cleaned = symbol.replace(/\\(.*\\)$/, '');\n const segments = cleaned.split(/[./:#]|::/).filter(Boolean);\n return segments[segments.length - 1] ?? cleaned;\n}\n\n/** Whether a lexical match on this identifier is meaningful evidence. */\nexport function isMatchableIdentifier(identifier: string): boolean {\n return identifier.length >= 3 && !GENERIC_SYMBOL_NAMES.has(identifier.toLowerCase());\n}\n\n/** Collect import evidence for one package from the graph's external nodes. */\nfunction collectPackageImports(\n graph: VgGraph,\n ecosystem: string,\n pkg: string,\n): PackageImportEvidence {\n if (!(ecosystem in ECOSYSTEM_MATCH_CONFIDENCE)) {\n return { supported: false, modules: [], importingFiles: [] };\n }\n const idx = indexFor(graph);\n const modules = new Set<string>();\n const files = new Set<string>();\n for (const node of graph.nodes) {\n if (node.kind !== 'external') continue;\n if (!specifierMatchesPackage(ecosystem, pkg, node.name)) continue;\n modules.add(node.name);\n for (const edge of idx.in(node.id, 'import')) {\n const src = idx.nodeById.get(edge.src) as GraphNode | undefined;\n if (src?.file) files.add(src.file);\n }\n }\n return {\n supported: true,\n modules: [...modules].sort(),\n importingFiles: [...files].sort(),\n };\n}\n\nasync function fileReferencesIdentifier(\n rootDir: string,\n relFile: string,\n identifier: string,\n readFile: (absPath: string) => Promise<string | null>,\n): Promise<boolean> {\n const content = await readFile(path.join(rootDir, relFile));\n if (!content) return false;\n const escaped = identifier.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`\\\\b${escaped}\\\\b`).test(content);\n}\n\nasync function defaultReadFile(absPath: string): Promise<string | null> {\n try {\n const stat = await fs.stat(absPath);\n if (!stat.isFile() || stat.size > MAX_FILE_BYTES) return null;\n return await fs.readFile(absPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nexport interface ReachabilityAnalysisInput {\n /** The freshly built code map; null when unavailable (all findings Unknown). */\n graph: VgGraph | null;\n rootDir: string;\n /** Risky-symbol manifest from the symbols preflight. */\n manifest: RiskySymbolManifestEntry[];\n /** The dependency coordinates that were posted (for module-import evidence). */\n dependencies: SymbolsPreflightDependency[];\n /** Injectable for tests. */\n readFile?: (absPath: string) => Promise<string | null>;\n}\n\n/**\n * Run the local reachability query. Never throws for per-file problems; a\n * missing/unreadable file simply yields no lexical evidence.\n */\nexport async function analyzeReachability(\n input: ReachabilityAnalysisInput,\n): Promise<ScanReachabilityResult> {\n const generatedAt = new Date().toISOString();\n const readFile = input.readFile ?? defaultReadFile;\n\n if (!input.graph) {\n return {\n analyzerVersion: REACHABILITY_ANALYZER_VERSION,\n source: 'none',\n generatedAt,\n manifestAdvisoryCount: input.manifest.length,\n findings: input.manifest.slice(0, MAX_FINDINGS).map((entry) => ({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'unknown' as ReachabilityTier,\n evidence: 'no code map available for this scan',\n graphConfidence: 0,\n })),\n };\n }\n\n // Module-import evidence for every posted dependency in a supported\n // ecosystem — including \"looked, found no import\" (importingFiles: 0), which\n // the server needs to distinguish from \"never evaluated\" (entry absent).\n const evidenceByPackage = new Map<string, PackageImportEvidence>();\n const importedModules: NonNullable<ScanReachabilityResult['importedModules']> = [];\n const seenPackages = new Set<string>();\n for (const dep of input.dependencies) {\n const key = `${dep.ecosystem}|${dep.package}`;\n if (seenPackages.has(key)) continue;\n seenPackages.add(key);\n const evidence = collectPackageImports(input.graph, dep.ecosystem, dep.package);\n evidenceByPackage.set(key, evidence);\n if (evidence.supported && importedModules.length < MAX_IMPORTED_MODULE_PACKAGES) {\n importedModules.push({\n ecosystem: dep.ecosystem,\n package: dep.package,\n modules: evidence.modules.slice(0, MAX_MODULES_PER_PACKAGE),\n importingFiles: evidence.importingFiles.length,\n });\n }\n }\n importedModules.sort(\n (a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.package.localeCompare(b.package),\n );\n\n const findings: ScanReachabilityFinding[] = [];\n\n for (const entry of input.manifest) {\n const key = `${entry.ecosystem}|${entry.package}`;\n const evidence =\n evidenceByPackage.get(key) ?? collectPackageImports(input.graph, entry.ecosystem, entry.package);\n const baseConfidence = ECOSYSTEM_MATCH_CONFIDENCE[entry.ecosystem] ?? 0;\n\n if (!evidence.supported) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'unknown',\n evidence: `import matching is not supported for the ${entry.ecosystem} ecosystem yet`,\n graphConfidence: 0,\n });\n continue;\n }\n\n if (evidence.importingFiles.length === 0) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'not_reached',\n evidence: `no import of ${entry.package} was found in the code map`,\n graphConfidence: baseConfidence,\n });\n continue;\n }\n\n const matchableSymbols = entry.symbols\n .map((s) => ({ symbol: s.symbol, identifier: symbolIdentifier(s.symbol) }))\n .filter((s) => isMatchableIdentifier(s.identifier));\n\n if (entry.symbolCoverage !== 'function' || matchableSymbols.length === 0) {\n // Module imported, but no usable symbol data (pending extraction, module\n // coverage, or names too generic to match safely) → potentially reachable.\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'potentially_reachable',\n evidence: `${entry.package} is imported by ${evidence.importingFiles.length} file${evidence.importingFiles.length === 1 ? '' : 's'}; vulnerable symbols unresolved (coverage: ${entry.symbolCoverage})`,\n callPath: evidence.importingFiles.slice(0, 10),\n graphConfidence: Math.min(baseConfidence, 0.6),\n });\n continue;\n }\n\n // Symbol-level check: lexical reference to any vulnerable symbol in an\n // importing file. Bounded fan-out so huge repos stay fast.\n const filesToCheck = evidence.importingFiles.slice(0, MAX_FILES_PER_PACKAGE);\n let anySymbolFound = false;\n for (const { symbol, identifier } of matchableSymbols) {\n const referencingFiles: string[] = [];\n for (const relFile of filesToCheck) {\n if (await fileReferencesIdentifier(input.rootDir, relFile, identifier, readFile)) {\n referencingFiles.push(relFile);\n if (referencingFiles.length >= 5) break;\n }\n }\n if (referencingFiles.length > 0) {\n anySymbolFound = true;\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n symbol,\n tier: 'reachable',\n evidence: `vulnerable symbol \\`${identifier}\\` is referenced in ${referencingFiles.length} importing file${referencingFiles.length === 1 ? '' : 's'}`,\n callPath: referencingFiles,\n graphConfidence: Math.min(baseConfidence, 0.75),\n });\n }\n }\n\n if (!anySymbolFound) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'not_reached',\n evidence: `${entry.package} is imported, but none of its ${matchableSymbols.length} vulnerable symbol${matchableSymbols.length === 1 ? '' : 's'} is referenced in the ${filesToCheck.length} importing file${filesToCheck.length === 1 ? '' : 's'} checked`,\n callPath: evidence.importingFiles.slice(0, 10),\n graphConfidence: Math.min(baseConfidence, 0.55),\n });\n }\n }\n\n findings.sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.advisoryId.localeCompare(b.advisoryId) ||\n (a.symbol ?? '').localeCompare(b.symbol ?? ''),\n );\n\n return {\n analyzerVersion: REACHABILITY_ANALYZER_VERSION,\n source: 'graph',\n generatedAt,\n manifestAdvisoryCount: input.manifest.length,\n importedModules,\n findings: findings.slice(0, MAX_FINDINGS),\n };\n}\n\n/**\n * Collect the deduped dependency coordinates to post to the symbols preflight\n * from the scan artifact's per-project dependency rows.\n */\nexport function collectPreflightDependencies(\n projects: Array<{\n type: string;\n dependencies: Array<{ package: string; resolvedVersion: string | null; currentSpec: string }>;\n }>,\n projectTypeToEcosystem: Partial<Record<string, string>>,\n): SymbolsPreflightDependency[] {\n const deduped = new Map<string, SymbolsPreflightDependency>();\n for (const project of projects) {\n const ecosystem = projectTypeToEcosystem[project.type];\n if (!ecosystem) continue;\n for (const dep of project.dependencies) {\n const version = dep.resolvedVersion || normalizeVersionSpec(dep.currentSpec);\n if (!version) continue;\n const key = `${ecosystem}:${dep.package}:${version}`;\n if (!deduped.has(key)) {\n deduped.set(key, { ecosystem, package: dep.package, version });\n }\n }\n }\n return [...deduped.values()].sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.version.localeCompare(b.version),\n );\n}\n\nfunction normalizeVersionSpec(spec: string): string | null {\n const match = spec.trim().match(/\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?/);\n return match?.[0] ?? null;\n}\n","/** Machine-parseable ingest id for CI, AMI, and other automation (plain stdout, no ANSI). */\nexport function emitIngestIdLine(ingestId: string, options?: { unchanged?: boolean }): void {\n console.log(`VIBGRATE_INGEST_ID=${ingestId}`);\n if (options?.unchanged) {\n console.log('VIBGRATE_INGEST_UNCHANGED=1');\n }\n}\n\n/**\n * Machine-parseable drift score for automation (plain stdout, no ANSI). The Vibgrate\n * remediation agent reads this to gate a run on before/after drift, rather than\n * scraping the human-formatted report. Emitted only when a consumer asks for it\n * (VIBGRATE_EMIT_MARKERS=1, set by the migration agent) so normal CLI output is\n * unchanged.\n */\nexport function emitDriftScoreLine(score: number): void {\n if (process.env.VIBGRATE_EMIT_MARKERS !== '1') return;\n console.log(`VIBGRATE_DRIFT_SCORE=${score}`);\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { pathExists } from '../core-open/index.js';\nimport { resolveCliInvocation } from '../util/cli-invocation.js';\n\n// Map of AI assistant config file/dir patterns to the `vg install <name>` argument.\n// Checked in priority order — first match wins.\nconst AI_ASSISTANT_DETECTORS: Array<{ files: string[]; name: string }> = [\n { files: ['CLAUDE.md', '.claude'], name: 'claude' },\n { files: ['.cursor', '.cursorrules'], name: 'cursor' },\n { files: ['.windsurf'], name: 'windsurf' },\n { files: ['.github/copilot-instructions.md', '.copilot'], name: 'copilot' },\n { files: ['.gemini'], name: 'gemini' },\n { files: ['.continuerc.json'], name: 'continue' },\n { files: ['.codex'], name: 'codex' },\n];\n\nexport async function detectAiAssistant(rootDir: string): Promise<string | null> {\n for (const detector of AI_ASSISTANT_DETECTORS) {\n for (const file of detector.files) {\n if (await pathExists(path.join(rootDir, file))) {\n return detector.name;\n }\n }\n }\n return null;\n}\n\nexport function printAiContextPrompt(detectedAssistant: string | null): void {\n const teal = chalk.hex('#3FB0A4');\n const mint = chalk.hex('#4FE3C1');\n // Prefix with whatever actually runs this CLI for the user: `vg` when it's\n // installed on PATH, or `npx @vibgrate/cli` when they ran via npx (where a\n // bare `vg install` would not resolve).\n const cli = resolveCliInvocation();\n const installArgs = detectedAssistant ? `install ${detectedAssistant}` : 'install --all';\n const installCmd = `${cli} ${installArgs}`;\n const detectedNote = detectedAssistant\n ? chalk.dim(` (${detectedAssistant} config detected)`)\n : '';\n\n console.log('');\n console.log(teal(' ╭──────────────────────────────────────────────────╮'));\n console.log(teal(' │') + ' ' + mint('◆') + ' ' + chalk.bold.white('Get AI-aware answers in your editor') + ' ' + teal('│'));\n console.log(teal(' ╰──────────────────────────────────────────────────╯'));\n console.log('');\n console.log(' ' + chalk.bold.white(installCmd) + detectedNote);\n console.log('');\n console.log(' ' + teal('·') + ' ' + chalk.white('Code map in your assistant') + chalk.dim(' — call trees, impact surfaces, import paths'));\n console.log(' ' + teal('·') + ' ' + chalk.white('Offline drift') + chalk.dim(' — DriftScore and upgrade priorities, right inside your editor'));\n console.log(' ' + teal('·') + ' ' + chalk.white('Version-correct library docs') + chalk.dim(' — pinned to your lockfile, no hallucinated APIs'));\n console.log('');\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n runCoreScan,\n pathExists,\n parseDsn,\n prepareCompressedUpload,\n fetchScanPreflight,\n fetchRiskySymbols,\n PROJECT_TYPE_TO_OSV_ECOSYSTEM,\n computeRepoFingerprint,\n detectVcs,\n resolveRepositoryName,\n parseExcludePatterns,\n loadConfig,\n} from '../../core-open/index.js';\nimport type { ScanOptions, ScanArtifact } from '../../core-open/index.js';\nimport { analyzeReachability, collectPreflightDependencies } from '../reachability.js';\nimport type { VgGraph } from '../../schema.js';\nimport { inventory } from '../../engine/drift.js';\nimport { loadStandards, checkStandards } from '../../engine/standards.js';\nimport { loadAdvancedScanHook } from '../advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { dashHostForIngestHost } from '../regions.js';\nimport { resolveDsn } from '../credentials.js';\nimport { emitIngestIdLine, emitDriftScoreLine } from '../utils/ingest-id-output.js';\nimport { uploadScanArtifact } from '../utils/upload.js';\nimport { buildGraph } from '../../engine/build.js';\nimport { writeArtifacts } from '../../engine/artifacts.js';\nimport { writeSnapshot } from '../../engine/freshness.js';\nimport { detectAiAssistant, printAiContextPrompt } from '../ai-context-prompt.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\n\n/**\n * Whether `scan` should build the local code map after scoring drift.\n *\n * The code map is a *local artifact* — it writes `.vibgrate/graph.json`, the\n * graph report/html, and a freshness snapshot, and building it runs the\n * memory-heavy in-process TypeScript program. It is therefore skipped whenever\n * the caller has opted out of local artifacts:\n *\n * - `--no-graph` (`opts.graph === false`) — explicit opt-out.\n * - `--max-privacy` — strongest privacy mode, which means \"no local artifacts\".\n * - `--no-local-artifacts` — \"Do not write .vibgrate JSON artifacts to disk\";\n * graph.json is one of those artifacts, so building it violated the flag's\n * contract *and* let the optional map build OOM-kill baseline scans (e.g. the\n * migration `scan --push --no-local-artifacts` path), taking `--push` down\n * with it even though drift and findings were already computed.\n */\nexport function shouldBuildCodeMap(opts: {\n graph?: boolean;\n maxPrivacy?: boolean;\n noLocalArtifacts?: boolean;\n}): boolean {\n return opts.graph !== false && !opts.maxPrivacy && !opts.noLocalArtifacts;\n}\n\n/**\n * Reachability hand-off: post the scan's dependency coordinates to the scan\n * symbols preflight, run the local graph query against the returned risky-symbol\n * manifest, and attach the verdicts to the artifact (uploaded with the push).\n * Best-effort — a failure here never fails or delays the scan.\n */\nasync function attachReachability(\n artifact: ScanArtifact,\n rootDir: string,\n opts: ScanOptions,\n graph: VgGraph,\n): Promise<void> {\n try {\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) return;\n const parsed = parseDsn(dsn);\n if (!parsed) return;\n const ingestHost = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n\n const dependencies = collectPreflightDependencies(artifact.projects, PROJECT_TYPE_TO_OSV_ECOSYSTEM);\n if (dependencies.length === 0) return;\n\n const manifest = await fetchRiskySymbols(parsed, ingestHost, dependencies);\n if (manifest.status !== 'ok' || !manifest.advisories) return;\n\n artifact.reachability = await analyzeReachability({\n graph,\n rootDir,\n manifest: manifest.advisories,\n dependencies,\n });\n\n if (!opts.quiet && manifest.advisories.length > 0) {\n const tiers = artifact.reachability.findings.reduce<Record<string, number>>((acc, f) => {\n acc[f.tier] = (acc[f.tier] ?? 0) + 1;\n return acc;\n }, {});\n const parts = [\n tiers.reachable ? `${tiers.reachable} reachable` : null,\n tiers.potentially_reachable ? `${tiers.potentially_reachable} potentially reachable` : null,\n tiers.not_reached ? `${tiers.not_reached} not reached` : null,\n tiers.unknown ? `${tiers.unknown} unknown` : null,\n ].filter(Boolean);\n console.log(\n chalk.dim(\n `Reachability: ${manifest.advisories.length} advisor${manifest.advisories.length === 1 ? 'y' : 'ies'} checked against the code map — ${parts.join(', ')}`,\n ),\n );\n }\n } catch (e: unknown) {\n // Unknown ≠ safe: the server scores these findings at full weight. Surface\n // the reason only in strict-less informational form.\n if (!opts.quiet) {\n const msg = e instanceof Error ? e.message : String(e);\n console.log(chalk.dim(`Reachability check skipped: ${msg}`));\n }\n }\n}\n\n/** Auto-push scan artifact to Vibgrate API */\nasync function autoPush(\n artifact: ScanArtifact,\n rootDir: string,\n opts: ScanOptions,\n): Promise<void> {\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) {\n console.error(chalk.red('No DSN provided for push.'));\n console.error(chalk.dim('Run \"vibgrate login\", set VIBGRATE_DSN, or use the --dsn flag.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n // Compact and compress artifact for upload. `databaseSchemaCaps` lets\n // `scanners.databaseSchema` in vibgrate.config.ts raise/lower the default\n // upload caps (see DOCS.md § Database Schema).\n const config = await loadConfig(rootDir);\n const databaseSchemaCaps = config.scanners !== false ? config.scanners?.databaseSchema : undefined;\n const { body, contentEncoding } = await prepareCompressedUpload(artifact, { databaseSchemaCaps });\n const timestamp = String(Date.now());\n\n let host = parsed.host;\n if (opts.region) {\n try {\n host = resolveIngestHost(opts.region);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n if (opts.strict) process.exit(1);\n return;\n }\n }\n\n const originalSize = JSON.stringify(artifact).length;\n const compressedSize = body.length;\n const ratio = ((1 - compressedSize / originalSize) * 100).toFixed(0);\n console.log(chalk.dim(`Uploading to ${host}... (${(compressedSize / 1024).toFixed(0)} KB, ${ratio}% smaller)`));\n\n try {\n // Auto-retries against the workspace's pinned region on a 409 REGION_MISMATCH.\n const { response, host: uploadedHost } = await uploadScanArtifact({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n body,\n contentEncoding,\n timestamp,\n force: opts.force,\n // Set only by an automated caller running the scan on the workspace's\n // behalf (e.g. a Vibgrate-hosted remediation run) — never a customer flag.\n runId: process.env.VIBGRATE_SCAN_RUN_ID,\n runToken: process.env.VIBGRATE_SCAN_RUN_TOKEN,\n });\n host = uploadedHost;\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = await response.json() as {\n status: string;\n ingestId?: string;\n unchanged?: boolean;\n previousIngestId?: string;\n lastScannedAt?: string;\n };\n\n if (result.unchanged) {\n console.log(\n chalk.green('✔')\n + ` Repository unchanged since ${result.lastScannedAt ?? 'last scan'} — skipped upload (no credit used).`,\n );\n if (result.previousIngestId) {\n emitIngestIdLine(result.previousIngestId, { unchanged: true });\n const dashUrl = `https://${dashHostForIngestHost(host)}/${parsed.workspaceId}/scan/${result.previousIngestId}`;\n console.log(chalk.dim(` Previous report: ${dashUrl}`));\n } else if (opts.strict) {\n console.error(chalk.red('Repository unchanged but no previous ingest id returned.'));\n process.exit(1);\n }\n return;\n }\n\n console.log(chalk.green('✔') + ` Scan queued for processing (${result.ingestId ?? 'ok'})`);\n if (result.ingestId) {\n emitIngestIdLine(result.ingestId);\n const dashUrl = `https://${dashHostForIngestHost(host)}/${parsed.workspaceId}/scan/${result.ingestId}`;\n // On Windows, stderr/stdout desync can leave residual content on lines.\n // Use ANSI escape: \\x1B[0G = move to column 0, \\x1B[2K = erase entire line\n const CLEAR_LINE = process.platform === 'win32' ? '\\x1B[0G\\x1B[2K' : '';\n console.log('');\n console.log(CLEAR_LINE + chalk.dim(' Processing continues in the background. Results available shortly.'));\n console.log('');\n console.log(CLEAR_LINE + chalk.cyan('────────────────────────────────────────────────────────────────────────────────'));\n console.log(CLEAR_LINE + chalk.bold(' 📊 View Scan Report'));\n console.log(CLEAR_LINE + ' ' + chalk.underline.cyan(dashUrl));\n console.log(CLEAR_LINE + chalk.cyan('────────────────────────────────────────────────────────────────────────────────'));\n console.log('');\n console.log('');\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Upload failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n}\n\n/**\n * Commander collector for the repeatable `--exclude` flag. Each occurrence\n * may itself hold several comma/semicolon-separated globs, so we expand and\n * accumulate them across every use of the flag.\n */\nfunction collectExcludes(value: string, previous: string[]): string[] {\n return [...previous, ...parseExcludePatterns(value)];\n}\n\n/**\n * `--full` extra: report banned dependencies against a committed standards policy\n * (`.vibgrate/standards.json` etc.). Silent when no policy is present, and never\n * changes the exit code — gating stays with `vg drift --fail-on standards`.\n */\nfunction reportStandards(rootDir: string): void {\n const loaded = loadStandards(rootDir);\n if (!loaded.policy) return;\n const violations = checkStandards(loaded.policy, inventory(rootDir).records);\n if (violations.length === 0) {\n console.log(chalk.green('✔') + ' Standards: no banned dependencies in use');\n return;\n }\n console.log(chalk.red(`\\n⚠ Standards: ${violations.length} banned dependency(ies) in use`));\n for (const v of violations) {\n const fix = v.use ? chalk.dim(` → use ${v.use}`) : '';\n const why = v.reason ? chalk.dim(` (${v.reason})`) : '';\n console.log(` ${chalk.red('banned')} ${v.ecosystem}:${v.name}${v.installed ? chalk.dim(` ${v.installed}`) : ''}${fix}${why}`);\n }\n}\n\nfunction parseNonNegativeNumber(value: string | undefined, label: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative number.`);\n }\n return parsed;\n}\n\nexport const scanCommand = new Command('scan')\n .description('Scan a project for upgrade drift')\n .argument('[path]', 'Path to scan', '.')\n .option('--out <file>', 'Output file path')\n .option('--format <format>', 'Output format (text|json|sarif|md)', 'text')\n .option('--fail-on <level>', 'Fail on warn or error')\n .option('--baseline <file>', 'Compare against baseline')\n .option('--changed-only', 'Only scan changed files')\n .option(\n '-e, --exclude <glob>',\n 'Exclude paths matching a glob pattern. Repeatable, and a single value may list several patterns separated by commas or semicolons (e.g. --exclude \"legacy/**,vendor/**\"). Merged with excludes from the config file.',\n collectExcludes,\n [],\n )\n .option('--concurrency <n>', 'Max concurrent npm calls', '8')\n .option('--push', 'Auto-push results to Vibgrate API after scan')\n .option('--dsn <dsn>', 'DSN token for push (or use VIBGRATE_DSN env)')\n .option('--region <region>', 'Override data residency region for push (us, eu)')\n .option('--strict', 'Fail on push errors')\n .option('--ui-purpose', 'Enable optional UI purpose evidence extraction (slower)')\n .option('--no-local-artifacts', 'Do not write .vibgrate JSON artifacts to disk')\n .option('--max-privacy', 'Enable strongest privacy mode (minimal scanners, no local artifacts)')\n .option('--offline', 'Run without network calls; do not upload results')\n .option('--full', 'Comprehensive scan: turns on known-vulnerability detection (= --vulns) and, when a standards policy exists, a banned-dependency report — on top of drift scoring and the code map')\n .option('--vulns', 'Also scan installed dependencies for known vulnerabilities (OSV online, or advisories from --package-manifest when offline)')\n .option('--package-manifest <file>', 'Use local package-version manifest JSON/ZIP (for offline mode)')\n .option('--project-scan-timeout <seconds>', 'Per-project scan timeout in seconds (default: 180)')\n .option('--drift-budget <score>', 'Fail if DriftScore is above budget (0-100)')\n .option('--drift-worsening <percent>', 'Fail if drift worsens by more than % since baseline')\n .option('--repository-name <name>', 'Override the repository name recorded for this scan (defaults to the directory or package.json name)')\n .option('--force', 'Always create a fresh scan ingest, even if the repository is unchanged since the last scan (skips the unchanged/reuse optimization). Used by scheduled and dashboard-triggered scans.')\n .option('--no-graph', 'Skip building the local code map (the AI/docs index) that scan produces after scoring drift')\n .option('--quiet', 'Suppress promotional output (the free-plan tracking panel and the AI Context install prompt); scan results are unaffected')\n .action(async (targetPath: string, opts: {\n out?: string;\n format: string;\n failOn?: string;\n baseline?: string;\n changedOnly?: boolean;\n exclude: string[];\n concurrency: string;\n push?: boolean;\n dsn?: string;\n region?: string;\n strict?: boolean;\n uiPurpose?: boolean;\n // Commander maps the `--no-local-artifacts` negation flag to\n // `localArtifacts` (default `true`, `false` when the flag is passed) — NOT\n // to `noLocalArtifacts`. Reading the wrong name silently ignored the flag.\n localArtifacts?: boolean;\n maxPrivacy?: boolean;\n offline?: boolean;\n full?: boolean;\n vulns?: boolean;\n packageManifest?: string;\n projectScanTimeout?: string;\n driftBudget?: string;\n driftWorsening?: string;\n repositoryName?: string;\n force?: boolean;\n graph?: boolean;\n quiet?: boolean;\n }) => {\n const rootDir = path.resolve(targetPath);\n if (!(await pathExists(rootDir))) {\n console.error(chalk.red(`Path does not exist: ${rootDir}`));\n process.exit(1);\n }\n\n const hasDsn = !!resolveDsn(opts.dsn);\n const willPush = !opts.offline && (opts.push || hasDsn);\n\n // `--no-local-artifacts` arrives from commander as `localArtifacts === false`\n // (the negation flag's camelCase key), so normalise it once here. Reading\n // `opts.noLocalArtifacts` (which never exists) had silently ignored the flag:\n // every .vibgrate artifact — including the memory-heavy code map — was still\n // written, which OOM-killed migration baseline scans mid-map.\n const noLocalArtifacts = opts.localArtifacts === false;\n\n // Capture first-run before the scan writes .vibgrate/scan_result.json.\n const isFirstRun = !(await pathExists(path.join(rootDir, '.vibgrate', 'scan_result.json')));\n\n // Region the workspace is pinned to, learned from preflight. Used to route\n // the upload to the correct ingest host up front (the push path also\n // self-heals on a 409 REGION_MISMATCH if preflight didn't run).\n let pinnedRegion: string | undefined;\n // Workspace billing tier + upgrade link, learned from preflight. They select\n // the free-plan upsell panel's audience: a free-tier workspace shows the\n // panel with an upgrade CTA; any paid tier suppresses it. Left undefined when\n // preflight does not run (offline / no push), which keeps the panel hidden\n // for authenticated users rather than risk mislabelling a paid plan.\n let planTier: string | undefined;\n let upgradeUrl: string | undefined;\n\n if (willPush && hasDsn) {\n const dsn = resolveDsn(opts.dsn)!;\n const parsed = parseDsn(dsn);\n if (parsed) {\n const ingestHost = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n const vcs = await detectVcs(rootDir);\n const fingerprint = await computeRepoFingerprint(rootDir, vcs);\n const repositoryName = opts.repositoryName?.trim() || await resolveRepositoryName(rootDir);\n try {\n const preflight = await fetchScanPreflight(parsed, ingestHost, {\n repositoryName,\n vcsSha: fingerprint.vcsSha,\n });\n pinnedRegion = preflight.region;\n planTier = preflight.plan?.tier;\n // Prefer the server's canonical upgrade link; otherwise point at the\n // workspace dashboard on the (possibly region-pinned) ingest host.\n upgradeUrl =\n preflight.upgradeUrl ??\n `https://${dashHostForIngestHost(preflight.ingestHost ?? ingestHost)}/${parsed.workspaceId}`;\n if (preflight.vm && !preflight.vm.allowed) {\n console.error(chalk.red(preflight.error ?? 'VM meter usage exhausted'));\n console.error(\n chalk.dim(\n `VM minutes: ${preflight.vm.used}/${preflight.vm.limit} (${preflight.plan.label} plan) — enable overages or upgrade your plan.`,\n ),\n );\n process.exit(1);\n }\n // A new repository that would breach the plan's repository cap is\n // blocked before the (expensive) local scan runs. Re-scanning an\n // already-mapped repository is never blocked here.\n if (preflight.repositories && !preflight.repositories.allowed) {\n console.error(\n chalk.red(\n preflight.error ??\n `Repository limit reached for the ${preflight.plan.label} plan — cannot scan a new repository.`,\n ),\n );\n const max =\n preflight.repositories.max < 0 ? 'unlimited' : String(preflight.repositories.max);\n console.error(\n chalk.dim(\n `Repositories: ${preflight.repositories.total}/${max} (${preflight.plan.label} plan) — archive a repository or upgrade your plan.`,\n ),\n );\n if (preflight.upgradeUrl) {\n console.error(chalk.dim(` Upgrade: ${preflight.upgradeUrl}`));\n }\n process.exit(1);\n }\n if (preflight.status === 'error' || !preflight.scans.allowed) {\n console.error(chalk.red(preflight.error ?? 'Scan ingestion not allowed for this workspace.'));\n console.error(\n chalk.dim(\n `Credits: ${preflight.scans.used}/${preflight.scans.limit} (${preflight.plan.label} plan)`,\n ),\n );\n if (opts.strict) process.exit(1);\n process.exit(1);\n }\n console.log(\n chalk.dim(\n `Plan: ${preflight.plan.label} — scan credits ${preflight.scans.used}/${preflight.scans.limit} this month`,\n ),\n );\n // `--force` opts out of the unchanged short-circuit so scheduled and\n // dashboard-triggered scans always produce a fresh report.\n if (preflight.repository?.unchanged && !opts.force) {\n console.log(\n chalk.green('✔')\n + ` Repository unchanged at ${preflight.repository.lastVcsSha?.slice(0, 7) ?? 'same revision'} — skipping scan.`,\n );\n if (preflight.repository.lastIngestId) {\n emitIngestIdLine(preflight.repository.lastIngestId, { unchanged: true });\n const dashUrl = `https://${dashHostForIngestHost(ingestHost)}/${parsed.workspaceId}/scan/${preflight.repository.lastIngestId}`;\n console.log(chalk.dim(` Latest report: ${dashUrl}`));\n } else if (opts.strict) {\n console.error(chalk.red('Repository unchanged but no previous ingest id available.'));\n process.exit(1);\n }\n return;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.yellow(`Preflight check failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n }\n }\n\n const scanOpts: ScanOptions = {\n vibgrateVersion: VERSION,\n out: opts.out,\n format: (opts.format as 'text' | 'json' | 'sarif' | 'md') || 'text',\n failOn: opts.failOn as 'warn' | 'error' | undefined,\n baseline: opts.baseline,\n changedOnly: opts.changedOnly,\n exclude: opts.exclude,\n concurrency: parseInt(opts.concurrency, 10) || 8,\n push: opts.push,\n dsn: opts.dsn,\n // An explicit --region wins; otherwise route to the workspace's pinned\n // region as reported by preflight.\n region: opts.region ?? pinnedRegion,\n strict: opts.strict,\n uiPurpose: opts.uiPurpose,\n noLocalArtifacts,\n maxPrivacy: opts.maxPrivacy,\n offline: opts.offline,\n // `--full` is the comprehensive umbrella: it turns on vulnerability scanning.\n vulns: opts.vulns || opts.full,\n packageManifest: opts.packageManifest,\n driftBudget: parseNonNegativeNumber(opts.driftBudget, '--drift-budget'),\n driftWorseningPercent: parseNonNegativeNumber(opts.driftWorsening, '--drift-worsening'),\n projectScanTimeout: opts.projectScanTimeout ? parseInt(opts.projectScanTimeout, 10) || undefined : undefined,\n repositoryName: opts.repositoryName?.trim() || undefined,\n force: opts.force,\n quiet: opts.quiet,\n // Auth + plan signals for the free-plan upsell panel. `hasDsn` resolves the\n // full credential precedence — `--dsn`, `VIBGRATE_DSN`, and the stored login\n // credential (`~/.vibgrate/credentials.json`) — which the scanner's own\n // dsn/env-only check cannot see. `planTier`/`upgradeUrl` come from preflight.\n // Together they pick the panel audience: signed out → login CTA; signed in\n // on free → upgrade CTA; signed in on a paid plan → no panel. Without the\n // auth signal, a logged-in user running a bare scan was mislabelled\n // \"Vibgrate Free\" and shown the login panel even as the run pushed.\n authenticated: hasDsn,\n planTier,\n upgradeUrl,\n // Prefix for the upsell panel's `login → push` hint — `vg` when installed,\n // `npx @vibgrate/cli` when the user ran via npx (where bare `vg` fails).\n invocation: resolveCliInvocation(),\n };\n\n // `scan` also builds the local code map (the AI/docs index) so one command\n // yields both the DriftScore and a ready graph for `vg ask`/`guide`/`lib`\n // and MCP. We run it as the scan's final `postScan` step so it shares the\n // *single* progress bar (no second bar/logo). Fail-soft — a map problem\n // never fails the scan. Skipped under --no-graph, --max-privacy, and\n // --no-local-artifacts (the map is a local .vibgrate artifact; see\n // shouldBuildCodeMap). An uncatchable OOM in the map build otherwise takes\n // the whole scan — and its --push — down with it.\n const wantGraph = shouldBuildCodeMap({ graph: opts.graph, maxPrivacy: opts.maxPrivacy, noLocalArtifacts });\n // Retained by the postScan hook so the reachability query below can run\n // against the freshly built map without a second (memory-heavy) build.\n let builtGraph: VgGraph | null = null;\n if (wantGraph) {\n scanOpts.postScan = async (report) => {\n const result = await buildGraph({\n root: rootDir,\n exclude: opts.exclude,\n onParseProgress: (done, total) => report(done, total, 'parsing'),\n });\n builtGraph = result.graph;\n writeArtifacts(result.graph, { root: rootDir });\n // Freshness snapshot → lets `vg serve`/`vg ask` auto-refresh this map\n // when the working tree drifts (see engine/freshness.ts).\n writeSnapshot(rootDir, result.graph.provenance.corpusHash, result.fileStats, {\n exclude: opts.exclude,\n });\n const { counts } = result.graph.meta;\n return `${counts.nodes.toLocaleString()} nodes · ${counts.edges.toLocaleString()} edges`;\n };\n }\n\n // Open base scan. The optional advanced-analysis hook is a no-op in this\n // open build, so the scan runs entirely on the open base engine.\n const advanced = await loadAdvancedScanHook();\n const artifact = await runCoreScan(rootDir, scanOpts, advanced);\n\n // Machine-readable drift score for the remediation agent's before/after gate\n // (no-op unless VIBGRATE_EMIT_MARKERS=1). Emitted from the freshly computed\n // local artifact, so it is available even without --push.\n emitDriftScoreLine(artifact.drift.score);\n\n // `--full` also surfaces the offline standards/policy check (otherwise only\n // reachable via `vg drift --fail-on standards`). Report-only here — it never\n // changes the exit code; use `vg drift --fail-on standards` to gate CI.\n if (opts.full) {\n reportStandards(rootDir);\n }\n\n // Check fail-on thresholds\n if (opts.failOn) {\n const hasErrors = artifact.findings.some((f: { level: string }) => f.level === 'error');\n const hasWarnings = artifact.findings.some((f: { level: string }) => f.level === 'warning');\n\n if (opts.failOn === 'error' && hasErrors) {\n console.error(chalk.red(`\\nFailing: ${artifact.findings.filter((f: { level: string }) => f.level === 'error').length} error finding(s) detected.`));\n process.exit(2);\n }\n if (opts.failOn === 'warn' && (hasErrors || hasWarnings)) {\n console.error(chalk.red(`\\nFailing: findings detected at warn level or above.`));\n process.exit(2);\n }\n }\n\n if (scanOpts.driftBudget !== undefined && artifact.drift.score > scanOpts.driftBudget) {\n console.error(chalk.red(`\\nFailing fitness function: DriftScore ${artifact.drift.score}/100 exceeds budget ${scanOpts.driftBudget}.`));\n process.exit(2);\n }\n\n if (scanOpts.driftWorseningPercent !== undefined) {\n if (artifact.delta === undefined) {\n console.error(chalk.red('\\nFailing fitness function: --drift-worsening requires --baseline to compare against previous drift.'));\n process.exit(2);\n }\n\n if (artifact.delta > 0) {\n const baselineScore = artifact.drift.score - artifact.delta;\n const denominator = Math.max(Math.abs(baselineScore), 0.0001);\n const worseningPercent = (artifact.delta / denominator) * 100;\n\n if (worseningPercent > scanOpts.driftWorseningPercent) {\n console.error(chalk.red(`\\nFailing fitness function: drift worsened by ${worseningPercent.toFixed(2)}% (threshold ${scanOpts.driftWorseningPercent}%).`));\n process.exit(2);\n }\n }\n }\n\n // Reachability hand-off (before push): post the dependency coordinates the\n // scan found in the package manifests to the symbols preflight, then query\n // the freshly built local code map for vulnerable-symbol usage and attach\n // the verdicts to the artifact. Coordinates only go up — never source.\n // Strictly best-effort: any failure leaves reachability absent (Unknown\n // server-side); it never delays exit codes or blocks the push.\n if (willPush && hasDsn && builtGraph) {\n await attachReachability(artifact, rootDir, scanOpts, builtGraph);\n }\n\n if (willPush) {\n await autoPush(artifact, rootDir, scanOpts);\n }\n\n // On first run with no cloud connection and text output, prompt the user\n // to wire Vibgrate AI Context into their AI assistant.\n const showAiPrompt =\n scanOpts.format === 'text' &&\n !opts.quiet &&\n !hasDsn &&\n !opts.offline &&\n !noLocalArtifacts &&\n !opts.maxPrivacy &&\n isFirstRun;\n\n if (showAiPrompt) {\n const detectedAssistant = await detectAiAssistant(rootDir);\n printAiContextPrompt(detectedAssistant);\n }\n });\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Is a prior `vg` scan artifact still up to date with the working tree?\n *\n * `vg fix` reads dependency drift from `.vibgrate/scan_result.json`. If the user\n * edited a dependency manifest — or a lockfile moved because they ran an install\n * or a previous `vg fix` — since that scan, the artifact describes a repository\n * that no longer exists, and the upgrade plan would be built against stale\n * versions (GUARDRAILS §1.4 — output integrity). So before planning, we check\n * whether any dependency manifest or lockfile is *newer* than the artifact and,\n * if so, re-scan.\n *\n * The signal is deliberately scoped to dependency manifests + lockfiles (not the\n * whole source tree): those are the only inputs that change what `vg fix`\n * analyses, and keying on them makes the check cheap and, crucially, loop-free —\n * a re-scan rewrites the artifact, bumping its mtime past every manifest, so the\n * next `vg fix` sees a fresh scan rather than re-scanning forever.\n *\n * Fail-open everywhere: a stat/read error reports \"fresh\". Freshness is an\n * optimisation, not a gate — a transient filesystem hiccup must never wedge\n * `vg fix` into a spurious re-scan (or a crash).\n */\n\n/** Dependency manifests + lockfiles whose modification invalidates a prior scan. */\nconst WATCHED_FILES = new Set([\n // npm\n 'package.json',\n 'package-lock.json',\n 'npm-shrinkwrap.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'bun.lockb',\n // pypi\n 'requirements.txt',\n 'pyproject.toml',\n 'poetry.lock',\n 'Pipfile',\n 'Pipfile.lock',\n 'uv.lock',\n // go\n 'go.mod',\n 'go.sum',\n // rust\n 'Cargo.toml',\n 'Cargo.lock',\n // ruby\n 'Gemfile',\n 'Gemfile.lock',\n // php\n 'composer.json',\n 'composer.lock',\n // swift\n 'Package.swift',\n 'Package.resolved',\n // dart\n 'pubspec.yaml',\n 'pubspec.lock',\n // java\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'gradle.lockfile',\n // dotnet\n 'packages.lock.json',\n]);\n\n/** .NET project files carry their dependency versions inline (`<PackageReference>`). */\nconst WATCHED_EXT = /\\.(cs|fs)proj$/i;\n\n/**\n * Directories never worth descending into when hunting for manifests. Mirrors\n * `engine/drift.ts` `findManifests` so both agree on what counts as project\n * source rather than a build/vendor/dependency directory.\n */\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.vibgrate',\n 'vendor',\n '.venv',\n 'venv',\n 'env',\n '__pycache__',\n 'target',\n '.next',\n '.nuxt',\n 'coverage',\n '.cache',\n]);\n\nexport interface StalenessResult {\n /** True when a manifest/lockfile is newer than the scan artifact. */\n stale: boolean;\n /**\n * The repo-relative path of the newest changed manifest, for an actionable\n * \"re-scanning because X changed\" message. Undefined when not stale.\n */\n newestChanged?: string;\n}\n\n/**\n * Decide whether `artifactPath` is out of date with the dependency manifests and\n * lockfiles under `rootDir`. See the module comment for the rationale and the\n * fail-open contract.\n */\nexport function scanStaleness(rootDir: string, artifactPath: string): StalenessResult {\n let ref: number;\n try {\n ref = fs.statSync(artifactPath).mtimeMs;\n } catch {\n // No artifact to compare against — the caller handles \"missing\" on its own.\n return { stale: false };\n }\n\n let newest = -Infinity;\n let newestChanged: string | undefined;\n\n // Bounded walk (depth + entry cap), matching engine/drift.ts findManifests, so\n // a pathological tree can never make freshness the slow part of `vg fix`.\n const MAX_ENTRIES = 20000;\n let scanned = 0;\n const walk = (dir: string, depth: number): void => {\n if (depth > 8 || scanned > MAX_ENTRIES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n scanned++;\n if (scanned > MAX_ENTRIES) break;\n if (e.isDirectory()) {\n if (!SKIP_DIRS.has(e.name) && !e.name.startsWith('.')) walk(path.join(dir, e.name), depth + 1);\n continue;\n }\n if (!WATCHED_FILES.has(e.name) && !WATCHED_EXT.test(e.name)) continue;\n const abs = path.join(dir, e.name);\n let mtimeMs: number;\n try {\n mtimeMs = fs.statSync(abs).mtimeMs;\n } catch {\n continue;\n }\n if (mtimeMs > newest) {\n newest = mtimeMs;\n newestChanged = path.relative(rootDir, abs) || e.name;\n }\n }\n };\n walk(rootDir, 0);\n\n return newest > ref ? { stale: true, newestChanged } : { stale: false };\n}\n\n/** Convenience predicate over {@link scanStaleness}. */\nexport function isScanStale(rootDir: string, artifactPath: string): boolean {\n return scanStaleness(rootDir, artifactPath).stale;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * \"Contract\" extraction for `vg fix`: the named symbols the source imports from\n * a package (its default, namespace, named exports, and destructured requires).\n *\n * These are the API surfaces an upgrade must preserve, so the report can point a\n * developer (or a breaking-change analysis) at exactly what to re-verify against\n * the new version. The parser is pure and exported for tests; {@link collectContracts}\n * is a bounded, deterministic walk of the source tree.\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;\n/** Cap on the distinct contract symbols reported per package (keeps output bounded). */\nexport const MAX_CONTRACTS = 40;\n\nconst SOURCE_EXT: Record<'npm' | 'pypi', 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/** Parse the specifiers of one ESM/CJS import clause (`Default, { A, B as C }` / `* as NS`). */\nfunction parseJsClause(clause: string, out: Set<string>): void {\n const trimmed = clause.trim();\n if (!trimmed) return;\n // Namespace import: `* as NS`\n if (/^\\*\\s+as\\s+\\w+/.test(trimmed)) {\n out.add('* (namespace)');\n return;\n }\n // Named block `{ ... }`, with an optional leading default identifier.\n const braceMatch = /\\{([^}]*)\\}/.exec(trimmed);\n const beforeBrace = braceMatch ? trimmed.slice(0, braceMatch.index) : trimmed;\n const defaultId = beforeBrace.replace(/,/g, '').trim();\n if (defaultId && /^\\w+$/.test(defaultId)) out.add('default');\n if (braceMatch) {\n for (const raw of braceMatch[1].split(',')) {\n const name = raw.trim().split(/\\s+as\\s+/)[0]?.trim();\n if (name && /^[\\w$]+$/.test(name)) out.add(name);\n }\n }\n}\n\n/** Extract the imported contract symbols for `pkg` from a single file's `content`. */\nexport function extractContracts(content: string, pkg: string, ecosystem: 'npm' | 'pypi' | 'unknown'): string[] {\n const out = new Set<string>();\n const e = escapeRegExp(pkg);\n if (ecosystem === 'npm') {\n const importRe = new RegExp(`import\\\\s+([^;'\"\\\\n]*?)\\\\s+from\\\\s+['\"]${e}(?:/[^'\"]*)?['\"]`, 'g');\n let m: RegExpExecArray | null;\n while ((m = importRe.exec(content))) parseJsClause(m[1], out);\n const requireDestructureRe = new RegExp(`\\\\{([^}]*)\\\\}\\\\s*=\\\\s*require\\\\(\\\\s*['\"]${e}(?:/[^'\"]*)?['\"]\\\\s*\\\\)`, 'g');\n while ((m = requireDestructureRe.exec(content))) {\n for (const raw of m[1].split(',')) {\n const name = raw.trim().split(':')[0]?.trim();\n if (name && /^[\\w$]+$/.test(name)) out.add(name);\n }\n }\n } else if (ecosystem === 'pypi') {\n const fromRe = new RegExp(`^\\\\s*from\\\\s+${e}(?:\\\\.[\\\\w.]+)?\\\\s+import\\\\s+(.+)$`, 'gm');\n let m: RegExpExecArray | null;\n while ((m = fromRe.exec(content))) {\n const names = m[1].replace(/[()]/g, '').split(',');\n for (const raw of names) {\n const name = raw.trim().split(/\\s+as\\s+/)[0]?.trim();\n if (name === '*') out.add('* (module)');\n else if (name && /^[\\w.]+$/.test(name)) out.add(name);\n }\n }\n const importRe = new RegExp(`^\\\\s*import\\\\s+${e}\\\\b`, 'gm');\n if (importRe.test(content)) out.add(`${pkg} (module)`);\n }\n return [...out].sort();\n}\n\n/**\n * Walk the source tree (bounded) collecting the distinct contract symbols used\n * from `pkg`. Deterministic: files are visited in sorted order and the result is\n * sorted and capped at {@link MAX_CONTRACTS}.\n */\nexport function collectContracts(root: string, pkg: string, ecosystem: 'npm' | 'pypi' | 'unknown'): string[] {\n if (ecosystem === 'unknown') return [];\n const exts = SOURCE_EXT[ecosystem];\n if (!exts) return [];\n const found = new Set<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 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 if (fs.statSync(full).size > MAX_FILE_BYTES) continue;\n content = fs.readFileSync(full, 'utf8');\n } catch {\n continue;\n }\n for (const sym of extractContracts(content, pkg, ecosystem)) found.add(sym);\n }\n }\n };\n walk(root, 0);\n return [...found].sort().slice(0, MAX_CONTRACTS);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { extractContracts, MAX_CONTRACTS } from './contracts.js';\n\n/**\n * A single bounded pass over the source tree that, for every candidate package\n * at once, counts import sites and collects the contract symbols in use. Doing\n * this in one walk (rather than one walk per package) keeps `vg fix` fast on\n * repos with many dependencies. Deterministic: sorted traversal, sorted output.\n *\n * This is pure input-gathering the CLI must do locally — it reads the user's own\n * source, which never leaves the machine. The counts and contracts are shipped\n * to the hosted planner; the risk classification they feed is computed there.\n */\n\nexport type SourceEcosystem = 'npm' | 'pypi' | 'unknown';\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;\n\nconst EXT_ECOSYSTEM: Record<string, SourceEcosystem> = {\n '.ts': 'npm', '.tsx': 'npm', '.js': 'npm', '.jsx': 'npm', '.mjs': 'npm', '.cjs': 'npm',\n '.mts': 'npm', '.cts': 'npm', '.vue': 'npm', '.svelte': 'npm',\n '.py': 'pypi',\n};\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction importPattern(ecosystem: 'npm' | 'pypi', pkg: string): RegExp {\n const e = escapeRegExp(pkg);\n if (ecosystem === 'npm') {\n return new RegExp(`(?:from\\\\s+|require\\\\(\\\\s*|import\\\\(\\\\s*)['\"]${e}(?:/[^'\"]*)?['\"]`, 'g');\n }\n return new RegExp(`^\\\\s*(?:import\\\\s+${e}(?:[.\\\\s]|$)|from\\\\s+${e}(?:[.\\\\s]))`, 'gm');\n}\n\nexport interface PackageUsage {\n importSites: number;\n filesTouched: number;\n contracts: string[];\n}\n\ninterface Tracked {\n name: string;\n ecosystem: 'npm' | 'pypi';\n pattern: RegExp;\n importSites: number;\n filesTouched: number;\n contracts: Set<string>;\n}\n\n/**\n * Walk `root` once, returning per-package usage keyed by package name. Packages\n * with an `unknown` ecosystem are returned with empty usage (no source scanning\n * applies).\n */\nexport function analyzeTree(\n root: string,\n packages: Array<{ name: string; ecosystem: SourceEcosystem }>,\n): Map<string, PackageUsage> {\n const result = new Map<string, PackageUsage>();\n const tracked: Tracked[] = [];\n for (const p of packages) {\n if (p.ecosystem === 'npm' || p.ecosystem === 'pypi') {\n tracked.push({\n name: p.name,\n ecosystem: p.ecosystem,\n pattern: importPattern(p.ecosystem, p.name),\n importSites: 0,\n filesTouched: 0,\n contracts: new Set(),\n });\n } else {\n result.set(p.name, { importSites: 0, filesTouched: 0, contracts: [] });\n }\n }\n if (tracked.length === 0) return result;\n\n let filesSeen = 0;\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 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 continue;\n }\n const fileEco = EXT_ECOSYSTEM[path.extname(entry.name)];\n if (!fileEco || fileEco === 'unknown') continue;\n filesSeen++;\n const full = path.join(dir, entry.name);\n let content: string;\n try {\n if (fs.statSync(full).size > MAX_FILE_BYTES) continue;\n content = fs.readFileSync(full, 'utf8');\n } catch {\n continue;\n }\n for (const t of tracked) {\n if (t.ecosystem !== fileEco) continue;\n t.pattern.lastIndex = 0;\n const matches = content.match(t.pattern);\n if (matches && matches.length) {\n t.importSites += matches.length;\n t.filesTouched++;\n if (t.contracts.size < MAX_CONTRACTS) {\n for (const sym of extractContracts(content, t.name, t.ecosystem)) t.contracts.add(sym);\n }\n }\n }\n }\n };\n walk(root, 0);\n\n for (const t of tracked) {\n result.set(t.name, {\n importSites: t.importSites,\n filesTouched: t.filesTouched,\n contracts: [...t.contracts].sort().slice(0, MAX_CONTRACTS),\n });\n }\n return result;\n}\n","/**\n * Transport for the hosted upgrade planner (`POST /v1/fix/plan`).\n *\n * `vg fix` is a thin, DSN-authenticated client: it sends drifted-dependency\n * candidates (versions + the usage/contract signals measured from local source)\n * and renders the plan the server returns. All planning intelligence lives\n * server-side. Mirrors the residency-aware retry of the scan upload transport —\n * a workspace is pinned to one region, so a 409 `REGION_MISMATCH` transparently\n * retries against the named regional host.\n */\n\nimport { ingestHostForRegionId } from '../regions.js';\nimport type { FixPlanRequest, FixPlanResponse } from '../planning/types.js';\n\nexport interface FixPlanInput {\n scheme: string;\n host: string;\n keyId: string;\n secret: string;\n request: FixPlanRequest;\n timestamp: string;\n}\n\nexport interface FixPlanResult {\n response: Response;\n /** The host the final request was sent to — differs from input.host on a region redirect. */\n host: string;\n}\n\nfunction postOnce(input: FixPlanInput, host: string): Promise<Response> {\n return fetch(`${input.scheme}://${host}/v1/fix/plan`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Vibgrate-Timestamp': input.timestamp,\n Authorization: `VibgrateDSN ${input.keyId}:${input.secret}`,\n Connection: 'close',\n },\n body: JSON.stringify(input.request),\n });\n}\n\nasync function regionRedirectHost(response: Response): Promise<string | undefined> {\n try {\n const payload = (await response.clone().json()) as { code?: string; region?: string };\n if (payload?.code !== 'REGION_MISMATCH' || !payload.region) return undefined;\n return ingestHostForRegionId(payload.region);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Request an upgrade plan from the hosted planner, transparently retrying\n * against the workspace's pinned region on a residency mismatch.\n */\nexport async function requestFixPlan(input: FixPlanInput): Promise<FixPlanResult> {\n let host = input.host;\n let response = await postOnce(input, host);\n\n if (response.status === 409) {\n const target = await regionRedirectHost(response);\n if (target && target !== host) {\n host = target;\n response = await postOnce(input, host);\n }\n }\n return { response, host };\n}\n\n/** Parse a fix-plan response body, tolerating an error envelope. */\nexport async function parseFixPlanResponse(response: Response): Promise<FixPlanResponse> {\n return (await response.json()) as FixPlanResponse;\n}\n","import chalk from 'chalk';\nimport type { VulnSeverity } from '../../core-open/index.js';\nimport type { FixPlanResponse, UpgradePlan, VulnDelta } from './types.js';\n\n/**\n * Human-facing renderers for the planner's response. `--json` bypasses these\n * entirely (the {@link FixPlanResponse} is emitted verbatim); these are for\n * `text` and `md`.\n */\n\nconst SEVERITY_ORDER: VulnSeverity[] = ['critical', 'high', 'moderate', 'low', 'unknown'];\n\nfunction deltaSummary(delta: VulnDelta): string {\n if (delta.total === 0) return 'none';\n const parts = SEVERITY_ORDER.filter((s) => delta.bySeverity[s]).map((s) => `${delta.bySeverity[s]} ${s}`);\n return parts.length ? parts.join(', ') : `${delta.total}`;\n}\n\nfunction riskLabel(score: number): string {\n if (score <= 15) return chalk.green(`${score}/100 low`);\n if (score <= 40) return chalk.yellow(`${score}/100 moderate`);\n return chalk.red(`${score}/100 high`);\n}\n\nfunction planBlock(plan: UpgradePlan, recommended: boolean): string {\n const lines: string[] = [];\n const marker = recommended ? chalk.green('● recommended') : chalk.dim('○');\n lines.push(`${marker} ${chalk.bold(plan.label)} — ${chalk.dim(plan.description)}`);\n const drift =\n typeof plan.expectedDriftScore === 'number' && typeof plan.driftDelta === 'number'\n ? ` · DriftScore →${plan.expectedDriftScore} (${plan.driftDelta <= 0 ? '' : '+'}${plan.driftDelta})`\n : '';\n lines.push(\n ` risk ${riskLabel(plan.riskScore)} · ${plan.upgrades.length} upgrade(s) · ` +\n `fixes ${deltaSummary(plan.fixes)}${drift}`,\n );\n if (plan.introduces.total) {\n lines.push(chalk.red(` ⚠ introduces ${deltaSummary(plan.introduces)} advisory(ies) in target versions`));\n }\n const shown = plan.upgrades.slice(0, 12);\n for (const u of shown) {\n const codemod = u.playbook?.codemod ? chalk.magenta(` [codemod: ${u.playbook.codemod}]`) : '';\n lines.push(` ${chalk.cyan(u.package)} ${chalk.dim(`${u.from ?? '?'} → ${u.to ?? '?'}`)} ${chalk.dim(u.reason)}${codemod}`);\n }\n if (plan.upgrades.length > shown.length) {\n lines.push(chalk.dim(` … and ${plan.upgrades.length - shown.length} more`));\n }\n return lines.join('\\n');\n}\n\nfunction dataNote(report: FixPlanResponse): string | null {\n if (report.vulnerabilityData === 'unavailable') {\n return chalk.dim('Advisory data was unavailable — vulnerability impact is not shown.');\n }\n if (report.vulnerabilityData === 'partial') {\n return chalk.dim('Advisory data was partial — some ecosystems were not checked.');\n }\n return null;\n}\n\nexport function renderText(report: FixPlanResponse): string {\n const out: string[] = [];\n out.push(chalk.bold('Vibgrate fix — upgrade plan'));\n out.push(\n chalk.dim(\n `${report.totalCandidates} drifted dependency(ies) analysed · ` +\n `${report.deepAnalysis ? 'deep (major) analysis on' : 'preflight only'}`,\n ),\n );\n const note = dataNote(report);\n if (note) out.push(note);\n if (report.exploitability && report.exploitability.kevPackages > 0) {\n const epss = report.exploitability.maxEpss != null ? `, peak EPSS ${(report.exploitability.maxEpss * 100).toFixed(0)}%` : '';\n out.push(chalk.red(`⚠ ${report.exploitability.kevPackages} package(s) carry a KNOWN-EXPLOITED (KEV) advisory${epss} — prioritise these.`));\n }\n out.push('');\n const visiblePlans = report.plans.filter((plan) => plan.upgrades.length > 0);\n if (visiblePlans.length === 0) {\n out.push(chalk.green('✔ Nothing to upgrade — every tracked dependency is current.'));\n out.push('');\n } else {\n for (const plan of visiblePlans) {\n out.push(planBlock(plan, plan.tier === report.recommended));\n out.push('');\n }\n }\n out.push(chalk.bold('Recommendation'));\n out.push(` ${chalk.green(report.plans.find((p) => p.tier === report.recommended)?.label ?? report.recommended)} — ${report.rationale}`);\n if (report.unresolved.total) {\n out.push('');\n out.push(chalk.red(`⚠ ${deltaSummary(report.unresolved)} advisory(ies) have no upgrade path in any plan.`));\n }\n return out.join('\\n');\n}\n\nexport function renderMarkdown(report: FixPlanResponse): string {\n const out: string[] = [];\n out.push('# Vibgrate fix — upgrade plan');\n out.push('');\n out.push(\n `${report.totalCandidates} drifted dependency(ies) analysed · ${report.deepAnalysis ? 'deep (major) analysis on' : 'preflight only'}.`,\n );\n const note = dataNote(report);\n if (note) {\n out.push('');\n out.push(`_${report.vulnerabilityData === 'unavailable' ? 'Advisory data was unavailable — vulnerability impact is not shown.' : 'Advisory data was partial — some ecosystems were not checked.'}_`);\n }\n out.push('');\n const visiblePlans = report.plans.filter((plan) => plan.upgrades.length > 0);\n if (visiblePlans.length === 0) {\n out.push('✔ Nothing to upgrade — every tracked dependency is current.');\n out.push('');\n }\n for (const plan of visiblePlans) {\n const rec = plan.tier === report.recommended ? ' ✅ **recommended**' : '';\n out.push(`## ${plan.label}${rec}`);\n out.push('');\n out.push(`_${plan.description}_`);\n out.push('');\n out.push(`- Risk: **${plan.riskScore}/100** (${plan.confidence} confidence)`);\n out.push(`- Upgrades: **${plan.upgrades.length}**`);\n out.push(`- Fixes advisories: ${deltaSummary(plan.fixes)}`);\n if (plan.introduces.total) {\n out.push(`- ⚠ Introduces advisories in target versions: ${deltaSummary(plan.introduces)}`);\n }\n out.push('');\n out.push('| Package | From | To | Kind | Reason |');\n out.push('|---|---|---|---|---|');\n for (const u of plan.upgrades) {\n out.push(`| \\`${u.package}\\` | ${u.from ?? '?'} | ${u.to ?? '?'} | ${u.kind} | ${u.reason} |`);\n }\n out.push('');\n }\n out.push('## Recommendation');\n out.push('');\n const recLabel = report.plans.find((p) => p.tier === report.recommended)?.label ?? report.recommended;\n out.push(`**${recLabel}** — ${report.rationale}`);\n if (report.unresolved.total) {\n out.push('');\n out.push(`> ⚠ ${deltaSummary(report.unresolved)} advisory(ies) have no upgrade path in any plan.`);\n }\n return out.join('\\n');\n}\n","import type { PlanTier, UpgradePlan } from './types.js';\n\n/**\n * Collapse duplicate plans onto the lowest-risk tier.\n *\n * The hosted planner always returns all three tiers, and in small estates they\n * frequently converge on the identical upgrade set (e.g. one drifted package\n * with only a minor update available). Presenting three indistinguishable\n * \"choices\" is noise, so a plan whose upgrade set is identical to a lower-risk\n * plan's is dropped and its tier is aliased to that surviving plan.\n */\n\n/** Tier order from lowest to highest risk — the survivor of a duplicate group is the earliest. */\nconst TIER_ORDER: PlanTier[] = ['safe', 'balanced', 'aggressive'];\n\nexport interface DedupedPlans {\n /** Surviving plans, in the planner's original order. */\n plans: UpgradePlan[];\n /** Every original tier → the tier of the surviving plan with the identical upgrade set. */\n canonicalTier: Map<PlanTier, PlanTier>;\n}\n\n/** Order-insensitive identity of a plan's upgrade set. */\nfunction upgradeSetKey(plan: UpgradePlan): string {\n return plan.upgrades\n .map((u) => `${u.ecosystem}\\0${u.package}\\0${u.from ?? ''}\\0${u.to ?? ''}`)\n .sort()\n .join('\\n');\n}\n\nexport function dedupePlans(plans: UpgradePlan[]): DedupedPlans {\n const byTier = (plan: UpgradePlan): number => {\n const i = TIER_ORDER.indexOf(plan.tier);\n return i === -1 ? TIER_ORDER.length : i;\n };\n const ordered = [...plans].sort((a, b) => byTier(a) - byTier(b));\n\n const survivorByKey = new Map<string, UpgradePlan>();\n const canonicalTier = new Map<PlanTier, PlanTier>();\n for (const plan of ordered) {\n const key = upgradeSetKey(plan);\n const survivor = survivorByKey.get(key) ?? plan;\n if (!survivorByKey.has(key)) survivorByKey.set(key, plan);\n canonicalTier.set(plan.tier, survivor.tier);\n }\n\n const survivors = new Set(survivorByKey.values());\n return { plans: plans.filter((p) => survivors.has(p)), canonicalTier };\n}\n","import { computeDriftScore } from '../../core-open/index.js';\nimport type { ScanArtifact, ProjectScan } from '../../core-open/index.js';\n\n/**\n * Estimate the DriftScore after applying a plan's upgrades.\n *\n * The DriftScore is a pure function of the scan's per-project state\n * (`computeDriftScore`), so we project the post-upgrade score by mutating a copy\n * of the scan to reflect the plan landing, then recomputing:\n *\n * - each upgraded dependency row lands at latest: `current`, zero majors\n * behind, and zero calendar-time drift (libyears/ageDays) — because the\n * driftscore-3.0 dependency pillar reads the per-dependency rows directly\n * (time-primary), not the age buckets;\n * - the age buckets are updated in lockstep for any legacy/aggregate consumer;\n * - each upgraded framework's `majorsBehind` is zeroed.\n *\n * It is a principled estimate, not a re-scan, but under v3 a fully-upgraded set\n * projects to 0 dependency drift (current version AND no time distance).\n * Deterministic.\n */\n\n/** Recompute the DriftScore assuming every package named in `upgraded` lands at latest. */\nexport function estimateDriftScore(artifact: ScanArtifact, upgraded: Set<string>): number {\n const projects: ProjectScan[] = JSON.parse(JSON.stringify(artifact.projects ?? []));\n for (const p of projects) {\n const buckets = p.dependencyAgeBuckets;\n for (const dep of p.dependencies ?? []) {\n if (!upgraded.has(dep.package)) continue;\n const mb = dep.majorsBehind ?? 0;\n // v3: project the upgrade onto the row — landed at latest ⇒ current, no\n // version lag, no calendar-time drift. Without this the time term (T)\n // would keep an upgraded dependency scoring > 0.\n dep.majorsBehind = 0;\n dep.drift = 'current';\n if (dep.libyears != null) dep.libyears = 0;\n if (dep.ageDays != null) dep.ageDays = 0;\n if (dep.latestStable) dep.resolvedVersion = dep.latestStable;\n if (mb >= 2 && buckets.twoPlusBehind > 0) {\n buckets.twoPlusBehind--;\n buckets.current++;\n } else if (mb === 1 && buckets.oneBehind > 0) {\n buckets.oneBehind--;\n buckets.current++;\n }\n }\n for (const fw of p.frameworks ?? []) {\n if (upgraded.has(fw.name)) fw.majorsBehind = 0;\n }\n }\n return computeDriftScore(projects).score;\n}\n","import { spawnSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport type { PlannedUpgrade } from './types.js';\n\n/**\n * Applies a chosen plan by running each ecosystem's native package manager to\n * pin the target version — which edits the manifest AND installs in one step.\n * `--dry-run` prints the commands without executing. Ecosystems without a clean\n * one-shot pin command are reported as \"manual\", never silently skipped.\n *\n * In a monorepo, a dependency lives in a specific workspace package's manifest,\n * not necessarily the repo root. Running the pin command at the root would edit\n * the wrong `package.json` (and pnpm refuses a bare `pnpm add` at a workspace\n * root: ERR_PNPM_ADDING_TO_ROOT). So callers resolve each upgrade to the\n * workspace package(s) that own it and we run the command in that package's\n * directory. Only when a dependency is declared in the root manifest of a pnpm\n * workspace do we add `-w`.\n */\n\n/** The npm-family package manager detected for a project. */\nexport type NpmPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport interface UpgradeCommand {\n cmd: string;\n args: string[];\n}\n\n/**\n * A manifest that owns an upgrade, as a directory relative to the repo root\n * (`'.'` or `''` = the root manifest).\n */\nexport interface WorkspaceTarget {\n /** Directory of the owning manifest, relative to the repo root. */\n dir: string;\n /**\n * True only when `dir` is the root of a pnpm workspace — the one case where\n * `pnpm add` needs `-w`. Workspace *members* never need it.\n */\n isWorkspaceRoot: boolean;\n}\n\n/** A `dir` referring to the repo root rather than a nested workspace package. */\nfunction isRootDir(dir: string): boolean {\n return dir === '' || dir === '.';\n}\n\nexport interface PmCommandOptions {\n /** When true and the package manager is pnpm, add the `-w` workspace-root flag. */\n workspaceRoot?: boolean;\n}\n\n/**\n * Build the native command that pins `pkg` to `version` for an ecosystem. Pure\n * and exported for tests. Returns null for ecosystems with no clean one-shot pin\n * (java, hex) — those are reported as manual.\n */\nexport function pmCommandFor(\n ecosystem: string,\n pkg: string,\n version: string,\n pm: NpmPackageManager = 'npm',\n opts: PmCommandOptions = {},\n): UpgradeCommand | null {\n // Only pnpm needs an explicit flag to write the workspace-root manifest.\n const ws = opts.workspaceRoot && pm === 'pnpm' ? ['-w'] : [];\n switch (ecosystem) {\n case 'npm':\n if (pm === 'pnpm') return { cmd: 'pnpm', args: ['add', ...ws, `${pkg}@${version}`] };\n if (pm === 'yarn') return { cmd: 'yarn', args: ['add', `${pkg}@${version}`] };\n if (pm === 'bun') return { cmd: 'bun', args: ['add', `${pkg}@${version}`] };\n return { cmd: 'npm', args: ['install', `${pkg}@${version}`] };\n case 'pypi':\n return { cmd: 'pip', args: ['install', `${pkg}==${version}`] };\n case 'cargo':\n return { cmd: 'cargo', args: ['add', `${pkg}@${version}`] };\n case 'go':\n return { cmd: 'go', args: ['get', `${pkg}@${version.startsWith('v') ? version : `v${version}`}`] };\n case 'composer':\n return { cmd: 'composer', args: ['require', `${pkg}:${version}`] };\n case 'nuget':\n return { cmd: 'dotnet', args: ['add', 'package', pkg, '--version', version] };\n case 'dotnet':\n return { cmd: 'dotnet', args: ['add', 'package', pkg, '--version', version] };\n case 'dart':\n case 'pub':\n return { cmd: 'dart', args: ['pub', 'add', `${pkg}:${version}`] };\n case 'rubygems':\n case 'ruby':\n // Bundler has no clean per-gem pin via CLI; update within the Gemfile's\n // constraint (best-effort). A hard pin needs a manual Gemfile edit.\n return { cmd: 'bundle', args: ['update', pkg] };\n default:\n return null; // java (maven/gradle), hex, swift → manual\n }\n}\n\nexport interface AppliedUpgrade {\n package: string;\n to: string | null;\n status: 'applied' | 'failed' | 'manual' | 'skipped';\n detail?: string;\n}\n\nexport interface RunResult {\n ok: boolean;\n detail?: string;\n /** The package-manager binary was not found on PATH (report as manual, not failed). */\n toolMissing?: boolean;\n}\n\nexport interface ApplyOptions {\n dryRun?: boolean;\n /** npm-family package manager for npm upgrades (from the scan). */\n packageManager?: NpmPackageManager;\n /**\n * Resolve which workspace manifest(s) own an upgrade, so the pin command runs\n * in the right directory instead of blindly at the repo root. Returns the\n * owning targets; an empty array falls back to the root manifest. Defaults to\n * a single root target (repo-root install, no `-w`).\n */\n resolveTargets?: (upgrade: PlannedUpgrade) => WorkspaceTarget[];\n /** Runner override for tests. */\n run?: (cmd: UpgradeCommand, cwd: string) => RunResult;\n}\n\nfunction defaultRun(cmd: UpgradeCommand, cwd: string): RunResult {\n const res = spawnSync(cmd.cmd, cmd.args, { cwd, stdio: 'inherit', shell: false });\n if (res.error) {\n // ENOENT = the toolchain (cargo, pip, go, …) isn't installed here. That's an\n // environment gap the user must resolve, not an upgrade that \"failed\".\n if ((res.error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { ok: false, toolMissing: true, detail: `${cmd.cmd} is not installed or not on PATH` };\n }\n return { ok: false, detail: res.error.message };\n }\n if (res.status !== 0) return { ok: false, detail: `exit ${res.status ?? 'signal'}` };\n return { ok: true };\n}\n\nconst ROOT_TARGET: WorkspaceTarget[] = [{ dir: '.', isWorkspaceRoot: false }];\n\n/** Apply a plan's upgrades. Returns per-package outcomes (nothing is silently dropped). */\nexport function applyPlan(rootDir: string, upgrades: PlannedUpgrade[], opts: ApplyOptions = {}): AppliedUpgrade[] {\n const run = opts.run ?? defaultRun;\n const resolveTargets = opts.resolveTargets ?? (() => ROOT_TARGET);\n const results: AppliedUpgrade[] = [];\n for (const u of upgrades) {\n if (!u.to) {\n results.push({ package: u.package, to: u.to, status: 'skipped', detail: 'no target version' });\n continue;\n }\n // Probe ecosystem support once (it never varies by target directory).\n if (!pmCommandFor(u.ecosystem, u.package, u.to, opts.packageManager)) {\n results.push({ package: u.package, to: u.to, status: 'manual', detail: `${u.ecosystem}: update the manifest to ${u.to} manually` });\n continue;\n }\n const targets = resolveTargets(u);\n const effective = targets.length > 0 ? targets : ROOT_TARGET;\n // Only tag a directory when disambiguation matters (a nested package, or\n // more than one owner) so single-root results read cleanly.\n const labelled = effective.length > 1;\n const where = (t: WorkspaceTarget) => (labelled || !isRootDir(t.dir) ? `${t.dir || '.'}: ` : '');\n\n if (opts.dryRun) {\n const detail = effective\n .map((t) => {\n const c = pmCommandFor(u.ecosystem, u.package, u.to as string, opts.packageManager, { workspaceRoot: t.isWorkspaceRoot });\n return `would run: ${c!.cmd} ${c!.args.join(' ')}${labelled || !isRootDir(t.dir) ? ` (in ${t.dir || '.'})` : ''}`;\n })\n .join('; ');\n results.push({ package: u.package, to: u.to, status: 'skipped', detail });\n continue;\n }\n const outcomes = effective.map((t) => {\n const c = pmCommandFor(u.ecosystem, u.package, u.to as string, opts.packageManager, { workspaceRoot: t.isWorkspaceRoot });\n return { t, res: run(c!, path.join(rootDir, t.dir)) };\n });\n const failures = outcomes.filter((o) => !o.res.ok);\n if (failures.length === 0) {\n results.push({\n package: u.package,\n to: u.to,\n status: 'applied',\n detail: labelled ? `applied in ${effective.map((t) => t.dir || '.').join(', ')}` : undefined,\n });\n } else if (failures.every((o) => o.res.toolMissing)) {\n // The toolchain (cargo, pip, go, …) isn't installed here — an environment\n // gap for the user to resolve, not an upgrade that \"failed\". Report manual.\n results.push({\n package: u.package,\n to: u.to,\n status: 'manual',\n detail: failures.map((o) => `${where(o.t)}${o.res.detail ?? 'tool missing'} — upgrade manually`).join('; '),\n });\n } else {\n results.push({\n package: u.package,\n to: u.to,\n status: 'failed',\n detail: failures.map((o) => `${where(o.t)}${o.res.detail ?? 'failed'}`).join('; '),\n });\n }\n }\n return results;\n}\n","import * 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","import { execSync } from 'node:child_process';\nimport * as fsSync from 'node:fs';\nimport * as os from 'node:os';\nimport * as readline from 'node:readline';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from '../version.js';\nimport { fetchLatestVersion } from '../utils/update-check.js';\nimport { pathExists } from '../utils/fs.js';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nconst PACKAGE_NAME = '@vibgrate/cli';\n\n/**\n * Check if the CLI is running from a global install by examining where it's\n * running from. Returns the package manager if global, null if local.\n *\n * Global bins are usually symlinks (`/usr/local/bin/vg` →\n * `../lib/node_modules/@vibgrate/cli/…`), so the launch path must be\n * realpath-resolved before inspecting it — the symlink itself contains no\n * `node_modules` segment and would defeat the check.\n */\nexport function detectGlobalInstall(\n execPath: string = process.argv[1] || '',\n cwd: string = process.cwd(),\n): PackageManager | null {\n if (!execPath) return null;\n let resolved = execPath;\n try {\n resolved = fsSync.realpathSync(execPath);\n } catch {\n // Path may not exist (tests, unusual launchers) — inspect it as given.\n }\n const p = resolved.replace(/\\\\/g, '/');\n if (!p.includes('/node_modules/')) return null;\n // One-off runner caches (npx / pnpm dlx / bunx) live outside the project but\n // are not installs — nothing to update there.\n if (p.includes('/_npx/') || p.includes('/dlx-') || p.includes('/.bunx/')) return null;\n // Inside the current project's own node_modules → a local install.\n const workdir = cwd.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (workdir && (p === workdir || p.startsWith(workdir + '/'))) return null;\n if (p.includes('/pnpm/')) return 'pnpm';\n if (p.includes('/yarn/') || p.includes('/.yarn/')) return 'yarn';\n if (p.includes('/.bun/')) return 'bun';\n return 'npm';\n}\n\n/** Runs a shell command and returns trimmed stdout; used by the global-root probe. */\nexport type CommandRunner = (cmd: string) => string;\n\nconst defaultRunner: CommandRunner = (cmd) =>\n execSync(cmd, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 15_000 });\n\n/**\n * Check whether the package is installed globally under any known package\n * manager, even when the current process wasn't launched from that install\n * (e.g. `vg` run via a local dependency while a global copy also exists).\n * Probes each manager's global root and returns the first that contains the\n * package, or null when none does. Managers that aren't installed just fail\n * their probe and are skipped.\n */\nexport async function findGlobalInstall(\n pkg: string = PACKAGE_NAME,\n run: CommandRunner = defaultRunner,\n): Promise<PackageManager | null> {\n const tryRun = (cmd: string): string | null => {\n try {\n const out = run(cmd).trim().split('\\n')[0]?.trim();\n return out || null;\n } catch {\n return null;\n }\n };\n\n const probes: Array<{ pm: PackageManager; root: () => string | null }> = [\n { pm: 'npm', root: () => tryRun('npm root -g') },\n { pm: 'pnpm', root: () => tryRun('pnpm root -g') },\n {\n pm: 'yarn',\n root: () => {\n const dir = tryRun('yarn global dir');\n return dir ? path.join(dir, 'node_modules') : null;\n },\n },\n { pm: 'bun', root: () => path.join(os.homedir(), '.bun', 'install', 'global', 'node_modules') },\n ];\n\n for (const probe of probes) {\n const root = probe.root();\n if (root && (await pathExists(path.join(root, pkg)))) return probe.pm;\n }\n return null;\n}\n\nfunction getGlobalUpdateCommand(pm: PackageManager, pkg: string, version: string): string {\n const spec = `${pkg}@${version}`;\n switch (pm) {\n case 'pnpm':\n return `pnpm add -g ${spec}`;\n case 'yarn':\n return `yarn global add ${spec}`;\n case 'bun':\n return `bun add -g ${spec}`;\n case 'npm':\n default:\n return `npm install -g ${spec}`;\n }\n}\n\n/**\n * Detect which package manager is being used in the current project\n * by checking for lockfiles in the working directory.\n */\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await pathExists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await pathExists(path.join(cwd, 'bun.lockb'))) return 'bun';\n if (await pathExists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm'; // default\n}\n\n/**\n * Detect whether `cwd` is a monorepo/workspace root.\n *\n * pnpm refuses a plain `pnpm add` at a workspace root (ERR_PNPM_ADDING_TO_ROOT)\n * unless `-w`/`--workspace-root` is passed, because adding to the root touches the\n * root `package.json` rather than a package. A pnpm workspace is declared by a\n * `pnpm-workspace.yaml`; npm/yarn workspaces are declared by the `workspaces`\n * field in `package.json`. We treat any of these as a workspace root.\n */\nexport async function detectWorkspaceRoot(cwd: string): Promise<boolean> {\n if (await pathExists(path.join(cwd, 'pnpm-workspace.yaml'))) return true;\n try {\n const pkgPath = path.join(cwd, 'package.json');\n const raw = await (await import('node:fs/promises')).readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as { workspaces?: unknown };\n return pkg.workspaces != null;\n } catch {\n return false;\n }\n}\n\nexport interface InstallCommandOptions {\n /** When true and the package manager is pnpm, add the `-w` workspace-root flag. */\n workspaceRoot?: boolean;\n}\n\nexport function getInstallCommand(\n pm: PackageManager,\n pkg: string,\n version: string,\n isDev: boolean,\n opts: InstallCommandOptions = {},\n): string {\n const spec = `${pkg}@${version}`;\n // Only pnpm needs an explicit workspace-root flag; npm/yarn/bun add to the\n // root package.json without complaint.\n const ws = opts.workspaceRoot && pm === 'pnpm' ? ' -w' : '';\n switch (pm) {\n case 'pnpm':\n return isDev ? `pnpm add${ws} -D ${spec}` : `pnpm add${ws} ${spec}`;\n case 'yarn':\n return isDev ? `yarn add --dev ${spec}` : `yarn add ${spec}`;\n case 'bun':\n return isDev ? `bun add -d ${spec}` : `bun add ${spec}`;\n case 'npm':\n default:\n return isDev ? `npm install --save-dev ${spec}` : `npm install ${spec}`;\n }\n}\n\n/** How the package is declared in the project's package.json, if at all. */\nexport type LocalDependencyState = 'dev' | 'prod' | null;\n\n/**\n * Read how the package is declared in the project's package.json.\n * Returns null when there is no package.json or the package isn't declared.\n */\nexport async function getLocalDependencyState(\n cwd: string,\n pkg: string = PACKAGE_NAME,\n): Promise<LocalDependencyState> {\n try {\n const pkgPath = path.join(cwd, 'package.json');\n const raw = await (await import('node:fs/promises')).readFile(pkgPath, 'utf-8');\n const parsed = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (parsed.devDependencies?.[pkg]) return 'dev';\n if (parsed.dependencies?.[pkg]) return 'prod';\n } catch {\n // No package.json / unreadable — not a declared dependency.\n }\n return null;\n}\n\n/**\n * Ask the user to confirm updating at a workspace root, which needs `-w` and\n * writes to the root package.json. Returns false when not attached to a TTY so\n * the aggressive add never runs unattended (e.g. in CI) without an explicit flag.\n */\nasync function confirmWorkspaceRoot(pm: PackageManager): Promise<boolean> {\n if (!(process.stdin.isTTY && process.stdout.isTTY)) return false;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.yellow(`Update the ${pm} workspace root with -w? [y/N]: `), (ans) => {\n rl.close();\n const t = ans.trim().toLowerCase();\n resolve(t === 'y' || t === 'yes');\n });\n });\n}\n\nexport const updateCommand = new Command('update')\n .description('Update vibgrate to the latest version')\n .option('--check', 'Only check for updates, do not install')\n .option('--pm <manager>', 'Package manager to use (npm, pnpm, yarn, bun)')\n .option('--global', 'Update global installation')\n .option('-y, --yes', 'Skip confirmation prompts (e.g. installing at a workspace root)')\n .option('-w, --workspace-root', 'Allow updating the pnpm workspace root (implies --yes for that prompt)')\n .action(\n async (opts: {\n check?: boolean;\n pm?: string;\n global?: boolean;\n yes?: boolean;\n workspaceRoot?: boolean;\n }) => {\n console.log(chalk.dim(`Current version: ${VERSION}`));\n console.log(chalk.dim('Checking npm registry...'));\n\n const latest = await fetchLatestVersion();\n\n if (!latest) {\n console.error(chalk.red('Could not reach the npm registry. Check your network connection.'));\n process.exit(1);\n }\n\n const semver = await import('semver');\n if (!semver.gt(latest, VERSION)) {\n console.log(chalk.green('✔') + ` You are on the latest version (${VERSION}).`);\n return;\n }\n\n console.log(chalk.yellow(`Update available: ${VERSION} → ${latest}`));\n\n if (opts.check) {\n console.log(chalk.dim('Run \"vg update\" to install.'));\n return;\n }\n\n const cwd = process.cwd();\n\n // Decide the update target. A global copy is updated in place — the\n // project's package.json is only touched when the package is actually\n // declared there (or when there is no global install to update).\n const runtimeGlobalPm = detectGlobalInstall();\n let globalPm: PackageManager | null = runtimeGlobalPm;\n let isGlobal = Boolean(opts.global) || runtimeGlobalPm !== null;\n let localState: LocalDependencyState = null;\n\n if (!isGlobal) {\n localState = await getLocalDependencyState(cwd);\n if (localState === null) {\n // Not declared in this project. If a global install exists, update\n // that instead of adding the CLI to this project's package.json.\n globalPm = await findGlobalInstall();\n if (globalPm) {\n isGlobal = true;\n console.log(\n chalk.dim(`Found a global ${globalPm} installation of ${PACKAGE_NAME} — updating it instead of this project.`),\n );\n }\n }\n }\n\n const pm: PackageManager = (opts.pm as PackageManager) || globalPm || (await detectPackageManager(cwd));\n\n let cmd: string;\n if (isGlobal) {\n cmd = getGlobalUpdateCommand(pm, PACKAGE_NAME, latest);\n console.log(chalk.dim(`Updating global installation with ${pm}: ${cmd}`));\n } else {\n // A CLI belongs in devDependencies: install as a dev dependency unless\n // the project has explicitly declared it under `dependencies`.\n const isDev = localState !== 'prod';\n\n // pnpm refuses `pnpm add` at a workspace root without -w. Detect that up\n // front so we can offer to run the workspace-root-aware command instead of\n // failing with ERR_PNPM_ADDING_TO_ROOT.\n let workspaceRoot = false;\n if (pm === 'pnpm' && (await detectWorkspaceRoot(cwd))) {\n console.log(\n chalk.yellow('Detected a pnpm workspace root.') +\n chalk.dim(' Installing here needs the -w flag and updates the root package.json.'),\n );\n const proceed = opts.yes || opts.workspaceRoot || (await confirmWorkspaceRoot(pm));\n if (!proceed) {\n const rootCmd = getInstallCommand(pm, PACKAGE_NAME, latest, isDev, { workspaceRoot: true });\n console.log(chalk.dim(`Skipped. To update the workspace root, run: ${rootCmd}`));\n console.log(chalk.dim('or re-run \"vg update --yes\" (or --workspace-root) to let vg do it.'));\n return;\n }\n workspaceRoot = true;\n }\n\n cmd = getInstallCommand(pm, PACKAGE_NAME, latest, isDev, { workspaceRoot });\n console.log(chalk.dim(`Using ${pm}: ${cmd}`));\n }\n\n try {\n execSync(cmd, { cwd, stdio: 'inherit' });\n console.log(chalk.green('✔') + ` Updated to ${PACKAGE_NAME}@${latest}`);\n } catch {\n console.error(chalk.red(`Update failed. Run manually: ${cmd}`));\n process.exit(1);\n }\n },\n );\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n runCoreScan,\n projectTypeToVulnEcosystem,\n detectVcs,\n computeRepoFingerprint,\n resolveRepositoryName,\n parseDsn,\n type ScanOptions,\n type ScanArtifact,\n type ProjectType,\n type VulnSeverity,\n} from '../../core-open/index.js';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { scanStaleness } from '../utils/scan-freshness.js';\nimport { loadAdvancedScanHook } from '../advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { resolveDsn } from '../credentials.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { dashHostForIngestHost } from '../regions.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\nimport * as readline from 'node:readline';\nimport { analyzeTree, type SourceEcosystem } from '../planning/usage.js';\nimport { requestFixPlan, parseFixPlanResponse } from '../utils/fix-plan.js';\nimport { renderText, renderMarkdown } from '../planning/render.js';\nimport { dedupePlans } from '../planning/dedupe.js';\nimport { estimateDriftScore } from '../planning/expected-drift.js';\nimport { applyPlan, type NpmPackageManager, type WorkspaceTarget } from '../planning/apply.js';\nimport { detectWorkspaceRoot } from './update.js';\nimport type { FixCandidateInput, FixPlanRequest, FixPlanResponse, PlanTier, PlannedUpgrade, UpgradePlan } from '../planning/types.js';\n\nconst SEVERITY_RANK: Record<VulnSeverity, number> = { unknown: 0, low: 1, moderate: 2, high: 3, critical: 4 };\n\n/** Map a scanned project type to the ecosystem id sent to the planner (all ecosystems, not just npm). */\nfunction ecosystemId(type: ProjectType): string {\n return projectTypeToVulnEcosystem(type) ?? type;\n}\n\n/** Which ecosystems we can cheaply read source for, to gather usage + contracts. */\nfunction sourceEcosystem(ecosystem: string): SourceEcosystem {\n if (ecosystem === 'npm') return 'npm';\n if (ecosystem === 'pypi') return 'pypi';\n return 'unknown';\n}\n\ninterface RawCandidate {\n package: string;\n ecosystem: string;\n source: SourceEcosystem;\n from: string | null;\n to: string | null;\n majorsBehind: number | null;\n section?: string;\n}\n\n/** Collect deduped, drifted dependencies across every ecosystem in the scan artifact. */\nfunction collectCandidates(artifact: ScanArtifact): RawCandidate[] {\n const seen = new Set<string>();\n const out: RawCandidate[] = [];\n for (const project of artifact.projects ?? []) {\n const ecosystem = ecosystemId(project.type);\n for (const dep of project.dependencies ?? []) {\n const key = `${ecosystem}\\0${dep.package}`;\n if (seen.has(key)) continue;\n if (!dep.latestStable || dep.latestStable === dep.resolvedVersion) continue;\n if (dep.drift === 'current' || dep.drift === 'unknown') continue;\n seen.add(key);\n out.push({\n package: dep.package,\n ecosystem,\n source: sourceEcosystem(ecosystem),\n from: dep.resolvedVersion,\n to: dep.latestStable,\n majorsBehind: dep.majorsBehind,\n section: dep.section,\n });\n }\n }\n out.sort((a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.package.localeCompare(b.package));\n return out;\n}\n\n/**\n * Runs a drift scan for `vg fix` when no usable prior scan exists. Injectable so\n * tests can exercise the auto-scan decision without a network round-trip; the\n * default runs the real core scan WITHOUT the code map (drift is all `fix`\n * needs), writing JSON quietly to a scratch file so nothing lands on stdout.\n */\nexport type FixScanner = (rootDir: string) => Promise<ScanArtifact>;\n\nconst defaultFixScanner: FixScanner = async (rootDir) => {\n const scratch = path.join(os.tmpdir(), `vg-fix-scan-${process.pid}.json`);\n const scanOpts: ScanOptions = { vibgrateVersion: VERSION, format: 'json', out: scratch, quiet: true, concurrency: 8 };\n const advanced = await loadAdvancedScanHook();\n return runCoreScan(rootDir, scanOpts, advanced);\n};\n\n/**\n * Load the scan artifact `vg fix` plans against, re-scanning when there is no\n * usable prior scan. A scan is re-run when the artifact is **missing** OR when it\n * is **out of date** with the working tree — a manifest edit or a lockfile bump\n * (e.g. from a previous `vg fix`) since the scan means the on-disk drift no\n * longer reflects the repository, so planning against it would upgrade the wrong\n * versions. Freshness is scoped to dependency manifests/lockfiles and fails open\n * (see {@link scanStaleness}).\n */\nexport async function loadArtifact(\n rootDir: string,\n inFile: string,\n scan: FixScanner = defaultFixScanner,\n): Promise<ScanArtifact> {\n const artifactPath = path.isAbsolute(inFile) ? inFile : path.join(rootDir, inFile);\n if (await pathExists(artifactPath)) {\n const staleness = scanStaleness(rootDir, artifactPath);\n if (!staleness.stale) {\n return readJsonFile<ScanArtifact>(artifactPath);\n }\n console.error(\n chalk.dim(\n `Scan is out of date (${staleness.newestChanged ?? 'a dependency manifest'} changed since the last scan) — re-running a drift scan first (code map skipped)…`,\n ),\n );\n } else {\n console.error(chalk.dim('No scan found — running a drift scan first (code map skipped)…'));\n }\n return scan(rootDir);\n}\n\n/** Best-effort, non-sensitive repository identity for dataset association + plan caching. */\nasync function repositoryIdentity(rootDir: string, override?: string): Promise<{ name?: string; vcsSha?: string }> {\n try {\n const vcs = await detectVcs(rootDir);\n const fingerprint = await computeRepoFingerprint(rootDir, vcs);\n const name = override?.trim() || (await resolveRepositoryName(rootDir));\n return { name, vcsSha: fingerprint.vcsSha };\n } catch {\n return { name: override?.trim() || undefined };\n }\n}\n\nexport const fixCommand = new Command('fix')\n .description('Get ranked, risk-tiered upgrade plans from the hosted planner and optionally apply them (prompts before changing files; --yes applies non-interactively, --dry-run previews, --no-apply only prints). Requires login/DSN.')\n .argument('[path]', 'Path to analyse', '.')\n .option('--in <file>', 'Scan artifact to read', '.vibgrate/scan_result.json')\n .option('--format <format>', 'Output format (text|json|md)', 'text')\n .option('--dsn <dsn>', 'DSN token (or use VIBGRATE_DSN env / \"vg login\")')\n .option('--region <region>', 'Override data residency region (us, eu)')\n .option('--repository-name <name>', 'Override the repository name recorded for this plan')\n .option('--plan <tier>', 'Apply a specific plan non-interactively (safe|balanced|aggressive)')\n .option('--yes', 'Apply the recommended plan without prompting')\n .option('--dry-run', 'Show what would change without applying')\n .option('--no-apply', 'Only print the plans; never modify the project')\n .option('--fail-on-vulns <severity>', 'Exit non-zero if the recommended plan leaves an advisory at/above this severity unresolved (low|moderate|high|critical)')\n .action(async (targetPath: string, opts: {\n in: string;\n format: string;\n dsn?: string;\n region?: string;\n repositoryName?: string;\n plan?: string;\n yes?: boolean;\n dryRun?: boolean;\n apply?: boolean; // commander maps --no-apply → apply === false\n failOnVulns?: string;\n }) => {\n const rootDir = path.resolve(targetPath);\n if (!(await pathExists(rootDir))) {\n console.error(chalk.red(`Path does not exist: ${rootDir}`));\n process.exit(1);\n }\n\n const failOn = opts.failOnVulns as VulnSeverity | undefined;\n if (failOn && !(failOn in SEVERITY_RANK)) {\n console.error(chalk.red(`Invalid --fail-on-vulns value '${opts.failOnVulns}'. Use one of: low, moderate, high, critical.`));\n process.exit(1);\n }\n\n // `vg fix` is a paid, hosted capability — it needs a DSN. No local planning\n // fallback exists (the planning intelligence is server-side by design).\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) {\n const cli = resolveCliInvocation();\n console.error(chalk.red('vg fix needs a Vibgrate login.'));\n console.error(\n chalk.dim(\n `Run \"${cli} login\" (or set VIBGRATE_DSN / pass --dsn) to analyse upgrades with the hosted planner. ` +\n 'See https://vibgrate.com/cli for details.',\n ),\n );\n process.exit(1);\n }\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format. Re-run \"vg login\" or check VIBGRATE_DSN.'));\n process.exit(1);\n }\n\n let host: string;\n try {\n host = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n let artifact: ScanArtifact;\n try {\n artifact = await loadArtifact(rootDir, opts.in);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const raw = collectCandidates(artifact);\n\n // Gather usage + contracts from local source (never leaves the machine except\n // as the aggregate counts/symbols the planner needs). One bounded walk.\n const usage = analyzeTree(\n rootDir,\n raw.filter((c) => c.source !== 'unknown').map((c) => ({ name: c.package, ecosystem: c.source })),\n );\n\n const candidates: FixCandidateInput[] = raw.map((c) => {\n const u = usage.get(c.package);\n return {\n package: c.package,\n ecosystem: c.ecosystem,\n currentVersion: c.from,\n latestVersion: c.to,\n majorsBehind: c.majorsBehind,\n section: c.section,\n ...(u && (u.importSites > 0 || u.filesTouched > 0)\n ? { usage: { importSites: u.importSites, filesTouched: u.filesTouched } }\n : {}),\n ...(u && u.contracts.length ? { contracts: u.contracts } : {}),\n };\n });\n\n const request: FixPlanRequest = {\n cliVersion: VERSION,\n repository: await repositoryIdentity(rootDir, opts.repositoryName),\n candidates,\n };\n\n let response: FixPlanResponse;\n try {\n const { response: httpResponse } = await requestFixPlan({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n request,\n timestamp: String(Date.now()),\n });\n if (!httpResponse.ok) {\n handleHttpError(httpResponse, parsed.workspaceId, host);\n return; // handleHttpError exits, but keep the type-checker happy.\n }\n response = await parseFixPlanResponse(httpResponse);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Could not reach the upgrade planner: ${msg}`));\n console.error(chalk.dim('Check your connection and try again, or see https://vibgrate.com/help.'));\n process.exit(1);\n }\n\n if (response.status === 'error') {\n console.error(chalk.red(response.error ?? 'The planner returned an error.'));\n if (response.requestId) console.error(chalk.dim(` (ref ${response.requestId})`));\n process.exit(1);\n }\n\n // Collapse duplicate plans onto the lowest-risk tier before anything is\n // rendered or selected: a tier whose upgrade set is identical to a\n // lower-risk tier's adds no real choice. Requests for a collapsed tier\n // (--plan, the server's recommendation) resolve via the alias map.\n const { plans: dedupedPlans, canonicalTier } = dedupePlans(response.plans);\n response.plans = dedupedPlans;\n response.recommended = canonicalTier.get(response.recommended) ?? response.recommended;\n\n // Augment each plan with an estimated post-upgrade DriftScore (client-side).\n const currentDrift = artifact.drift?.score;\n if (typeof currentDrift === 'number') {\n response.currentDriftScore = currentDrift;\n for (const plan of response.plans) {\n const upgraded = new Set(plan.upgrades.map((u) => u.package));\n const expected = estimateDriftScore(artifact, upgraded);\n plan.expectedDriftScore = expected;\n plan.driftDelta = expected - currentDrift;\n }\n }\n\n emit(response, opts.format);\n\n // Apply flow (text mode only; --no-apply / json / md are report-only).\n if (opts.format === 'text' && opts.apply !== false) {\n await runApplyFlow(rootDir, artifact, response, opts, canonicalTier);\n }\n\n if (failOn) {\n // Advisories the *recommended* plan does not remediate = the estate's open\n // advisories minus what the recommended plan fixes, evaluated by severity.\n const recommended = response.plans.find((p) => p.tier === response.recommended);\n const threshold = SEVERITY_RANK[failOn];\n let stillOpen = 0;\n for (const sev of Object.keys(SEVERITY_RANK) as VulnSeverity[]) {\n if (SEVERITY_RANK[sev] < threshold) continue;\n const open = response.unresolved.bySeverity[sev] ?? 0;\n // Anything the recommended plan itself does not fix also counts as open.\n // Measured against the most-fixing plan (not the 'aggressive' tier by\n // name — that tier may have been collapsed as a duplicate).\n const maxFixable = Math.max(0, ...response.plans.map((p) => p.fixes.bySeverity[sev] ?? 0));\n const notFixedByRecommended = maxFixable - (recommended?.fixes.bySeverity[sev] ?? 0);\n stillOpen += open + Math.max(0, notFixedByRecommended);\n }\n if (stillOpen > 0) {\n console.error(\n chalk.red(`\\nFailing: the recommended plan leaves ${stillOpen} advisory(ies) at/above ${failOn} unresolved.`),\n );\n process.exit(2);\n }\n }\n });\n\n/** Turn a non-2xx planner response into an actionable, non-leaky error and exit. */\nfunction handleHttpError(response: Response, workspaceId: string, host: string): never {\n const upgradeUrl = `https://${dashHostForIngestHost(host)}/${workspaceId}`;\n if (response.status === 401 || response.status === 403) {\n console.error(chalk.red('Not authorised. Your DSN may be invalid or lack access to this workspace.'));\n console.error(chalk.dim('Re-run \"vg login\" or check VIBGRATE_DSN.'));\n process.exit(1);\n }\n if (response.status === 402) {\n console.error(chalk.red('vg fix is a paid capability that is not enabled on your current plan.'));\n console.error(chalk.dim(`Upgrade to enable the hosted upgrade planner: ${upgradeUrl}`));\n process.exit(1);\n }\n if (response.status === 429) {\n console.error(chalk.red('Rate limited by the planner. Wait a moment and try again.'));\n process.exit(1);\n }\n console.error(chalk.red(`The planner returned HTTP ${response.status}.`));\n console.error(chalk.dim('Try again shortly, or see https://vibgrate.com/help.'));\n process.exit(1);\n}\n\nfunction emit(report: FixPlanResponse, format: string): void {\n switch (format) {\n case 'json':\n console.log(JSON.stringify(report, null, 2));\n break;\n case 'md':\n console.log(renderMarkdown(report));\n break;\n case 'text':\n default:\n console.log(renderText(report));\n break;\n }\n}\n\n/** Normalise a project's scan path to a directory relative to the repo root. */\nfunction relProjectDir(rootDir: string, projectPath: string): string {\n const rel = path.isAbsolute(projectPath) ? path.relative(rootDir, projectPath) : projectPath;\n return rel === '' ? '.' : rel;\n}\n\n/**\n * Build a resolver mapping each upgrade to the workspace manifest(s) that\n * actually declare it, so the pin command edits the right `package.json` (and\n * a monorepo dep never lands in the root manifest by accident).\n *\n * Ownership is keyed by `${ecosystem}\\0${package}` — identical to how\n * {@link collectCandidates} keys candidates — but drawn from *every* project in\n * the artifact, not deduped, so a dependency declared in several workspace\n * packages resolves to all of them. Dirs are sorted for deterministic output.\n * A dependency with no located owner falls back to the root manifest (with\n * `-w` when the root is a pnpm workspace, so the command no longer crashes).\n */\nexport async function buildTargetResolver(\n rootDir: string,\n artifact: ScanArtifact,\n): Promise<(upgrade: PlannedUpgrade) => WorkspaceTarget[]> {\n const rootIsWorkspace = await detectWorkspaceRoot(rootDir);\n const owners = new Map<string, Set<string>>();\n for (const project of artifact.projects ?? []) {\n const ecosystem = ecosystemId(project.type);\n const dir = relProjectDir(rootDir, project.path);\n for (const dep of project.dependencies ?? []) {\n const key = `${ecosystem}\\0${dep.package}`;\n (owners.get(key) ?? owners.set(key, new Set()).get(key)!).add(dir);\n }\n }\n const rootFallback: WorkspaceTarget[] = [{ dir: '.', isWorkspaceRoot: rootIsWorkspace }];\n return (upgrade) => {\n const dirs = owners.get(`${upgrade.ecosystem}\\0${upgrade.package}`);\n if (!dirs || dirs.size === 0) return rootFallback;\n return [...dirs]\n .sort((a, b) => a.localeCompare(b))\n .map((dir) => ({ dir, isWorkspaceRoot: dir === '.' && rootIsWorkspace }));\n };\n}\n\n/** The npm-family package manager to drive npm upgrades, from the scan. */\nfunction npmPackageManager(artifact: ScanArtifact): NpmPackageManager {\n for (const p of artifact.projects ?? []) {\n if ((p.type === 'node' || p.type === 'typescript') && p.packageManager) {\n const pm = p.packageManager;\n if (pm === 'pnpm' || pm === 'yarn' || pm === 'bun' || pm === 'npm') return pm;\n }\n }\n return 'npm';\n}\n\n/** Interactive plan picker (TTY). Resolves to the chosen tier, or null to cancel. */\nfunction promptPlanSelection(response: FixPlanResponse): Promise<PlanTier | null> {\n const plans = response.plans.filter((p) => p.upgrades.length > 0);\n console.log(chalk.bold('\\nSelect a plan to apply:'));\n plans.forEach((p, i) => {\n const rec = p.tier === response.recommended ? chalk.green(' (recommended)') : '';\n const drift =\n typeof p.expectedDriftScore === 'number' && typeof response.currentDriftScore === 'number'\n ? ` · DriftScore ${response.currentDriftScore}→${p.expectedDriftScore}`\n : '';\n console.log(` ${i + 1}) ${chalk.bold(p.label)}${rec} risk ${p.riskScore}/100 · ${p.upgrades.length} upgrade(s)${drift}`);\n });\n const defaultIdx = plans.findIndex((p) => p.tier === response.recommended);\n const def = defaultIdx >= 0 ? defaultIdx + 1 : 1;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(`Plan [1-${plans.length}, default ${def}, q to cancel]: `, (ans) => {\n rl.close();\n const t = ans.trim().toLowerCase();\n if (t === 'q' || t === 'quit') return resolve(null);\n const n = t === '' ? def : Number.parseInt(t, 10);\n if (!Number.isInteger(n) || n < 1 || n > plans.length) return resolve(null);\n resolve(plans[n - 1].tier);\n });\n });\n}\n\n/** Choose a plan (flags → single-plan → interactive → non-interactive default), apply it, and report. */\nasync function runApplyFlow(\n rootDir: string,\n artifact: ScanArtifact,\n response: FixPlanResponse,\n opts: { plan?: string; yes?: boolean; dryRun?: boolean },\n canonicalTier?: Map<PlanTier, PlanTier>,\n): Promise<void> {\n const nonEmpty = response.plans.filter((p) => p.upgrades.length > 0);\n if (nonEmpty.length === 0) {\n console.log(chalk.green('\\n✔ Nothing to upgrade — every tracked dependency is current.'));\n return;\n }\n\n let chosen: UpgradePlan | undefined;\n if (opts.plan) {\n // A tier collapsed as a duplicate resolves to the surviving lower-risk plan.\n const tier = canonicalTier?.get(opts.plan as PlanTier) ?? opts.plan;\n chosen = response.plans.find((p) => p.tier === tier);\n if (!chosen) {\n console.error(chalk.red(`Unknown plan '${opts.plan}'. Use safe, balanced, or aggressive.`));\n process.exit(1);\n }\n } else if (nonEmpty.length === 1) {\n chosen = nonEmpty[0];\n } else if (opts.yes) {\n chosen = response.plans.find((p) => p.tier === response.recommended) ?? nonEmpty[0];\n } else if (process.stdin.isTTY && process.stdout.isTTY) {\n const tier = await promptPlanSelection(response);\n if (!tier) {\n console.log(chalk.dim('No plan applied.'));\n return;\n }\n chosen = response.plans.find((p) => p.tier === tier);\n } else {\n console.log(chalk.dim('\\nMultiple plans available — re-run with --plan <tier> or --yes to apply, or --dry-run to preview.'));\n return;\n }\n if (!chosen || chosen.upgrades.length === 0) {\n console.log(chalk.dim('Selected plan has no upgrades.'));\n return;\n }\n\n const pm = npmPackageManager(artifact);\n const resolveTargets = await buildTargetResolver(rootDir, artifact);\n const results = applyPlan(rootDir, chosen.upgrades, { dryRun: opts.dryRun, packageManager: pm, resolveTargets });\n\n if (opts.dryRun) {\n console.log(chalk.bold(`\\nDry run — ${chosen.label} plan (${chosen.upgrades.length} upgrade(s)):`));\n for (const r of results) {\n if (r.status === 'manual') console.log(chalk.yellow(` ⚠ ${r.package}: ${r.detail}`));\n else console.log(chalk.dim(` ${r.package}: ${r.detail}`));\n }\n if (typeof chosen.expectedDriftScore === 'number') {\n console.log(chalk.dim(`Expected DriftScore after apply: ~${chosen.expectedDriftScore} (was ${response.currentDriftScore ?? '?'}).`));\n }\n return;\n }\n\n const applied = results.filter((r) => r.status === 'applied');\n const failed = results.filter((r) => r.status === 'failed');\n const manual = results.filter((r) => r.status === 'manual');\n\n console.log(chalk.bold(`\\nApplied the ${chosen.label} plan:`));\n console.log(\n chalk.green(` ✔ ${applied.length} upgraded`) +\n (failed.length ? chalk.red(` ✖ ${failed.length} failed`) : '') +\n (manual.length ? chalk.yellow(` ⚠ ${manual.length} need manual work`) : ''),\n );\n for (const r of failed) console.log(chalk.red(` ✖ ${r.package} → ${r.to}: ${r.detail ?? 'failed'}`));\n for (const r of manual) console.log(chalk.yellow(` ⚠ ${r.package} → ${r.to}: ${r.detail}`));\n if (typeof chosen.expectedDriftScore === 'number' && typeof response.currentDriftScore === 'number') {\n const delta = chosen.expectedDriftScore - response.currentDriftScore;\n console.log(\n ` Expected DriftScore: ${response.currentDriftScore} → ~${chosen.expectedDriftScore} (${delta <= 0 ? '' : '+'}${delta}). ` +\n 'Re-run `vg` to confirm the actual score.',\n );\n }\n if (failed.length) process.exitCode = 2;\n}\n","import chalk from 'chalk';\nimport type { ScanArtifact, ExtendedScanResults, InventoryItem, ServiceDependencyItem, ArchitectureResult } from '../types.js';\nimport { VERSION } from '../version.js';\nimport { driftBar } from '../../core-open/ui/bar.js';\nimport { titleBox } from '../../core-open/ui/box.js';\n\nexport function formatText(artifact: ScanArtifact): string {\n const lines: string[] = [];\n\n // Brand colours from docs/design logo bundle\n const teal = chalk.hex('#3FB0A4');\n const mint = chalk.hex('#4FE3C1');\n\n lines.push('');\n lines.push(' ' + teal('╭──────╮') + mint('➜'));\n lines.push(' ' + chalk.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + chalk.dim('├') + ' ' + chalk.bold.white('vibgrate'));\n lines.push(' ' + chalk.dim('┤') + teal('│') + ' ' + chalk.dim('▁▁') + ' ' + teal('│') + chalk.dim('├') + ' ' + chalk.dim(`Code Intelligence Engine v${VERSION}`));\n lines.push(' ' + teal('╰──────╯'));\n lines.push('');\n lines.push(...titleBox('Vibgrate Drift Report', teal));\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 // Lower is better: a positive delta means drift increased (worse → red),\n // a negative delta means drift decreased (improved → green).\n const deltaStr = artifact.delta > 0\n ? chalk.red(`+${artifact.delta}`)\n : artifact.delta < 0\n ? chalk.green(`${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 — drift score is lower-is-better (0 = no drift).\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 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 return lines.join('\\n');\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 // 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 scores)`,\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","import type { ScanArtifact } from '../types.js';\n\n/** Generate a Markdown report from scan artifact */\nexport function formatMarkdown(artifact: ScanArtifact): string {\n const lines: string[] = [];\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 _(lower is better; 0 = no drift)_ |`);\n lines.push(`| **Risk Level** | ${artifact.drift.riskLevel.toUpperCase()} |`);\n lines.push(`| **Projects** | ${artifact.projects.length} |`);\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 // Lower is better: a rise (positive delta) means drift worsened; a fall means it improved.\n const dir = artifact.delta > 0 ? '📈' : artifact.delta < 0 ? '📉' : '➡️';\n const trend = artifact.delta > 0 ? ' _(worsened)_' : artifact.delta < 0 ? ' _(improved)_' : '';\n lines.push(`## Drift Delta: ${dir} ${artifact.delta > 0 ? '+' : ''}${artifact.delta} vs baseline${trend}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { formatText } from '../formatters/text.js';\nimport { formatMarkdown } from '../formatters/markdown.js';\nimport type { ScanArtifact } from '../types.js';\n\nexport const reportCommand = new Command('report')\n .description('Generate a drift report from a scan artifact')\n .option('--in <file>', 'Input artifact file', '.vibgrate/scan_result.json')\n .option('--format <format>', 'Output format (md|text|json)', 'text')\n .action(async (opts: { in: string; format: string }) => {\n const artifactPath = path.resolve(opts.in);\n\n if (!(await pathExists(artifactPath))) {\n console.error(chalk.red(`Artifact not found: ${artifactPath}`));\n console.error(chalk.dim('Run \"vibgrate scan\" first to generate a scan artifact.'));\n process.exit(1);\n }\n\n const artifact = await readJsonFile<ScanArtifact>(artifactPath);\n\n switch (opts.format) {\n case 'md':\n console.log(formatMarkdown(artifact));\n break;\n case 'json':\n console.log(JSON.stringify(artifact, null, 2));\n break;\n case 'text':\n default:\n console.log(formatText(artifact));\n break;\n }\n });\n","import { spawn } from 'node:child_process';\n\n/**\n * Best-effort open of a URL in the user's default browser. Returns true if a\n * launcher was spawned (not a guarantee the browser actually opened). Callers\n * should always print the URL too, in case this fails or we're headless.\n */\nexport function openUrl(url: string): boolean {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'open';\n args = [url];\n } else if (platform === 'win32') {\n command = 'cmd';\n // `start` needs an empty title arg first when the URL contains special chars.\n args = ['/c', 'start', '', url];\n } else {\n command = 'xdg-open';\n args = [url];\n }\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.on('error', () => {\n /* swallow — caller falls back to printing the URL */\n });\n child.unref();\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { availableRegionIds } from '../regions.js';\nimport { resolveIngestHost, createWorkspaceDsn } from './dsn.js';\nimport { writeStoredCredentials, credentialsPath, gitignoreEntryForCredentials } from '../credentials.js';\nimport type { StoredCredentials } from '../credentials.js';\nimport { findGitRoot, ensureGitignored } from '../utils/gitignore.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\nimport * as path from 'node:path';\nimport { openUrl } from '../utils/open-url.js';\n\ninterface StartResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface TokenResponse {\n status:\n | 'authorization_pending'\n | 'complete'\n | 'access_denied'\n | 'expired'\n | 'invalid'\n | 'error';\n dsn?: string;\n keyId?: string;\n workspaceId?: string;\n ingestHost?: string;\n error?: string;\n}\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** True when `file` resolves to a path inside the `dir` tree. */\nfunction isInside(dir: string, file: string): boolean {\n const rel = path.relative(dir, file);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n}\n\nexport const loginCommand = new Command('login')\n .description('Authenticate the CLI with your Vibgrate workspace via the browser')\n .option('--ingest <url>', 'Ingest API URL (overrides --region)')\n .option('--region <region>', `Data residency region (${availableRegionIds().join(', ')})`, 'us')\n .option('--no-browser', 'Do not attempt to open a browser automatically')\n .option(\n '--local',\n 'Store credentials in this project (.vibgrate/credentials.json) instead of ~/.vibgrate',\n )\n .action(async (opts: { ingest?: string; region: string; browser: boolean; local?: boolean }) => {\n let ingestHost: string;\n try {\n ingestHost = resolveIngestHost(opts.region, opts.ingest);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const base = `https://${ingestHost}/v1/auth/device`;\n\n // 1. Start the device authorization request.\n let start: StartResponse;\n try {\n const res = await fetch(`${base}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: '{}',\n });\n if (!res.ok) {\n console.error(chalk.red(`Failed to start login (HTTP ${res.status}).`));\n process.exit(1);\n }\n start = (await res.json()) as StartResponse;\n } catch (e: unknown) {\n console.error(chalk.red(`Could not reach ${ingestHost}: ${e instanceof Error ? e.message : String(e)}`));\n process.exit(1);\n }\n\n // 2. Prompt the user to approve in the browser.\n console.log('');\n console.log('To finish signing in, open this URL and approve the request:');\n console.log('');\n console.log(' ' + chalk.cyan(start.verificationUri));\n console.log('');\n console.log(' Your code: ' + chalk.bold(start.userCode));\n console.log('');\n\n if (opts.browser) {\n const opened = openUrl(start.verificationUriComplete);\n if (opened) {\n console.log(chalk.dim('Opening your browser… (if it does not open, use the URL above)'));\n }\n }\n console.log(chalk.dim('Waiting for approval…'));\n\n // 3. Poll for completion.\n const intervalMs = Math.max(2, start.interval || 5) * 1000;\n const deadline = Date.now() + (start.expiresIn || 900) * 1000;\n\n while (Date.now() < deadline) {\n await delay(intervalMs);\n let token: TokenResponse;\n try {\n const res = await fetch(`${base}/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify({ deviceCode: start.deviceCode }),\n });\n token = (await res.json()) as TokenResponse;\n } catch {\n // Transient network error — keep polling until the deadline.\n continue;\n }\n\n if (token.status === 'authorization_pending') continue;\n\n if (token.status === 'complete') {\n // Resolve the DSN. An existing account comes back with one from the\n // device flow; a brand-new account has no workspace yet, so we\n // provision one automatically in the user's region rather than making\n // the user run \"dsn create\" by hand. Login itself already succeeded —\n // only the workspace setup can still fail here.\n let creds: StoredCredentials;\n if (token.dsn) {\n creds = {\n dsn: token.dsn,\n workspaceId: token.workspaceId,\n keyId: token.keyId,\n ingestHost: token.ingestHost ?? ingestHost,\n savedAt: new Date().toISOString(),\n };\n } else {\n console.log(chalk.dim('Setting up your workspace…'));\n try {\n const provisioned = await createWorkspaceDsn({\n region: opts.region,\n ingest: opts.ingest,\n });\n creds = {\n dsn: provisioned.dsn,\n workspaceId: provisioned.workspaceId,\n keyId: provisioned.keyId,\n ingestHost: provisioned.ingestHost,\n savedAt: new Date().toISOString(),\n };\n } catch (e: unknown) {\n console.error(\n chalk.red('✖ Signed in, but workspace setup failed: ') +\n (e instanceof Error ? e.message : String(e)),\n );\n console.error(\n chalk.dim(' Finish setup with \"vibgrate dsn create --workspace new\".'),\n );\n process.exit(1);\n }\n }\n\n const storeOpts = { local: opts.local === true };\n writeStoredCredentials(creds, storeOpts);\n const credsFile = credentialsPath(storeOpts);\n console.log('');\n console.log(chalk.green('✔') + ' Logged in.');\n if (creds.workspaceId) {\n console.log(' Workspace: ' + chalk.bold(creds.workspaceId));\n }\n console.log(chalk.dim(` Credentials saved to ${credsFile}`));\n\n // Defense in depth (GUARDRAILS §1.1): the DSN we just stored is a\n // credential and must never be committed. Only touch .gitignore when the\n // credentials file actually lives inside the repo (the project-local\n // store) — a home-directory store is already outside version control, so\n // there is nothing to ignore. This is best-effort: never fail an\n // otherwise-successful login over .gitignore housekeeping.\n try {\n const root = findGitRoot();\n if (root && isInside(root, credsFile)) {\n const res = ensureGitignored(gitignoreEntryForCredentials(root, credsFile), root);\n if (res.status === 'created') {\n console.log(chalk.dim(` Created .gitignore and ignored ${res.entry}`));\n } else if (res.status === 'added') {\n console.log(chalk.dim(` Added ${res.entry} to .gitignore`));\n }\n }\n } catch {\n /* non-fatal */\n }\n\n console.log(chalk.dim(` You can now run \"${resolveCliInvocation()} scan --push\".`));\n return;\n }\n\n if (token.status === 'access_denied') {\n console.error(chalk.red('✖ Login was denied in the browser.'));\n process.exit(1);\n }\n if (token.status === 'expired' || token.status === 'invalid') {\n console.error(chalk.red('✖ Login request expired. Run \"vibgrate login\" again.'));\n process.exit(1);\n }\n if (token.status === 'error') {\n console.error(chalk.red(`✖ ${token.error ?? 'Login failed.'}`));\n process.exit(1);\n }\n }\n\n console.error(chalk.red('✖ Timed out waiting for approval. Run \"vibgrate login\" again.'));\n process.exit(1);\n });\n","/**\n * Shell-aware hints for the CLI.\n *\n * When we tell a user how to unset an environment variable, the syntax depends\n * on their shell — `unset` (POSIX sh/bash/zsh), `set -e` (fish),\n * `unsetenv` (csh/tcsh), `Remove-Item Env:` (PowerShell), `set VAR=` (cmd.exe).\n * Printing one hardcoded form is wrong for everyone else, so we pick the command\n * that matches the environment we can actually detect.\n */\n\nexport interface ShellEnv {\n /** Defaults to `process.platform`. */\n platform?: NodeJS.Platform;\n /** Defaults to `process.env.SHELL` (the user's login shell on Unix). */\n shell?: string;\n}\n\n/**\n * Return the command that unsets `varName` in the caller's shell.\n *\n * Detection is best-effort and honest about its limits:\n * - Unix: keyed off `$SHELL` (the login shell). fish and csh/tcsh get their\n * own syntax; everything else falls back to POSIX `unset`, which covers\n * sh/bash/zsh/ksh. `$SHELL` is the *default* shell, not guaranteed to be the\n * one currently running, but it is the only signal available.\n * - Windows: PowerShell and cmd.exe can't be told apart reliably from the\n * environment, so we show both forms rather than guess wrong.\n */\nexport function unsetEnvCommand(varName: string, env: ShellEnv = {}): string {\n const platform = env.platform ?? process.platform;\n\n if (platform === 'win32') {\n return `PowerShell: Remove-Item Env:${varName} | cmd.exe: set ${varName}=`;\n }\n\n const shell = env.shell ?? process.env.SHELL ?? '';\n const base = shell.split('/').pop() ?? '';\n if (base === 'fish') return `set -e ${varName}`;\n if (base === 'csh' || base === 'tcsh') return `unsetenv ${varName}`;\n return `unset ${varName}`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { clearStoredCredentials, credentialsPath } from '../credentials.js';\nimport { unsetEnvCommand } from '../utils/shell.js';\n\nexport const logoutCommand = new Command('logout')\n .description('Clear stored Vibgrate login credentials')\n .action(() => {\n const cleared = clearStoredCredentials();\n if (cleared) {\n console.log(chalk.green('✔') + ' Logged out. Stored credentials removed.');\n } else {\n console.log(chalk.dim(`No stored credentials found at ${credentialsPath()}.`));\n }\n\n // The stored file is not the only DSN source: resolveDsn() also honors the\n // VIBGRATE_DSN env var (and a --dsn flag). Deleting the file does not clear\n // those, so the user can still be authenticated after \"logout\". Warn them —\n // but never echo the value itself (GUARDRAILS §1.1), only that it is set.\n if (process.env.VIBGRATE_DSN) {\n console.log('');\n console.log(\n chalk.yellow('⚠') +\n ' VIBGRATE_DSN is still set in your environment, so commands will keep using it.',\n );\n console.log(\n chalk.dim(` Unset it to fully sign out: ${unsetEnvCommand('VIBGRATE_DSN')}`),\n );\n }\n });\n","import * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile, writeTextFile } from '../utils/fs.js';\n\n/**\n * The in-toto predicate type for an OpenVEX attestation. Passed to\n * `cosign attest --type …` in the release pipeline and verified by buyers.\n */\nexport const OPENVEX_PREDICATE_TYPE = 'openvex';\n\n/** OpenVEX context URI (spec version this generator emits). */\nconst OPENVEX_CONTEXT = 'https://openvex.dev/ns/v0.2.0';\n\n/** Valid OpenVEX statement statuses. */\nconst VEX_STATUSES = ['not_affected', 'affected', 'fixed', 'under_investigation'] as const;\nexport type VexStatus = (typeof VEX_STATUSES)[number];\n\n/** Justifications permitted for a `not_affected` status (OpenVEX spec). */\nconst VEX_JUSTIFICATIONS = [\n 'component_not_present',\n 'vulnerable_code_not_present',\n 'vulnerable_code_not_in_execute_path',\n 'vulnerable_code_cannot_be_controlled_by_adversary',\n 'inline_mitigations_already_exist',\n] as const;\nexport type VexJustification = (typeof VEX_JUSTIFICATIONS)[number];\n\nexport interface VexStatementInput {\n vulnerability: string;\n /** Product references (e.g. `pkg:…` or an image digest). Falls back to the document default. */\n products?: string[];\n status: VexStatus;\n justification?: VexJustification;\n impact_statement?: string;\n action_statement?: string;\n}\n\ninterface OpenVexStatement {\n vulnerability: { name: string };\n products: Array<{ '@id': string }>;\n status: VexStatus;\n justification?: VexJustification;\n impact_statement?: string;\n action_statement?: string;\n}\n\nexport interface OpenVexDocument {\n '@context': string;\n '@id': string;\n author: string;\n timestamp: string;\n version: number;\n statements: OpenVexStatement[];\n}\n\nexport interface BuildVexOptions {\n author: string;\n /** Default product applied to statements that don't carry their own. */\n defaultProduct?: string;\n timestamp?: string;\n id?: string;\n statements: VexStatementInput[];\n}\n\n/** A validation problem found while assembling the document. */\nexport class VexValidationError extends Error {}\n\n/**\n * Builds a spec-compliant OpenVEX document from a set of statements. Pure: given\n * the same inputs (including an explicit `timestamp`/`id`) it returns the same\n * document, so an attested VEX is reproducible. A document with zero statements\n * is valid and honest — it asserts no known affected components.\n */\nexport function buildVexDocument(opts: BuildVexOptions): OpenVexDocument {\n const statements: OpenVexStatement[] = opts.statements.map((s, i) => {\n if (!s.vulnerability || typeof s.vulnerability !== 'string') {\n throw new VexValidationError(`statement[${i}]: \"vulnerability\" is required`);\n }\n if (!VEX_STATUSES.includes(s.status)) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): invalid status \"${s.status}\". Expected one of: ${VEX_STATUSES.join(', ')}`,\n );\n }\n\n const products = (s.products && s.products.length > 0\n ? s.products\n : opts.defaultProduct\n ? [opts.defaultProduct]\n : []);\n if (products.length === 0) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): no product. Set \"products\" on the statement or pass --product.`,\n );\n }\n\n // OpenVEX requires a justification or impact_statement for not_affected, and\n // an action_statement is expected for affected.\n if (s.status === 'not_affected' && !s.justification && !s.impact_statement) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): \"not_affected\" requires a justification or impact_statement.`,\n );\n }\n if (s.justification && !VEX_JUSTIFICATIONS.includes(s.justification)) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): invalid justification \"${s.justification}\". Expected one of: ${VEX_JUSTIFICATIONS.join(', ')}`,\n );\n }\n if (s.status === 'affected' && !s.action_statement) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): \"affected\" requires an action_statement.`,\n );\n }\n\n const out: OpenVexStatement = {\n vulnerability: { name: s.vulnerability },\n products: products.map((p) => ({ '@id': p })),\n status: s.status,\n };\n if (s.justification) out.justification = s.justification;\n if (s.impact_statement) out.impact_statement = s.impact_statement;\n if (s.action_statement) out.action_statement = s.action_statement;\n return out;\n });\n\n return {\n '@context': OPENVEX_CONTEXT,\n '@id': opts.id ?? `https://vibgrate.com/vex/${randomUUID()}`,\n author: opts.author,\n timestamp: opts.timestamp ?? new Date().toISOString(),\n version: 1,\n statements,\n };\n}\n\n/**\n * Reads statements from a JSON file. Accepts either a bare array of statements or\n * an object with a `statements` array (e.g. an existing OpenVEX document).\n */\nasync function loadStatementsFile(filePath: string): Promise<VexStatementInput[]> {\n const data = await readJsonFile<unknown>(filePath);\n const arr = Array.isArray(data)\n ? data\n : (data && typeof data === 'object' && Array.isArray((data as { statements?: unknown }).statements)\n ? (data as { statements: unknown[] }).statements\n : null);\n if (!arr) {\n throw new VexValidationError(\n `${filePath}: expected a JSON array of statements or an object with a \"statements\" array.`,\n );\n }\n return arr as VexStatementInput[];\n}\n\nfunction collectStatement(value: string, previous: VexStatementInput[]): VexStatementInput[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new VexValidationError(`--statement must be a JSON object: ${value.slice(0, 60)}…`);\n }\n return [...previous, parsed as VexStatementInput];\n}\n\nexport const vexCommand = new Command('vex')\n .description('Generate an OpenVEX document (exploitability statements) for attestation')\n .option('--from <file>', 'Read statements from a JSON file (array, or an object with a \"statements\" array)')\n .option(\n '--statement <json>',\n 'Add a statement as inline JSON, e.g. \\'{\"vulnerability\":\"CVE-2024-1\",\"status\":\"not_affected\",\"justification\":\"vulnerable_code_not_present\"}\\'. Repeatable.',\n collectStatement,\n [] as VexStatementInput[],\n )\n .option('--product <ref>', 'Default product reference applied to statements without their own (e.g. an image digest)')\n .option('--author <name>', 'Document author', 'Vibgrate')\n .option('--timestamp <iso>', 'Override the document timestamp (ISO 8601) for reproducible output')\n .option('--id <uri>', 'Override the document @id (otherwise a uuid URN is generated)')\n .option('--out <file>', 'Write the document to a file (default: stdout)')\n .action(async (opts: {\n from?: string;\n statement: VexStatementInput[];\n product?: string;\n author: string;\n timestamp?: string;\n id?: string;\n out?: string;\n }) => {\n try {\n const statements: VexStatementInput[] = [];\n if (opts.from) {\n const fromPath = path.resolve(opts.from);\n if (!(await pathExists(fromPath))) {\n process.stderr.write(chalk.red(`Statements file not found: ${fromPath}\\n`));\n process.exit(1);\n }\n statements.push(...(await loadStatementsFile(fromPath)));\n }\n statements.push(...opts.statement);\n\n const doc = buildVexDocument({\n author: opts.author,\n defaultProduct: opts.product,\n timestamp: opts.timestamp,\n id: opts.id,\n statements,\n });\n\n const json = JSON.stringify(doc, null, 2);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), json + '\\n');\n process.stderr.write(\n chalk.green('✔') + ` Wrote OpenVEX document (${doc.statements.length} statement(s)) to ${path.resolve(opts.out)}\\n`,\n );\n } else {\n process.stdout.write(json + '\\n');\n }\n } catch (err) {\n if (err instanceof VexValidationError) {\n process.stderr.write(chalk.red(`VEX validation error: ${err.message}\\n`));\n process.exit(1);\n }\n throw err;\n }\n });\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile, writeTextFile } from '../utils/fs.js';\nimport type { DependencyRow, ScanArtifact } from '../types.js';\nimport { vexCommand } from './vex.js';\n\ntype SbomFormat = 'cyclonedx' | 'spdx';\n\ninterface FlattenedDependency {\n project: string;\n package: string;\n version: string;\n currentSpec: string;\n drift: DependencyRow['drift'];\n majorsBehind: number | null;\n}\n\n/**\n * Deterministic RFC 9562 version-8 UUID derived from `seed`, so an SBOM's\n * serialNumber / documentNamespace is stable for identical content instead of\n * random. A stable id makes `vg sbom export` reproducible for a given scan and\n * format. Uses a salted FNV-1a hash; a collision is only cosmetic — the SBOM\n * content, not this id, is what a consumer verifies.\n *\n * Kept in sync with the identical helper in the API\n * (`packages/vibgrate-api/src/lib/sbom-export.ts`).\n */\nexport function deterministicUuid(seed: string): string {\n const bytes = new Uint8Array(16);\n for (let block = 0; block < 4; block++) {\n let h = 0x811c9dc5;\n const s = `${block} ${seed}`;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n h >>>= 0;\n bytes[block * 4] = (h >>> 24) & 0xff;\n bytes[block * 4 + 1] = (h >>> 16) & 0xff;\n bytes[block * 4 + 2] = (h >>> 8) & 0xff;\n bytes[block * 4 + 3] = h & 0xff;\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x80; // version 8 (custom)\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Stable seed for the document id: format + root + the ordered dependency set. */\nfunction sbomSerialSeed(format: string, artifact: ScanArtifact, deps: FlattenedDependency[]): string {\n return [\n format,\n artifact.rootPath ?? '',\n artifact.timestamp ?? '',\n artifact.vibgrateVersion ?? '',\n ...deps.map((d) => `${d.package}|${d.version}|${d.currentSpec}|${d.project}|${d.drift}|${d.majorsBehind ?? ''}`),\n ].join('\\n');\n}\n\nexport function flattenDependencies(artifact: ScanArtifact): FlattenedDependency[] {\n const rows: FlattenedDependency[] = [];\n for (const project of artifact.projects) {\n for (const dep of project.dependencies) {\n rows.push({\n project: project.name,\n package: dep.package,\n version: dep.resolvedVersion ?? dep.currentSpec,\n currentSpec: dep.currentSpec,\n drift: dep.drift,\n majorsBehind: dep.majorsBehind,\n });\n }\n }\n return rows;\n}\n\nexport function toCycloneDx(artifact: ScanArtifact): Record<string, unknown> {\n const dependencies = flattenDependencies(artifact);\n return {\n bomFormat: 'CycloneDX',\n specVersion: '1.5',\n serialNumber: `urn:uuid:${deterministicUuid(sbomSerialSeed('cyclonedx', artifact, dependencies))}`,\n version: 1,\n metadata: {\n timestamp: artifact.timestamp,\n tools: [\n {\n vendor: 'Vibgrate',\n name: '@vibgrate/cli',\n version: artifact.vibgrateVersion,\n },\n ],\n component: {\n type: 'application',\n name: artifact.rootPath,\n },\n },\n components: dependencies.map((dep) => ({\n type: 'library',\n name: dep.package,\n version: dep.version,\n properties: [\n { name: 'vibgrate:project', value: dep.project },\n { name: 'vibgrate:currentSpec', value: dep.currentSpec },\n { name: 'vibgrate:drift', value: dep.drift },\n { name: 'vibgrate:majorsBehind', value: String(dep.majorsBehind ?? 'unknown') },\n ],\n })),\n };\n}\n\nexport function toSpdx(artifact: ScanArtifact): Record<string, unknown> {\n const dependencies = flattenDependencies(artifact);\n return {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: `${artifact.rootPath}-sbom`,\n documentNamespace: `https://vibgrate.com/spdx/${artifact.rootPath}/${deterministicUuid(sbomSerialSeed('spdx', artifact, dependencies))}`,\n creationInfo: {\n created: artifact.timestamp,\n creators: [`Tool: @vibgrate/cli-${artifact.vibgrateVersion}`],\n },\n packages: dependencies.map((dep, i) => ({\n name: dep.package,\n SPDXID: `SPDXRef-Package-${i + 1}`,\n versionInfo: dep.version,\n downloadLocation: 'NOASSERTION',\n filesAnalyzed: false,\n externalRefs: [\n {\n referenceCategory: 'PACKAGE-MANAGER',\n referenceType: 'purl',\n referenceLocator: `pkg:npm/${encodeURIComponent(dep.package)}@${encodeURIComponent(dep.version)}`,\n },\n ],\n annotations: [\n {\n annotationType: 'OTHER',\n annotator: 'Tool: @vibgrate/cli',\n annotationDate: artifact.timestamp,\n comment: `project=${dep.project}; drift=${dep.drift}; majorsBehind=${dep.majorsBehind ?? 'unknown'}`,\n },\n ],\n })),\n };\n}\n\nfunction projectDependencyMap(artifact: ScanArtifact): Map<string, DependencyRow> {\n const map = new Map<string, DependencyRow>();\n for (const project of artifact.projects) {\n for (const dep of project.dependencies) {\n map.set(`${project.name}:${dep.package}`, dep);\n }\n }\n return map;\n}\n\nexport function formatDeltaText(base: ScanArtifact, current: ScanArtifact): string {\n const baseMap = projectDependencyMap(base);\n const currentMap = projectDependencyMap(current);\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [key, dep] of currentMap.entries()) {\n if (!baseMap.has(key)) {\n added.push(`${key} @ ${dep.resolvedVersion ?? dep.currentSpec}`);\n continue;\n }\n const prev = baseMap.get(key)!;\n const prevVersion = prev.resolvedVersion ?? prev.currentSpec;\n const nowVersion = dep.resolvedVersion ?? dep.currentSpec;\n if (prevVersion !== nowVersion || prev.majorsBehind !== dep.majorsBehind) {\n changed.push(`${key} ${prevVersion} -> ${nowVersion} (majorsBehind ${prev.majorsBehind ?? 'unknown'} -> ${dep.majorsBehind ?? 'unknown'})`);\n }\n }\n\n for (const [key, dep] of baseMap.entries()) {\n if (!currentMap.has(key)) {\n removed.push(`${key} @ ${dep.resolvedVersion ?? dep.currentSpec}`);\n }\n }\n\n const lines = [\n 'Vibgrate SBOM Delta',\n '===================',\n `Baseline: ${base.timestamp}`,\n `Current: ${current.timestamp}`,\n `DriftScore delta: ${(current.drift.score - base.drift.score).toFixed(2)} points`,\n '',\n `Added dependencies (${added.length})`,\n ...added.map((d) => ` + ${d}`),\n '',\n `Removed dependencies (${removed.length})`,\n ...removed.map((d) => ` - ${d}`),\n '',\n `Changed dependencies (${changed.length})`,\n ...changed.map((d) => ` * ${d}`),\n ];\n\n return lines.join('\\n');\n}\n\nasync function readArtifactOrExit(filePath: string): Promise<ScanArtifact> {\n const absolutePath = path.resolve(filePath);\n if (!(await pathExists(absolutePath))) {\n console.error(chalk.red(`Artifact not found: ${absolutePath}`));\n process.exit(1);\n }\n return readJsonFile<ScanArtifact>(absolutePath);\n}\n\nconst exportCommand = new Command('export')\n .description('Export scan artifact as SBOM')\n .option('--in <file>', 'Input artifact file', '.vibgrate/scan_result.json')\n .option('--out <file>', 'Output SBOM file')\n .option('--format <format>', 'SBOM format (cyclonedx|spdx)', 'cyclonedx')\n .action(async (opts: { in: string; out?: string; format: string }) => {\n const artifact = await readArtifactOrExit(opts.in);\n const format = opts.format.toLowerCase() as SbomFormat;\n\n if (format !== 'cyclonedx' && format !== 'spdx') {\n console.error(chalk.red('Invalid SBOM format. Use cyclonedx or spdx.'));\n process.exit(1);\n }\n\n const sbom = format === 'cyclonedx' ? toCycloneDx(artifact) : toSpdx(artifact);\n const body = JSON.stringify(sbom, null, 2);\n\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), body);\n console.log(chalk.green('✔') + ` SBOM written to ${opts.out}`);\n } else {\n console.log(body);\n }\n });\n\nconst deltaCommand = new Command('delta')\n .description('Show SBOM delta between two scan artifacts')\n .requiredOption('--from <file>', 'Baseline scan artifact path')\n .requiredOption('--to <file>', 'Current scan artifact path')\n .option('--out <file>', 'Write report to file')\n .action(async (opts: { from: string; to: string; out?: string }) => {\n const base = await readArtifactOrExit(opts.from);\n const current = await readArtifactOrExit(opts.to);\n const report = formatDeltaText(base, current);\n\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), report);\n console.log(chalk.green('✔') + ` SBOM delta report written to ${opts.out}`);\n } else {\n console.log(report);\n }\n });\n\nexport const sbomCommand = new Command('sbom')\n .description('Supply-chain evidence: SBOM export/delta and OpenVEX generation')\n .addCommand(exportCommand)\n .addCommand(deltaCommand)\n .addCommand(vexCommand);\n","#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { realpathSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { Command, CommanderError } from 'commander';\nimport { VERSION } from './version.js';\nimport { resolveCliInvocation, NPX_INVOCATION } from './util/cli-invocation.js';\nimport { registerBuild, runBuild } from './commands/build.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerAsk } from './commands/ask.js';\nimport { registerEmbed } from './commands/embed.js';\nimport { registerShow } from './commands/show.js';\nimport { registerPath } from './commands/path.js';\nimport { registerTree } from './commands/tree.js';\nimport { registerInsights } from './commands/insights.js';\nimport { registerImpact } from './commands/impact.js';\nimport { registerUnknowns } from './commands/unknowns.js';\nimport { registerServe } from './commands/serve.js';\nimport { registerLsp } from './commands/lsp.js';\nimport { registerInstall } from './commands/install.js';\nimport { registerShare } from './commands/share.js';\nimport { registerBenchmark } from './commands/benchmark.js';\nimport { registerTests } from './commands/tests.js';\nimport { registerFacts } from './commands/facts.js';\nimport { registerGuide } from './commands/guide.js';\nimport { registerWhy } from './commands/why.js';\nimport { registerBisect } from './commands/bisect.js';\nimport { registerDrift } from './commands/drift.js';\nimport { registerModels } from './commands/models.js';\nimport { registerSavings } from './commands/savings.js';\nimport { registerLib } from './commands/lib.js';\nimport { registerExport } from './commands/export.js';\nimport { registerBundle } from './commands/bundle.js';\nimport { registerDoctor } from './commands/doctor.js';\nimport { CliError, ExitCode } from './util/exit.js';\nimport { c, info, disableColor } from './util/output.js';\n\n// Drift-reporting commands (merged from the Vibgrate CLI). These run on the\n// open base engine (`@vibgrate/core-open`) — no proprietary kernel.\nimport { initCommand } from './reporting/commands/init.js';\nimport { scanCommand } from './reporting/commands/scan.js';\nimport { fixCommand } from './reporting/commands/fix.js';\nimport { baselineCommand } from './reporting/commands/baseline.js';\nimport { reportCommand } from './reporting/commands/report.js';\nimport { dsnCommand } from './reporting/commands/dsn.js';\nimport { loginCommand } from './reporting/commands/login.js';\nimport { logoutCommand } from './reporting/commands/logout.js';\nimport { pushCommand } from './reporting/commands/push.js';\nimport { updateCommand } from './reporting/commands/update.js';\nimport { sbomCommand } from './reporting/commands/sbom.js';\n\n/** The set of registered subcommand names (kept in sync with registration). */\nexport const KNOWN_COMMANDS = new Set([\n 'build',\n 'status',\n 'ask',\n 'embed',\n 'show',\n 'path',\n 'tree',\n 'impact',\n 'unknowns',\n 'tests',\n 'facts',\n 'guide',\n 'why',\n 'bisect',\n 'drift',\n 'models',\n 'savings',\n 'lib',\n 'export',\n 'push',\n 'bundle',\n 'map',\n 'hubs',\n 'areas',\n 'oddities',\n 'serve',\n 'lsp',\n 'doctor',\n 'install',\n 'uninstall',\n 'share',\n 'benchmark',\n 'help',\n // Drift-reporting verbs (merged from the Vibgrate CLI).\n 'init',\n 'scan',\n 'fix',\n 'baseline',\n 'report',\n 'login',\n 'logout',\n 'dsn',\n 'update',\n 'sbom',\n]);\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name('vg')\n .description(\n 'vg — local codebase intelligence for AI coding agents: a deterministic, ' +\n 'no-API-key code graph + MCP server, drift reporting, and version-correct library docs',\n )\n .version(VERSION, '--version', 'output the version number')\n .showSuggestionAfterError(true)\n .addHelpText('after', () => {\n // Show commands with the prefix that actually runs this CLI for the reader:\n // `vg` when installed, `npx @vibgrate/cli` when they invoked it via npx.\n const cli = resolveCliInvocation();\n const aliasNote =\n cli === 'vg'\n ? 'The `vibgrate` command is an alias for `vg`.\\n'\n : cli === NPX_INVOCATION\n ? 'Install globally (`npm i -g @vibgrate/cli`) to use the shorter `vg` command.\\n'\n : '';\n return (\n `\\nRun \\`${cli}\\` to scan + map the current folder, \\`${cli} \"<question>\"\\` to ask, ` +\n `\\`${cli} status\\` for state, \\`${cli} build --verify\\` to re-verify the map.\\n` +\n `Drift: \\`${cli} scan\\` / \\`${cli} report\\`. Wire into your AI agent: \\`${cli} install\\`.\\n` +\n `${aliasNote}Docs: https://vibgrate.com/help`\n );\n });\n\n // Global flags live on each subcommand (see cli-options.applyGlobalOptions),\n // so the dispatch can place the command token first and let flags follow.\n registerBuild(program);\n registerStatus(program);\n registerAsk(program);\n registerEmbed(program);\n registerShow(program);\n registerPath(program);\n registerTree(program);\n registerInsights(program);\n registerImpact(program);\n registerUnknowns(program);\n registerServe(program);\n registerLsp(program);\n registerInstall(program);\n registerShare(program);\n registerBenchmark(program);\n registerTests(program);\n registerFacts(program);\n registerGuide(program);\n registerWhy(program);\n registerBisect(program);\n registerDrift(program);\n registerModels(program);\n registerSavings(program);\n registerLib(program);\n registerExport(program);\n registerBundle(program);\n registerDoctor(program);\n\n // Drift-reporting commands (merged from the Vibgrate CLI). `push` here is the\n // real scan-artifact upload, so it replaces the graph engine's no-op `push`.\n program.addCommand(initCommand);\n program.addCommand(scanCommand);\n program.addCommand(fixCommand);\n program.addCommand(baselineCommand);\n program.addCommand(reportCommand);\n program.addCommand(loginCommand);\n program.addCommand(logoutCommand);\n program.addCommand(dsnCommand);\n program.addCommand(pushCommand);\n program.addCommand(updateCommand);\n program.addCommand(sbomCommand);\n\n return program;\n}\n\n/**\n * The \"simple as Google\" dispatch (VG-CLI-SPEC §1):\n * vg → scan + map the current folder\n * vg <path-that-exists> → scan + map that path\n * vg \"<quoted question>\" → ask (contains a space or ends with '?')\n * vg <known-command> … → run that command\n * vg <other-word> → ask (bare-string search)\n */\n/**\n * Flags that consume the following token as their value. Includes global flags\n * and command-level value options, so the dispatcher never mistakes a flag's\n * value (e.g. the `4` in `vg --jobs 4`) for the command/positional.\n */\nconst VALUE_FLAGS = new Set([\n '-C',\n '--cwd',\n '--generated-at',\n '--graph',\n '--jobs',\n '--only',\n '--exclude',\n '--export',\n '-o',\n '--budget',\n '-b',\n]);\n\n/**\n * Build-only flags that `scan` has no equivalent for. When one of these appears\n * on an otherwise-default invocation (`vg --json`, `vg --jobs 4`, `vg . --only ts`),\n * we keep routing to `build` so the flag still means \"map\", rather than handing\n * it to `scan` (which would reject the unknown option).\n */\nconst BUILD_ONLY_FLAGS = new Set([\n '--json',\n '--jobs',\n '--only',\n '--export',\n '--graph',\n '--generated-at',\n '--no-cache',\n '--deep',\n '--scip',\n '--no-scip',\n '--tsc',\n '--no-tsc',\n '--ground',\n '--no-ground',\n '--html',\n '--no-html',\n '--report',\n '--no-report',\n '--warm',\n]);\n\nfunction hasBuildOnlyFlag(args: string[]): boolean {\n return args.some((a) => BUILD_ONLY_FLAGS.has(a.split('=')[0]));\n}\n\nexport function dispatch(argv: string[], cwd: string): string[] {\n const args = [...argv];\n const firstPositionalIdx = findFirstPositional(args);\n\n // No positional at all (e.g. `vg`, `vg --quiet`): default to scan, which also\n // builds the map (one command → DriftScore + AI/docs index). A terminal flag\n // like --help/--version is left for commander; a build-only flag keeps `build`.\n if (firstPositionalIdx === -1) {\n if (args.includes('--help') || args.includes('-h') || args.includes('--version')) {\n return args;\n }\n return [hasBuildOnlyFlag(args) ? 'build' : 'scan', ...args];\n }\n\n const first = args[firstPositionalIdx];\n\n // Explicit command → move it to the front (commander needs the command first;\n // global flags live on the subcommand so they can follow in any order).\n if (KNOWN_COMMANDS.has(first)) {\n const rest = [...args];\n rest.splice(firstPositionalIdx, 1);\n return [first, ...rest];\n }\n\n const looksLikeQuestion = /\\s/.test(first) || first.endsWith('?');\n if (looksLikeQuestion) return ['ask', ...args];\n\n // A path (relative to cwd) → scan + map it (a build-only flag keeps `build`).\n if (fs.existsSync(path.resolve(cwd, first))) {\n return [hasBuildOnlyFlag(args) ? 'build' : 'scan', ...args];\n }\n\n // Recently-moved verbs: a migration hint beats a confusing search fall-through.\n const moved = MOVED_COMMANDS[first];\n if (moved) {\n throw new CliError(`\\`vg ${first}\\` has moved to \\`${moved}\\``, ExitCode.USAGE_ERROR);\n }\n\n // Bare word that is neither a command nor a path → treat as a search query.\n return ['ask', ...args];\n}\n\n/** Verbs folded into the build lifecycle — guide the user to the new form. */\nconst MOVED_COMMANDS: Record<string, string> = {\n verify: 'vg build --verify',\n attest: 'vg build --attest',\n};\n\n/** The first real positional, skipping value-taking global flags and their values. */\nfunction findFirstPositional(args: string[]): number {\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a.startsWith('-')) {\n // `--flag=value` consumes nothing extra; a bare value-flag consumes next.\n if (VALUE_FLAGS.has(a)) i++;\n continue;\n }\n return i;\n }\n return -1;\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const raw = argv.slice(2);\n\n // Honor NO_COLOR / --no-color early so even bootstrap messages obey it.\n if (process.env.NO_COLOR || raw.includes('--no-color')) disableColor();\n\n // We need cwd for path-based dispatch; read -C/--cwd from the raw args.\n const cwd = readCwd(raw);\n\n const program = buildProgram();\n program.exitOverride((err) => {\n throw err;\n });\n // Route commander's own output through our streams; errors are handled below.\n program.configureOutput({\n writeErr: (str) => process.stderr.write(str),\n writeOut: (str) => process.stdout.write(str),\n });\n\n try {\n // dispatch() can throw (e.g. a moved-command hint) — keep it inside the\n // handler so those surface as a clean `error:` line, not a raw stack.\n const dispatched = dispatch(raw, cwd);\n await program.parseAsync(dispatched, { from: 'user' });\n } catch (err) {\n handleError(err);\n }\n}\n\nfunction readCwd(raw: string[]): string {\n const i = raw.findIndex((a) => a === '-C' || a === '--cwd');\n if (i >= 0 && raw[i + 1]) return path.resolve(raw[i + 1]);\n const eq = raw.find((a) => a.startsWith('--cwd='));\n if (eq) return path.resolve(eq.slice('--cwd='.length));\n return process.cwd();\n}\n\nfunction handleError(err: unknown): never {\n if (err instanceof CommanderError) {\n // Help/version are not errors.\n if (err.code === 'commander.helpDisplayed' || err.code === 'commander.help') {\n process.exit(ExitCode.OK);\n }\n if (err.code === 'commander.version') process.exit(ExitCode.OK);\n // Unknown command / bad option / missing argument → usage error.\n process.exit(ExitCode.USAGE_ERROR);\n }\n if (err instanceof CliError) {\n info(c.red(`error: ${err.message}`));\n process.exit(err.code);\n }\n const message = err instanceof Error ? err.message : String(err);\n const correlation = Math.random().toString(36).slice(2, 10);\n info(c.red(`error: ${message}`));\n info(c.dim(` (ref ${correlation}) — re-run with --json for detail, or report at https://vibgrate.com/help`));\n process.exit(ExitCode.ERROR);\n}\n\n// Export for programmatic/default-build use and tests.\nexport { runBuild };\n\n// Run only when invoked as the process entry (not when imported by a test or\n// the embedding API). Robust across dev (tsx .ts), the built bin, and bin\n// symlinks by comparing realpaths.\nfunction isEntry(): boolean {\n try {\n if (!process.argv[1]) return false;\n return realpathSync(process.argv[1]) === fileURLToPath(import.meta.url);\n } catch {\n return false;\n }\n}\n\nif (isEntry()) {\n void main();\n}\n"]}
1
+ {"version":3,"sources":["../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/util/output.ts","../src/util/logo.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts","../src/commands/status.ts","../src/commands/util.ts","../src/commands/ask.ts","../src/commands/embed.ts","../src/commands/ambiguity.ts","../src/commands/show.ts","../src/commands/path.ts","../src/commands/tree.ts","../src/commands/insights.ts","../src/commands/impact.ts","../src/commands/unknowns.ts","../src/engine/stats-share.ts","../src/util/origin.ts","../src/mcp/live-stats.ts","../src/mcp/serve-stats.ts","../src/mcp/ledger-tail.ts","../src/commands/serve.ts","../src/lsp/protocol.ts","../src/lsp/manifest-positions.ts","../src/lsp/scan-cache.ts","../src/lsp/graph-query.ts","../src/lsp/enrich.ts","../src/lsp/server.ts","../src/commands/lsp.ts","../src/commands/install.ts","../src/commands/share.ts","../src/commands/benchmark.ts","../src/commands/tests.ts","../src/commands/facts.ts","../src/commands/guide.ts","../src/commands/why.ts","../src/commands/bisect.ts","../src/engine/standards.ts","../src/commands/drift.ts","../src/commands/models.ts","../src/commands/savings.ts","../src/commands/lib.ts","../src/commands/export.ts","../src/commands/bundle.ts","../src/commands/doctor.ts","../src/reporting/commands/init.ts","../src/reporting/reachability.ts","../src/reporting/utils/ingest-id-output.ts","../src/reporting/ai-context-prompt.ts","../src/reporting/commands/scan.ts","../src/reporting/utils/scan-freshness.ts","../src/reporting/planning/contracts.ts","../src/reporting/planning/usage.ts","../src/reporting/utils/fix-plan.ts","../src/reporting/planning/render.ts","../src/reporting/planning/dedupe.ts","../src/reporting/planning/expected-drift.ts","../src/reporting/planning/apply.ts","../src/reporting/utils/update-check.ts","../src/reporting/commands/update.ts","../src/reporting/commands/fix.ts","../src/reporting/formatters/text.ts","../src/reporting/formatters/markdown.ts","../src/reporting/commands/report.ts","../src/reporting/utils/open-url.ts","../src/reporting/commands/login.ts","../src/reporting/utils/shell.ts","../src/reporting/commands/logout.ts","../src/reporting/commands/vex.ts","../src/reporting/commands/sbom.ts","../src/cli.ts"],"names":["fs","crypto2","resolve","chalk","path2","rel","fs2","path3","fs3","path4","out","pad","path5","fs4","key","path6","now","fs5","teal","mint","fs6","fs7","handler","path7","walk","fs8","nodeSummary","path8","fs9","path9","next","mb","fs11","c","path","parseDsn","fs14","path12","path13","fs15","fs16","path14","parsed","Command","path15","vibgrateDir","pathExists","readFile","path16","stat","path17","path18","SKIP_DIRS","fs18","path19","MAX_FILE_BYTES","escapeRegExp","fs20","path21","path22","path23","os2","fs21","fsSync","execSync","path24","os3","semver","path25","os4","readline2","path26","spawn","path27","randomUUID","path28","json","path29","fs22","path30","realpathSync","fileURLToPath"],"mappings":"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","file":"cli.js","sourcesContent":["import * as crypto from 'node:crypto';\nimport { canonicalize } from './hash.js';\nimport { VERSION } from '../version.js';\nimport type { Toolchain, VgGraph } from '../schema.js';\n\n/**\n * `vg attest` — a signed, reproducible attestation over the code graph.\n *\n * This is the moat made load-bearing: a consumer can cryptographically verify,\n * offline, that a graph was produced by a named toolchain over a named commit and\n * has not changed since. We sign an in-toto Statement wrapped in a DSSE envelope\n * with Ed25519 (`node:crypto`, zero dependencies) — interoperable with\n * `cosign verify-blob-attestation`. Ed25519 signatures are deterministic\n * (RFC 8032), so the same graph + key produce a byte-identical envelope.\n *\n * The subject digest excludes the graph's volatile `generatedAt`, so it is\n * reproducible across rebuilds of identical content — which is exactly what makes\n * the attestation verifiable rather than a timestamped snapshot.\n */\n\nexport const DSSE_PAYLOAD_TYPE = 'application/vnd.in-toto+json';\nexport const IN_TOTO_STATEMENT_TYPE = 'https://in-toto.io/Statement/v1';\nexport const VG_PREDICATE_TYPE = 'https://vibgrate.com/attestation/code-graph/v1';\n\nexport interface CommitInfo {\n sha?: string;\n shortSha?: string;\n branch?: string;\n dirty?: boolean; // uncommitted changes vs sha — never verified-clean when true\n}\n\nexport interface AttestPredicate {\n tool: { name: 'vg'; version: string };\n toolchain?: Toolchain;\n corpusHash: string;\n graphDigest: string; // sha256 of the canonical graph (generatedAt excluded)\n counts: VgGraph['meta']['counts'];\n commit?: CommitInfo;\n sbomDigest?: string; // sha256 of an accompanying SBOM, if attested together\n timestamp?: string; // optional, opt-in (omitted by default for determinism)\n}\n\nexport interface InTotoStatement {\n _type: string;\n subject: { name: string; digest: { sha256: string } }[];\n predicateType: string;\n predicate: AttestPredicate;\n}\n\nexport interface DsseSignature {\n keyid: string;\n sig: string; // base64\n publicKey?: string; // PEM, embedded so the envelope self-verifies for integrity\n}\n\nexport interface DsseEnvelope {\n payloadType: string;\n payload: string; // base64 of the Statement JSON\n signatures: DsseSignature[];\n}\n\nexport function sha256Hex(input: string | Uint8Array): string {\n return crypto.createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * sha256 over the canonical graph with the volatile `generatedAt` excluded, so\n * two builds of identical content attest to the same digest.\n */\nexport function graphSubjectDigest(graph: VgGraph): string {\n const { generatedAt: _omit, ...rest } = graph;\n return sha256Hex(canonicalize(rest));\n}\n\n/** The 16-hex key id: a truncated sha256 over the SPKI DER public key. */\nexport function keyId(publicKey: crypto.KeyObject): string {\n return sha256Hex(publicKey.export({ type: 'spki', format: 'der' })).slice(0, 16);\n}\n\nexport interface StatementInput {\n commit?: CommitInfo;\n sbomDigest?: string;\n timestamp?: string;\n}\n\nexport function buildStatement(graph: VgGraph, input: StatementInput = {}): InTotoStatement {\n const graphDigest = graphSubjectDigest(graph);\n const predicate: AttestPredicate = {\n tool: { name: 'vg', version: VERSION },\n toolchain: graph.provenance.toolchain,\n corpusHash: graph.provenance.corpusHash,\n graphDigest,\n counts: graph.meta.counts,\n };\n if (input.commit) predicate.commit = input.commit;\n if (input.sbomDigest) predicate.sbomDigest = input.sbomDigest;\n if (input.timestamp) predicate.timestamp = input.timestamp;\n return {\n _type: IN_TOTO_STATEMENT_TYPE,\n subject: [{ name: 'graph.json', digest: { sha256: graphDigest } }],\n predicateType: VG_PREDICATE_TYPE,\n predicate,\n };\n}\n\n/**\n * DSSE Pre-Authentication Encoding:\n * \"DSSEv1\" SP len(type) SP type SP len(body) SP body\n * with lengths as ASCII decimal byte counts. Signing the PAE (not the raw body)\n * is what binds the payloadType to the signature.\n */\nexport function dssePae(payloadType: string, body: Uint8Array): Buffer {\n const typeBytes = Buffer.from(payloadType, 'utf8');\n const header = Buffer.from(\n `DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `,\n 'utf8',\n );\n return Buffer.concat([header, Buffer.from(body)]);\n}\n\n/** Sign a statement, returning a self-contained DSSE envelope. */\nexport function signStatement(statement: InTotoStatement, privateKey: crypto.KeyObject): DsseEnvelope {\n const body = Buffer.from(JSON.stringify(statement), 'utf8');\n const pae = dssePae(DSSE_PAYLOAD_TYPE, body);\n const sig = crypto.sign(null, pae, privateKey);\n // Derive the public key from the private key (via its PEM, for @types/node compat).\n const publicKey = crypto.createPublicKey(privateKey.export({ type: 'pkcs8', format: 'pem' }).toString());\n return {\n payloadType: DSSE_PAYLOAD_TYPE,\n payload: body.toString('base64'),\n signatures: [\n {\n keyid: keyId(publicKey),\n sig: sig.toString('base64'),\n publicKey: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n },\n ],\n };\n}\n\nexport type AttestStatus = 'verified' | 'signature-valid' | 'failed';\n\nexport interface VerifyResult {\n status: AttestStatus;\n signatureValid: boolean;\n signerPinned: boolean; // signature verified against a caller-supplied trusted key\n digestMatches?: boolean; // recomputed graph digest matches the attested one\n dirty?: boolean; // the attested commit had uncommitted changes\n keyid: string;\n reason: string;\n statement: InTotoStatement;\n}\n\n/**\n * Verify an envelope. Honest states, never a fabricated pass:\n * failed — bad signature, or the on-disk graph no longer matches.\n * signature-valid — cryptographically intact, but signer not pinned (or dirty).\n * verified — pinned signer + matching digest + clean tree.\n */\n/** An empty statement for results where the envelope could not even be parsed. */\nfunction emptyStatement(): InTotoStatement {\n return {\n _type: '',\n subject: [],\n predicateType: '',\n predicate: {\n tool: { name: 'vg', version: '' },\n corpusHash: '',\n graphDigest: '',\n counts: { nodes: 0, edges: 0, areas: 0, tests: 0, untested: 0 },\n },\n };\n}\n\nfunction failedResult(reason: string): VerifyResult {\n return {\n status: 'failed',\n signatureValid: false,\n signerPinned: false,\n keyid: '',\n reason,\n statement: emptyStatement(),\n };\n}\n\nexport function verifyEnvelope(\n env: DsseEnvelope,\n opts: { publicKeyPem?: string; graph?: VgGraph } = {},\n): VerifyResult {\n // A `.intoto.jsonl` is attacker-supplied input: every decode/parse/key step\n // must degrade to an honest `failed`, never crash the command.\n let body: Buffer;\n let statement: InTotoStatement;\n try {\n body = Buffer.from(env?.payload ?? '', 'base64');\n const parsed = JSON.parse(body.toString('utf8')) as InTotoStatement;\n if (!parsed || typeof parsed !== 'object' || !parsed.predicate) {\n throw new Error('missing predicate');\n }\n statement = parsed;\n } catch {\n return failedResult('malformed attestation payload (not a valid in-toto statement)');\n }\n\n const pae = dssePae(env.payloadType, body);\n const sig0 = env.signatures?.[0];\n const keyid = sig0?.keyid ?? '';\n const sig = sig0?.sig ? Buffer.from(sig0.sig, 'base64') : Buffer.alloc(0);\n\n let signatureValid = false;\n let signerPinned = false;\n try {\n if (sig0 && sig.length) {\n if (opts.publicKeyPem) {\n const pinnedKey = crypto.createPublicKey(opts.publicKeyPem);\n signatureValid = crypto.verify(null, pae, pinnedKey, sig);\n signerPinned = signatureValid;\n } else if (sig0.publicKey) {\n const embeddedKey = crypto.createPublicKey(sig0.publicKey);\n signatureValid = crypto.verify(null, pae, embeddedKey, sig);\n }\n }\n } catch {\n // Malformed key or signature bytes → not a valid signature (not a crash).\n signatureValid = false;\n signerPinned = false;\n }\n\n const digestMatches = opts.graph\n ? graphSubjectDigest(opts.graph) === statement.predicate.graphDigest\n : undefined;\n const dirty = statement.predicate.commit?.dirty;\n\n let status: AttestStatus;\n let reason: string;\n if (!signatureValid) {\n status = 'failed';\n reason = sig0 ? 'signature verification failed' : 'no signature in envelope';\n } else if (digestMatches === false) {\n status = 'failed';\n reason = 'graph.json no longer matches the attested digest (content changed since signing)';\n } else if (signerPinned && !dirty) {\n status = 'verified';\n reason =\n digestMatches === true\n ? 'signature valid, signer trusted, graph digest matches'\n : 'signature valid, signer trusted';\n } else {\n status = 'signature-valid';\n reason = dirty\n ? 'signature valid but the attested tree was dirty (uncommitted changes)'\n : 'signature valid but signer not pinned — pass --pub to establish trust';\n }\n\n return { status, signatureValid, signerPinned, digestMatches, dirty, keyid, reason, statement };\n}\n\nexport interface GeneratedKeypair {\n privatePem: string;\n publicPem: string;\n keyid: string;\n}\n\n/** Mint a fresh Ed25519 keypair for signing attestations. */\nexport function generateKeypair(): GeneratedKeypair {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');\n return {\n privatePem: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),\n publicPem: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n keyid: keyId(publicKey),\n };\n}\n\n/** Serialize an envelope as a single-line `.intoto.jsonl` record (deterministic). */\nexport function serializeEnvelope(env: DsseEnvelope): string {\n return `${JSON.stringify(env)}\\n`;\n}\n\nexport function parseEnvelope(text: string): DsseEnvelope {\n const line = text.trim().split('\\n')[0];\n return JSON.parse(line) as DsseEnvelope;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { execFile } from 'node:child_process';\nimport { loadGraph } from '../engine/load.js';\nimport { resolveHead, workingTreeDirty } from '../core-open/utils/git-history.js';\nimport {\n buildStatement,\n signStatement,\n verifyEnvelope,\n generateKeypair,\n serializeEnvelope,\n parseEnvelope,\n type CommitInfo,\n type VerifyResult,\n} from '../engine/attest.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Attestation actions folded into the graph lifecycle: `vg build --attest` signs\n * the graph it just built; `vg build --verify` checks a committed attestation.\n * The crypto lives in engine/attest.ts; this is the file/key/git glue + output.\n */\n\nconst DEFAULT_ATTESTATION = 'attestation.intoto.jsonl';\nconst DEFAULT_KEY = 'attest-key.pem';\n\nexport interface SignOpts {\n /** Signing key PEM path; else $VG_ATTEST_KEY; else .vibgrate/attest-key.pem (auto-minted). */\n key?: string;\n /** Output path for the attestation (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n}\n\nexport interface SignSummary {\n keyid: string;\n graphDigest: string;\n fingerprint?: string;\n commit?: CommitInfo;\n out: string;\n keyGeneratedAt?: string;\n}\n\n/** Sign an already-built graph, writing a DSSE attestation. Returns a summary +\n * human notices (the caller decides how to render them alongside build output). */\nexport async function signGraphAttestation(\n root: string,\n graph: VgGraph,\n opts: SignOpts,\n): Promise<{ summary: SignSummary; notices: string[] }> {\n const notices: string[] = [];\n const explicitKey = opts.key ?? process.env.VG_ATTEST_KEY;\n const keyPath = explicitKey ? path.resolve(explicitKey) : path.join(root, '.vibgrate', DEFAULT_KEY);\n\n let keyGeneratedAt: string | undefined;\n if (!fs.existsSync(keyPath)) {\n if (explicitKey) {\n throw new CliError(`signing key not found: ${explicitKey}`, ExitCode.USAGE_ERROR);\n }\n // First use with no key: mint one at the default path (loud — it must be kept\n // and gitignored to re-sign reproducibly).\n const kp = generateKeypair();\n fs.mkdirSync(path.dirname(keyPath), { recursive: true });\n fs.writeFileSync(keyPath, kp.privatePem, { mode: 0o600 });\n fs.writeFileSync(`${keyPath}.pub`, kp.publicPem);\n keyGeneratedAt = keyPath;\n notices.push(\n `minted a new Ed25519 signing key at ${rel(root, keyPath)} (keyid ${kp.keyid}) — ` +\n `keep it, add it to .gitignore, and reuse it to re-sign reproducibly`,\n );\n }\n\n let privateKey: crypto.KeyObject;\n try {\n privateKey = crypto.createPrivateKey(fs.readFileSync(keyPath, 'utf8'));\n } catch {\n throw new CliError(`could not read an Ed25519 private key from ${rel(root, keyPath)}`, ExitCode.USAGE_ERROR);\n }\n if (privateKey.asymmetricKeyType !== 'ed25519') {\n throw new CliError(\n `attest requires an Ed25519 key, but ${rel(root, keyPath)} is ${privateKey.asymmetricKeyType ?? 'unknown'}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const commit = await gitCommitInfo(root);\n const statement = buildStatement(graph, { commit });\n const envelope = signStatement(statement, privateKey);\n const outPath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, serializeEnvelope(envelope));\n\n return {\n summary: {\n keyid: envelope.signatures[0]?.keyid ?? '',\n graphDigest: statement.predicate.graphDigest,\n fingerprint: statement.predicate.toolchain?.fingerprint,\n commit,\n out: rel(root, outPath),\n keyGeneratedAt: keyGeneratedAt ? rel(root, keyGeneratedAt) : undefined,\n },\n notices,\n };\n}\n\nexport interface VerifyOpts {\n /** Attestation path (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n /** Public key PEM to pin the signer (else integrity-only verification). */\n pub?: string;\n}\n\nexport interface AttestVerifyOutcome {\n bundlePath: string;\n /** True when no attestation exists at the default path (and none was required). */\n missing: boolean;\n result?: VerifyResult;\n}\n\n/** Verify a committed attestation against the on-disk graph. Returns the outcome\n * (the caller renders + decides the exit code). Throws only when an attestation\n * was explicitly requested but is absent. */\nexport function verifyGraphAttestation(root: string, opts: VerifyOpts): AttestVerifyOutcome {\n const bundlePath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n if (!fs.existsSync(bundlePath)) {\n if (opts.attestation || opts.pub) {\n throw new CliError(\n `no attestation at ${rel(root, bundlePath)} — sign one with \\`vg build --attest\\``,\n ExitCode.NOT_FOUND,\n );\n }\n return { bundlePath, missing: true };\n }\n const envelope = parseEnvelope(fs.readFileSync(bundlePath, 'utf8'));\n const publicKeyPem = opts.pub ? fs.readFileSync(path.resolve(opts.pub), 'utf8') : undefined;\n const graph = loadGraph(root) ?? undefined;\n return { bundlePath, missing: false, result: verifyEnvelope(envelope, { publicKeyPem, graph }) };\n}\n\nasync function gitCommitInfo(root: string): Promise<CommitInfo | undefined> {\n const sha = await resolveHead(root);\n if (!sha) return undefined;\n const dirty = await workingTreeDirty(root);\n const branch = await gitBranch(root);\n return { sha, shortSha: sha.slice(0, 7), branch, dirty: dirty === true ? true : dirty === false ? false : undefined };\n}\n\n/** Best-effort current branch name; undefined on detached HEAD or no git. */\nfunction gitBranch(root: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { cwd: root, timeout: 5000, windowsHide: true, encoding: 'utf8' },\n (err, stdout) => {\n if (err) return resolve(undefined);\n const name = String(stdout).trim();\n resolve(name && name !== 'HEAD' ? name : undefined);\n },\n );\n });\n}\n\nfunction rel(root: string, p: string): string {\n const r = path.relative(root, p);\n return r.startsWith('..') ? p : r;\n}\n","import chalk from 'chalk';\n\n/**\n * Output conventions (VG-CLI-SPEC §1.1): human output + progress → stderr;\n * machine output (JSON/exports) → stdout. So `vg \"…\" --json | jq` and\n * `vg export - …` pipe cleanly.\n */\n\nexport function info(message = ''): void {\n process.stderr.write(`${message}\\n`);\n}\n\nexport function out(message: string): void {\n process.stdout.write(`${message}\\n`);\n}\n\nexport function json(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport const c = chalk;\n\n/** Honor NO_COLOR / --no-color via chalk's level (set by the CLI bootstrap). */\nexport function disableColor(): void {\n chalk.level = 0;\n}\n","import { c } from './output.js';\nimport { VERSION } from '../version.js';\n\n/**\n * The `vg` brand banner — the same boxy robot mark and brand colours (teal/mint)\n * as the Vibgrate scanner (`vibgrate-cli/src/ui/progress.ts`), replicated here so\n * the open graph package stays standalone.\n *\n * The wordmark is stacked BELOW the mark rather than beside it: the robot's eye\n * (`◼`) and arrow (`➜`) glyphs are East-Asian \"ambiguous\"/wide, so terminals that\n * render them double-width make the rows unequal — text placed to their right\n * (the scanner's layout) then misaligns. Nothing sits beside the art here, so the\n * banner lines up in every terminal. Shown on `vg build` for a human at a TTY;\n * never on `--json`, `--quiet`, or under a pipe.\n */\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\n// ── Boxy robot mark — identical glyphs/colours to the scanner's ROBOT ──\nconst ROBOT = [\n ' ' + teal('╭──────╮') + mint('➜'),\n ' ' + c.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + c.dim('├'),\n ' ' + c.dim('┤') + teal('│') + ' ' + c.dim('▁▁') + ' ' + teal('│') + c.dim('├'),\n ' ' + teal('╰──────╯'),\n] as const;\n\n/**\n * The banner as lines (no I/O) so it is unit-testable. The robot mark is a\n * self-contained block; the wordmark/tagline sit on their OWN lines beneath it\n * (never beside the variable-width glyphs), so the banner aligns in any terminal.\n */\nexport function logoLines(root?: string, opts: { product?: string; tagline?: string } = {}): string[] {\n const product = opts.product ?? 'Graph';\n const tagline = opts.tagline ?? 'Code Intelligence Engine';\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('Vibgrate')} ${teal(product)} ${c.dim(`· ${tagline} · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the banner to stderr, only for an interactive human (TTY). */\nexport function printLogo(root?: string, opts: { product?: string; tagline?: string } = {}): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${logoLines(root, opts).join('\\n')}\\n`);\n}\n","import { c } from './output.js';\nimport { brandProgressBar } from '../core-open/ui/bar.js';\n\n/**\n * A small progress bar matching the scanner's style\n * (`vibgrate-core-open/src/ui/progress.ts`): a smooth sub-cell gradient bar\n * (shared `brandProgressBar`), a braille spinner, percent, elapsed and ETA.\n * Renders to **stderr** in place, and only when stderr is a TTY — under a\n * pipe/CI it stays silent so logs aren't polluted.\n */\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst WIDTH = 30;\n\nfunction fmtDuration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n}\n\n/**\n * Pure render of one progress line (no I/O, no clock) so it is unit-testable.\n * `elapsedMs` and `frame` are passed in by the caller.\n */\nexport function formatProgressLine(\n label: string,\n done: number,\n total: number,\n elapsedMs: number,\n frame: number,\n): string {\n const ratio = total > 0 ? Math.min(done / total, 1) : 0;\n const bar = brandProgressBar(ratio, WIDTH);\n const pct = Math.round(ratio * 100);\n const spin = c.cyan(FRAMES[((frame % FRAMES.length) + FRAMES.length) % FRAMES.length]);\n const eta = ratio > 0.02 && ratio < 1 ? ` · eta ${fmtDuration((elapsedMs / ratio) * (1 - ratio))}` : '';\n return ` ${spin} ${label} ${bar} ${c.bold(`${pct}%`)} ${c.dim(`${done}/${total} · ${fmtDuration(elapsedMs)}${eta}`)}`;\n}\n\n/** Live, in-place progress bar on stderr (no-op when stderr isn't a TTY). */\nexport class ProgressBar {\n private readonly start = Date.now();\n private frame = 0;\n private readonly tty = Boolean(process.stderr.isTTY);\n\n constructor(private readonly label: string) {}\n\n update(done: number, total: number): void {\n if (!this.tty) return;\n const line = formatProgressLine(this.label, done, total, Date.now() - this.start, this.frame++);\n process.stderr.write(`\\r\\x1b[2K${line}`);\n }\n\n /** Clear the bar; optionally print a final summary line. */\n done(summary?: string): void {\n if (!this.tty) return;\n process.stderr.write('\\r\\x1b[2K');\n if (summary) process.stderr.write(`${summary}\\n`);\n }\n}\n","import type { Command } from 'commander';\n\n/** Global flags shared across all `vg` commands (VG-CLI-SPEC §1.1). */\nexport interface GlobalOpts {\n /** -C, --cwd <dir> */\n cwd?: string;\n /** --deep */\n deep?: boolean;\n /** --json */\n json?: boolean;\n /** --generated-at <iso> */\n generatedAt?: string;\n /** --graph <file> (override the map path) */\n graph?: string;\n /** --no-cache (commander exposes this as `cache: false`) */\n noCache?: boolean;\n /** --local (never touch the network) */\n local?: boolean;\n /** --quiet */\n quiet?: boolean;\n /**\n * --client <name> — the AI on the other end (e.g. `claude`, `cursor`). When an\n * AI host runs `vg`, passing this lets navigation calls be counted in the local\n * savings ledger with the command-vs-MCP split, so `vg savings` and the opt-in\n * share-stats upload can attribute usage. Counts only; a coarse label, not\n * identity (sanitized before it's recorded). Absent for human-run commands.\n */\n client?: string;\n}\n\n/**\n * Attach the global flags to a command. They live on every subcommand (rather\n * than only the program) so the \"simple as Google\" dispatch can put the command\n * token first and let flags appear in any order after it.\n */\nexport function applyGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>', '.')\n .option('--deep', 'do more: precise resolution, all edges, semantic links')\n .option('--json', 'machine-readable JSON on stdout')\n .option('--generated-at <iso>', 'pin the artifact timestamp for byte-deterministic output')\n .option('--graph <file>', 'override the map path')\n .option('--no-cache', 'full rebuild (ignore the incremental cache)')\n .option('--local', 'never touch the network (lexical-only semantic)')\n .option('--quiet', 'suppress progress output')\n .option('--client <name>', 'identify the AI client (e.g. claude) so navigation calls are counted in vg savings')\n .option('--no-color', 'disable colored output');\n}\n\n/** Read the global subset from a command's parsed options. */\nexport function readGlobal(cmd: Command): GlobalOpts {\n const o = cmd.opts<Record<string, unknown>>();\n return {\n cwd: o.cwd as string | undefined,\n deep: o.deep as boolean | undefined,\n json: o.json as boolean | undefined,\n generatedAt: o.generatedAt as string | undefined,\n graph: o.graph as string | undefined,\n noCache: o.cache === false,\n local: o.local as boolean | undefined,\n quiet: o.quiet as boolean | undefined,\n client: o.client as string | undefined,\n };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { verifyDeterminism } from '../engine/verify.js';\nimport { epistemicBreakdown } from '../engine/epistemic.js';\nimport { signGraphAttestation, verifyGraphAttestation, type SignSummary } from './attest-actions.js';\nimport { isModelReady, countPending, resolveEmbedModel } from '../engine/embeddings.js';\nimport type { VgGraph } from '../schema.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshInstalledInstructions, SMALL_REPO_FILES } from '../install/registry.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { renderReport } from '../engine/report.js';\nimport { renderHtml } from '../engine/html.js';\nimport { UsageError } from '../engine/discover.js';\nimport { ResourceLimitError } from '../engine/limits.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, out, json } from '../util/output.js';\nimport { printLogo } from '../util/logo.js';\nimport { ProgressBar } from '../util/progress.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\ninterface BuildCmdOpts {\n only?: string;\n exclude?: string[];\n html?: boolean;\n report?: boolean;\n ground?: boolean;\n jobs?: string;\n scip?: string | boolean;\n tsc?: boolean;\n export?: string;\n warm?: boolean;\n grammars?: string;\n attest?: boolean;\n verify?: boolean;\n attestKey?: string;\n attestation?: string;\n pub?: string;\n}\n\nexport function registerBuild(program: Command): void {\n const cmd = program\n .command('build')\n .description('build / update the code map (incremental, deterministic)')\n .argument('[paths...]', 'folders or files to map (default: current folder)')\n .option('--only <langs>', 'restrict to languages, e.g. ts,py,go')\n .option('--exclude <glob>', 'extra ignore glob (repeatable)', collect, [])\n .option('--no-html', 'do not write graph.html')\n .option('--no-report', 'do not write GRAPH_REPORT.md')\n .option('--no-ground', 'do not attach grounding (Phase 2)')\n .option('--jobs <n>', 'worker count (1 = single-threaded)')\n .option('--scip <file>', 'ingest a SCIP index for precise resolution (default: auto-detect index.scip)')\n .option('--no-scip', 'ignore any SCIP index')\n .option('--no-tsc', 'skip the in-process TypeScript resolver (heuristic floor only)')\n .option('--no-warm', 'do not warm the semantic index in the background after building')\n .option('--grammars <dir>', 'directory of grammar .wasm files (offline / air-gapped)')\n .option('-o, --export <file>', 'also write the map to a file (format inferred)')\n .option('--attest', 'sign the built graph → .vibgrate/attestation.intoto.jsonl')\n .option('--verify', 'verify a committed attestation against the graph (no rebuild)')\n .option('--attest-key <path>', 'signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)')\n .option('--attestation <file>', 'attestation path (out for --attest, in for --verify)')\n .option('--pub <path>', 'public key PEM to pin the signer (with --verify)')\n .action(async function (this: Command, paths: string[], opts: BuildCmdOpts) {\n await runBuild(paths, opts, readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n\n // `vg build --verify`: the single verification entry point — determinism\n // self-check plus (if present) attestation verification.\n if (opts.verify) {\n await verifyGraph(root, opts, global);\n return;\n }\n\n // Brand banner + live parse progress for an interactive human while the index\n // builds (TTY only; both are no-ops under --json/--quiet/pipe so machine output\n // stays clean).\n const interactive = !global.json && !global.quiet;\n if (interactive) printLogo(path.basename(root) || root);\n const bar = interactive ? new ProgressBar(c.dim('parsing')) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n if (jobs !== undefined && (!Number.isInteger(jobs) || jobs < 1)) {\n throw usageError(`--jobs must be a positive integer (got \"${opts.jobs}\")`);\n }\n\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n let result;\n try {\n result = await buildGraph({\n root,\n paths: paths.length ? paths : undefined,\n only,\n exclude: opts.exclude,\n jobs,\n noCache: global.noCache,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n generatedAt: global.generatedAt,\n onParseProgress: bar ? (done, total) => bar.update(done, total) : undefined,\n grammarsDir: opts.grammars,\n });\n } catch (err) {\n bar?.done();\n if (err instanceof UsageError) throw usageError(err.message);\n // A resource safeguard fired (file-count cap, heap budget, worker OOM) —\n // the message already carries the remedy; surface it without a stack.\n if (err instanceof ResourceLimitError) throw new CliError(err.message, ExitCode.ERROR);\n throw err;\n }\n bar?.done();\n\n const written = writeArtifacts(result.graph, {\n root,\n html: opts.html,\n report: opts.report,\n graphPath: global.graph,\n });\n\n // Record the freshness snapshot (stat+hash per corpus file, plus this build's\n // scope) so `vg serve`/`vg ask` can auto-refresh the map when the tree drifts.\n // Skipped for a custom --graph target: that is an explicit artifact the\n // auto-refresh machinery must not manage.\n if (!global.graph) {\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, {\n only,\n exclude: opts.exclude,\n paths: paths.length ? paths : undefined,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n grammarsDir: opts.grammars,\n });\n }\n\n if (opts.export) writeExport(result.graph, opts.export);\n\n // Bring previously-installed assistant instructions (skill/nudge files from\n // `vg install`) up to the current content version — so evolved instructions\n // reach this repo the first time a new CLI builds here. Only files carrying\n // vg's own version marker (or the exact legacy generated content) are\n // touched; a custom --graph build is an explicit artifact and skips this.\n if (!global.graph) {\n const fileCount = result.graph.nodes.filter((n) => n.kind === 'file').length;\n const refreshed = refreshInstalledInstructions(root, fileCount > 0 && fileCount < SMALL_REPO_FILES);\n if (interactive) {\n for (const r of refreshed) {\n info(c.dim(`vg · refreshed assistant instructions ${r.file} (v${r.from} → v${r.to})`));\n }\n }\n }\n\n // `--attest`: sign the freshly-built graph → .vibgrate/attestation.intoto.jsonl.\n let attestation: SignSummary | undefined;\n const attestNotices: string[] = [];\n if (opts.attest) {\n const signed = await signGraphAttestation(root, result.graph, {\n key: opts.attestKey,\n attestation: opts.attestation,\n });\n attestation = signed.summary;\n attestNotices.push(...signed.notices);\n }\n\n if (global.json) {\n json({\n ok: true,\n counts: result.graph.meta.counts,\n languages: result.graph.meta.languages,\n reparsed: result.reparsed,\n reused: result.reused,\n totalFiles: result.totalFiles,\n resolve: result.resolveStats,\n tsc: result.tsc,\n scip: result.scip,\n epistemic: epistemicBreakdown(result.graph.edges),\n artifacts: written,\n corpusHash: result.graph.provenance.corpusHash,\n toolchain: result.graph.provenance.toolchain,\n attestation,\n timingMs: result.timing.totalMs,\n warnings: result.warnings,\n });\n return;\n }\n\n const { counts } = result.graph.meta;\n const incremental =\n result.reused > 0\n ? `incremental: ${result.reparsed} of ${result.totalFiles} files re-parsed`\n : `${result.totalFiles} files parsed`;\n const seconds = (result.timing.totalMs / 1000).toFixed(2);\n info(`${c.cyan('vg')} · mapped ${rel(root)} in ${seconds}s (${incremental})`);\n info(\n ` nodes ${c.bold(String(counts.nodes))} edges ${c.bold(String(counts.edges))} ` +\n `areas ${counts.areas} langs ${result.graph.meta.languages.join(',') || '—'}`,\n );\n const callPct =\n result.resolveStats.callsResolved + result.resolveStats.callsUnresolved > 0\n ? Math.round(\n (100 * result.resolveStats.callsResolved) /\n (result.resolveStats.callsResolved + result.resolveStats.callsUnresolved),\n )\n : 100;\n // When a precise rung ran it is authoritative; callPct is only the heuristic\n // floor (label it so, to avoid understating the precise result below).\n const precise = result.tsc || result.scip;\n const callLabel = precise ? `heuristic floor ${callPct}%` : `calls resolved ${callPct}%`;\n info(c.dim(` ${callLabel} · resolver ${result.graph.provenance.resolver.join(',')}`));\n if (result.tsc) {\n const jsx = result.tsc.jsx > 0 ? `, ${result.tsc.jsx} JSX` : '';\n info(c.dim(` tsc: ${result.tsc.resolved} precise edges across ${result.tsc.files} TS/JS files (${result.tsc.calls} calls${jsx})`));\n }\n if (result.scip) {\n info(c.dim(` scip: ${result.scip.resolved} precise edges from ${result.scip.tool ?? 'index'} (${result.scip.documents} docs)`));\n }\n const ep = epistemicBreakdown(result.graph.edges);\n info(\n c.dim(\n ` edges by evidence · observed ${ep.observed} · name-matched ${ep['name-matched']} · declared ${ep.declared}`,\n ),\n );\n const artifactList = [written.graphPath, written.htmlPath, written.reportPath]\n .filter(Boolean)\n .map((p) => path.relative(root, p as string))\n .join(' ');\n info(` → ${artifactList}`);\n if (result.warnings.length) {\n info(c.yellow(` ${result.warnings.length} parse warning(s) — run with --json for detail`));\n }\n if (attestation) {\n for (const n of attestNotices) info(c.yellow(` ${n}`));\n info(\n c.dim(\n ` attested · keyid ${attestation.keyid} · digest ${attestation.graphDigest.slice(0, 16)}… → ${attestation.out}`,\n ),\n );\n }\n\n maybeWarmEmbeddings(root, result.graph, global, opts.warm !== false);\n}\n\n/**\n * `vg build --verify` — the single verification entry point. Runs the determinism\n * self-check (byte-identical rebuilds + toolchain fingerprint) and, when an\n * attestation is present, verifies it against the on-disk graph. Exit 4 on a\n * determinism failure, exit 2 on an attestation failure.\n */\nasync function verifyGraph(root: string, opts: BuildCmdOpts, global: GlobalOpts): Promise<void> {\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n const det = await verifyDeterminism({ root, only, exclude: opts.exclude, jobs });\n const attest = verifyGraphAttestation(root, { attestation: opts.attestation, pub: opts.pub });\n const attestFailed = !attest.missing && attest.result?.status === 'failed';\n\n if (global.json) {\n json({\n ok: det.ok && !attestFailed,\n determinism: { ok: det.ok, checks: det.checks, digest: det.digest },\n attestation: attest.missing\n ? null\n : {\n status: attest.result?.status,\n signatureValid: attest.result?.signatureValid,\n signerPinned: attest.result?.signerPinned,\n digestMatches: attest.result?.digestMatches,\n dirty: attest.result?.dirty,\n keyid: attest.result?.keyid,\n reason: attest.result?.reason,\n },\n });\n } else {\n info(`${c.cyan('vg build --verify')} · ${path.relative(process.cwd(), root) || '.'}`);\n for (const check of det.checks) {\n const mark = check.ok ? c.green('✔') : c.red('✘');\n const detail = check.detail ? c.dim(` (${check.detail})`) : '';\n info(` ${mark} ${check.name}${detail}`);\n }\n info(det.ok ? c.green(` deterministic · digest ${det.digest.slice(0, 16)}…`) : c.red(' NON-DETERMINISTIC'));\n if (attest.missing) {\n info(c.dim(` attestation: none (sign one with \\`vg build --attest\\`)`));\n } else {\n const r = attest.result;\n const badge =\n r?.status === 'verified'\n ? c.green('✔ attestation verified')\n : r?.status === 'signature-valid'\n ? c.yellow('~ attestation signature valid')\n : c.red('✘ attestation failed');\n info(` ${badge}${r?.keyid ? c.dim(` · keyid ${r.keyid}`) : ''}`);\n info(c.dim(` ${r?.reason ?? ''}`));\n }\n }\n\n if (!det.ok) throw new CliError('determinism self-check failed', ExitCode.NON_DETERMINISTIC);\n if (attestFailed) throw new CliError('attestation verification failed', ExitCode.GATE_FAILED);\n}\n\n/**\n * After an interactive build we have just committed to a code graph, so the\n * user is likely to run `vg ask`/`vg serve` next — start warming the semantic\n * index in the background now so that first semantic call is instant instead of\n * paying a cold model load. If the model isn't downloaded yet, the background\n * warm fetches it (once, centrally) rather than deferring the whole cost to the\n * first `ask`. Disabled with `--no-warm`; skipped under --json/--quiet/--local\n * and when not at a TTY (so CI never auto-downloads). The detached child runs\n * `vg embed --bg [--download]`; a lock prevents it racing a foreground `ask`.\n */\nfunction maybeWarmEmbeddings(root: string, graph: VgGraph, global: GlobalOpts, warm: boolean): void {\n if (!warm || global.json || global.quiet || global.local) return;\n if (!process.stdout.isTTY && !process.stderr.isTTY) return;\n const cli = process.argv[1];\n if (!cli) return;\n const modelId = resolveEmbedModel();\n const ready = isModelReady(modelId);\n // Already fully warm: model present and every node embedded → nothing to do.\n if (ready && countPending(graph, root, modelId) === 0) return;\n // When the model isn't on this machine yet, start the one-time download now\n // (the graph is built; the next semantic call shouldn't wait for it).\n const args = ready\n ? [cli, 'embed', '-C', root, '--bg']\n : [cli, 'embed', '-C', root, '--bg', '--download'];\n try {\n const child = spawn(process.execPath, args, { detached: true, stdio: 'ignore' });\n child.unref();\n info(\n c.dim(\n ready\n ? ' warming the semantic index in the background — `vg ask` will be instant'\n : ' downloading the semantic model in the background (once) — `vg ask`/`vg serve` will be instant; disable with --no-warm',\n ),\n );\n } catch {\n /* warm-up is best-effort */\n }\n}\n\nfunction writeExport(graph: Parameters<typeof serializeGraph>[0], target: string): void {\n if (target === '-') {\n out(serializeGraph(graph).trimEnd());\n return;\n }\n const ext = path.extname(target).toLowerCase();\n let content: string;\n switch (ext) {\n case '.json':\n content = serializeGraph(graph);\n break;\n case '.md':\n content = renderReport(graph);\n break;\n case '.html':\n content = renderHtml(graph);\n break;\n default:\n throw new CliError(\n `cannot export to \"${ext || target}\" yet — supported in Phase 0: .json, .md, .html, \"-\" (stdout). ` +\n `More formats (graphml, dot, cypher) arrive with \\`vg export\\` in Phase 1.`,\n ExitCode.USAGE_ERROR,\n );\n }\n fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });\n fs.writeFileSync(target, content);\n}\n\nfunction collect(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nfunction rel(root: string): string {\n const r = path.relative(process.cwd(), root);\n return r === '' ? '.' : r;\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { defaultGraphPath, vibgrateDir } from '../engine/artifacts.js';\nimport { cacheDir } from '../engine/cache.js';\nimport { discover } from '../engine/discover.js';\nimport { probeFreshness, driftCount } from '../engine/freshness.js';\nimport { c, info, json } from '../util/output.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\n/**\n * `vg status` — cache/freshness, counts, staleness, resolver rungs used.\n * Read-only; compares the committed graph against the working tree.\n */\nexport function registerStatus(program: Command): void {\n const cmd = program\n .command('status')\n .description('cache/freshness, counts, staleness, resolver rungs used')\n .action(async function (this: Command) {\n await runStatus(readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nasync function runStatus(global: GlobalOpts): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n const graphPath = global.graph ?? defaultGraphPath(root);\n const graph = loadGraph(root, graphPath);\n const hasCache = fs.existsSync(path.join(cacheDir(root), 'parse-cache.json'));\n\n // Determine staleness deterministically. Preferred path: the freshness\n // snapshot (stat+hash per corpus file, written by every build) gives an\n // exact per-file answer — content edits, adds, AND removes. Fallback when\n // no snapshot exists on this machine: \"files present now\" vs \"the graph's\n // node file set\", which sees adds/removes but not content edits.\n let stale: number | null = null;\n let staleExact = false;\n if (graph) {\n const probe = probeFreshness(root);\n if (probe) {\n stale = driftCount(probe.drift);\n staleExact = true;\n } else {\n const files = discover({ root });\n let changed = 0;\n const graphFiles = new Set(graph.nodes.filter((n) => n.kind === 'file').map((n) => n.file));\n const currentFiles = new Set(files.map((f) => f.rel));\n for (const f of currentFiles) if (!graphFiles.has(f)) changed++;\n for (const f of graphFiles) if (!currentFiles.has(f)) changed++;\n stale = changed;\n }\n }\n\n if (global.json) {\n json({\n root: path.relative(process.cwd(), root) || '.',\n graphPath: path.relative(root, graphPath),\n built: graph !== null,\n generatedAt: graph?.generatedAt ?? null,\n counts: graph?.meta.counts ?? null,\n languages: graph?.meta.languages ?? [],\n cluster: graph?.meta.cluster ?? null,\n resolver: graph?.provenance.resolver ?? [],\n corpusHash: graph?.provenance.corpusHash ?? null,\n cache: hasCache,\n staleFiles: stale,\n staleExact,\n });\n return;\n }\n\n if (!graph) {\n info(`${c.cyan('vg')} · no map yet at ${c.dim(path.relative(root, graphPath))}`);\n info(` run ${c.bold('vg')} to build one`);\n return;\n }\n\n info(`${c.cyan('vg')} · ${path.relative(root, graphPath)}`);\n info(` generated ${graph.generatedAt}`);\n info(\n ` nodes ${c.bold(String(graph.meta.counts.nodes))} edges ${c.bold(\n String(graph.meta.counts.edges),\n )} areas ${graph.meta.counts.areas} langs ${graph.meta.languages.join(',') || '—'}`,\n );\n info(` cluster ${graph.meta.cluster} · resolver ${graph.provenance.resolver.join(',')}`);\n info(` cache ${hasCache ? c.green('warm') : c.dim('cold')} · corpus ${graph.provenance.corpusHash.slice(0, 12)}…`);\n if (stale && stale > 0) {\n info(c.yellow(` ${stale} file(s) changed since last build — run ${c.bold('vg')} to refresh`));\n } else {\n info(c.dim(' up to date'));\n }\n if (vibgrateDir(root)) {\n /* artifact dir exists implicitly */\n }\n}\n","import * as path from 'node:path';\nimport { loadGraph } from '../engine/load.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport type { VgGraph } from '../schema.js';\n\nexport function rootOf(global: GlobalOpts): string {\n return path.resolve(global.cwd ?? '.');\n}\n\n/** Load the committed graph, or fail with an actionable NOT_FOUND error. */\nexport function requireGraph(global: GlobalOpts): { root: string; graph: VgGraph } {\n const root = rootOf(global);\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no map found — run \\`vg\\` to build one first` +\n (global.graph ? ` (looked at ${global.graph})` : ''),\n ExitCode.NOT_FOUND,\n );\n }\n return { root, graph };\n}\n","import { Command } from 'commander';\nimport { queryGraph, queryGraphSemantic, type QueryResult } from '../engine/query.js';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n resolveEmbedModel,\n embeddingsCached,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { driftCount } from '../engine/freshness.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { c, info, json, out } from '../util/output.js';\nimport { ProgressBar } from '../util/progress.js';\n\n/**\n * `vg ask \"<question>\"` (VG-CLI-SPEC §3.2). Hybrid lexical+structural+semantic\n * retrieval **on by default** — no API key, no flags. A local ONNX embedding\n * model is downloaded once on first use (then cached and fully offline) and\n * blends with the always-on deterministic lexical floor. It degrades gracefully\n * to lexical alone under `--local`, `--no-semantic`, on an unsupported platform,\n * or if the model can't be fetched — `ask` never fails. The context block goes\n * to stdout (pipeable); notes/progress to stderr.\n *\n * Before answering, `ask` auto-refreshes the map if the working tree drifted\n * since the last build (incremental, fail-soft; `--no-refresh` opts out), so\n * answers reflect the code as it is now — not as it was last built.\n */\nexport function registerAsk(program: Command): void {\n const cmd = program\n .command('ask')\n .description('ask the map — returns a budget-bounded context block')\n .argument('<question...>', 'your question (a bare quoted string also works: vg \"…\")')\n .option('-b, --budget <n>', 'approx token budget for the answer', '2000')\n .option('--no-semantic', 'lexical only (skip the local-embedding pass)')\n .option('--no-refresh', 'answer from the map as built — skip the auto-rebuild when files change')\n .action(async function (this: Command, question: string[], opts: { budget?: string; semantic?: boolean; refresh?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n // Answer from a map that matches the working tree: a cheap freshness\n // probe, then an incremental rebuild only if files really drifted. A\n // custom --graph is an explicit artifact and is never rebuilt over.\n // Fail-soft — a refresh problem falls back to the last built map.\n if (opts.refresh !== false && !global.graph) {\n const refreshed = await refreshIfStale(root);\n if (refreshed.status === 'refreshed' && !global.json) {\n const n = driftCount(refreshed.drift);\n info(c.dim(` map refreshed — ${n} file(s) drifted (${(refreshed.ms / 1000).toFixed(2)}s)`));\n } else if (refreshed.status === 'error' && !global.json) {\n info(c.yellow(` map refresh failed (${refreshed.message}) — answering from the last built map`));\n }\n }\n const { graph } = requireGraph(global);\n const budget = Number(opts.budget) || 2000;\n const q = question.join(' ');\n // Semantic is the default; --no-semantic or --local opt out.\n const wantSemantic = opts.semantic !== false && !global.local;\n\n let result: QueryResult;\n let mode = 'lexical';\n let note = '';\n\n if (wantSemantic) {\n // A genuine first run for this repo (no cached vectors yet) → show a\n // one-time note + live progress bar for the embedding pass. Otherwise stay quiet.\n const firstRun = !embeddingsCached(root, resolveEmbedModel());\n if (!global.json && firstRun) {\n info(c.dim(' preparing semantic search (first use embeds the map; cached, resumable & offline after)…'));\n }\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({ local: global.local, onUnavailable: (r) => (reason = r) });\n if (embedder) {\n const bar = !global.json && firstRun ? new ProgressBar(c.dim('embedding')) : undefined;\n const vectors = await getNodeEmbeddings(graph, embedder, root, bar ? (d, t) => bar.update(d, t) : undefined);\n bar?.done();\n result = await queryGraphSemantic(graph, q, { budget, embedder, nodeVectors: vectors });\n mode = `semantic (${embedder.id})`;\n } else {\n result = queryGraph(graph, q, { budget });\n note = reason ? unavailableMessage(reason) : 'semantic unavailable; used lexical';\n }\n } else {\n result = queryGraph(graph, q, { budget });\n if (global.local) note = 'semantic skipped under --local; used lexical';\n }\n\n // Count this call in the local ledger when an AI host identified itself\n // (`--client`). `ask` is the CLI twin of the MCP `query_graph` tool, so it\n // records under that shared name with source `cli` — that's the\n // command-vs-MCP split `vg savings` reports.\n if (global.client) {\n const files = new Set(result.matches.map((m) => m.node.file).filter(Boolean));\n recordCliCall(\n root,\n {\n tool: CLI_TOOL_ALIASES.ask,\n client: global.client,\n outcome: result.matches.length === 0 ? 'miss' : 'complete',\n vgTokens: result.tokensEstimate,\n baselineFiles: files.size,\n },\n Date.now(),\n );\n }\n\n if (global.json) {\n json({\n question: result.question,\n mode,\n note: note || undefined,\n tokensEstimate: result.tokensEstimate,\n matches: result.matches.map((m) => ({\n name: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span.start,\n score: m.score,\n why: m.why,\n })),\n context: result.context,\n });\n return;\n }\n\n out(result.context);\n info('');\n info(c.dim(`vg · ${result.matches.length} match(es) · ~${result.tokensEstimate} tokens (budget ${budget}) · ${mode}`));\n if (note) info(c.yellow(` ${note}`));\n });\n applyGlobalOptions(cmd);\n}\n","import { Command, Option } from 'commander';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n resolveEmbedModel,\n countPending,\n embeddingsCached,\n modelCacheInfo,\n clearModelCache,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\nimport { ProgressBar } from '../util/progress.js';\n\nfunction mb(bytes: number): string {\n if (bytes <= 0) return '0 MB';\n if (bytes < 1024 * 1024) return `${Math.max(1, Math.round(bytes / 1024))} KB`;\n return `${Math.round(bytes / (1024 * 1024))} MB`;\n}\n\n/**\n * `vg embed` — precompute the semantic index (node embeddings) so the next\n * `vg ask` is instant. The model is downloaded once per machine into a central,\n * home-folder cache (XDG `~/.cache/vibgrate/models`; no admin/sudo needed) shared\n * across all repos; per-repo vectors live in `.vibgrate/cache/`.\n *\n * `--where` shows the cache location/size; `--clear` removes the model. The\n * hidden `--bg` flag warms silently and never downloads (the `vg build` warm-up).\n */\nexport function registerEmbed(program: Command): void {\n const cmd = program\n .command('embed')\n .description('precompute the semantic index for instant `vg ask` (or --where / --clear)')\n .option('--where', 'show where the model is cached, and its size')\n .option('--clear', 'remove the downloaded model from the shared cache')\n // --bg: the silent background warm-up spawned by `vg build`. It skips the\n // model download by default; `--download` lets that background warm fetch\n // the model too, so a graph build starts the one-time download immediately\n // and the next `vg serve`/`vg ask` is instant instead of paying a cold load.\n .addOption(new Option('--bg').hideHelp())\n .addOption(new Option('--download').hideHelp())\n .action(async function (this: Command, opts: { where?: boolean; clear?: boolean; bg?: boolean; download?: boolean }) {\n const global = readGlobal(this);\n const modelId = resolveEmbedModel();\n\n // --where / --clear don't need a built graph.\n if (opts.where) return showWhere(rootOf(global), modelId, global.json);\n if (opts.clear) return doClear(global.json);\n\n const { graph } = requireGraph(global);\n const root = rootOf(global);\n const bg = opts.bg === true;\n const speak = !bg && !global.json;\n\n if (global.local) {\n if (speak) info(c.dim('vg embed · semantic is off (--local) — lexical search only'));\n return;\n }\n if (countPending(graph, root, modelId) === 0) {\n if (global.json) json({ embedded: 0, pending: 0, upToDate: true, model: modelId });\n else if (speak) info(`${c.cyan('vg embed')} · semantic index already up to date`);\n return;\n }\n\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({\n local: global.local,\n // Background warm-ups skip the download unless explicitly asked to fetch\n // (`--bg --download`, spawned by `vg build` so the model is ready by the\n // time `vg serve`/`vg ask` needs it).\n noDownload: bg && opts.download !== true,\n showDownloadProgress: !bg,\n onUnavailable: (r) => (reason = r),\n });\n if (!embedder) {\n // Calm, specific fallback — never a stack trace. (bg stays silent.)\n if (speak && reason) info(c.dim(`vg embed · ${unavailableMessage(reason)}`));\n return;\n }\n\n const pending = countPending(graph, root, modelId);\n const bar = speak ? new ProgressBar(c.dim('embedding')) : undefined;\n await getNodeEmbeddings(graph, embedder, root, bar ? (d, t) => bar.update(d, t) : undefined);\n bar?.done();\n if (global.json) json({ embedded: pending, model: modelId });\n else if (speak) info(`${c.green('✔')} vg embed · semantic index ready (~${pending} node(s) · model ${modelId})`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction showWhere(root: string, modelId: string, asJson?: boolean): void {\n const m = modelCacheInfo(modelId);\n const repoCached = embeddingsCached(root, modelId);\n if (asJson) {\n json({ model: modelId, cacheDir: m.dir, present: m.present, bytes: m.bytes, repoEmbeddings: repoCached });\n return;\n }\n info(`${c.cyan('vg embed')} · model cache`);\n info(` model ${c.bold(modelId)}`);\n info(` shared at ${m.dir}`);\n info(` ${m.present ? c.green(`present · ~${mb(m.bytes)}`) : c.dim('not downloaded yet (fetched on first semantic ask)')}`);\n info(` this repo ${repoCached ? c.green('embeddings cached') : c.dim('not embedded yet — run `vg embed`')}`);\n info(c.dim(' no admin/sudo needed — the cache is in your home folder, shared across all repos.'));\n info(c.dim(' turn off: run with --local · relocate: XDG_CACHE_HOME=<dir> · remove: vg embed --clear'));\n}\n\nfunction doClear(asJson?: boolean): void {\n const before = modelCacheInfo();\n const freed = clearModelCache();\n if (asJson) {\n json({ removed: before.present, bytesFreed: freed, dir: before.dir });\n return;\n }\n if (!before.present || freed === 0) {\n info(`${c.cyan('vg embed')} · no model in the shared cache — nothing to remove (${before.dir})`);\n return;\n }\n info(`${c.green('✔')} vg embed · removed the shared model (~${mb(freed)}) from ${before.dir}`);\n info(c.dim(' repos use fast lexical search until the next semantic ask re-downloads it.'));\n}\n","import { CliError, ExitCode } from '../util/exit.js';\nimport type { GraphNode } from '../schema.js';\n\n/**\n * Build a NOT_FOUND error that lists ambiguous candidates with `--pick` hints,\n * so the message is actionable (VG-CLI-SPEC §3.3). `pickFlag` lets multi-argument\n * commands point at the right flag (e.g. `vg path` uses `--pick-a`/`--pick-b`).\n */\nexport function ambiguityError(summary: string, candidates: GraphNode[], pickFlag = '--pick'): CliError {\n if (candidates.length === 0) {\n return new CliError(`${summary} — try \\`vg hubs\\` or a broader name/glob`, ExitCode.NOT_FOUND);\n }\n const lines = candidates\n .slice(0, 10)\n .map((n, i) => ` ${i + 1}. ${n.qualifiedName} (${n.kind}, ${n.file}:${n.span.start})`);\n const more = candidates.length > 10 ? `\\n …and ${candidates.length - 10} more` : '';\n return new CliError(\n `${summary} — pick one with ${pickFlag} <n>:\\n${lines.join('\\n')}${more}`,\n ExitCode.NOT_FOUND,\n );\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { indexFor } from '../engine/relations.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg show <name>` (VG-CLI-SPEC §3.3) — the richest single-node view: what it\n * is, its callers and callees and other edges, its area and importance.\n * (Facts + grounding are attached in Phase 2.)\n */\nexport function registerShow(program: Command): void {\n const cmd = program\n .command('show')\n .description('explain a node: what it is, what it calls, what calls it')\n .argument('<name>', 'qualified name, short name, file:line, glob, or id')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n\n if (!node) {\n if (candidates.length === 0) {\n throw ambiguityError(`no node matches \"${name}\"`, []);\n }\n throw ambiguityError(`\"${name}\" is ambiguous`, candidates);\n }\n\n const index = indexFor(graph);\n const callees = dedupe(index.callees(node.id).map((x) => x.node));\n const callers = dedupe(index.callers(node.id).map((x) => x.node));\n const extendsEdges = index.out(node.id, 'extends').concat(index.out(node.id, 'implements'));\n const supertypes = extendsEdges.map((e) => index.node(e.dst)?.qualifiedName).filter(Boolean);\n const area = graph.areas.find((a) => a.id === node.area);\n\n // `show` is the CLI twin of the MCP `get_node` tool — record it under that\n // shared name (source `cli`) when an AI host identified itself. Baseline =\n // the node's file plus each caller/callee file a grep/read agent would open.\n if (global.client) {\n const files = new Set<string>([node.file]);\n for (const n of [...callees, ...callers]) if (n.file) files.add(n.file);\n const shown =\n node.qualifiedName +\n (node.signature ?? '') +\n callees.map((n) => n.qualifiedName).join('') +\n callers.map((n) => n.qualifiedName).join('');\n recordCliCall(\n rootOf(global),\n {\n tool: CLI_TOOL_ALIASES.show,\n client: global.client,\n outcome: 'complete',\n vgTokens: countTokens(shown),\n baselineFiles: files.size,\n },\n Date.now(),\n );\n }\n\n if (global.json) {\n json({\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n centrality: node.centrality,\n isHub: node.isHub,\n area: node.area,\n areaLabel: area?.label ?? null,\n tested: node.tested,\n calls: callees.map((n) => n.qualifiedName),\n calledBy: callers.map((n) => n.qualifiedName),\n extends: supertypes,\n });\n return;\n }\n\n info(`${c.cyan(node.qualifiedName)} ${c.dim(`(${node.kind})`)}`);\n info(` ${c.dim(`${node.file}:${node.span.start}`)}`);\n if (node.signature) info(` ${c.bold(node.signature)}`);\n info(\n ` importance ${node.importance.toFixed(3)}${node.isHub ? c.yellow(' ★ hub') : ''} · area #${node.area}${area ? ` ${c.dim(area.label)}` : ''}`,\n );\n if (supertypes.length) info(` ${c.dim('extends:')} ${supertypes.join(', ')}`);\n info(` ${c.dim('calls')} (${callees.length}): ${callees.slice(0, 12).map((n) => n.qualifiedName).join(', ') || '—'}`);\n info(` ${c.dim('called by')} (${callers.length}): ${callers.slice(0, 12).map((n) => n.qualifiedName).join(', ') || '—'}`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction dedupe<T extends { id: string }>(nodes: T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const n of nodes) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out;\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { shortestPath } from '../engine/paths.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg path <A> <B>` (VG-CLI-SPEC §4.1) — how A connects to B (shortest path).\n */\nexport function registerPath(program: Command): void {\n const cmd = program\n .command('path')\n .description('how A connects to B (shortest path)')\n .argument('<a>', 'source node')\n .argument('<b>', 'target node')\n .option('--pick-a <n>', 'pick the nth candidate for A when ambiguous')\n .option('--pick-b <n>', 'pick the nth candidate for B when ambiguous')\n .action(function (this: Command, a: string, b: string, opts: { pickA?: string; pickB?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n\n const ra = resolveOne(graph, a, opts.pickA ? Number(opts.pickA) : undefined);\n if (!ra.node) throw ambiguityError(`\"${a}\" ${ra.candidates.length ? 'is ambiguous' : 'not found'}`, ra.candidates, '--pick-a');\n const rb = resolveOne(graph, b, opts.pickB ? Number(opts.pickB) : undefined);\n if (!rb.node) throw ambiguityError(`\"${b}\" ${rb.candidates.length ? 'is ambiguous' : 'not found'}`, rb.candidates, '--pick-b');\n\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n // Record the call for the command-vs-MCP split when an AI identified itself\n // (before the not-found throw, so a no-path attempt is counted as a miss).\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.path, client: global.client, outcome: result ? 'complete' : 'miss' },\n Date.now(),\n );\n }\n if (!result) {\n throw new CliError(\n `no path between ${ra.node.qualifiedName} and ${rb.node.qualifiedName}`,\n ExitCode.NOT_FOUND,\n );\n }\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const names = result.ids.map((id) => byId.get(id)?.qualifiedName ?? id);\n\n if (global.json) {\n json({ from: ra.node.qualifiedName, to: rb.node.qualifiedName, hops: names.length - 1, direction: result.direction, path: names });\n return;\n }\n\n info(`${c.cyan('vg path')} · ${names.length - 1} hop(s)${result.direction === 'reverse' ? c.dim(' (reverse)') : ''}`);\n info(' ' + names.map((n) => c.bold(n)).join(c.dim(' → ')));\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { GraphIndex, indexFor } from '../engine/relations.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\nimport type { GraphNode } from '../schema.js';\n\n/**\n * `vg tree <name>` (VG-CLI-SPEC §2/§3) — the call tree rooted at a node\n * (callees by default; `--callers` to invert), depth-bounded and cycle-safe.\n */\nexport function registerTree(program: Command): void {\n const cmd = program\n .command('tree')\n .description('the call tree rooted at a node (callees; --callers to invert)')\n .argument('<name>', 'root node')\n .option('--callers', 'show callers instead of callees')\n .option('--depth <n>', 'max depth', '3')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { callers?: boolean; depth?: string; pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const index = indexFor(graph);\n const maxDepth = Math.max(1, Number(opts.depth) || 3);\n const direction = opts.callers ? 'callers' : 'callees';\n // Record the call for the command-vs-MCP split when an AI identified itself.\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.tree, client: global.client, outcome: 'complete' },\n Date.now(),\n );\n }\n\n if (global.json) {\n json(toJsonTree(index, node, direction, maxDepth, new Set()));\n return;\n }\n\n info(`${c.cyan('vg tree')} · ${direction} of ${c.bold(node.qualifiedName)} (depth ${maxDepth})`);\n const lines: string[] = [];\n walk(index, node, direction, maxDepth, 0, new Set(), lines, '');\n for (const l of lines) info(l);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction next(index: GraphIndex, node: GraphNode, direction: 'callers' | 'callees'): GraphNode[] {\n const rel = direction === 'callees' ? index.callees(node.id) : index.callers(node.id);\n const seen = new Set<string>();\n const out: GraphNode[] = [];\n for (const { node: n } of rel) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out.sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName));\n}\n\nfunction walk(\n index: GraphIndex,\n node: GraphNode,\n direction: 'callers' | 'callees',\n maxDepth: number,\n depth: number,\n visited: Set<string>,\n lines: string[],\n prefix: string,\n): void {\n if (depth === 0) lines.push(`${c.bold(node.qualifiedName)} ${c.dim(`(${node.kind})`)}`);\n if (depth >= maxDepth) return;\n if (visited.has(node.id)) {\n lines.push(`${prefix}${c.dim('↻ (cycle)')}`);\n return;\n }\n visited.add(node.id);\n const children = next(index, node, direction);\n children.forEach((child, i) => {\n const last = i === children.length - 1;\n const branch = last ? '└─ ' : '├─ ';\n const cyc = visited.has(child.id) ? c.dim(' ↻') : '';\n lines.push(`${prefix}${c.dim(branch)}${child.qualifiedName}${cyc}`);\n walk(index, child, direction, maxDepth, depth + 1, new Set(visited), lines, prefix + (last ? ' ' : c.dim('│ ')));\n });\n}\n\nexport function toJsonTree(\n index: GraphIndex,\n node: GraphNode,\n direction: 'callers' | 'callees',\n maxDepth: number,\n visited: Set<string>,\n): unknown {\n if (maxDepth <= 0 || visited.has(node.id)) {\n return { name: node.qualifiedName, kind: node.kind, cycle: visited.has(node.id) };\n }\n const nextVisited = new Set(visited).add(node.id);\n return {\n name: node.qualifiedName,\n kind: node.kind,\n children: next(index, node, direction).map((child) =>\n toJsonTree(index, child, direction, maxDepth - 1, nextVisited),\n ),\n };\n}\n","import { Command } from 'commander';\nimport { renderReport } from '../engine/report.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { c, info, json, out } from '../util/output.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Map insights (VG-CLI-SPEC §4.1): `vg map`, `vg hubs`, `vg areas`,\n * `vg oddities`. Read-only views over the committed graph.\n */\nexport function registerInsights(program: Command): void {\n const map = program\n .command('map')\n .description('the overview report (areas, hubs, untested hotspots)')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n if (global.json) json(reportJson(graph));\n else out(renderReport(graph));\n });\n applyGlobalOptions(map);\n\n const hubs = program\n .command('hubs')\n .description('the most-depended-on code (centrality outliers)')\n .option('-n, --limit <n>', 'how many to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n const list = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, limit);\n if (global.json) {\n json(list.map(nodeSummary));\n return;\n }\n info(`${c.cyan('vg hubs')} · top ${list.length} by importance`);\n for (const n of list) {\n const hub = n.isHub ? c.yellow(' ★') : '';\n info(` ${pad(n.importance.toFixed(3), 6)} ${c.bold(n.qualifiedName)}${hub} ${c.dim(`${n.file}:${n.span.start}`)}`);\n }\n });\n applyGlobalOptions(hubs);\n\n const areas = program\n .command('areas')\n .description('the natural groupings (communities), each labelled and sized')\n .option('-n, --limit <n>', 'how many to show', '30')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 30;\n const list = [...graph.areas].sort((a, b) => b.size - a.size || a.id - b.id).slice(0, limit);\n if (global.json) {\n json(list);\n return;\n }\n info(`${c.cyan('vg areas')} · ${graph.areas.length} communities (${graph.meta.cluster})`);\n for (const a of list) {\n info(\n ` ${c.bold(`#${a.id}`)} ${a.label} ${c.dim(`${a.size} nodes · cohesion ${a.cohesion.toFixed(2)} · ${a.externalEdges} external`)}`,\n );\n }\n });\n applyGlobalOptions(areas);\n\n const oddities = program\n .command('oddities')\n .description('surprising cross-area links (architectural smells)')\n .option('-n, --limit <n>', 'how many to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const list = graph.edges\n .filter((e) => typeof e.surprise === 'number' && e.surprise > 0)\n .sort((a, b) => (b.surprise ?? 0) - (a.surprise ?? 0) || a.id.localeCompare(b.id))\n .slice(0, limit);\n if (global.json) {\n json(\n list.map((e) => ({\n kind: e.kind,\n surprise: e.surprise,\n from: byId.get(e.src)?.qualifiedName ?? e.src,\n to: byId.get(e.dst)?.qualifiedName ?? e.dst,\n })),\n );\n return;\n }\n if (!list.length) {\n info(`${c.cyan('vg oddities')} · none found (no cross-area links, or only one area)`);\n return;\n }\n info(`${c.cyan('vg oddities')} · top ${list.length} surprising links`);\n for (const e of list) {\n const from = byId.get(e.src)?.qualifiedName ?? e.src;\n const to = byId.get(e.dst)?.qualifiedName ?? e.dst;\n info(` ${pad((e.surprise ?? 0).toFixed(2), 5)} ${c.bold(from)} ${c.dim(`—${e.kind}→`)} ${c.bold(to)}`);\n }\n });\n applyGlobalOptions(oddities);\n}\n\nfunction nodeSummary(n: GraphNode) {\n return {\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n isHub: n.isHub,\n area: n.area,\n };\n}\n\nfunction reportJson(graph: VgGraph) {\n return {\n counts: graph.meta.counts,\n languages: graph.meta.languages,\n cluster: graph.meta.cluster,\n areas: graph.areas.length,\n hubs: graph.nodes.filter((n) => n.isHub).length,\n };\n}\n\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { impactOf } from '../engine/impact.js';\nimport { testsToRun, detectRunner } from '../engine/test-query.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg impact <name>` (VG-CLI-SPEC §3.5) — what breaks if you change it: the\n * deterministic structural blast radius (reverse reachability + decay\n * confidence), and with `--tests`, exactly the tests to run before shipping.\n * `--fail-on-untested` is a CI gate (exit 2).\n */\nexport function registerImpact(program: Command): void {\n const cmd = program\n .command('impact')\n .description('what breaks if you change it — and the tests to run')\n .argument('<name>', 'node to assess')\n .option('--depth <n>', 'max depth', '4')\n .option('--tests', 'also select the tests to run for the affected set')\n .option('--fail-on-untested', 'exit 2 if any affected node is untested')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { depth?: string; tests?: boolean; failOnUntested?: boolean; pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const depth = Number(opts.depth) || 4;\n const result = impactOf(graph, node.id, { depth });\n // Record the call for the command-vs-MCP split when an AI identified itself.\n if (global.client) {\n recordCliCall(\n rootOf(global),\n { tool: CLI_TOOL_ALIASES.impact, client: global.client, outcome: 'complete' },\n Date.now(),\n );\n }\n const withTests = opts.tests || opts.failOnUntested;\n const ti = withTests ? testsToRun(graph, node.id, depth) : undefined;\n const runner = ti ? detectRunner(rootOf(global), node.lang) : undefined;\n\n if (global.json) {\n json({\n ...result,\n tests: ti\n ? { toRun: ti.affectedTestFiles, command: runner?.command(ti.affectedTestFiles), untestedAffected: ti.untestedAffected }\n : undefined,\n });\n } else {\n info(`${c.cyan('Impact of')} ${c.bold(result.root.name)}`);\n info(` Affected (${result.affected.length}) ▸ ${result.direct} direct, ${result.transitive} transitive (depth ≤ ${result.depth})`);\n const preview = result.affected.slice(0, 15);\n for (const a of preview) {\n info(` ${c.dim(`d${a.depth}`)} ${a.name} ${c.dim(`${a.file}:${a.line} · conf ${a.confidence.toFixed(2)}`)}`);\n }\n if (result.affected.length > preview.length) info(c.dim(` …and ${result.affected.length - preview.length} more (use --json)`));\n if (result.minEdgeConfidence < 1) info(c.dim(` lowest edge confidence ${result.minEdgeConfidence.toFixed(2)} (ambiguous/dynamic edges lower it)`));\n if (ti) {\n info(` ${c.cyan(`Tests to run (${ti.affectedTestFiles.length})`)} ▸ ${ti.affectedTestFiles.join(' · ') || c.dim('none found')}`);\n if (runner && ti.affectedTestFiles.length) info(c.dim(` $ ${runner.command(ti.affectedTestFiles)}`));\n if (ti.untestedAffected.length) info(c.yellow(` ${ti.untestedAffected.length} affected node(s) are untested`));\n }\n }\n\n if (opts.failOnUntested && ti && ti.untestedAffected.length > 0) {\n throw new CliError(\n `${ti.untestedAffected.length} affected node(s) are untested: ${ti.untestedAffected.slice(0, 5).map((u) => u.name).join(', ')}`,\n ExitCode.GATE_FAILED,\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { impactOf } from '../engine/impact.js';\nimport { c, info, json } from '../util/output.js';\nimport type { GraphNode, Unknown, VgGraph } from '../schema.js';\n\n/**\n * `vg unknowns` — the honest inverse of a scanner that hides its blind spots.\n *\n * The graph records every heuristic reference it could not resolve (a call to a\n * name with no reachable definition, a supertype it could not connect), minus any\n * site a precise rung already covered. This command ranks those blind spots by\n * *blast radius*: an unresolved call inside a hub is far more consequential than\n * one in a leaf, because the graph is blind about a node everything depends on.\n * Deterministic: same graph → same ranking.\n */\n\n// Bound the impact BFS work: rank the most-central candidate sites exactly and\n// note if the tail was ordered by centrality alone.\nconst IMPACT_CANDIDATE_CAP = 200;\n\nexport interface Site {\n node: GraphNode;\n refs: Unknown[];\n total: number; // total unresolved occurrences at this site\n blastRadius: number; // transitive dependents (blind-spot reach)\n direct: number;\n transitive: number;\n}\n\nexport interface RankedUnknowns {\n sites: Site[];\n totalSites: number; // distinct sites with unknowns\n /** True when more sites existed than were exactly blast-radius scored (see cap). */\n capped: boolean;\n}\n\nexport function registerUnknowns(program: Command): void {\n const cmd = program\n .command('unknowns')\n .description('what the graph cannot resolve, ranked by blast radius')\n .option('-n, --limit <n>', 'how many sites to show', '20')\n .action(function (this: Command, opts: { limit?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const limit = Number(opts.limit) || 20;\n\n const ranked = rankUnknowns(graph, limit);\n const { sites, totalSites, capped } = ranked;\n const totalRefs = (graph.unknowns ?? []).reduce((n, u) => n + u.count, 0);\n\n if (global.json) {\n json({\n unresolvedReferences: totalRefs,\n sites: totalSites,\n shown: sites.length,\n blastRankedCandidateCap: capped ? IMPACT_CANDIDATE_CAP : null,\n top: sites.map((s) => ({\n id: s.node.id,\n name: s.node.qualifiedName,\n kind: s.node.kind,\n file: s.node.file,\n line: s.node.span.start,\n importance: s.node.importance,\n blastRadius: s.blastRadius,\n direct: s.direct,\n transitive: s.transitive,\n unresolved: s.refs.map((r) => ({ name: r.name, kind: r.kind, count: r.count })),\n })),\n });\n return;\n }\n\n if (totalRefs === 0) {\n info(\n `${c.cyan('vg unknowns')} · none — every heuristic reference resolved ` +\n `(or was covered by a precise rung)`,\n );\n return;\n }\n\n info(\n `${c.cyan('vg unknowns')} · ${c.bold(String(totalRefs))} unresolved reference(s) at ` +\n `${totalSites} site(s) · top ${sites.length} by blast radius`,\n );\n for (const s of sites) {\n info(\n ` ${c.yellow(pad(String(s.blastRadius), 5))} ${c.bold(s.node.qualifiedName)} ` +\n c.dim(`${s.node.file}:${s.node.span.start} · importance ${s.node.importance.toFixed(3)}`),\n );\n info(` ${c.dim('cannot resolve:')} ${s.refs.map(fmtRef).join(', ')}`);\n }\n info(\n c.dim(\n ` blast radius = transitive dependents; these are the code paths the graph is blind about`,\n ),\n );\n if (capped) {\n info(\n c.dim(\n ` note: ${totalSites} sites have unknowns; only the top ${IMPACT_CANDIDATE_CAP} by ` +\n `centrality were blast-radius scored (the tail is ordered by centrality alone)`,\n ),\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/** Group unknowns by their originating node and rank by blast radius. */\nexport function rankSites(graph: VgGraph, limit: number): Site[] {\n return rankUnknowns(graph, limit).sites;\n}\n\n/** Group unknowns by originating node, rank by blast radius, and report truncation. */\nexport function rankUnknowns(graph: VgGraph, limit: number): RankedUnknowns {\n const unknowns = graph.unknowns ?? [];\n if (unknowns.length === 0) return { sites: [], totalSites: 0, capped: false };\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const grouped = new Map<string, Unknown[]>();\n for (const u of unknowns) {\n const list = grouped.get(u.from);\n if (list) list.push(u);\n else grouped.set(u.from, [u]);\n }\n\n // Only sites whose node still exists; pre-rank by centrality so the exact\n // (bounded) impact pass runs on the most consequential candidates first.\n const candidates: { node: GraphNode; refs: Unknown[]; total: number }[] = [];\n for (const [from, refs] of grouped) {\n const node = byId.get(from);\n if (!node) continue;\n candidates.push({ node, refs, total: refs.reduce((n, r) => n + r.count, 0) });\n }\n candidates.sort(\n (a, b) => b.node.importance - a.node.importance || a.node.id.localeCompare(b.node.id),\n );\n\n const scored: Site[] = candidates.slice(0, IMPACT_CANDIDATE_CAP).map((cand) => {\n const impact = impactOf(graph, cand.node.id);\n return {\n ...cand,\n blastRadius: impact.affected.length,\n direct: impact.direct,\n transitive: impact.transitive,\n };\n });\n\n scored.sort(\n (a, b) =>\n b.blastRadius - a.blastRadius ||\n b.node.importance - a.node.importance ||\n b.total - a.total ||\n a.node.id.localeCompare(b.node.id),\n );\n\n return {\n sites: scored.slice(0, limit),\n totalSites: candidates.length,\n capped: candidates.length > IMPACT_CANDIDATE_CAP,\n };\n}\n\nfunction fmtRef(r: Unknown): string {\n const times = r.count > 1 ? ` ×${r.count}` : '';\n const kind = r.kind === 'call' ? '' : ` (${r.kind})`;\n return `${r.name}${kind}${times}`;\n}\n\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from '../reporting/regions.js';\nimport type { SavingEntry, Source, Outcome } from './savings.js';\n\n/**\n * Opt-in usage-stats sharing for `vg serve --share-stats`.\n *\n * This is the ONLY path in `vg serve` that sends anything off the machine, and\n * it is off unless the operator explicitly asks for it. What we send is the\n * same counts-only ledger `vg savings` reports locally — per (source, client,\n * tool, outcome): how many calls and the vg-vs-grep token figures — plus the vg\n * version, OS/arch, and a random per-install id. We never send code, file paths,\n * question text, repo identity, or any credential. See GUARDRAILS §3.4.\n *\n * Even when the flag is passed, the universal `DO_NOT_TRACK` opt-out (or\n * `VIBGRATE_TELEMETRY=0`) wins: nothing is uploaded and no install id is ever\n * minted or persisted (see `telemetryOptOut` / `installId`).\n *\n * Design:\n * - The local ledger (savings.jsonl) is the single source of truth; the flusher\n * reads only the tail past a persisted byte offset, so a batch is sent once.\n * - Fire-and-forget with a short timeout. A network problem never blocks a tool\n * call and never throws — the offset only advances on a confirmed 2xx, so a\n * failed batch is retried on the next flush.\n * - Fully offline-safe: under `--local` the sharer is never constructed.\n */\n\n/** Payload schema version — must match the server's `mcpUsageStatsSchema`. */\nconst SCHEMA_VERSION = '1';\n/** Where the offset (and cached install id) live, per repo, beside the ledger. */\nconst OFFSET_FILE = 'stats-share.json';\n/** The machine-global anonymous install id lives here (stable across repos). */\nconst INSTALL_ID_DIR = path.join(os.homedir(), '.vibgrate');\nconst INSTALL_ID_FILE = path.join(INSTALL_ID_DIR, 'install-id');\n/** Give a flush POST a hard ceiling so a hung endpoint never stalls shutdown. */\nconst SEND_TIMEOUT_MS = 4000;\n\n/** One aggregated row of the shared batch — counts only. */\nexport interface StatsRow {\n source: Source;\n client: string;\n tool: string;\n outcome: Outcome;\n calls: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\n/** The counts-only batch POSTed to the ingest endpoint. */\nexport interface StatsBatch {\n schemaVersion: string;\n installId: string;\n vgVersion: string;\n os: string;\n arch: string;\n windowStart: string;\n windowEnd: string;\n totalCalls: number;\n rows: StatsRow[];\n}\n\n/**\n * The universal opt-out (https://consoledonottrack.com) plus a tool-specific\n * alias, honoured even when `--share-stats` is passed explicitly. Pure function\n * of the environment for testability. Returns the name of the variable that\n * opted out (for the disclosure message), or null when sharing may proceed.\n */\nexport function telemetryOptOut(env: NodeJS.ProcessEnv = process.env): string | null {\n const dnt = (env.DO_NOT_TRACK ?? '').trim().toLowerCase();\n if (dnt !== '' && dnt !== '0' && dnt !== 'false') return 'DO_NOT_TRACK';\n const vt = (env.VIBGRATE_TELEMETRY ?? '').trim().toLowerCase();\n if (vt === '0' || vt === 'false' || vt === 'off') return 'VIBGRATE_TELEMETRY';\n return null;\n}\n\n/** Common CI environment markers — a CI runner is never an interactive session. */\nconst CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'TRAVIS',\n 'BUILDKITE',\n 'JENKINS_URL',\n 'TF_BUILD',\n] as const;\n\n/** True when running under a recognised CI system. Pure function of the env. */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return CI_ENV_VARS.some((v) => {\n const val = (env[v] ?? '').trim().toLowerCase();\n return val !== '' && val !== '0' && val !== 'false';\n });\n}\n\n/**\n * Read (or lazily create) the anonymous per-install id — a random UUID stored in\n * `~/.vibgrate/install-id`. It is *not* tied to the user, the repo, or any\n * account; it only lets us de-duplicate batches from the same install when\n * aggregating. If the home dir isn't writable we fall back to an ephemeral id\n * so sharing still works (it just can't be de-duplicated across restarts).\n *\n * Under an env opt-out no id is ever read or persisted (the sharing path isn't\n * reached then either — this is defence in depth), and on CI runners the id is\n * ephemeral: a persisted id on a shared/throwaway runner would be meaningless\n * for de-duplication and would leave state behind on machines we don't own.\n */\nexport function installId(env: NodeJS.ProcessEnv = process.env): string {\n if (telemetryOptOut(env) !== null || isCI(env)) return randomUuid();\n try {\n const existing = fs.readFileSync(INSTALL_ID_FILE, 'utf8').trim();\n if (isUuid(existing)) return existing;\n } catch {\n /* not created yet */\n }\n const id = randomUuid();\n try {\n fs.mkdirSync(INSTALL_ID_DIR, { recursive: true });\n fs.writeFileSync(INSTALL_ID_FILE, id + '\\n', { mode: 0o600 });\n } catch {\n /* home dir read-only — use the ephemeral id for this process */\n }\n return id;\n}\n\nfunction isUuid(s: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);\n}\n\nfunction randomUuid(): string {\n return randomUUID();\n}\n\n/** Resolve the ingest endpoint: env override wins, else the default region host. */\nexport function statsEndpoint(): string {\n const override = process.env.VIBGRATE_STATS_ENDPOINT;\n if (override && /^https?:\\/\\//.test(override)) return override;\n return `https://${resolveIngestHost()}/v1/ingest/cli-mcp-usage`;\n}\n\nfunction offsetPath(root: string): string {\n return path.join(cacheDir(root), OFFSET_FILE);\n}\n\nfunction ledgerFilePath(root: string): string {\n return path.join(cacheDir(root), 'savings.jsonl');\n}\n\nfunction readOffset(root: string): number {\n try {\n const raw = JSON.parse(fs.readFileSync(offsetPath(root), 'utf8')) as { offset?: number };\n return typeof raw.offset === 'number' && raw.offset >= 0 ? raw.offset : 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeOffset(root: string, offset: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(offsetPath(root), JSON.stringify({ offset }) + '\\n');\n } catch {\n /* best-effort; a lost offset just means one batch may re-send */\n }\n}\n\n/**\n * Aggregate the ledger entries after `fromOffset` into a counts-only batch.\n * Returns the batch (or null if there's nothing new) and the new byte offset to\n * persist once the batch is confirmed sent.\n */\nexport function buildBatch(\n root: string,\n fromOffset: number,\n id = installId(),\n): { batch: StatsBatch | null; newOffset: number } {\n const file = ledgerFilePath(root);\n let size = 0;\n try {\n size = fs.statSync(file).size;\n } catch {\n return { batch: null, newOffset: 0 };\n }\n // The ledger was truncated/recreated under us — re-read from the top.\n const start = fromOffset > size ? 0 : fromOffset;\n if (start >= size) return { batch: null, newOffset: size };\n\n let text = '';\n try {\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(size - start);\n fs.readSync(fd, buf, 0, buf.length, start);\n text = buf.toString('utf8');\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return { batch: null, newOffset: fromOffset };\n }\n\n // Only whole lines are complete; a trailing partial line (mid-append) is left\n // for the next flush by rewinding the offset to the last newline.\n const lastNl = text.lastIndexOf('\\n');\n if (lastNl < 0) return { batch: null, newOffset: start };\n const consumed = start + lastNl + 1;\n const rows = new Map<string, StatsRow>();\n let total = 0;\n let minTs = Infinity;\n let maxTs = -Infinity;\n for (const line of text.slice(0, lastNl).split('\\n')) {\n if (!line.trim()) continue;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n continue;\n }\n const source: Source = e.source ?? 'mcp';\n const client = e.client ?? 'unknown';\n const outcome: Outcome = e.outcome ?? 'complete';\n const key = `${source}|${client}|${e.tool}|${outcome}`;\n const row = rows.get(key) ?? {\n source,\n client,\n tool: e.tool,\n outcome,\n calls: 0,\n vgTokens: 0,\n baselineTokens: 0,\n };\n row.calls++;\n row.vgTokens += e.vgTokens ?? 0;\n row.baselineTokens += e.baselineTokens ?? 0;\n rows.set(key, row);\n total++;\n if (typeof e.ts === 'number') {\n if (e.ts < minTs) minTs = e.ts;\n if (e.ts > maxTs) maxTs = e.ts;\n }\n }\n if (total === 0 || !Number.isFinite(minTs)) return { batch: null, newOffset: consumed };\n const batch: StatsBatch = {\n schemaVersion: SCHEMA_VERSION,\n installId: id,\n vgVersion: VERSION,\n os: process.platform,\n arch: process.arch,\n windowStart: new Date(minTs).toISOString(),\n windowEnd: new Date(maxTs).toISOString(),\n totalCalls: total,\n rows: [...rows.values()],\n };\n return { batch, newOffset: consumed };\n}\n\n/**\n * POST a batch to the endpoint. Never throws; returns whether it was accepted.\n * A short timeout keeps a hung endpoint from stalling the caller (e.g. shutdown).\n */\nasync function postBatch(batch: StatsBatch): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);\n timer.unref?.();\n try {\n const res = await fetch(statsEndpoint(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Periodic + on-shutdown flusher for one serve session. Holds the install id and\n * the persisted offset so each flush reads only new ledger lines and advances the\n * offset only when the batch is confirmed sent.\n */\nexport class StatsSharer {\n private readonly id = installId();\n private offset: number;\n private flushing = false;\n\n constructor(private readonly root: string) {\n this.offset = readOffset(root);\n }\n\n /**\n * Flush any new ledger entries. Single-flight (a slow POST won't overlap the\n * next tick). Best-effort: any failure is swallowed and retried next time.\n */\n async flush(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n const { batch, newOffset } = buildBatch(this.root, this.offset, this.id);\n if (!batch) {\n // Nothing to send, but still advance past consumed blank/partial space.\n if (newOffset > this.offset) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n return;\n }\n const ok = await postBatch(batch);\n if (ok) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n } catch {\n /* never let sharing break serving */\n } finally {\n this.flushing = false;\n }\n }\n}\n","/**\n * DNS-rebinding protection for the local `vg serve --http` endpoint, per the\n * MCP 2025-11-25 transport spec: a browser reaching a localhost server via a\n * rebound hostname still sends the *attacker's* Origin, so policing Origin is\n * the boundary that keeps drive-by pages from reading the local map.\n *\n * Policy: no Origin header (CLI/native MCP clients) passes; a browser-set\n * Origin must be loopback (localhost / 127.0.0.0/8 / [::1]) or on the\n * comma-separated `VIBGRATE_ALLOWED_ORIGINS` allowlist (`*` allows all —\n * an explicit operator escape hatch, never the default).\n */\nexport function originAllowed(origin: string | undefined, allowlist?: string): boolean {\n if (origin === undefined || origin === '') return true;\n const allowed = (allowlist ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (allowed.includes('*')) return true;\n if (allowed.includes(origin)) return true;\n return isLoopbackOrigin(origin);\n}\n\nfunction isLoopbackOrigin(origin: string): boolean {\n let url: URL;\n try {\n url = new URL(origin);\n } catch {\n return false; // unparsable Origin (\"null\", garbage) is never trusted\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n const host = url.hostname;\n if (host === 'localhost' || host === '[::1]' || host === '::1') return true;\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from '../engine/cache.js';\nimport { VERSION } from '../version.js';\nimport type { SessionStats, SessionSnapshot, RollupRow } from './serve-stats.js';\n\n/**\n * Cross-process live stats for `vg serve` — the missing link between the serve\n * process an operator watches in a terminal and the one their assistant\n * actually talks to.\n *\n * Stdio MCP servers are spawned *by the client*: Claude Code launches its own\n * private `vg serve` child, so a manually-run terminal serve never receives\n * those tool calls and its dashboard would sit at zero forever. Every serve\n * process therefore publishes its in-memory session snapshot (counts only —\n * the exact data the live display already renders) to an ephemeral per-process\n * file under `.vibgrate/cache/serve-live/`, and a TTY display folds fresh\n * sibling snapshots into its render. Net effect: `vg serve` in a terminal\n * shows the MCP traffic of the assistant-spawned server(s) in the same repo.\n *\n * Privacy posture is identical to the live display itself: counts, tool\n * names, and coarse client labels only — never code, paths, or question text;\n * local only; files die with the session (unlinked on exit, and stale files\n * from crashed processes are swept on read). This is NOT the opt-in usage\n * ledger (GUARDRAILS §3.4) — nothing here persists or uploads.\n */\n\n/** Publish cadence; also the reader's poll granularity via the display timer. */\nconst PUBLISH_INTERVAL_MS = 2000;\n/** Rewrite even without new calls so `updatedAt` proves the process is alive. */\nconst KEEPALIVE_MS = 10_000;\n/** A snapshot older than this is a dead process — ignored and swept. */\nconst STALE_MS = 60_000;\n\ninterface LiveSnapshotFile {\n pid: number;\n updatedAt: number;\n /** CLI version this serve process is running. Absent on files written before\n * versioning existed → read as 'unknown', which the reaper treats as stale\n * (a server that predates the field is by definition an older build). */\n version?: string;\n snapshot: SessionSnapshot;\n}\n\nexport function liveStatsDir(root: string): string {\n return path.join(cacheDir(root), 'serve-live');\n}\n\n/** A reaped process: the pid signalled and the version it was running. */\nexport interface ReapedServer {\n pid: number;\n version: string;\n}\n\n/**\n * SIGTERM every OTHER `vg serve` process in this repo that is running a version\n * other than `keepVersion` — used by `vg update` so an assistant-spawned server\n * still executing the old build is retired and respawned by its client on the\n * freshly-installed one.\n *\n * Safety — this only ever signals vg's own servers, never an arbitrary process:\n * - candidates come exclusively from `serve-<pid>.json` heartbeat files that\n * only a `vg serve` process writes (same registry the live display reads);\n * - a candidate must be HEARTBEATING (updatedAt within STALE_MS). A live serve\n * rewrites its file at least every KEEPALIVE_MS, so a fresh heartbeat proves\n * the pid is that live serve right now — this is what rules out signalling a\n * reused pid; a crashed process's file is stale and is swept, never signalled;\n * - the reaper's own pid is skipped;\n * - SIGTERM (graceful — serve installs a handler), never SIGKILL, so even the\n * millisecond-window worst case is the gentlest possible signal.\n *\n * `now` and `kill` are injectable for tests. Returns the servers signalled.\n */\nexport function reapOtherVersionServers(\n dir: string,\n keepVersion: string,\n now: number = Date.now(),\n kill: (pid: number, signal: NodeJS.Signals) => void = (pid, signal) => process.kill(pid, signal),\n selfPid: number = process.pid,\n): ReapedServer[] {\n let entries: string[];\n try {\n entries = fs.readdirSync(dir);\n } catch {\n return []; // no serve-live dir → nothing running here\n }\n const reaped: ReapedServer[] = [];\n for (const name of entries) {\n if (!/^serve-\\d+\\.json$/.test(name)) continue;\n let parsed: LiveSnapshotFile;\n try {\n parsed = JSON.parse(fs.readFileSync(path.join(dir, name), 'utf8')) as LiveSnapshotFile;\n } catch {\n continue; // mid-write or corrupt — skip\n }\n if (typeof parsed?.pid !== 'number' || typeof parsed.updatedAt !== 'number') continue;\n if (parsed.pid === selfPid) continue; // never signal ourselves\n if (now - parsed.updatedAt > STALE_MS) continue; // not heartbeating → dead/unknown, do not signal\n const version = typeof parsed.version === 'string' ? parsed.version : 'unknown';\n if (version === keepVersion) continue; // already on the kept build\n try {\n kill(parsed.pid, 'SIGTERM');\n reaped.push({ pid: parsed.pid, version });\n } catch {\n /* already exited, or not permitted — nothing to do */\n }\n }\n return reaped;\n}\n\nexport class LiveStatsBus {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRevision = -1;\n private lastWriteAt = 0;\n private readonly file: string;\n\n constructor(\n private readonly dir: string,\n private readonly stats: SessionStats,\n private readonly pid: number = process.pid,\n ) {\n this.file = path.join(dir, `serve-${this.pid}.json`);\n }\n\n start(): void {\n if (this.timer) return;\n this.publish();\n this.timer = setInterval(() => this.publish(), PUBLISH_INTERVAL_MS);\n this.timer.unref?.(); // the MCP server, not this bus, keeps the process alive\n process.on('exit', this.unlinkOwn);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n process.removeListener('exit', this.unlinkOwn);\n this.unlinkOwn();\n }\n\n /** Write the current snapshot when it changed (or as a keepalive). Never throws. */\n publish(now: number = Date.now()): void {\n const snap = this.stats.snapshot();\n if (snap.revision === this.lastRevision && now - this.lastWriteAt < KEEPALIVE_MS) return;\n this.lastRevision = snap.revision;\n this.lastWriteAt = now;\n const body: LiveSnapshotFile = { pid: this.pid, updatedAt: now, version: VERSION, snapshot: snap };\n try {\n fs.mkdirSync(this.dir, { recursive: true });\n // tmp + rename so a concurrent reader never sees a half-written file.\n const tmp = `${this.file}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(body));\n fs.renameSync(tmp, this.file);\n } catch {\n /* display plumbing must never break serving */\n }\n }\n\n /**\n * Fresh snapshots of the OTHER serve processes in this repo. Stale files\n * (crashed processes) are swept best-effort while reading.\n */\n siblings(now: number = Date.now()): SessionSnapshot[] {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.dir);\n } catch {\n return [];\n }\n const out: SessionSnapshot[] = [];\n for (const name of entries.sort()) {\n if (!/^serve-\\d+\\.json$/.test(name)) continue;\n const file = path.join(this.dir, name);\n let parsed: LiveSnapshotFile;\n try {\n parsed = JSON.parse(fs.readFileSync(file, 'utf8')) as LiveSnapshotFile;\n } catch {\n continue; // mid-write or corrupt — skip, the next poll will see it\n }\n if (typeof parsed?.pid !== 'number' || typeof parsed.updatedAt !== 'number' || !parsed.snapshot?.totals) continue;\n if (now - parsed.updatedAt > STALE_MS) {\n try {\n fs.unlinkSync(file);\n } catch {\n /* best-effort sweep */\n }\n continue;\n }\n if (parsed.pid === this.pid) continue;\n out.push(parsed.snapshot);\n }\n return out;\n }\n\n private readonly unlinkOwn = (): void => {\n try {\n fs.unlinkSync(this.file);\n } catch {\n /* already gone */\n }\n };\n}\n\nfunction addInto(target: RollupRow, add: RollupRow): void {\n target.calls += add.calls;\n target.complete += add.complete;\n target.partial += add.partial;\n target.miss += add.miss;\n target.timed += add.timed;\n target.totalMs += add.totalMs;\n target.vgTokens += add.vgTokens;\n target.baselineTokens += add.baselineTokens;\n}\n\nfunction mergeRows(base: RollupRow[], extra: RollupRow[]): RollupRow[] {\n const byKey = new Map<string, RollupRow>(base.map((r) => [r.key, { ...r }]));\n for (const row of extra) {\n const hit = byKey.get(row.key);\n if (hit) addInto(hit, row);\n else byKey.set(row.key, { ...row });\n }\n return [...byKey.values()].sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * The operator's aggregate view: own snapshot plus every sibling's, rows\n * summed by key. Uptime stays the own process's; lastCallAt is the latest\n * anywhere; revision sums so change detection fires on sibling activity too.\n */\nexport function mergeSnapshots(own: SessionSnapshot, siblings: SessionSnapshot[]): SessionSnapshot {\n if (!siblings.length) return own;\n const merged: SessionSnapshot = {\n startedAt: own.startedAt,\n revision: own.revision,\n lastCallAt: own.lastCallAt,\n totals: { ...own.totals },\n clients: [...own.clients.map((r) => ({ ...r }))],\n tools: [...own.tools.map((r) => ({ ...r }))],\n sources: [...own.sources.map((r) => ({ ...r }))],\n };\n for (const s of siblings) {\n merged.revision += s.revision;\n if (s.lastCallAt !== null && (merged.lastCallAt === null || s.lastCallAt > merged.lastCallAt)) {\n merged.lastCallAt = s.lastCallAt;\n }\n addInto(merged.totals, s.totals);\n merged.clients = mergeRows(merged.clients, s.clients);\n merged.tools = mergeRows(merged.tools, s.tools);\n merged.sources = mergeRows(merged.sources, s.sources);\n }\n return merged;\n}\n","import { c } from '../util/output.js';\nimport { SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport { mergeSnapshots } from './live-stats.js';\n\n/**\n * Live, in-memory session stats for `vg serve` — the \"is it earning its keep?\"\n * display. While the MCP server runs, every tool call is aggregated per tool\n * and per client (which AI is calling, how many calls, how long they take, and\n * the context tokens served vs the grep/read baseline they replaced), and a\n * status block on stderr keeps the operator posted. CLI navigation calls made\n * while serving (`vg impact … --client=<ai>` etc.) are folded in from the local\n * ledger by ./ledger-tail.ts, so agents that shell out to `vg` instead of\n * calling MCP tools still show up here.\n *\n * Privacy: everything here lives and dies with the serve session — nothing is\n * persisted or uploaded, so the display is always on (GUARDRAILS §3.4 applies\n * to the opt-in ledger/upload, which remain separate and off by default).\n * Counts only — never code, paths beyond what the operator already sees, or\n * question text. Sibling serve processes in the same repo (an assistant's own\n * spawned stdio server) surface their counts to a TTY display through the\n * ephemeral live-stats bus (./live-stats.ts) — same counts-only data, swept\n * on exit.\n *\n * Output discipline: stderr only. Under stdio transport, stdout IS the MCP\n * protocol stream and carries nothing else.\n */\n\nexport interface CallSample {\n tool: string;\n /** Coarse, sanitized client label ('claude', 'cursor', … or 'unknown'). */\n client: string;\n outcome: Outcome;\n /**\n * How the call arrived: an MCP tool call into this serve process, or a\n * `vg <cmd> --client=<ai>` CLI invocation folded in from the local ledger\n * (see ./ledger-tail.ts). Absent reads as 'mcp'.\n */\n source?: 'mcp' | 'cli';\n /** Wall time of the call, ms. Absent = not measured (CLI ledger lines carry none) — never 0. */\n ms?: number;\n /** Context tokens vg actually returned (savings tools only; else 0). */\n vgTokens: number;\n /** Grep/read baseline estimate those tokens replaced (savings tools only; else 0). */\n baselineTokens: number;\n}\n\nexport interface RollupRow {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** Calls that carried a measured wall time — the avg-ms denominator. */\n timed: number;\n totalMs: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\nexport interface SessionSnapshot {\n startedAt: number;\n /** Bumped on every recorded call — cheap dirty check for renderers. */\n revision: number;\n /** Epoch ms of the most recent call, or null when none yet (never 0). */\n lastCallAt: number | null;\n totals: RollupRow;\n /** Sorted by calls desc, then key — deterministic display order. */\n clients: RollupRow[];\n tools: RollupRow[];\n /** The mcp-vs-cli split ('mcp' / 'cli' rows), same ordering. */\n sources: RollupRow[];\n}\n\nfunction zeroRow(key: string): RollupRow {\n return { key, calls: 0, complete: 0, partial: 0, miss: 0, timed: 0, totalMs: 0, vgTokens: 0, baselineTokens: 0 };\n}\n\n/** Aggregates tool calls for the lifetime of one serve process. */\nexport class SessionStats {\n readonly startedAt: number;\n private revision = 0;\n private lastCallAt: number | null = null;\n private readonly totals = zeroRow('total');\n private readonly byClient = new Map<string, RollupRow>();\n private readonly byTool = new Map<string, RollupRow>();\n private readonly bySource = new Map<string, RollupRow>();\n\n constructor(now: number = Date.now()) {\n this.startedAt = now;\n }\n\n record(sample: CallSample, now: number = Date.now()): void {\n this.revision++;\n this.lastCallAt = now;\n const rows = [\n this.totals,\n this.rowFor(this.byClient, sample.client),\n this.rowFor(this.byTool, sample.tool),\n this.rowFor(this.bySource, sample.source ?? 'mcp'),\n ];\n for (const row of rows) {\n row.calls++;\n row[sample.outcome]++;\n if (typeof sample.ms === 'number') {\n row.timed++;\n row.totalMs += sample.ms;\n }\n row.vgTokens += sample.vgTokens;\n row.baselineTokens += sample.baselineTokens;\n }\n }\n\n snapshot(): SessionSnapshot {\n const sorted = (m: Map<string, RollupRow>): RollupRow[] =>\n [...m.values()]\n .map((r) => ({ ...r }))\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n return {\n startedAt: this.startedAt,\n revision: this.revision,\n lastCallAt: this.lastCallAt,\n totals: { ...this.totals },\n clients: sorted(this.byClient),\n tools: sorted(this.byTool),\n sources: sorted(this.bySource),\n };\n }\n\n private rowFor(m: Map<string, RollupRow>, key: string): RollupRow {\n let row = m.get(key);\n if (!row) {\n row = zeroRow(key);\n m.set(key, row);\n }\n return row;\n }\n}\n\n// ── Formatting helpers (exported for tests) ──\n\n/** '45s' / '12m 03s' / '2h 14m' / '3d 02h' — compact uptime. */\nexport function fmtUptime(ms: number): string {\n const s = Math.max(0, Math.floor(ms / 1000));\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, '0')}s`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ${String(m % 60).padStart(2, '0')}m`;\n const d = Math.floor(h / 24);\n return `${d}d ${String(h % 24).padStart(2, '0')}h`;\n}\n\n/** 1234 → '1.2k', 2500000 → '2.50M'. */\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction fmtAvgMs(row: RollupRow): string {\n // Average only over calls that measured a wall time — CLI-sourced ledger\n // entries carry none, and counting them as 0 would fake a faster average.\n if (row.timed === 0) return '—';\n const avg = row.totalMs / row.timed;\n return avg >= 1000 ? `${(avg / 1000).toFixed(1)}s` : `${Math.round(avg)}ms`;\n}\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\n\n/** How many tool rows the live block shows before folding into \"+N more\". */\nconst MAX_TOOL_ROWS = 8;\n\n/**\n * The status block as lines (no I/O, injected clock) so it is unit-testable —\n * same pattern as `logoLines`. `tick` drives the spinner frame.\n */\nexport function serveStatusLines(snap: SessionSnapshot, now: number, tick = 0, siblingServers = 0): string[] {\n const spinner = mint(SPINNER[tick % SPINNER.length]!);\n const up = fmtUptime(now - snap.startedAt);\n const lines: string[] = [];\n // Assistant-spawned serve processes in this repo whose live counts are\n // folded into this view (see ./live-stats.ts) — worth a line either way:\n // \"your assistant IS connected, just to its own server process\".\n const siblingNote =\n siblingServers > 0\n ? ` ${c.dim(`incl. ${siblingServers} assistant-spawned server${siblingServers === 1 ? '' : 's'} in this repo`)}`\n : null;\n\n if (snap.totals.calls === 0) {\n lines.push(\n ` ${spinner} ${c.bold.white('vg serve')} ${c.dim('·')} up ${teal(up)} ${c.dim('· waiting for your assistant’s first call (MCP tool call, or `vg … --client=<ai>` CLI)…')}`,\n );\n if (siblingNote) lines.push(siblingNote);\n return lines;\n }\n\n const t = snap.totals;\n const answered = Math.round(((t.complete + t.partial) / t.calls) * 100);\n // The mcp-vs-cli split — shown once CLI-sourced calls exist, so a pure-MCP\n // session keeps the familiar compact header.\n const cli = snap.sources.find((s) => s.key === 'cli');\n const via = cli\n ? c.dim(' · via ') + snap.sources.map((s) => `${c.white(s.key)} ${teal(String(s.calls))}`).join(c.dim(' · '))\n : '';\n const ago = snap.lastCallAt === null ? '' : c.dim(` · last call ${fmtUptime(now - snap.lastCallAt)} ago`);\n lines.push(\n ` ${spinner} ${c.bold.white('vg serve')} ${c.dim('·')} up ${teal(up)} ${c.dim('·')} ` +\n `${c.bold.white(String(t.calls))} call${t.calls === 1 ? '' : 's'} ${c.dim('·')} ${mint(`${answered}%`)} answered${via}${ago}`,\n );\n\n // Which AI is calling, and how fast we answer it.\n lines.push(\n ` ${c.dim('clients')} ` +\n snap.clients\n .map((cl) => `${c.white(cl.key)} ${teal(String(cl.calls))}${c.dim(` (avg ${fmtAvgMs(cl)})`)}`)\n .join(c.dim(' · ')),\n );\n\n // Per-tool rows: calls, avg time and — for the grep-baseline tools — the\n // context served vs what a grep/read agent would have burned instead.\n const shown = snap.tools.slice(0, MAX_TOOL_ROWS);\n const nameW = Math.max(...shown.map((r) => r.key.length));\n for (const row of shown) {\n let line =\n ` ${c.white(row.key.padEnd(nameW))} ${teal(String(row.calls).padStart(4))} ${c.dim('·')} ` +\n c.dim(`avg ${fmtAvgMs(row)}`);\n if (SAVINGS_TOOLS.has(row.key) && row.baselineTokens > 0) {\n line += c.dim(' · ctx ') + c.white(fmtTokens(row.vgTokens)) + c.dim(` vs ≈${fmtTokens(row.baselineTokens)} grep/read`);\n }\n if (row.miss > 0) line += c.dim(' · ') + c.yellow(`${row.miss} miss`);\n lines.push(line);\n }\n if (snap.tools.length > shown.length) {\n lines.push(` ${c.dim(`… +${snap.tools.length - shown.length} more tools`)}`);\n }\n\n // Session totals + the honest estimate, on two lines so the block survives\n // narrow terminals without wrapping. Tokens only — no monetary figures: the\n // operator's model rate is unknowable here, and a wrong $ number reads as a\n // claim. `vg savings` remains the place for cost estimates with stated rates.\n if (t.baselineTokens > 0) {\n const savedTokens = Math.max(0, t.baselineTokens - t.vgTokens);\n const ratio = t.vgTokens > 0 ? (t.baselineTokens / t.vgTokens).toFixed(1) : '—';\n lines.push(\n ` ${c.dim('session')} ctx ${c.bold.white(fmtTokens(t.vgTokens))} ` +\n c.dim(`vs grep/read ≈${fmtTokens(t.baselineTokens)} → `) +\n mint(`${ratio}× fewer`),\n );\n lines.push(\n ` ${c.dim('est. saved ≈')} ${mint(`${fmtTokens(savedTokens)} context tokens`)} ${c.dim('(estimate)')}`,\n );\n }\n if (siblingNote) lines.push(siblingNote);\n return lines;\n}\n\n/** One-line summary for non-TTY heartbeats (logs, CI, piped stderr). */\nexport function serveHeartbeatLine(snap: SessionSnapshot, now: number): string {\n const up = fmtUptime(now - snap.startedAt);\n const t = snap.totals;\n if (t.calls === 0) return c.dim(`vg · serving for ${up} — no tool calls yet`);\n const clients = snap.clients.map((cl) => `${cl.key} ${cl.calls}`).join(', ');\n const cli = snap.sources.find((s) => s.key === 'cli');\n let line = `vg · serving for ${up} — ${t.calls} call${t.calls === 1 ? '' : 's'} (${clients})`;\n if (cli) line += ` · ${cli.calls} via CLI`;\n if (t.baselineTokens > 0) {\n const savedTokens = Math.max(0, t.baselineTokens - t.vgTokens);\n line += ` · ctx ${fmtTokens(t.vgTokens)} vs ≈${fmtTokens(t.baselineTokens)} grep/read · est. saved ≈ ${fmtTokens(savedTokens)} tokens`;\n }\n return c.dim(line);\n}\n\n/** TTY repaint cadence — 1s keeps the uptime ticking without meaningful cost. */\nconst TTY_INTERVAL_MS = 1000;\n/** Non-TTY heartbeat cadence — a quiet, greppable pulse in logs. */\nconst HEARTBEAT_INTERVAL_MS = 15 * 60 * 1000;\n\n/**\n * Drives the live status display on stderr for the lifetime of a serve process.\n *\n * - **TTY** (a human ran `vg serve` in a terminal): an in-place repainted block,\n * spinner + uptime + per-client/per-tool stats, redrawn atomically\n * (cursor-up + erase) with a dirty check, cursor hidden while live.\n * - **non-TTY** (assistant-spawned, logs, CI): one compact heartbeat line every\n * 15 minutes, and only when there is new activity — never log spam.\n *\n * Timers are unref'd: the MCP server, not this display, keeps the process alive.\n */\nexport class ServeStatusDisplay {\n private timer: ReturnType<typeof setInterval> | null = null;\n private tick = 0;\n private lastRowCount = 0;\n private lastFrame = '';\n private lastHeartbeatRevision = -1;\n private cursorHidden = false;\n private readonly isTTY: boolean;\n\n constructor(\n private readonly stats: SessionStats,\n private readonly stream: NodeJS.WriteStream = process.stderr,\n /** Fresh sibling-process snapshots to fold into the view (live-stats bus). */\n private readonly siblings?: () => SessionSnapshot[],\n ) {\n this.isTTY = (stream.isTTY ?? false) && process.env.VIBGRATE_PROGRESS_MODE !== 'plain';\n }\n\n start(): void {\n if (this.timer) return;\n if (this.isTTY) {\n this.hideCursor();\n // Restore the cursor however the process ends. SIGINT/SIGTERM: any\n // earlier-registered handler (e.g. the share-stats final flush) runs\n // first and exits; its process.exit still fires our 'exit' restore.\n process.on('exit', this.restoreCursor);\n process.once('SIGINT', () => {\n this.restoreCursor();\n process.exit(130);\n });\n process.once('SIGTERM', () => {\n this.restoreCursor();\n process.exit(143);\n });\n this.timer = setInterval(() => this.renderTTY(), TTY_INTERVAL_MS);\n this.renderTTY();\n } else {\n this.timer = setInterval(() => this.renderHeartbeat(), HEARTBEAT_INTERVAL_MS);\n }\n this.timer.unref?.();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.isTTY) {\n let buf = '';\n if (this.lastRowCount > 0) buf += `\\x1B[${this.lastRowCount}A\\x1B[J`;\n this.stream.write(buf);\n this.lastRowCount = 0;\n this.restoreCursor();\n }\n }\n\n private renderTTY(): void {\n this.tick++;\n const sibs = this.siblings?.() ?? [];\n const snap = mergeSnapshots(this.stats.snapshot(), sibs);\n const lines = serveStatusLines(snap, Date.now(), this.tick, sibs.length);\n const content = lines.join('\\n') + '\\n';\n if (content === this.lastFrame) return;\n this.lastFrame = content;\n // Atomic repaint: cursor-up over the previous block, erase to end, redraw.\n let buf = '';\n if (this.lastRowCount > 0) buf += `\\x1B[${this.lastRowCount}A\\x1B[J`;\n buf += content;\n this.stream.write(buf);\n this.lastRowCount = this.countRows(lines);\n }\n\n private renderHeartbeat(): void {\n const snap = this.stats.snapshot();\n // Only pulse when something happened since the last line — idle logs stay idle.\n if (snap.revision === this.lastHeartbeatRevision) return;\n this.lastHeartbeatRevision = snap.revision;\n this.stream.write(serveHeartbeatLine(snap, Date.now()) + '\\n');\n }\n\n /** Terminal rows the frame occupies, accounting for line wrap. */\n private countRows(lines: string[]): number {\n const columns = Math.max(this.stream.columns ?? 80, 20);\n return lines.reduce((total, line) => {\n const visible = line.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n return total + Math.max(1, Math.ceil(visible / columns));\n }, 0);\n }\n\n private hideCursor(): void {\n if (this.cursorHidden) return;\n this.stream.write('\\x1B[?25l');\n this.cursorHidden = true;\n }\n\n private readonly restoreCursor = (): void => {\n if (!this.cursorHidden) return;\n this.stream.write('\\x1B[?25h');\n this.cursorHidden = false;\n };\n}\n","import * as fs from 'node:fs';\nimport { sanitizeClient, type SavingEntry } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\n\n/**\n * Folds CLI navigation calls into the live `vg serve` status display.\n *\n * An agent that shells out to the CLI (`vg impact <name> --client=claude`)\n * appends a counts-only entry to the local ledger (`.vibgrate/cache/\n * savings.jsonl`, engine/savings.ts) — a different process from the serve one,\n * so the in-memory SessionStats never sees it. This tail polls the ledger for\n * lines appended after serve start and records the `source: 'cli'` ones into\n * the same SessionStats the display renders, so the operator watching\n * `vg serve` sees CLI traffic too.\n *\n * Only `cli` entries are ingested: `mcp` lines are written by a serve process\n * that already recorded them live (its own, or another one — either way,\n * counting them here would double-book).\n *\n * Everything stays in-process and local. Polling (not fs.watch) because watch\n * semantics differ per platform (and are unreliable on Windows/network drives);\n * a 2s stat of one small file is free. The timer is unref'd — the MCP server,\n * not this tail, keeps the process alive.\n */\n\nconst POLL_INTERVAL_MS = 2000;\n\nexport class LedgerTail {\n private timer: ReturnType<typeof setInterval> | null = null;\n /** Byte offset of the next unread ledger byte (always at a line boundary). */\n private offset = 0;\n\n constructor(\n private readonly file: string,\n private readonly stats: SessionStats,\n private readonly intervalMs = POLL_INTERVAL_MS,\n ) {}\n\n start(): void {\n if (this.timer) return;\n // Start at the current end: only calls made while this serve runs count —\n // the display is a session view, not a history report (`vg savings` is).\n this.offset = this.sizeOf();\n this.timer = setInterval(() => this.poll(), this.intervalMs);\n this.timer.unref?.();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** One poll cycle — exposed for tests (deterministic, no timers needed). */\n poll(now: number = Date.now()): void {\n let size: number;\n try {\n size = this.sizeOf();\n } catch {\n return; // never let the display break serving\n }\n // Shrunk file = truncated/rotated ledger — start over from the top.\n if (size < this.offset) this.offset = 0;\n if (size === this.offset) return;\n\n let chunk: Buffer;\n try {\n const fd = fs.openSync(this.file, 'r');\n try {\n chunk = Buffer.alloc(size - this.offset);\n fs.readSync(fd, chunk, 0, chunk.length, this.offset);\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return;\n }\n // Consume only whole lines; a partially-flushed last line stays for the\n // next poll (offset advances to just past the final newline).\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline < 0) return;\n const text = chunk.subarray(0, lastNewline).toString('utf8');\n this.offset += lastNewline + 1;\n for (const line of text.split('\\n')) ingestLedgerLine(this.stats, line, now);\n }\n\n private sizeOf(): number {\n try {\n return fs.statSync(this.file).size;\n } catch {\n return 0; // no ledger yet — nothing recorded so far\n }\n }\n}\n\n/**\n * Record one ledger line into the session stats iff it is a CLI-sourced call.\n * Corrupt lines are skipped, same as every other ledger reader.\n */\nexport function ingestLedgerLine(stats: SessionStats, line: string, now: number): void {\n if (!line.trim()) return;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n return;\n }\n if (e.source !== 'cli' || typeof e.tool !== 'string') return;\n stats.record(\n {\n tool: e.tool,\n client: sanitizeClient(e.client),\n outcome: e.outcome ?? 'complete',\n source: 'cli',\n // CLI lines carry no wall time — leave ms absent (\"not measured\").\n vgTokens: e.vgTokens ?? 0,\n baselineTokens: e.baselineTokens ?? 0,\n },\n now,\n );\n}\n","import * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { serveStdio, createServer, GraphSource, type ServeOptions } from '../mcp/server.js';\nimport { StatsSharer, statsEndpoint, telemetryOptOut } from '../engine/stats-share.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { driftCount } from '../engine/freshness.js';\nimport { runBuild } from './build.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info } from '../util/output.js';\nimport { originAllowed } from '../util/origin.js';\nimport { printLogo } from '../util/logo.js';\nimport { SessionStats, ServeStatusDisplay } from '../mcp/serve-stats.js';\nimport { LedgerTail } from '../mcp/ledger-tail.js';\nimport { LiveStatsBus, liveStatsDir } from '../mcp/live-stats.js';\nimport { savingsLedgerPath } from '../engine/savings.js';\n\n/** How often the opt-in `--share-stats` flusher uploads new ledger entries. */\nconst SHARE_FLUSH_INTERVAL_MS = 5 * 60 * 1000;\n\n/**\n * `vg serve` (VG-CLI-SPEC §3.6) — a LOCAL MCP server over the map. Default\n * transport is stdio (what assistants spawn); `--http` exposes a stateless\n * streamable-HTTP endpoint for local browser/shared hosts. Fully offline,\n * read-only tools only. Independent of Vibgrate's hosted cloud MCP.\n *\n * The map auto-refreshes: tool calls run a cheap freshness probe and trigger\n * an incremental in-process rebuild when the working tree drifted, so the AI\n * always queries an up-to-date graph (see mcp/server.ts). `--no-refresh`\n * pins serving to the map as built; a custom `--graph` implies it.\n *\n * Before the server accepts its first request it also brings the map in sync\n * once, up front: a missing map is built from scratch and a stale map is\n * rebuilt incrementally (see `ensureServableGraph`). That way the first tool\n * call already sees an up-to-date graph instead of waiting for the in-process\n * probe — which only fires once tool calls start arriving — to notice drift.\n */\nexport function registerServe(program: Command): void {\n const cmd = program\n .command('serve')\n .description('start Vibgrate AI Context — local-first MCP serving your code map, drift & version-correct docs to your AI')\n .option('--http', 'serve over streamable HTTP instead of stdio')\n .option('--port <n>', 'port for --http', '7437')\n .option('--host <h>', 'host for --http', '127.0.0.1')\n .option('--savings', 'record local, counts-only usage savings (opt-in; off by default)')\n .option('--share-stats', 'ALSO upload the counts-only usage ledger to Vibgrate to improve the local MCP (opt-in; off by default; implies --savings; disabled under --local)')\n .option('--dedup', \"collapse a node's heavy relation lists on repeat reads within a session (opt-in; saves tokens)\")\n .option('--no-refresh', 'serve the map as built — skip the auto-rebuild when files change')\n .action(async function (this: Command, opts: { http?: boolean; port?: string; host?: string; savings?: boolean; shareStats?: boolean; dedup?: boolean; refresh?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const graphPath = global.graph ?? defaultGraphPath(root);\n // A custom --graph is an explicit artifact — never rebuild over it.\n const refresh = opts.refresh !== false && !global.graph;\n // Sharing needs the network, so `--local` (air-gapped) hard-disables the\n // upload — but still lets `--savings` record locally. Sharing implies\n // recording so there's something to send.\n const local = global.local === true;\n // The universal DO_NOT_TRACK opt-out (and VIBGRATE_TELEMETRY=0) wins even\n // over an explicit --share-stats: the env is how operators of shared or\n // managed machines say \"never upload\", and CI passes flags mechanically.\n const optOut = telemetryOptOut();\n const shareStats = opts.shareStats === true && !local && optOut === null;\n // Live session stats (in-memory only — nothing persisted or uploaded, so\n // no opt-in needed): uptime, which AI is calling, per-tool calls/timing,\n // and the context-vs-grep-baseline estimate, rendered to stderr while the\n // server runs. `--quiet` turns the whole display off.\n const quiet = global.quiet === true;\n const stats = quiet ? undefined : new SessionStats();\n if (!quiet) {\n // Brand banner for a human at a TTY, same as the scanner (printLogo\n // no-ops under a pipe, so assistant-spawned stdio stays clean).\n printLogo(root, { product: 'AI Context', tagline: 'Local-first MCP for your AI' });\n }\n const serveOpts: ServeOptions = {\n // A *requested* --share-stats always implies local recording, even when\n // the upload itself is suppressed (--local / env opt-out) — the local\n // ledger never leaves the machine, and the disclosure messages below\n // promise \"recording locally\".\n savings: opts.savings === true || opts.shareStats === true,\n shareStats,\n local,\n dedup: opts.dedup === true,\n refresh,\n stats,\n };\n\n // Check the map is up to date and, when it isn't, run the build before we\n // start serving — build a missing map from scratch, rebuild a stale one\n // incrementally. Skipped under `--no-refresh`/`--graph`, which serve the\n // map exactly as built.\n await ensureServableGraph(root, graphPath, global, refresh);\n\n if (opts.shareStats === true && local) {\n info(c.dim('vg · --share-stats ignored under --local (air-gapped): recording locally, not uploading.'));\n } else if (opts.shareStats === true && optOut !== null) {\n info(c.dim(`vg · --share-stats disabled by ${optOut}: recording locally, not uploading.`));\n }\n if (shareStats) startSharing(root);\n\n // Cross-process live stats, split by role so nothing double-counts:\n // an assistant-spawned (non-interactive) serve PUBLISHES its counts to\n // the ephemeral bus; the operator's terminal (interactive) serve\n // AGGREGATES — it folds sibling snapshots and the CLI `--client` ledger\n // into its display. See mcp/live-stats.ts and mcp/ledger-tail.ts.\n const interactive = process.stderr.isTTY === true;\n const bus = stats ? new LiveStatsBus(liveStatsDir(root), stats) : undefined;\n if (bus && !interactive) bus.start();\n // The display starts only after the startup lines are printed, so they\n // stay in scroll history above the repainted status block.\n const display = stats\n ? new ServeStatusDisplay(stats, process.stderr, bus && interactive ? () => bus.siblings() : undefined)\n : undefined;\n // Fold in CLI navigation calls (`vg <cmd> --client=<ai>`) made while\n // serving: they land in the local ledger from a separate process, so the\n // watching display tails it — otherwise an agent that shells out to the\n // CLI would leave this dashboard frozen at zero. Interactive-only: if a\n // publisher folded them too, the aggregate would count each call twice.\n if (stats && interactive) new LedgerTail(savingsLedgerPath(root), stats).start();\n const freshness = refresh ? 'auto-refresh' : 'as built';\n if (opts.http) {\n await serveHttp(graphPath, opts.host ?? '127.0.0.1', Number(opts.port) || 7437, serveOpts, freshness, () => display?.start());\n } else {\n // stdio: NOTHING may go to stdout except the protocol stream.\n info(c.dim(`vg · MCP server on stdio (read-only, ${freshness}). Connect your assistant to this process.`));\n await serveStdio(graphPath, serveOpts);\n display?.start();\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/**\n * Ensure there is an up-to-date map to serve before the MCP server starts.\n *\n * When auto-refresh is on (the default; disabled by `--no-refresh` or a pinned\n * `--graph`):\n * - **No map yet** → run the ordinary `vg build` so a fresh checkout can `vg\n * serve` without a separate build step first. Forced out of `--json` so the\n * build summary never lands on stdout — under stdio that channel is the MCP\n * protocol stream and carries nothing else.\n * - **Map present but stale** → the incremental refresh (`refreshIfStale`),\n * replaying the last build's scope. Fail-soft: a refresh error degrades to\n * serving the last built map rather than refusing to start.\n *\n * With auto-refresh off we serve the map exactly as built and only verify one\n * exists. Either way, if there is still no map afterwards we stop with an\n * actionable error instead of starting a server with nothing to answer from.\n *\n * `opts.inline` forces single-threaded build/refresh (tests only).\n */\nexport async function ensureServableGraph(\n root: string,\n graphPath: string,\n global: GlobalOpts,\n refresh: boolean,\n opts: { inline?: boolean } = {},\n): Promise<void> {\n if (refresh) {\n if (!fs.existsSync(graphPath)) {\n info(c.dim('vg · no map found — building it before serving…'));\n await runBuild(\n [],\n { html: false, report: false, jobs: opts.inline ? '1' : undefined },\n { ...global, json: false },\n );\n } else {\n const refreshed = await refreshIfStale(root, { inline: opts.inline });\n if (refreshed.status === 'refreshed') {\n const n = driftCount(refreshed.drift);\n info(c.dim(`vg · map refreshed before serving — ${n} file(s) drifted (${(refreshed.ms / 1000).toFixed(2)}s)`));\n } else if (refreshed.status === 'error') {\n info(c.yellow(`vg · map refresh failed (${refreshed.message}) — serving the last built map`));\n }\n }\n }\n\n if (!fs.existsSync(graphPath)) {\n throw new CliError(\n `no map found at ${graphPath} — run \\`vg\\` to build one first`,\n ExitCode.NOT_FOUND,\n );\n }\n}\n\n/**\n * Start the opt-in usage-stats upload for this serve session: a clear one-time\n * disclosure, a periodic flush of the counts-only ledger, and a final flush when\n * the process is asked to stop. Everything is best-effort — a network problem\n * never affects serving. Nothing here is reached unless the operator passed\n * `--share-stats` (and is not `--local`).\n */\nfunction startSharing(root: string): void {\n const sharer = new StatsSharer(root);\n // Transparency (GUARDRAILS §3.4): say exactly what is shared, where, and how to\n // stop. To stderr, so it never pollutes the stdio protocol stream.\n info(\n c.dim(\n `vg · sharing counts-only usage stats with Vibgrate (${statsEndpoint()}) to improve the local MCP. ` +\n 'No code, paths, or questions are sent. Stop by omitting --share-stats.',\n ),\n );\n const timer = setInterval(() => void sharer.flush(), SHARE_FLUSH_INTERVAL_MS);\n timer.unref?.(); // the server, not this timer, keeps the process alive\n\n let flushed = false;\n const finalFlush = (): void => {\n if (flushed) return;\n flushed = true;\n void sharer.flush();\n };\n process.once('SIGINT', () => {\n finalFlush();\n process.exit(0);\n });\n process.once('SIGTERM', () => {\n finalFlush();\n process.exit(0);\n });\n process.once('beforeExit', finalFlush);\n}\n\nasync function serveHttp(\n graphPath: string,\n host: string,\n port: number,\n opts: ServeOptions,\n freshness: string,\n onReady?: () => void,\n): Promise<void> {\n const { createServer: createHttp } = await import('node:http');\n const { StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp.js'\n );\n\n // One graph source for the whole process: the parsed graph, hot-reload state,\n // and refresh debounce live across requests (re-parsing per request would be\n // wasteful and would probe freshness on every call).\n const source = new GraphSource(graphPath, opts.refresh !== false);\n\n const httpServer = createHttp(async (req, res) => {\n if (req.url !== '/mcp') {\n res.writeHead(404).end('not found');\n return;\n }\n // DNS-rebinding protection (MCP 2025-11-25): a browser-set Origin must be\n // loopback or explicitly allowlisted; absent Origin (CLI clients) passes.\n // See util/origin.ts.\n const origin = req.headers.origin;\n if (!originAllowed(origin, process.env.VIBGRATE_ALLOWED_ORIGINS)) {\n res.writeHead(403, { 'Content-Type': 'text/plain' }).end(\n 'forbidden origin — vg serve only accepts browser requests from loopback origins. ' +\n 'Set VIBGRATE_ALLOWED_ORIGINS to allow others.',\n );\n return;\n }\n try {\n // Stateless: a fresh server+transport per request (no session state) —\n // simple and robust for a local single-user endpoint. (Per-request, so\n // `--dedup` only accumulates within stdio sessions, not across HTTP calls.)\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n const server = createServer(source, opts);\n res.on('close', () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res);\n } catch (err) {\n if (!res.headersSent) res.writeHead(500).end('internal error');\n info(c.red(`vg serve: request error: ${(err as Error).message}`));\n }\n });\n\n await new Promise<void>((resolve) => httpServer.listen(port, host, resolve));\n info(c.dim(`vg · MCP server on http://${host}:${port}/mcp (read-only, local, ${freshness})`));\n // Live status display, once the listen line is safely in scroll history.\n onReady?.();\n // Keep the process alive until killed.\n await new Promise<never>(() => {});\n}\n","/**\n * Minimal LSP transport — JSON-RPC 2.0 over stdio with `Content-Length` framing.\n *\n * Deliberately zero-dependency. Vibgrate's whole thesis is dependency currency;\n * pulling `vscode-languageserver` (and its tree) into the published CLI to move\n * a few hundred bytes of JSON would be a poor advertisement for the product.\n * The surface we need is small and the framing is fully specified by LSP §3.\n *\n * See `docs/IDE-INTEGRATION-PLAN.md` §3.\n */\n\nexport interface RpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type RequestHandler = (method: string, params: unknown) => unknown | Promise<unknown>;\nexport type NotificationHandler = (method: string, params: unknown) => void | Promise<void>;\n\n/** LSP error codes we actually use (LSP §3.16.1). */\nexport const ErrorCodes = {\n MethodNotFound: -32601,\n InternalError: -32603,\n} as const;\n\n/**\n * Reads `Content-Length`-framed JSON-RPC messages from a byte stream.\n *\n * Buffers on a Buffer (not a string) because `Content-Length` counts *bytes*,\n * not characters: a header saying 120 bytes over a body with any multi-byte\n * UTF-8 in it (a package name with a non-ASCII char, an EOL date with an\n * en-dash) would be mis-sliced by string-length accounting, and every message\n * after it in the stream would be shifted. This is the classic LSP framing bug.\n */\nexport class MessageReader {\n private buf: Buffer = Buffer.alloc(0);\n\n /** Feed a chunk; returns every complete message now available. */\n push(chunk: Buffer): RpcMessage[] {\n this.buf = this.buf.length === 0 ? chunk : Buffer.concat([this.buf, chunk]);\n const out: RpcMessage[] = [];\n\n for (;;) {\n const headerEnd = this.buf.indexOf('\\r\\n\\r\\n');\n if (headerEnd === -1) break;\n\n const header = this.buf.subarray(0, headerEnd).toString('ascii');\n const match = /content-length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n // Unrecoverable: a frame with no length. Drop the header and resync\n // rather than spin forever on the same bytes.\n this.buf = this.buf.subarray(headerEnd + 4);\n continue;\n }\n\n const length = Number(match[1]);\n const bodyStart = headerEnd + 4;\n if (this.buf.length < bodyStart + length) break; // body not fully arrived\n\n const body = this.buf.subarray(bodyStart, bodyStart + length).toString('utf8');\n this.buf = this.buf.subarray(bodyStart + length);\n\n try {\n out.push(JSON.parse(body) as RpcMessage);\n } catch {\n // A malformed body is not worth killing the server over — the editor\n // will re-request. Skip it.\n }\n }\n\n return out;\n }\n}\n\n/** Writes `Content-Length`-framed JSON-RPC messages to a stream. */\nexport class MessageWriter {\n constructor(private readonly out: NodeJS.WritableStream) {}\n\n write(msg: RpcMessage): void {\n const body = Buffer.from(JSON.stringify(msg), 'utf8');\n this.out.write(`Content-Length: ${body.length}\\r\\n\\r\\n`);\n this.out.write(body);\n }\n}\n\n/**\n * A tiny JSON-RPC connection: dispatches requests and notifications, and lets\n * the server push notifications back to the client.\n */\nexport class Connection {\n private readonly reader = new MessageReader();\n private readonly writer: MessageWriter;\n private readonly requests = new Map<string, RequestHandler>();\n private readonly notifications = new Map<string, NotificationHandler>();\n\n constructor(\n input: NodeJS.ReadableStream = process.stdin,\n output: NodeJS.WritableStream = process.stdout,\n ) {\n this.writer = new MessageWriter(output);\n input.on('data', (chunk: Buffer) => {\n for (const msg of this.reader.push(chunk)) void this.dispatch(msg);\n });\n }\n\n onRequest(method: string, handler: RequestHandler): void {\n this.requests.set(method, handler);\n }\n\n onNotification(method: string, handler: NotificationHandler): void {\n this.notifications.set(method, handler);\n }\n\n /** Push a server→client notification (diagnostics, `vibgrate/score`, …). */\n notify(method: string, params: unknown): void {\n this.writer.write({ jsonrpc: '2.0', method, params });\n }\n\n private async dispatch(msg: RpcMessage): Promise<void> {\n if (!msg.method) return; // a response to something we sent; we send no requests\n\n const isRequest = msg.id !== undefined && msg.id !== null;\n\n if (!isRequest) {\n const handler = this.notifications.get(msg.method);\n if (handler) {\n try {\n await handler(msg.method, msg.params);\n } catch {\n // A failed notification must never take the server down: the editor\n // would show \"server crashed\" and the user would uninstall us.\n }\n }\n return;\n }\n\n const handler = this.requests.get(msg.method);\n if (!handler) {\n this.writer.write({\n jsonrpc: '2.0',\n id: msg.id,\n error: { code: ErrorCodes.MethodNotFound, message: `Unhandled method: ${msg.method}` },\n });\n return;\n }\n\n try {\n const result = await handler(msg.method, msg.params);\n this.writer.write({ jsonrpc: '2.0', id: msg.id, result: result ?? null });\n } catch (err) {\n this.writer.write({\n jsonrpc: '2.0',\n id: msg.id,\n error: {\n code: ErrorCodes.InternalError,\n message: err instanceof Error ? err.message : 'Internal error',\n },\n });\n }\n }\n}\n","/**\n * Maps a dependency name to the line it is declared on, inside a manifest.\n *\n * This is the one thing the scan engine cannot tell us: it reports *what* is\n * drifted, not *where the text is*. The editor needs a line to hang a\n * decoration, a hover, or a diagnostic on.\n *\n * Deliberately lexical, not a full parse. We are matching a declaration line in\n * a file the user is looking at; a tolerant regex over the exact text in the\n * editor buffer beats a parser that fails on a half-typed edit. If we can't\n * find a line, we return nothing and the surface silently doesn't render —\n * which is the correct failure mode for an ambient feature.\n */\n\nexport type ManifestKind =\n | 'package.json'\n | 'go.mod'\n | 'requirements.txt'\n | 'pyproject.toml'\n | 'Cargo.toml'\n | 'pom.xml'\n | 'build.gradle'\n | 'Gemfile'\n | 'composer.json'\n | 'pubspec.yaml'\n | 'mix.exs'\n | 'csproj'\n | 'Dockerfile'\n | 'unknown';\n\n/** Classify a path so we know which matcher to use. Case-insensitive on the basename. */\nexport function manifestKind(filePath: string): ManifestKind {\n const base = (filePath.split(/[\\\\/]/).pop() ?? '').toLowerCase();\n if (base === 'package.json') return 'package.json';\n if (base === 'go.mod') return 'go.mod';\n if (base === 'requirements.txt' || /^requirements.*\\.txt$/.test(base)) return 'requirements.txt';\n if (base === 'pyproject.toml') return 'pyproject.toml';\n if (base === 'cargo.toml') return 'Cargo.toml';\n if (base === 'pom.xml') return 'pom.xml';\n if (base === 'build.gradle' || base === 'build.gradle.kts') return 'build.gradle';\n if (base === 'gemfile') return 'Gemfile';\n if (base === 'composer.json') return 'composer.json';\n if (base === 'pubspec.yaml') return 'pubspec.yaml';\n if (base === 'mix.exs') return 'mix.exs';\n if (base.endsWith('.csproj') || base.endsWith('.fsproj') || base.endsWith('.vbproj')) return 'csproj';\n if (base === 'dockerfile' || base.startsWith('dockerfile.')) return 'Dockerfile';\n return 'unknown';\n}\n\n/** True when this file is one the LSP should attach surfaces to. */\nexport function isManifest(filePath: string): boolean {\n return manifestKind(filePath) !== 'unknown';\n}\n\n/** Escape a package name for safe embedding in a RegExp. */\nfunction esc(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Find the 0-based line index on which `pkg` is declared in `text`.\n * Returns -1 when not found.\n */\nexport function findPackageLine(text: string, pkg: string, kind: ManifestKind): number {\n const lines = text.split(/\\r?\\n/);\n const p = esc(pkg);\n\n // Ordered candidate matchers. The first that hits wins.\n const patterns: RegExp[] = (() => {\n switch (kind) {\n case 'package.json':\n case 'composer.json':\n // \"react\": \"^17.0.2\" — the key, quoted, followed by a colon\n return [new RegExp(`^\\\\s*\"${p}\"\\\\s*:`)];\n\n case 'go.mod':\n // \tgithub.com/foo/bar v1.2.3 (inside a require block, or `require x v1`)\n return [new RegExp(`^\\\\s*(?:require\\\\s+)?${p}\\\\s+v?\\\\d`)];\n\n case 'requirements.txt':\n // requests==2.31.0 · requests>=2 · requests[security]==2 · requests\n return [new RegExp(`^\\\\s*${p}\\\\s*(?:\\\\[[^\\\\]]*\\\\])?\\\\s*(?:[=<>!~]|$)`, 'i')];\n\n case 'pyproject.toml':\n case 'Cargo.toml':\n // foo = \"1.2\" · foo = { version = \"1.2\" } · \"foo>=1.2\" (poetry/pep621 arrays)\n return [\n new RegExp(`^\\\\s*${p}\\\\s*=`),\n new RegExp(`^\\\\s*\"${p}\\\\s*(?:[=<>!~\\\\[]|\")`),\n ];\n\n case 'pom.xml':\n // <artifactId>spring-boot</artifactId>\n return [new RegExp(`<artifactId>\\\\s*${p}\\\\s*</artifactId>`)];\n\n case 'build.gradle':\n // implementation 'com.foo:bar:1.2' · implementation(\"com.foo:bar:1.2\")\n return [new RegExp(`[\"']${p}(?:[\"':])`)];\n\n case 'Gemfile':\n // gem 'rails', '~> 7.0'\n return [new RegExp(`^\\\\s*gem\\\\s+[\"']${p}[\"']`)];\n\n case 'pubspec.yaml':\n return [new RegExp(`^\\\\s*${p}\\\\s*:`)];\n\n case 'mix.exs':\n // {:phoenix, \"~> 1.7\"}\n return [new RegExp(`\\\\{\\\\s*:${p}\\\\s*,`)];\n\n case 'csproj':\n // <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.1\" />\n return [new RegExp(`Include\\\\s*=\\\\s*\"${p}\"`, 'i')];\n\n case 'Dockerfile':\n // FROM node:18-alpine — the \"package\" here is the base image\n return [new RegExp(`^\\\\s*FROM\\\\s+.*${p}`, 'i')];\n\n default:\n return [];\n }\n })();\n\n for (const re of patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i])) return i;\n }\n }\n\n return -1;\n}\n\n/**\n * The line a *runtime* constraint sits on — `engines.node`, `go 1.21`,\n * `<java.version>`, `FROM node:18`. Used to place the EOL-runtime diagnostic on\n * the actual offending line instead of dumping it at the top of the file.\n * Returns -1 when we can't place it (caller falls back to line 0).\n */\nexport function findRuntimeLine(text: string, kind: ManifestKind): number {\n const lines = text.split(/\\r?\\n/);\n const patterns: RegExp[] = (() => {\n switch (kind) {\n case 'package.json':\n return [/^\\s*\"node\"\\s*:/, /^\\s*\"engines\"\\s*:/];\n case 'go.mod':\n return [/^\\s*go\\s+\\d/];\n case 'pyproject.toml':\n return [/^\\s*(?:requires-python|python)\\s*=/];\n case 'pom.xml':\n return [/<(?:java\\.version|maven\\.compiler\\.(?:source|target|release))>/];\n case 'build.gradle':\n return [/(?:sourceCompatibility|targetCompatibility|JavaVersion)/];\n case 'csproj':\n return [/<TargetFrameworks?>/i];\n case 'Dockerfile':\n return [/^\\s*FROM\\s+/i];\n default:\n return [];\n }\n })();\n\n for (const re of patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (re.test(lines[i])) return i;\n }\n }\n\n return -1;\n}\n\n/** The end-of-line column for a given line — where an `after` decoration lands. */\nexport function endOfLine(text: string, line: number): number {\n const lines = text.split(/\\r?\\n/);\n return (lines[line] ?? '').length;\n}\n","/**\n * Drift-scan result cache for `vg lsp`.\n *\n * `runCoreScan` is the expensive part of a scan (per-package registry lookups),\n * not reading the manifest/lockfile — so on every editor activation, hashing\n * just the manifest+lockfile bytes first and comparing to the last successful\n * scan's hash lets an unchanged repo skip `runCoreScan` entirely and replay the\n * cached result instantly. Only a real dependency change (any manifest or\n * lockfile byte differs) pays for a fresh scan.\n *\n * Lives under `.vibgrate/cache/` (gitignored, machine-local) alongside the\n * graph's parse cache and freshness snapshot — same convention, same directory.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { hashBytes, hashString, canonicalize } from '../engine/hash.js';\nimport { cacheDir } from '../engine/cache.js';\nimport { stableStringify } from '../engine/serialize.js';\nimport { SKIP_DIRS, SKIP_FILES } from '../engine/discover.js';\nimport { isManifest } from './manifest-positions.js';\nimport type { ScanArtifact } from '../core-open/index.js';\n\n// Bumped: v1 caches carried no `toolVersion`/`offline` guard, so a scan cached\n// under an older engine build (or under `--local`, before registry access was\n// available) replayed forever once the manifest stopped changing — even after\n// an upgrade or the network came back. Bumping discards every v1 cache on read.\nconst CACHE_VERSION = 'vg-lsp-scan-cache/2';\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'lsp-scan.json');\n}\n\n/**\n * Hash every manifest (`package.json`, `go.mod`, …) and lockfile\n * (`package-lock.json`, `go.sum`, …) under `root`, combined into one stable\n * digest. A cheap stat+read walk — no registry calls, no dependency\n * resolution — so it is safe to run before every scan as a gate.\n */\nexport function manifestHash(root: string): string {\n const files: { rel: string; hash: string }[] = [];\n\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return; // unreadable dir — skip rather than crash the probe\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n const base = entry.name.toLowerCase();\n if (!isManifest(abs) && !SKIP_FILES.has(base)) continue;\n try {\n const rel = path.relative(root, abs).split(path.sep).join('/');\n files.push({ rel, hash: hashBytes(fs.readFileSync(abs)) });\n } catch {\n // Unreadable/raced-away file — leave it out; worst case is an extra\n // rescan next time, never a wrong cache hit.\n }\n }\n };\n walk(root);\n\n files.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));\n return hashString(canonicalize(files));\n}\n\nexport interface ScanCacheEntry {\n manifestHash: string;\n artifact: ScanArtifact;\n}\n\n/**\n * A cache hit must match on more than the manifest bytes: `toolVersion` guards\n * against an engine upgrade changing what a scan produces (mirrors the parse\n * cache's `toolVersion` invalidation in `engine/cache.ts`), and `offline`\n * guards against replaying an offline scan's unresolved drift once the\n * network — or `vibgrate.offline` — changes. Both are cheap to compare and\n * cheap to get wrong, so they are required, not optional.\n */\nexport interface ScanCacheKey {\n manifestHash: string;\n toolVersion: string;\n offline: boolean;\n}\n\n/** Best-effort read. Returns null on a missing, corrupt, stale-version, or non-matching-key cache. */\nexport function loadScanCache(root: string, key: ScanCacheKey): ScanCacheEntry | null {\n try {\n const raw = JSON.parse(fs.readFileSync(cachePath(root), 'utf8')) as {\n version?: string;\n manifestHash?: string;\n toolVersion?: string;\n offline?: boolean;\n artifact?: ScanArtifact;\n };\n if (\n raw.version === CACHE_VERSION &&\n raw.manifestHash === key.manifestHash &&\n raw.toolVersion === key.toolVersion &&\n raw.offline === key.offline &&\n raw.artifact\n ) {\n return { manifestHash: raw.manifestHash, artifact: raw.artifact };\n }\n } catch {\n /* missing/corrupt — treat as no cache */\n }\n return null;\n}\n\n/** Best-effort write (a read-only checkout etc. just means no cache next time). */\nexport function writeScanCache(root: string, key: ScanCacheKey, artifact: ScanArtifact): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(\n cachePath(root),\n stableStringify(\n { version: CACHE_VERSION, manifestHash: key.manifestHash, toolVersion: key.toolVersion, offline: key.offline, artifact },\n 0,\n ),\n );\n } catch {\n /* best-effort only */\n }\n}\n","/**\n * `vibgrate/graph/query` — the graph-command surface for editor clients.\n *\n * Every mode here calls the exact same engine functions the CLI commands\n * (`vg ask`, `vg areas`, `vg hubs`, `vg impact`, `vg path`, `vg show`,\n * `vg tree`) call — no re-implementation, no shelling out to a second `vg`\n * process. That is what keeps \"ONE ENGINE, MANY THIN CLIENTS\" (see\n * `server.ts` file header) true for the graph, not just the DriftScore.\n *\n * Unlike the CLI commands, a lookup failure here returns a typed result\n * instead of throwing `CliError` — this is a long-lived server, not a\n * one-shot process that exits on error.\n */\n\nimport { queryGraph, queryGraphSemantic, type QueryResult } from '../engine/query.js';\nimport {\n loadEmbedder,\n getNodeEmbeddings,\n unavailableMessage,\n type EmbedUnavailable,\n} from '../engine/embeddings.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { impactOf } from '../engine/impact.js';\nimport { shortestPath } from '../engine/paths.js';\nimport { indexFor } from '../engine/relations.js';\nimport { toJsonTree } from '../commands/tree.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\nexport type GraphQueryMode = 'ask' | 'areas' | 'hubs' | 'impact' | 'path' | 'show' | 'tree';\n\nexport interface GraphQueryParams {\n mode: GraphQueryMode;\n question?: string;\n semantic?: boolean;\n budget?: number;\n limit?: number;\n name?: string;\n depth?: number;\n a?: string;\n b?: string;\n callers?: boolean;\n}\n\nexport interface GraphQueryContext {\n root: string;\n /** Mirrors `vg ask --local` — skip the embedding download even if `semantic` was requested. */\n offline: boolean;\n /** Mirrors `vg ask --no-semantic` — `false` forces lexical search regardless of the request. */\n semantic?: boolean;\n}\n\ninterface CandidateSummary {\n name: string;\n kind: string;\n file: string;\n line: number;\n}\n\nexport type GraphQueryResult =\n | { ok: true; mode: GraphQueryMode; data: unknown }\n | {\n ok: false;\n mode: GraphQueryMode;\n error: 'ambiguous' | 'not-found' | 'bad-request' | 'disabled';\n message: string;\n candidates?: CandidateSummary[];\n };\n\nexport async function runGraphQuery(\n graph: VgGraph,\n params: GraphQueryParams,\n ctx: GraphQueryContext,\n): Promise<GraphQueryResult> {\n switch (params.mode) {\n case 'ask':\n return runAsk(graph, params, ctx);\n case 'areas':\n return runAreas(graph, params);\n case 'hubs':\n return runHubs(graph, params);\n case 'impact':\n return runImpact(graph, params);\n case 'path':\n return runPath(graph, params);\n case 'show':\n return runShow(graph, params);\n case 'tree':\n return runTree(graph, params);\n default:\n return { ok: false, mode: params.mode, error: 'bad-request', message: `unknown mode \"${String(params.mode)}\"` };\n }\n}\n\nasync function runAsk(graph: VgGraph, params: GraphQueryParams, ctx: GraphQueryContext): Promise<GraphQueryResult> {\n const question = (params.question ?? '').trim();\n if (!question) return { ok: false, mode: 'ask', error: 'bad-request', message: 'question is required' };\n\n const budget = params.budget ?? 2000;\n const wantSemantic = !!params.semantic && !ctx.offline && ctx.semantic !== false;\n\n let result: QueryResult;\n let mode = 'lexical';\n let note: string | undefined;\n\n if (wantSemantic) {\n let reason: EmbedUnavailable | undefined;\n const embedder = await loadEmbedder({ onUnavailable: (r) => (reason = r) });\n if (embedder) {\n const vectors = await getNodeEmbeddings(graph, embedder, ctx.root);\n result = await queryGraphSemantic(graph, question, { budget, embedder, nodeVectors: vectors });\n mode = `semantic (${embedder.id})`;\n } else {\n result = queryGraph(graph, question, { budget });\n note = reason ? unavailableMessage(reason) : 'semantic unavailable; used lexical';\n }\n } else {\n result = queryGraph(graph, question, { budget });\n if (params.semantic && ctx.semantic === false) note = 'semantic search is turned off — used lexical';\n else if (params.semantic && ctx.offline) note = 'semantic skipped — Vibgrate is running offline';\n }\n\n return {\n ok: true,\n mode: 'ask',\n data: {\n question: result.question,\n mode,\n note,\n tokensEstimate: result.tokensEstimate,\n matches: result.matches.map((m) => ({\n name: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span.start,\n score: m.score,\n why: m.why,\n })),\n context: result.context,\n },\n };\n}\n\nfunction runAreas(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const limit = params.limit ?? 30;\n const list = [...graph.areas].sort((a, b) => b.size - a.size || a.id - b.id).slice(0, limit);\n return { ok: true, mode: 'areas', data: list };\n}\n\nfunction runHubs(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const limit = params.limit ?? 20;\n const list = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, limit)\n .map(nodeSummary);\n return { ok: true, mode: 'hubs', data: list };\n}\n\nfunction nodeSummary(n: GraphNode) {\n return {\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n isHub: n.isHub,\n area: n.area,\n };\n}\n\n/** Resolve a name to one node, or a typed not-found/ambiguous result. */\nfunction resolveOrError(\n graph: VgGraph,\n name: string,\n mode: GraphQueryMode,\n): { node: GraphNode } | GraphQueryResult {\n const { node, candidates } = resolveOne(graph, name);\n if (node) return { node };\n if (candidates.length === 0) {\n return { ok: false, mode, error: 'not-found', message: `no node matches \"${name}\"` };\n }\n return {\n ok: false,\n mode,\n error: 'ambiguous',\n message: `\"${name}\" is ambiguous`,\n candidates: candidates.slice(0, 10).map((n) => ({ name: n.qualifiedName, kind: n.kind, file: n.file, line: n.span.start })),\n };\n}\n\nfunction runImpact(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'impact', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'impact');\n if (!('node' in resolved)) return resolved;\n const result = impactOf(graph, resolved.node.id, { depth: params.depth ?? 4 });\n return { ok: true, mode: 'impact', data: result };\n}\n\nfunction runPath(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const a = (params.a ?? '').trim();\n const b = (params.b ?? '').trim();\n if (!a || !b) return { ok: false, mode: 'path', error: 'bad-request', message: 'a and b are required' };\n\n const ra = resolveOrError(graph, a, 'path');\n if (!('node' in ra)) return ra;\n const rb = resolveOrError(graph, b, 'path');\n if (!('node' in rb)) return rb;\n\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n if (!result) {\n return {\n ok: false,\n mode: 'path',\n error: 'not-found',\n message: `no path between ${ra.node.qualifiedName} and ${rb.node.qualifiedName}`,\n };\n }\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n const names = result.ids.map((id) => byId.get(id)?.qualifiedName ?? id);\n return {\n ok: true,\n mode: 'path',\n data: { from: ra.node.qualifiedName, to: rb.node.qualifiedName, hops: names.length - 1, direction: result.direction, path: names },\n };\n}\n\nfunction runShow(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'show', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'show');\n if (!('node' in resolved)) return resolved;\n\n const node = resolved.node;\n const index = indexFor(graph);\n const callees = dedupeNodes(index.callees(node.id).map((x) => x.node));\n const callers = dedupeNodes(index.callers(node.id).map((x) => x.node));\n const extendsEdges = index.out(node.id, 'extends').concat(index.out(node.id, 'implements'));\n const supertypes = extendsEdges.map((e) => index.node(e.dst)?.qualifiedName).filter(Boolean);\n const area = graph.areas.find((a) => a.id === node.area);\n\n return {\n ok: true,\n mode: 'show',\n data: {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n centrality: node.centrality,\n isHub: node.isHub,\n area: node.area,\n areaLabel: area?.label ?? null,\n tested: node.tested,\n calls: callees.map((n) => n.qualifiedName),\n calledBy: callers.map((n) => n.qualifiedName),\n extends: supertypes,\n },\n };\n}\n\nfunction dedupeNodes(nodes: GraphNode[]): GraphNode[] {\n const seen = new Set<string>();\n const out: GraphNode[] = [];\n for (const n of nodes) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n out.push(n);\n }\n return out;\n}\n\nfunction runTree(graph: VgGraph, params: GraphQueryParams): GraphQueryResult {\n const name = (params.name ?? '').trim();\n if (!name) return { ok: false, mode: 'tree', error: 'bad-request', message: 'name is required' };\n const resolved = resolveOrError(graph, name, 'tree');\n if (!('node' in resolved)) return resolved;\n\n const index = indexFor(graph);\n const direction = params.callers ? 'callers' : 'callees';\n const maxDepth = Math.max(1, params.depth ?? 3);\n const data = toJsonTree(index, resolved.node, direction, maxDepth, new Set());\n return { ok: true, mode: 'tree', data };\n}\n","/**\n * Vulnerability enrichment for the panel accordion, from OSV.dev.\n *\n * OSV.dev is the ecosystem-agnostic vulnerability API: one endpoint keyed by an\n * ecosystem slug (npm, PyPI, Go, Maven, crates.io, …) and a version, so a single\n * client covers every package manager the scanner supports. This is deliberately\n * NOT Vibgrate's own API — the editor enriches straight from the public source,\n * so nothing about your dependencies is sent to us.\n *\n * Lazy + cached: called only when the user expands a package in the accordion,\n * and each `ecosystem:name@version` result is cached for the session so a\n * re-expand (or the CVE-count overlay) is instant. Honours `--local`: an offline\n * server never reaches the network and reports `offline`.\n */\n\n/** A single advisory, trimmed to what the accordion shows. */\nexport interface VulnSummary {\n /** OSV id (often a GHSA), the stable key. */\n id: string;\n /** CVE aliases, for the count and cross-reference. */\n cves: string[];\n /** One-line summary (OSV `summary`, else the start of `details`). */\n summary: string;\n /** Normalised severity band, best-effort from OSV data. */\n severity: 'critical' | 'high' | 'moderate' | 'low' | 'unknown';\n}\n\nexport interface EnrichResult {\n vulns: VulnSummary[];\n /** Distinct CVE count across all advisories (for the overlay badge). */\n cveCount: number;\n /** Where the answer came from — surfaced for honesty, never a spinner lie. */\n source: 'osv' | 'cache' | 'offline' | 'error';\n}\n\nconst OSV_QUERY_URL = 'https://api.osv.dev/v1/query';\nconst cache = new Map<string, EnrichResult>();\n\nfunction key(ecosystem: string, name: string, version: string): string {\n return `${ecosystem}:${name}@${version}`;\n}\n\n/** Normalise OSV severity signals (database_specific.severity or a CVSS vector). */\nfunction severityOf(v: Record<string, unknown>): VulnSummary['severity'] {\n const dbSpecific = v.database_specific as Record<string, unknown> | undefined;\n const label = typeof dbSpecific?.severity === 'string' ? dbSpecific.severity.toLowerCase() : '';\n if (label.includes('critical')) return 'critical';\n if (label.includes('high')) return 'high';\n if (label.includes('moderate') || label.includes('medium')) return 'moderate';\n if (label.includes('low')) return 'low';\n // Fall back to a CVSS base score if present.\n const sev = Array.isArray(v.severity) ? (v.severity as Record<string, unknown>[]) : [];\n const cvss = sev.find((s) => typeof s.score === 'string' && String(s.type).startsWith('CVSS'));\n if (cvss) {\n const m = /\\/AV:.*$/.test(String(cvss.score)) ? null : Number(cvss.score);\n if (m != null && !Number.isNaN(m)) {\n if (m >= 9) return 'critical';\n if (m >= 7) return 'high';\n if (m >= 4) return 'moderate';\n if (m > 0) return 'low';\n }\n }\n return 'unknown';\n}\n\nfunction toSummary(raw: unknown): VulnSummary {\n const v = (raw ?? {}) as Record<string, unknown>;\n const aliases = Array.isArray(v.aliases) ? v.aliases.map(String) : [];\n const details = typeof v.details === 'string' ? v.details : '';\n const summary =\n (typeof v.summary === 'string' && v.summary) ||\n (details ? details.split('\\n')[0]!.slice(0, 140) : '') ||\n 'Advisory';\n return {\n id: String(v.id ?? 'unknown'),\n cves: aliases.filter((a) => a.startsWith('CVE-')),\n summary,\n severity: severityOf(v),\n };\n}\n\n/**\n * Query OSV.dev for advisories affecting `name@version` in `ecosystem`.\n * Returns cached results instantly; never throws (a failed lookup degrades to an\n * empty, `error`-sourced result so the accordion just shows \"no known vulns\").\n */\nexport async function enrichVulns(\n ecosystem: string | null,\n name: string,\n version: string | null,\n opts: { offline: boolean } = { offline: false },\n): Promise<EnrichResult> {\n if (!ecosystem || !version) return { vulns: [], cveCount: 0, source: 'error' };\n if (opts.offline) return { vulns: [], cveCount: 0, source: 'offline' };\n\n const k = key(ecosystem, name, version);\n const cached = cache.get(k);\n if (cached) return { ...cached, source: 'cache' };\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n const res = await fetch(OSV_QUERY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ version, package: { name, ecosystem } }),\n signal: controller.signal,\n }).finally(() => clearTimeout(timer));\n\n if (!res.ok) return { vulns: [], cveCount: 0, source: 'error' };\n const data = (await res.json()) as { vulns?: unknown[] };\n const vulns = (data.vulns ?? []).map(toSummary);\n const cveCount = new Set(vulns.flatMap((v) => v.cves)).size;\n const result: EnrichResult = { vulns, cveCount, source: 'osv' };\n cache.set(k, result);\n return result;\n } catch {\n return { vulns: [], cveCount: 0, source: 'error' };\n }\n}\n","/**\n * `vg lsp` — the Vibgrate language server.\n *\n * ONE ENGINE, MANY THIN CLIENTS. This process is the only thing that knows how\n * to score drift. Every editor client (Vibgrate for VS Code, Vibgrate for\n * JetBrains) is a renderer over the messages defined here. If you find yourself\n * adding scoring, banding, or thresholding logic to a client, it belongs here\n * instead — see `docs/IDE-INTEGRATION-PLAN.md` §3, §4.\n *\n * Two rules this file exists to enforce:\n *\n * 1. **The wire carries a `band`, never a colour.** Clients map band → their\n * own native theme colour. Ship a hex from here and every client inherits\n * the light-mode bug (plan §5.0).\n * 2. **Never emit an Error-severity diagnostic.** Vibgrate is not a gate.\n * The engine's findings use `error` for EOL runtimes; we deliberately clamp\n * that to Warning on the way out (plan §8.2). Erroring in the Problems panel\n * is how an ambient tool gets uninstalled.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { pathToFileURL, fileURLToPath } from 'node:url';\n\nimport { runCoreScan } from '../core-open/index.js';\nimport type { ScanArtifact, ScanOptions, DependencyRow, ProjectScan, DriftScore } from '../core-open/index.js';\nimport { loadAdvancedScanHook } from '../reporting/advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { Connection } from './protocol.js';\nimport {\n findPackageLine,\n findRuntimeLine,\n endOfLine,\n isManifest,\n manifestKind,\n} from './manifest-positions.js';\nimport { buildGraph } from '../engine/build.js';\nimport { loadGraph } from '../engine/load.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { manifestHash, loadScanCache, writeScanCache } from './scan-cache.js';\nimport { runGraphQuery, type GraphQueryParams, type GraphQueryResult } from './graph-query.js';\nimport { enrichVulns, type EnrichResult } from './enrich.js';\nimport type { VgGraph } from '../schema.js';\n\n// ── Wire types (the contract every client renders) ─────────────────────────\n\n/** DriftScore band. Mirrors the engine — clients must never re-derive it. */\nexport type Band = 'low' | 'moderate' | 'high';\n\n/** `vibgrate/score` — pushed whenever the score changes. Drives the status bar. */\nexport interface ScoreNotification {\n score: number;\n /** DRIFTSCORE-V3-SPEC §5. Clients map band → theme colour; we never send one. */\n band: Band;\n /** `estimated` renders with a leading `~` (v3 §2.4). Offline is NOT estimated. */\n mode: 'verified' | 'estimated';\n /** Clients must break trend lines across a change here (v3 version-tag note). */\n methodology: string;\n scale: '0 best, 100 worst';\n counts: { behind: number; eol: number; unmaintained: number; total: number };\n rootPath: string;\n scannedAt: string;\n /**\n * Per-package contribution breakdown for the panel accordion — the packages\n * actually driving the score (drift > 0), ranked worst-first. Built from the\n * driftscore-3.0 envelope (`drift.dependencyDrift.top`) enriched with the row\n * detail. Absent when nothing is drifting (e.g. an offline scan that can't\n * resolve latest versions). Vulnerability + registry enrichment is fetched\n * lazily on expand, not carried here.\n */\n breakdown?: BreakdownItem[];\n}\n\n/** One dependency's contribution to the score, for the panel accordion. */\nexport interface BreakdownItem {\n package: string;\n section: string;\n /**\n * OSV.dev ecosystem slug for this dependency (npm, PyPI, Go, Maven, crates.io,\n * RubyGems, NuGet, Packagist, Pub, …), from the owning project's type. Null\n * when the ecosystem has no OSV mapping — the client then skips enrichment.\n */\n ecosystem: string | null;\n /** 0–100 drift contribution for this dependency. */\n drift: number;\n /** Band for `drift` — the client maps it to a colour; it never re-derives it. */\n band: Band;\n currentSpec: string;\n resolvedVersion: string | null;\n latestStable: string | null;\n majorsBehind: number | null;\n ageDays: number | null;\n mode: 'verified' | 'estimated';\n unsupported: boolean;\n abandoned: boolean;\n /** Data-quality guards that fired (canary-latest, scheme-jump, high-cadence…). */\n flags: string[];\n}\n\n/** One coloured end-of-line decoration. `vibgrate/inline`, pushed per open manifest. */\nexport interface InlineItem {\n line: number;\n endCol: number;\n text: string;\n band: Band;\n package: string;\n}\n\nexport interface InlineNotification {\n uri: string;\n items: InlineItem[];\n}\n\n/**\n * `vibgrate/status` — a scan lifecycle signal that carries no score. Currently\n * only `error`, pushed when a scan fails, so a client never sits on a \"scanning\"\n * placeholder forever. Deliberately minimal and non-alarming (the client shows a\n * quiet state, never a toast).\n */\nexport interface StatusNotification {\n state: 'error';\n}\n\n/**\n * `vibgrate/graph/status` — mirrors `vibgrate/status` but for the code map:\n * lets a client show a \"building the map…\" placeholder for the Graph section\n * the first time it runs on a repo, without blocking the drift score.\n */\nexport interface GraphStatusNotification {\n /** `disabled` = the client launched with `--no-graph` (the Graph setting is off). */\n state: 'building' | 'ready' | 'error' | 'disabled';\n message?: string;\n}\n\n// ── Band + severity mapping ────────────────────────────────────────────────\n\n/**\n * Per-dependency band, from the engine's drift classification.\n *\n * NOTE (P0, plan §0.3): the repo currently ships two band systems — the score\n * bands here (low ≤30 / moderate ≤60 / high >60, `drift-score.ts`) and the\n * badge/dashboard bands (green ≤20 / amber ≤50 / red >50, `drift-badge.ts`).\n * They disagree for scores in 21–30 and 51–60. DRIFTSCORE-V3-SPEC §6 item 5\n * schedules the reconciliation. When it lands, this is the ONLY place in the\n * IDE stack that changes — which is the entire reason clients are forbidden\n * from deriving a band themselves.\n */\nfunction bandForDependency(dep: DependencyRow): Band {\n if (dep.drift === 'major-behind') {\n return (dep.majorsBehind ?? 1) >= 2 ? 'high' : 'moderate';\n }\n if (dep.drift === 'minor-behind') return 'moderate';\n return 'low';\n}\n\n/**\n * The engine emits `error` for an EOL runtime. The editor must not.\n * See the file header, rule 2.\n */\nfunction severityFor(level: 'warning' | 'error' | 'note'): 1 | 2 | 3 | 4 {\n // LSP DiagnosticSeverity: 1 Error · 2 Warning · 3 Information · 4 Hint\n if (level === 'note') return 3;\n return 2; // both `warning` and `error` clamp to Warning. Never 1.\n}\n\n/**\n * Only hard facts reach the Problems panel, and only when the user opts in.\n * \"You are two minors behind\" is not a defect and does not belong here\n * (plan §8.2).\n */\nconst DIAGNOSTIC_RULES = new Set([\n 'vibgrate/runtime-eol',\n 'vibgrate/runtime-lag',\n 'vibgrate/unmaintained',\n 'vibgrate/abandoned',\n 'vibgrate/license-change',\n 'vibgrate/eol',\n]);\n\n// ── Server ─────────────────────────────────────────────────────────────────\n\ninterface ServerOptions {\n root: string;\n offline: boolean;\n /** Problems-panel diagnostics. OFF unless the client asks (plan §8.1). */\n diagnostics: boolean;\n /** The local Vibgrate Graph. `false` (`--no-graph`) skips the background build and disables graph queries. */\n graph: boolean;\n /** Semantic search over the graph. `false` (`--no-semantic`) forces lexical and never downloads the embedding model. */\n semantic: boolean;\n}\n\nexport class VibgrateLanguageServer {\n private readonly conn: Connection;\n private readonly docs = new Map<string, string>(); // uri → text\n private artifact: ScanArtifact | null = null;\n private scanning = false;\n private queued = false;\n private debounce: NodeJS.Timeout | null = null;\n private shuttingDown = false;\n private graph: VgGraph | null = null;\n private graphBuilding = false;\n\n constructor(\n private readonly opts: ServerOptions,\n output: NodeJS.WritableStream = process.stdout,\n ) {\n this.conn = new Connection(process.stdin, output);\n this.register();\n }\n\n private register(): void {\n this.conn.onRequest('initialize', () => ({\n capabilities: {\n // 1 = Full sync. We only actually act on save, but full sync keeps our\n // buffer honest so hovers land on the text the user is looking at.\n textDocumentSync: 1,\n hoverProvider: true,\n codeLensProvider: { resolveProvider: false },\n executeCommandProvider: {\n commands: ['vibgrate.rescan', 'vibgrate.explain', 'vibgrate.routeFix'],\n },\n },\n serverInfo: { name: 'Vibgrate', version: VERSION },\n }));\n\n this.conn.onNotification('initialized', () => {\n this.scheduleScan(0);\n // Independent of the drift scan — a slow first graph build must not\n // delay the score the status bar/panel are waiting on.\n void this.ensureGraph();\n });\n\n this.conn.onNotification('textDocument/didOpen', (_m, params) => {\n const p = params as { textDocument?: { uri?: string; text?: string } };\n const uri = p.textDocument?.uri;\n if (!uri || !isManifest(uriToPath(uri))) return;\n this.docs.set(uri, p.textDocument?.text ?? '');\n // Already scanned? Render immediately — don't make the user wait on a\n // rescan just because they opened a second manifest.\n if (this.artifact) this.publishForDoc(uri);\n else this.scheduleScan(0);\n });\n\n this.conn.onNotification('textDocument/didChange', (_m, params) => {\n const p = params as {\n textDocument?: { uri?: string };\n contentChanges?: { text?: string }[];\n };\n const uri = p.textDocument?.uri;\n if (!uri || !this.docs.has(uri)) return;\n const full = p.contentChanges?.[p.contentChanges.length - 1]?.text;\n if (typeof full === 'string') this.docs.set(uri, full);\n // Do NOT rescan on keystroke — that is how you get a tool that heats a\n // laptop. Re-anchor the existing decorations against the new text only.\n if (this.artifact) this.publishForDoc(uri);\n });\n\n this.conn.onNotification('textDocument/didSave', (_m, params) => {\n const p = params as { textDocument?: { uri?: string } };\n const uri = p.textDocument?.uri;\n if (!uri || !this.docs.has(uri)) return;\n this.scheduleScan(400);\n });\n\n this.conn.onNotification('textDocument/didClose', (_m, params) => {\n const p = params as { textDocument?: { uri?: string } };\n if (p.textDocument?.uri) this.docs.delete(p.textDocument.uri);\n });\n\n this.conn.onRequest('textDocument/hover', (_m, params) => this.onHover(params));\n this.conn.onRequest('textDocument/codeLens', (_m, params) => this.onCodeLens(params));\n\n this.conn.onRequest('vibgrate/graph/query', (_m, params) => this.onGraphQuery(params));\n this.conn.onRequest('vibgrate/score/forFile', (_m, params) => this.onScoreForFile(params));\n this.conn.onRequest('vibgrate/enrich', (_m, params) => this.onEnrich(params));\n\n this.conn.onRequest('workspace/executeCommand', (_m, params) => {\n const p = params as { command?: string };\n if (p.command === 'vibgrate.rescan') {\n this.scheduleScan(0);\n return { ok: true };\n }\n return null;\n });\n\n this.conn.onRequest('shutdown', () => {\n this.shuttingDown = true;\n if (this.debounce) clearTimeout(this.debounce);\n return null;\n });\n\n this.conn.onNotification('exit', () => {\n process.exit(this.shuttingDown ? 0 : 1);\n });\n }\n\n // ── Scanning ─────────────────────────────────────────────────────────────\n\n private scheduleScan(delayMs: number): void {\n if (this.debounce) clearTimeout(this.debounce);\n this.debounce = setTimeout(() => void this.scan(), delayMs);\n }\n\n private async scan(): Promise<void> {\n if (this.scanning) {\n this.queued = true;\n return;\n }\n this.scanning = true;\n\n try {\n // The expensive part of a scan is the per-package registry lookups, not\n // reading the manifest/lockfile — so hash just those first (cheap: no\n // network) and skip `runCoreScan` entirely when nothing a scan cares\n // about has changed since the last successful scan on this machine.\n // `toolVersion`/`offline` are part of the key too: an engine upgrade or a\n // flip of `vibgrate.offline` must not replay a scan from before it.\n const cacheKey = { manifestHash: manifestHash(this.opts.root), toolVersion: VERSION, offline: this.opts.offline };\n const cached = loadScanCache(this.opts.root, cacheKey);\n\n if (cached) {\n this.artifact = cached.artifact;\n } else {\n const scanOpts: ScanOptions = {\n format: 'json',\n concurrency: 8,\n offline: this.opts.offline,\n noLocalArtifacts: true, // an editor scan must not litter the repo\n noGraph: true, // the code map is not needed to score drift; skip the cost\n quiet: true, // no spinners, no artifact dump — an editor is not a terminal\n vibgrateVersion: VERSION,\n } as ScanOptions;\n\n // Same hook `vg scan` uses, so the number the editor shows is the number\n // the CLI shows — by construction, not by coincidence (plan §8.3).\n const advanced = await loadAdvancedScanHook();\n this.artifact = await runCoreScan(this.opts.root, scanOpts, advanced);\n writeScanCache(this.opts.root, cacheKey, this.artifact);\n }\n\n this.publishScore();\n for (const uri of this.docs.keys()) this.publishForDoc(uri);\n } catch (err) {\n // A failed scan is silent — no red banner because a lockfile was mid-write.\n // But it must not be INVISIBLE: without a signal the client sits on its\n // \"scanning…\" placeholder forever. The reason goes to the log; a minimal\n // `error` status tells the client to stop pretending it is still working.\n this.conn.notify('window/logMessage', {\n type: 3,\n message: `Vibgrate scan failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n this.conn.notify('vibgrate/status', { state: 'error' } satisfies StatusNotification);\n } finally {\n this.scanning = false;\n if (this.queued) {\n this.queued = false;\n this.scheduleScan(0);\n }\n }\n }\n\n // ── Publishing ───────────────────────────────────────────────────────────\n\n private publishScore(): void {\n const a = this.artifact;\n if (!a) return;\n\n let behind = 0;\n let unmaintained = 0;\n let total = 0;\n for (const proj of a.projects ?? []) {\n for (const dep of proj.dependencies ?? []) {\n total++;\n if (dep.drift === 'major-behind' || dep.drift === 'minor-behind') behind++;\n }\n }\n const eol = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol',\n ).length;\n unmaintained = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/unmaintained' || f.ruleId === 'vibgrate/abandoned',\n ).length;\n\n // `riskLevel` is what `driftscore-2.0` ships; v3 renames it `band` (§5\n // envelope). We normalise to `band` on the wire so clients are already\n // speaking v3 and need no change when the engine catches up.\n const band = (a.drift.riskLevel ?? 'low') as Band;\n\n const payload: ScoreNotification = {\n score: a.drift.score,\n band,\n // v3 §2.4: `estimated` means \"no timestamps at all\" — it is NOT an\n // offline marker. An air-gapped scan against a dated snapshot is Verified.\n // The score now carries the authoritative provenance (driftscore-3.0\n // envelope); fall back to the artifact heuristic for pre-v3 engines.\n mode: a.drift.mode ?? (hasReleaseDates(a) ? 'verified' : 'estimated'),\n methodology: a.drift.methodologyVersion ?? 'unknown',\n scale: '0 best, 100 worst',\n counts: { behind, eol, unmaintained, total },\n rootPath: a.rootPath,\n scannedAt: a.timestamp,\n ...(buildBreakdown(a.drift, a.projects ?? []) ? { breakdown: buildBreakdown(a.drift, a.projects ?? []) } : {}),\n };\n\n this.conn.notify('vibgrate/score', payload);\n }\n\n /** Decorations + (optionally) diagnostics for one open manifest. */\n private publishForDoc(uri: string): void {\n const a = this.artifact;\n const text = this.docs.get(uri);\n if (!a || text === undefined) return;\n\n const filePath = uriToPath(uri);\n const kind = manifestKind(filePath);\n const project = projectForFile(this.opts.root, a, filePath);\n\n // ── inline decorations ──\n const items: InlineItem[] = [];\n for (const dep of project?.dependencies ?? []) {\n if (dep.drift === 'current' || dep.drift === 'unknown') continue;\n const line = findPackageLine(text, dep.package, kind);\n if (line === -1) continue;\n items.push({\n line,\n endCol: endOfLine(text, line),\n text: inlineLabel(dep),\n band: bandForDependency(dep),\n package: dep.package,\n });\n }\n this.conn.notify('vibgrate/inline', { uri, items } satisfies InlineNotification);\n\n // ── diagnostics (off unless the client asked) ──\n if (!this.opts.diagnostics) {\n this.conn.notify('textDocument/publishDiagnostics', { uri, diagnostics: [] });\n return;\n }\n\n const diagnostics = (a.findings ?? [])\n .filter((f) => DIAGNOSTIC_RULES.has(f.ruleId))\n .filter((f) => project && sameProject(f.location, project.path))\n .map((f) => {\n const line = Math.max(0, findRuntimeLine(text, kind));\n return {\n range: {\n start: { line, character: 0 },\n end: { line, character: endOfLine(text, line) },\n },\n severity: severityFor(f.level), // never 1 — see file header\n source: 'vibgrate',\n code: f.ruleId,\n message: f.message,\n };\n });\n\n this.conn.notify('textDocument/publishDiagnostics', { uri, diagnostics });\n }\n\n // ── Requests ─────────────────────────────────────────────────────────────\n\n private onHover(params: unknown): unknown {\n const p = params as {\n textDocument?: { uri?: string };\n position?: { line?: number; character?: number };\n };\n const uri = p.textDocument?.uri;\n const line = p.position?.line;\n const a = this.artifact;\n const text = uri ? this.docs.get(uri) : undefined;\n if (!uri || line === undefined || !a || text === undefined) return null;\n\n const filePath = uriToPath(uri);\n const kind = manifestKind(filePath);\n const project = projectForFile(this.opts.root, a, filePath);\n\n const dep = (project?.dependencies ?? []).find(\n (d) => findPackageLine(text, d.package, kind) === line,\n );\n if (!dep) return null;\n\n const contribution = a.drift.dependencyDrift?.top.find((t) => t.package === dep.package)?.drift ?? null;\n return {\n contents: { kind: 'markdown', value: hoverMarkdown(dep, contribution) },\n };\n }\n\n private onCodeLens(params: unknown): unknown {\n const p = params as { textDocument?: { uri?: string } };\n const uri = p.textDocument?.uri;\n const a = this.artifact;\n if (!uri || !a || !this.docs.has(uri)) return [];\n\n // ONE lens, at the top of the file. A per-dependency lens would double the\n // height of package.json — and a CodeLens cannot carry colour anyway, which\n // is why the per-dependency detail is an inline decoration (plan §5.2).\n const behind = (a.projects ?? []).reduce(\n (n, proj) =>\n n +\n (proj.dependencies ?? []).filter(\n (d) => d.drift === 'major-behind' || d.drift === 'minor-behind',\n ).length,\n 0,\n );\n const eol = (a.findings ?? []).filter(\n (f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol',\n ).length;\n\n const estimated = (a.drift.mode ?? (hasReleaseDates(a) ? 'verified' : 'estimated')) === 'estimated';\n const mode = estimated ? '~' : '';\n const title =\n `Vibgrate · drift ${mode}${a.drift.score} (${a.drift.riskLevel}) · ` +\n `${behind} behind · ${eol} EOL`;\n\n return [\n {\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },\n command: { title, command: 'vibgrate.openPanel', arguments: [] },\n },\n ];\n }\n\n // ── Graph ────────────────────────────────────────────────────────────────\n\n /**\n * Load the committed map if one exists, else build it once (this is the\n * \"first activation sets up the graph\" step). Fire-and-forget from\n * `initialized` so it never blocks the drift score; a query that arrives\n * mid-build awaits the same in-flight promise via the `graphBuilding` guard.\n */\n private async ensureGraph(): Promise<void> {\n if (!this.opts.graph) {\n // Turned off by the user (`--no-graph`). Say so once, quietly — the\n // client's Graph section renders the off state instead of \"building…\".\n this.conn.notify('vibgrate/graph/status', { state: 'disabled' } satisfies GraphStatusNotification);\n return;\n }\n if (this.graph || this.graphBuilding) return;\n this.graphBuilding = true;\n try {\n const existing = loadGraph(this.opts.root);\n if (existing) {\n this.graph = existing;\n this.conn.notify('vibgrate/graph/status', { state: 'ready' } satisfies GraphStatusNotification);\n return;\n }\n\n this.conn.notify('vibgrate/graph/status', { state: 'building' } satisfies GraphStatusNotification);\n const result = await buildGraph({ root: this.opts.root });\n // Leaves `.vibgrate/graph.json` exactly as a manual `vg build` would, so\n // `vg ask` from a terminal afterward sees the same map.\n writeArtifacts(result.graph, { root: this.opts.root, html: false, report: false });\n writeSnapshot(this.opts.root, result.graph.provenance.corpusHash, result.fileStats, {});\n this.graph = result.graph;\n this.conn.notify('vibgrate/graph/status', { state: 'ready' } satisfies GraphStatusNotification);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.conn.notify('window/logMessage', { type: 3, message: `Vibgrate graph build failed: ${message}` });\n this.conn.notify('vibgrate/graph/status', { state: 'error', message } satisfies GraphStatusNotification);\n } finally {\n this.graphBuilding = false;\n }\n }\n\n /** The graph, refreshed if the working tree drifted since the last build (same probe `vg ask` uses). */\n private async graphForQuery(): Promise<VgGraph | null> {\n await this.ensureGraph();\n if (!this.graph) return null;\n const refreshed = await refreshIfStale(this.opts.root);\n if (refreshed.status === 'refreshed' && refreshed.wrote) {\n const reloaded = loadGraph(this.opts.root);\n if (reloaded) this.graph = reloaded;\n }\n return this.graph;\n }\n\n private async onGraphQuery(params: unknown): Promise<GraphQueryResult> {\n const p = params as GraphQueryParams;\n if (!this.opts.graph) {\n return { ok: false, mode: p.mode, error: 'disabled', message: 'the local Vibgrate Graph is turned off' };\n }\n const graph = await this.graphForQuery();\n if (!graph) {\n return { ok: false, mode: p.mode, error: 'not-found', message: 'no code map yet — it is still building' };\n }\n return runGraphQuery(graph, p, { root: this.opts.root, offline: this.opts.offline, semantic: this.opts.semantic });\n }\n\n /**\n * `vibgrate/enrich` — lazy vulnerability enrichment for one expanded package,\n * straight from OSV.dev (never our API). Honours the server's offline flag.\n */\n private onEnrich(params: unknown): Promise<EnrichResult> {\n const p = (params ?? {}) as { ecosystem?: string | null; package?: string; version?: string | null };\n return enrichVulns(p.ecosystem ?? null, p.package ?? '', p.version ?? null, { offline: this.opts.offline });\n }\n\n private onScoreForFile(params: unknown): ScoreNotification | null {\n const p = params as { uri?: string };\n const a = this.artifact;\n if (!a || !p.uri) return null;\n const project = projectForFile(this.opts.root, a, uriToPath(p.uri));\n return project ? scoreForProject(a, project) : null;\n }\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction uriToPath(uri: string): string {\n try {\n return fileURLToPath(uri);\n } catch {\n return uri;\n }\n}\n\n/**\n * Which scanned project owns this manifest file?\n *\n * Resolve against the *server's* root, not `artifact.rootPath`. The artifact\n * deliberately carries a relative, portable root (it is uploaded and compared\n * across machines), so resolving against it lands on the process cwd — which is\n * wherever the editor happened to spawn us from, and is not the workspace.\n * That mismatch silently produces zero decorations and zero diagnostics: the\n * score renders fine and every in-editor surface is empty.\n */\nfunction projectForFile(root: string, a: ScanArtifact, filePath: string): ProjectScan | undefined {\n const dir = path.dirname(path.resolve(filePath));\n let best: ProjectScan | undefined;\n let bestLen = -1;\n for (const proj of a.projects ?? []) {\n const projDir = path.resolve(root, proj.path);\n // Longest matching prefix wins — correct in a monorepo, where the root\n // package.json and packages/foo/package.json both \"contain\" the file.\n if ((dir === projDir || dir.startsWith(projDir + path.sep)) && projDir.length > bestLen) {\n best = proj;\n bestLen = projDir.length;\n }\n }\n return best;\n}\n\nfunction sameProject(location: string, projectPath: string): boolean {\n return path.normalize(location) === path.normalize(projectPath);\n}\n\n/** Does the artifact carry release-date data? Drives Verified vs Estimated. */\nfunction hasReleaseDates(a: ScanArtifact): boolean {\n for (const proj of a.projects ?? []) {\n for (const dep of proj.dependencies ?? []) {\n if (dep.ageDays !== null && dep.ageDays !== undefined) return true;\n }\n }\n return false;\n}\n\n/**\n * `vibgrate/score/forFile` payload for one project — same shape as the\n * whole-repo `ScoreNotification`, scoped to a single manifest. Reuses the\n * per-project `drift` the scan already computed (`ProjectScan.drift`) rather\n * than re-deriving a score client-side, for the same \"one engine\" reason the\n * whole-repo score is never recomputed in a client.\n */\nfunction scoreForProject(a: ScanArtifact, proj: ProjectScan): ScoreNotification | null {\n if (!proj.drift) return null;\n\n let behind = 0;\n let total = 0;\n for (const dep of proj.dependencies ?? []) {\n total++;\n if (dep.drift === 'major-behind' || dep.drift === 'minor-behind') behind++;\n }\n const projFindings = (a.findings ?? []).filter((f) => sameProject(f.location, proj.path));\n const eol = projFindings.filter((f) => f.ruleId === 'vibgrate/runtime-eol' || f.ruleId === 'vibgrate/eol').length;\n const unmaintained = projFindings.filter(\n (f) => f.ruleId === 'vibgrate/unmaintained' || f.ruleId === 'vibgrate/abandoned',\n ).length;\n const hasDates = (proj.dependencies ?? []).some((d) => d.ageDays !== null && d.ageDays !== undefined);\n\n return {\n score: proj.drift.score,\n band: (proj.drift.riskLevel ?? 'low') as Band,\n mode: proj.drift.mode ?? (hasDates ? 'verified' : 'estimated'),\n methodology: proj.drift.methodologyVersion ?? a.drift.methodologyVersion ?? 'unknown',\n scale: '0 best, 100 worst',\n counts: { behind, eol, unmaintained, total },\n rootPath: proj.path,\n scannedAt: a.timestamp,\n ...(buildBreakdown(proj.drift, [proj]) ? { breakdown: buildBreakdown(proj.drift, [proj]) } : {}),\n };\n}\n\n/** Band for a 0–100 drift number — the reconciled score bands (§6.5). The\n * server sends the band; the client never re-derives one. */\nfunction bandForScore(n: number): Band {\n if (n <= 30) return 'low';\n if (n <= 60) return 'moderate';\n return 'high';\n}\n\n/**\n * The per-package contribution breakdown for the panel accordion. Built from the\n * driftscore-3.0 envelope's ranked `top` (authoritative — the same per-dependency\n * drift the aggregate used), enriched with the row detail (spec, resolved,\n * latest, age). Only contributing packages (drift > 0); empty when nothing\n * drifts (e.g. offline, where latest versions can't be resolved).\n */\nfunction buildBreakdown(drift: DriftScore, projects: ProjectScan[]): BreakdownItem[] | undefined {\n const top = drift.dependencyDrift?.top;\n if (!top || top.length === 0) return undefined;\n\n const byPkg = new Map<string, { row: DependencyRow; ecosystem: string | null }>();\n for (const p of projects) {\n const ecosystem = osvEcosystem(p.type);\n for (const d of p.dependencies ?? []) if (!byPkg.has(d.package)) byPkg.set(d.package, { row: d, ecosystem });\n }\n\n const items = top\n .filter((t) => t.drift > 0)\n .map((t): BreakdownItem => {\n const found = byPkg.get(t.package);\n const row = found?.row;\n return {\n package: t.package,\n section: row?.section ?? 'dependencies',\n ecosystem: found?.ecosystem ?? null,\n drift: t.drift,\n band: bandForScore(t.drift),\n currentSpec: row?.currentSpec ?? '',\n resolvedVersion: row?.resolvedVersion ?? null,\n latestStable: row?.latestStable ?? null,\n majorsBehind: row?.majorsBehind ?? null,\n ageDays: row?.ageDays ?? null,\n mode: t.mode,\n unsupported: t.unsupported,\n abandoned: t.flags.includes('abandoned-floor'),\n flags: t.flags,\n };\n });\n\n return items.length > 0 ? items : undefined;\n}\n\n/** Map a scanned project type to its OSV.dev ecosystem slug (null = no OSV\n * coverage, so the client skips vulnerability enrichment). */\nfunction osvEcosystem(type: ProjectScan['type']): string | null {\n switch (type) {\n case 'node':\n case 'typescript': return 'npm';\n case 'python': return 'PyPI';\n case 'java':\n case 'kotlin':\n case 'scala':\n case 'groovy': return 'Maven';\n case 'go': return 'Go';\n case 'rust': return 'crates.io';\n case 'ruby': return 'RubyGems';\n case 'php': return 'Packagist';\n case 'dotnet': return 'NuGet';\n case 'dart': return 'Pub';\n case 'swift': return 'SwiftURL';\n case 'elixir': return 'Hex';\n default: return null;\n }\n}\n\n/** The end-of-line decoration text. Terse: it sits in the user's code. */\nfunction inlineLabel(dep: DependencyRow): string {\n const bits: string[] = [];\n if (dep.drift === 'major-behind') {\n const n = dep.majorsBehind ?? 1;\n bits.push(`${n} major behind`);\n } else if (dep.drift === 'minor-behind') {\n bits.push('minor behind');\n }\n if (dep.latestStable) bits.push(dep.latestStable);\n // ageDays is fractional off the wire — round it. \"1,896.836d stale\" in the\n // margin of someone's package.json is the kind of detail that reads as sloppy.\n if (dep.ageDays != null && dep.ageDays >= 1) {\n bits.push(`${Math.round(dep.ageDays).toLocaleString('en-US')}d stale`);\n }\n return bits.join(' · ');\n}\n\n/** `command:` URI for a `MarkdownString` link — one JSON-encoded arg object, matching `executeCommand`. */\nfunction commandUri(command: string, args: unknown): string {\n return `command:${command}?${encodeURIComponent(JSON.stringify([args]))}`;\n}\n\n/** \"2 majors behind\" / \"minor behind\" — the hover card's badge text. Mirrors `inlineLabel`'s drift wording. */\nfunction driftBadge(dep: DependencyRow): string | null {\n if (dep.drift === 'major-behind') {\n const n = dep.majorsBehind ?? 1;\n return `${n} major${n === 1 ? '' : 's'} behind`;\n }\n if (dep.drift === 'minor-behind') return 'minor behind';\n return null;\n}\n\n/**\n * \"17.x → 18.x → 19.x\" — a plain-text stand-in for the wireframe's version\n * ladder graphic (hover markdown can't draw one). Built only from the real\n * major-version numbers in `yours`/`latest`; long jumps are truncated with\n * `…` rather than listing every major, so a package that is a decade behind\n * doesn't produce a wall of numbers. Returns null when either version isn't\n * a parseable `<major>.x` (so nothing is shown rather than something wrong).\n */\nfunction versionJourney(yours: string, latest: string): string | null {\n const from = Number(/^(\\d+)/.exec(yours)?.[1]);\n const to = Number(/^(\\d+)/.exec(latest)?.[1]);\n if (!Number.isFinite(from) || !Number.isFinite(to) || to <= from) return null;\n\n const majors: number[] = [];\n for (let m = from; m <= to; m++) majors.push(m);\n const shown = majors.length > 5 ? [majors[0], majors[1], -1, majors[majors.length - 2], majors[majors.length - 1]] : majors;\n return shown.map((m) => (m === -1 ? '…' : `${m}.x`)).join(' → ');\n}\n\n/**\n * The hover card (docs/ide-integration/wireframes/02-hover-card.svg). Shows\n * the facts we actually have: version currency, this dependency's real\n * contribution to the score, and real maintenance flags (`unsupported`/\n * `abandoned`).\n *\n * The wireframe also lists upstream release cadence, a last-commit date, a\n * breaking-change count, and transitive blast radius. None of those are\n * backed by real data today — no release-history or changelog source is\n * scanned, and the graph does not track per-npm-package import edges — so\n * they are left out rather than approximated. Fabricating them would violate\n * the same rule that keeps marketing visuals honest (no invented product\n * output); a hover card is not exempt.\n *\n * Two links, both real, not aspirational: \"Route this fix →\" opens the\n * existing ranked, vendor-neutral remediation menu (`routeFix.ts`) — per the\n * wireframe's own design notes, that is explicitly not a \"Fix\" button, so it\n * does not conflict with \"no fix affordance\" (plan §0.1). \"Explain this\n * drift\" focuses the panel and expands this dependency's breakdown row,\n * which already carries the full explanation (guards, floors, age).\n */\nfunction hoverMarkdown(dep: DependencyRow, contribution: number | null): string {\n const lines: string[] = [];\n const badge = driftBadge(dep);\n const contributionText = contribution != null ? ` · contributes +${Math.round(contribution)} to drift` : '';\n lines.push(badge ? `**${dep.package}** \\`${badge}\\`${contributionText}` : `**${dep.package}**`);\n lines.push('');\n\n const yours = dep.resolvedVersion ?? dep.currentSpec;\n const drifted = dep.drift === 'major-behind' || dep.drift === 'minor-behind';\n\n if (dep.latestStable && dep.latestStable !== yours) {\n lines.push('**Currency**');\n lines.push(`| | |`);\n lines.push(`|---|---|`);\n lines.push(`| yours | \\`${yours}\\` |`);\n lines.push(`| latest | \\`${dep.latestStable}\\` |`);\n const journey = versionJourney(yours, dep.latestStable);\n if (journey) lines.push(`| journey | ${journey} |`);\n if (dep.majorsBehind) lines.push(`| majors behind | ${dep.majorsBehind} |`);\n if (dep.ageDays != null && dep.ageDays >= 1) {\n lines.push(`| age | ${Math.round(dep.ageDays).toLocaleString('en-US')} days |`);\n }\n if (dep.libyears != null && dep.libyears >= 0.01) {\n lines.push(`| libyears | ${dep.libyears.toFixed(2)} |`);\n }\n const license = dep.license?.spdxId ?? dep.license?.raw;\n if (license) lines.push(`| license | ${license} |`);\n } else {\n lines.push(`\\`${yours}\\` — current.`);\n }\n\n if (dep.unsupported || dep.abandoned) {\n lines.push('');\n lines.push('**Maintenance**');\n if (dep.unsupported) lines.push('$(warning) Unsupported / deprecated — floored at 70.');\n if (dep.abandoned) lines.push('$(warning) Abandoned — no recent releases — floored at 50.');\n }\n\n if (drifted) {\n lines.push('');\n lines.push('---');\n const routeFixUri = commandUri('vibgrate.routeFix', {\n package: dep.package,\n from: yours,\n to: dep.latestStable ?? yours,\n majorsBehind: dep.majorsBehind ?? 0,\n });\n const explainUri = commandUri('vibgrate.explain', { package: dep.package });\n lines.push(`[Route this fix →](${routeFixUri}) · [Explain this drift](${explainUri})`);\n }\n\n lines.push('');\n lines.push('---');\n lines.push('$(shield) Resolved locally from your lockfile. No source uploaded.');\n return lines.join('\\n');\n}\n\n// ── Entry point ────────────────────────────────────────────────────────────\n\nexport function startLanguageServer(opts: ServerOptions): void {\n if (!fs.existsSync(opts.root)) {\n process.stderr.write(`vg lsp: root does not exist: ${opts.root}\\n`);\n process.exit(1);\n }\n\n /*\n * stdout is the protocol channel, and nothing else may touch it.\n *\n * A single stray `console.log` from anywhere in the scanner tree — a debug\n * line, a deprecation warning, a progress spinner — lands in the middle of a\n * framed message, desynchronises the reader, and the editor reports the\n * server as crashed. This is the most common way an LSP integration fails,\n * and it fails intermittently, which is worse.\n *\n * So we take the real stdout writer for ourselves, hand it to the protocol,\n * and then redirect `process.stdout` to stderr for the rest of the process.\n * After this point it is not possible for anything else to write to the\n * protocol stream, however deep in the call tree it lives.\n */\n const realWrite = process.stdout.write.bind(process.stdout);\n\n const protocolOut = {\n write(chunk: string | Uint8Array): boolean {\n return realWrite(chunk as never);\n },\n } as NodeJS.WritableStream;\n\n process.stdout.write = ((chunk: never, ...rest: never[]) =>\n process.stderr.write(chunk, ...rest)) as typeof process.stdout.write;\n\n process.stderr.write(\n `vg lsp ${VERSION} — serving ${pathToFileURL(opts.root).href}` +\n `${opts.offline ? ' (offline)' : ''}\\n`,\n );\n\n new VibgrateLanguageServer(opts, protocolOut);\n}\n","import { Command } from 'commander';\nimport { startLanguageServer } from '../lsp/server.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\n\n/**\n * `vg lsp` — the Vibgrate language server (stdio).\n *\n * Editors spawn this; humans generally don't. It is the single engine behind\n * **Vibgrate for VS Code** and **Vibgrate for JetBrains** — one scanner, many\n * thin clients, exactly the architecture Snyk uses and for the same reason:\n * a new IDE should be a new client, never a new scanner.\n *\n * The server speaks standard LSP (diagnostics, hover, CodeLens) plus one\n * custom notification, `vibgrate/score`, which carries the DriftScore and its\n * **band** — never a colour. Clients map band → their own theme colour, which\n * is what keeps light mode, dark mode, high contrast, and JetBrains all honest\n * from a single source of truth.\n *\n * See `docs/IDE-INTEGRATION-PLAN.md` §3.\n */\nexport function registerLsp(program: Command): void {\n const cmd = program\n .command('lsp')\n .description('start the Vibgrate language server (stdio) — the engine behind the IDE extensions')\n .option(\n '--diagnostics',\n 'also publish Problems-panel diagnostics (EOL runtime, unmaintained, license change). Off by default: drift is not a defect, and the Problems panel is not ours to fill',\n false,\n )\n .option('--no-graph', 'skip the local Vibgrate Graph entirely: no background build, and graph queries report it as turned off')\n .option('--no-semantic', 'never use semantic search for graph queries (lexical only; the embedding model is not downloaded)')\n .action(async function (this: Command, opts: { diagnostics?: boolean; graph?: boolean; semantic?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n startLanguageServer({\n root,\n // `--local` is the established air-gap flag across the CLI; honour it\n // here too, so an offline editor session stays offline.\n offline: global.local === true,\n diagnostics: opts.diagnostics === true,\n graph: opts.graph !== false,\n semantic: opts.semantic !== false,\n });\n\n // The server owns the process from here: it lives on stdin/stdout until\n // the client sends `shutdown` + `exit`. Returning from the action must\n // not let the CLI exit, so we never resolve.\n await new Promise<never>(() => {});\n });\n\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { ASSISTANTS, SMALL_REPO_FILES, assistantById, detectAssistants, detectServeLaunch, installAssistant, uninstallAssistant, writeNavigationConfig } from '../install/registry.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg install <tool…>` (VG-CLI-SPEC §3.7) — wire vg into AI assistants: a skill,\n * an advisory (opt-out) nudge, and an MCP registration where supported.\n * Idempotent; repo-local (the team-shareable default). On small repos the nudge\n * honestly says searching is fine.\n */\nexport function registerInstall(program: Command): void {\n const install = program\n .command('install')\n .description('add vg to your AI assistant(s): skill + MCP + advisory nudge')\n .argument('[tools...]', `assistant ids: ${ASSISTANTS.map((a) => a.id).join(', ')}`)\n .option('--all', 'install for every supported assistant')\n .option('--detect', 'detect assistants in use (repo footprint, home config, PATH) and install for those; with --list, only report what was detected')\n .option('--list', 'show the support matrix and exit')\n .option('--no-hook', 'skip the advisory nudge')\n .action(function (this: Command, tools: string[], opts: { all?: boolean; detect?: boolean; list?: boolean; hook?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n const detected = opts.detect ? detectAssistants(root) : [];\n\n if (opts.list) {\n if (opts.detect) {\n // Detection report only — nothing is written. This is what editor\n // integrations poll before deciding to run an install.\n if (global.json) {\n json(detected.map((d) => ({ id: d.assistant.id, label: d.assistant.label, via: d.via, marker: d.marker })));\n } else if (detected.length === 0) {\n info(`${c.cyan('vg install')} · no AI assistants detected here`);\n } else {\n info(`${c.cyan('vg install')} · detected assistants`);\n const pad = Math.max(...detected.map((d) => d.assistant.id.length)) + 2;\n for (const d of detected) {\n info(` ${c.bold(d.assistant.id.padEnd(pad))} ${d.assistant.label} ${c.dim(`via ${d.via}: ${d.marker}`)}`);\n }\n }\n return;\n }\n if (global.json) {\n json(ASSISTANTS.map((a) => ({ id: a.id, label: a.label, mcp: !!a.mcp, skill: !!a.skill, nudge: !!a.nudge })));\n } else {\n info(`${c.cyan('vg install')} · supported assistants`);\n const pad = Math.max(...ASSISTANTS.map((a) => a.id.length)) + 2;\n for (const a of ASSISTANTS) {\n info(` ${c.bold(a.id.padEnd(pad))} ${a.label} ${c.dim(`mcp:${a.mcp ? '✓' : '—'} skill:${a.skill ? '✓' : '—'} nudge:${a.nudge ? '✓' : '—'}`)}`);\n }\n }\n return;\n }\n\n const targets = opts.all ? ASSISTANTS : opts.detect ? detected.map((d) => d.assistant) : tools.map(resolve);\n if (targets.length === 0) {\n if (opts.detect) {\n // Detecting nothing is a clean no-op, not a usage mistake.\n if (global.json) json({ root, detected: [], results: [] });\n else info(`${c.cyan('vg install')} · no AI assistants detected here — name one (e.g. \\`vg install claude\\`) or use --all`);\n return;\n }\n throw usageError('name an assistant (e.g. `vg install claude`) or use --all / --detect / --list');\n }\n\n const graph = loadGraph(root, global.graph);\n const fileCount = graph ? graph.nodes.filter((n) => n.kind === 'file').length : 0;\n const smallRepo = graph !== null && fileCount > 0 && fileCount < SMALL_REPO_FILES;\n\n // Detect once — every target registers the same launch command.\n const launch = detectServeLaunch();\n const results = targets.map((a) => ({ id: a.id, ...installAssistant(a, { root, hook: opts.hook, smallRepo, launch }) }));\n // Write the deferred-loading navigation config once (P3): a client-side\n // loading config for Claude-API agents that support defer_loading — the\n // server tool set is unchanged.\n const navConfig = writeNavigationConfig(root);\n\n if (global.json) {\n json({ root, smallRepo, navConfig, launch: { command: launch.command, args: launch.args, note: launch.note ?? null }, results });\n return;\n }\n for (const r of results) {\n info(`${c.green('✔')} ${c.bold(r.id)} — wrote ${r.wrote.join(', ')}${r.skipped.length ? c.dim(` (skipped ${r.skipped.join(', ')})`) : ''}`);\n }\n if (launch.note && results.some((r) => r.note)) info(`${c.yellow('!')} ${launch.note}`);\n if (smallRepo) info(c.dim(` note: small repo (${fileCount} files) — nudge says searching is fine; vg is still used for impact/tests`));\n info(c.dim(` wrote ${navConfig} — deferred-loading config for Claude-API agents (lower per-step token cost)`));\n info(c.dim(' run `vg serve` is wired via MCP; build the map with `vg` if you have not yet'));\n });\n applyGlobalOptions(install);\n\n const uninstall = program\n .command('uninstall')\n .description('remove vg from an AI assistant')\n .argument('<tools...>', 'assistant ids')\n .option('--purge', 'also delete the skill file')\n .action(function (this: Command, tools: string[], opts: { purge?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const results = tools.map(resolve).map((a) => ({ id: a.id, removed: uninstallAssistant(a, root, !!opts.purge) }));\n if (global.json) {\n json({ root, results });\n return;\n }\n for (const r of results) {\n info(`${c.green('✔')} ${c.bold(r.id)} — removed ${r.removed.length ? r.removed.join(', ') : c.dim('nothing (not installed)')}`);\n }\n });\n applyGlobalOptions(uninstall);\n}\n\nfunction resolve(id: string) {\n const a = assistantById(id);\n if (!a) {\n const near = ASSISTANTS.filter(\n (x) => x.id.startsWith(id) || id.startsWith(x.id) || x.id.includes(id) || x.label.toLowerCase().includes(id.toLowerCase()),\n ).map((x) => x.id);\n const hint = near.length ? ` Did you mean: ${near.join(', ')}?` : '';\n throw new CliError(\n `unknown assistant \"${id}\".${hint} Supported: ${ASSISTANTS.map((x) => x.id).join(', ')} (see \\`vg install --list\\`)`,\n ExitCode.USAGE_ERROR,\n );\n }\n return a;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { Command } from 'commander';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info } from '../util/output.js';\n\n/**\n * `vg share` (VG-CLI-SPEC §3.8) — make the map committable + self-updating for\n * the team. Installs:\n * - a pre-commit hook that rebuilds and stages `graph.json` *only when it\n * changed* (deterministic, no LLM → no token burn, no churn on no-op commits);\n * - a deterministic merge driver: on conflict it rebuilds the graph from the\n * merged code (the graph is a pure function of code) instead of corrupting\n * JSON with a naive union;\n * - `.vibgrate/.gitignore` keeping `cache/` and volatile artifacts out of git\n * while committing the stable `graph.json` (prompt-cache safe).\n */\n\nconst HOOK_BEGIN = '# vg:begin';\nconst HOOK_END = '# vg:end';\n\nexport function registerShare(program: Command): void {\n const cmd = program\n .command('share')\n .description('make the map committable + auto-updating for your team (git)')\n .option('--undo', 'reverse what `vg share` installed')\n .option('--reports', 'also commit graph.html / GRAPH_REPORT.md (default: gitignored)')\n .action(function (this: Command, opts: { undo?: boolean; reports?: boolean }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const gitDir = path.join(root, '.git');\n if (!fs.existsSync(gitDir)) {\n throw new CliError('not a git repository — run `vg share` inside a git repo', ExitCode.USAGE_ERROR);\n }\n\n if (opts.undo) {\n undo(root);\n info(`${c.cyan('vg share')} ${c.dim('--undo')} · removed hooks, merge driver, and attributes`);\n return;\n }\n\n writeVibgrateGitignore(root, !!opts.reports);\n writeGitAttributes(root);\n configureMergeDriver(root);\n installPreCommitHook(root);\n\n info(`${c.cyan('vg share')} · the map is now committable + auto-updating`);\n info(` ${c.green('✔')} .vibgrate/.gitignore (cache + volatile artifacts ignored, graph.json committed)`);\n info(` ${c.green('✔')} pre-commit hook (rebuilds + stages graph.json only when it changed)`);\n info(` ${c.green('✔')} deterministic merge driver for .vibgrate/graph.json (rebuild on conflict)`);\n info(c.dim(' commit .vibgrate/graph.json so teammates inherit the map on pull'));\n });\n applyGlobalOptions(cmd);\n}\n\n// Deliberately overwrites the default create-once ignore file (see\n// ensureVibgrateGitignore): sharing is the explicit opt-in that flips\n// graph.json from ignored-by-default to committed.\nfunction writeVibgrateGitignore(root: string, reports: boolean): void {\n const dir = path.join(root, '.vibgrate');\n fs.mkdirSync(dir, { recursive: true });\n const lines = ['# Managed by `vg share` — keep graph.json committed, ignore the rest', 'cache/', 'facts.jsonl'];\n if (!reports) lines.push('graph.html', 'GRAPH_REPORT.md');\n fs.writeFileSync(path.join(dir, '.gitignore'), `${lines.join('\\n')}\\n`);\n}\n\nfunction writeGitAttributes(root: string): void {\n const file = path.join(root, '.gitattributes');\n const line = '.vibgrate/graph.json merge=vg';\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n if (!content.split('\\n').some((l) => l.trim() === line)) {\n content = content.length ? `${content.replace(/\\s*$/, '')}\\n${line}\\n` : `${line}\\n`;\n fs.writeFileSync(file, content);\n }\n}\n\nfunction configureMergeDriver(root: string): void {\n // The graph is a pure function of code, so the correct merge is a rebuild.\n git(root, ['config', 'merge.vg.name', 'vg deterministic graph rebuild']);\n git(root, ['config', 'merge.vg.driver', 'vg build >/dev/null 2>&1; cp .vibgrate/graph.json %A']);\n}\n\nfunction installPreCommitHook(root: string): void {\n const hooksDir = hookDir(root);\n fs.mkdirSync(hooksDir, { recursive: true });\n const file = path.join(hooksDir, 'pre-commit');\n const block = [\n HOOK_BEGIN,\n 'if command -v vg >/dev/null 2>&1; then',\n ' vg build >/dev/null 2>&1 || true',\n ' git add .vibgrate/graph.json >/dev/null 2>&1 || true',\n 'fi',\n HOOK_END,\n ].join('\\n');\n\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '#!/bin/sh\\n';\n const re = new RegExp(`${escapeRe(HOOK_BEGIN)}[\\\\s\\\\S]*?${escapeRe(HOOK_END)}`);\n if (re.test(content)) content = content.replace(re, block);\n else content = `${content.replace(/\\s*$/, '')}\\n\\n${block}\\n`;\n if (!content.startsWith('#!')) content = `#!/bin/sh\\n${content}`;\n fs.writeFileSync(file, content);\n fs.chmodSync(file, 0o755);\n}\n\nfunction undo(root: string): void {\n // Remove hook block.\n const hookFile = path.join(hookDir(root), 'pre-commit');\n if (fs.existsSync(hookFile)) {\n const re = new RegExp(`\\\\n*${escapeRe(HOOK_BEGIN)}[\\\\s\\\\S]*?${escapeRe(HOOK_END)}\\\\n*`);\n const next = fs.readFileSync(hookFile, 'utf8').replace(re, '\\n');\n if (next.trim() === '#!/bin/sh') fs.rmSync(hookFile);\n else fs.writeFileSync(hookFile, next);\n }\n // Remove .gitattributes line.\n const attr = path.join(root, '.gitattributes');\n if (fs.existsSync(attr)) {\n const next = fs\n .readFileSync(attr, 'utf8')\n .split('\\n')\n .filter((l) => l.trim() !== '.vibgrate/graph.json merge=vg')\n .join('\\n');\n fs.writeFileSync(attr, next);\n }\n // Drop git config (ignore errors if absent).\n try {\n git(root, ['config', '--remove-section', 'merge.vg']);\n } catch {\n /* section may not exist */\n }\n}\n\nfunction hookDir(root: string): string {\n // Respect a configured hooks path (e.g. husky) when set.\n try {\n const configured = git(root, ['config', '--get', 'core.hooksPath']).trim();\n if (configured) return path.resolve(root, configured);\n } catch {\n /* not set */\n }\n return path.join(root, '.git', 'hooks');\n}\n\nfunction git(root: string, args: string[]): string {\n return execFileSync('git', args, { cwd: root, encoding: 'utf8' });\n}\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { queryGraph } from '../engine/query.js';\nimport { discover } from '../engine/discover.js';\nimport { resolveLimits, type ResourceLimits } from '../engine/limits.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * `vg benchmark` (VG-ENGINE-TEARDOWN §6) — reproducible, cache-aware,\n * honest-estimate benchmark on the current repo:\n * - cold vs incremental build time, plus throughput (files/s, MB/s);\n * - memory: peak RSS/heap sampled across the cold build, heap retained by\n * the loaded graph, serialized artifact size (all labelled approximate —\n * GC timing and OS accounting make them indicative, not exact);\n * - determinism (two pinned builds must be byte-identical);\n * - token reduction: vg's context block vs a grep/read baseline, per question;\n * - the effective resource limits (VG_MAX_FILE_BYTES etc.) the run built under.\n *\n * Token figures are clearly-labelled estimates (~4 chars/token), scaling with\n * repo size — never a hero number.\n */\nconst PIN = '2020-01-01T00:00:00.000Z';\n\nexport interface BenchmarkResult {\n repo: { files: number; nodes: number; edges: number };\n build: { coldMs: number; incrementalMs: number; reusedOnWarm: number };\n throughput: { corpusBytes: number; filesPerSec: number; mbPerSec: number };\n memory: {\n baselineRssMb: number;\n peakRssMb: number;\n peakHeapMb: number;\n retainedHeapMb: number;\n graphJsonBytes: number;\n bytesPerNode: number;\n note: string;\n };\n limits: ResourceLimits;\n determinism: { byteIdentical: boolean };\n tokenReduction: {\n questions: { question: string; vgTokens: number; baselineTokens: number; ratio: number }[];\n aggregateRatio: number;\n note: string;\n };\n}\n\nexport function registerBenchmark(program: Command): void {\n const cmd = program\n .command('benchmark')\n .description('reproducible build + memory + token-reduction benchmark (honest estimates)')\n .option('--budget <n>', 'token budget for vg answers', '2000')\n .action(async function (this: Command, opts: { budget?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const budget = Number(opts.budget) || 2000;\n const result = await runBenchmarkSuite(root, budget);\n\n if (global.json) {\n json(result);\n return;\n }\n\n const { repo, build, throughput, memory, determinism, tokenReduction } = result;\n info(`${c.cyan('vg benchmark')} · ${repo.files} files · ${repo.nodes} nodes`);\n info(` build cold ${build.coldMs.toFixed(0)}ms · incremental ${build.incrementalMs.toFixed(0)}ms (reused ${build.reusedOnWarm})`);\n info(` speed ${throughput.filesPerSec.toFixed(0)} files/s · ${throughput.mbPerSec.toFixed(1)} MB/s (cold, ${mb(throughput.corpusBytes).toFixed(1)} MB corpus)`);\n info(\n ` memory peak rss ${memory.peakRssMb.toFixed(0)} MB (baseline ${memory.baselineRssMb.toFixed(0)} MB) · ` +\n `peak heap ${memory.peakHeapMb.toFixed(0)} MB · graph retains ~${memory.retainedHeapMb.toFixed(0)} MB ${c.dim('(approximate)')}`,\n );\n info(` graph ${mb(memory.graphJsonBytes).toFixed(1)} MB serialized · ${memory.bytesPerNode.toFixed(0)} B/node`);\n info(` determinism ${determinism.byteIdentical ? c.green('byte-identical ✓') : c.red('NON-DETERMINISTIC ✗')}`);\n if (tokenReduction.questions.length) {\n info(` token reduction vs grep/read baseline (${c.dim('estimates')}):`);\n for (const q of tokenReduction.questions) {\n info(` ${pad(`${q.ratio.toFixed(1)}×`, 6)} ${c.dim(`vg ${q.vgTokens} vs ~${q.baselineTokens}`)} \"${q.question}\"`);\n }\n info(` ${c.bold(`aggregate ≈ ${tokenReduction.aggregateRatio.toFixed(1)}× fewer tokens`)} ${c.dim('(honest estimate, scales with repo size)')}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n\n/**\n * The benchmark body, exported for tests. Timings and memory figures are\n * environment-dependent by nature (the graph artifact stays deterministic; the\n * measurements of producing it are not).\n */\nexport async function runBenchmarkSuite(root: string, budget: number): Promise<BenchmarkResult> {\n // 1. cold build (no cache), with peak-memory sampling across it.\n const baseline = process.memoryUsage();\n const sampler = startMemorySampler();\n const t0 = now();\n const cold = await buildGraph({ root, generatedAt: PIN, noCache: true });\n const coldMs = now() - t0;\n\n // 2. incremental build (warm cache)\n const t1 = now();\n const warm = await buildGraph({ root, generatedAt: PIN });\n const warmMs = now() - t1;\n\n // 3. determinism: two pinned builds byte-identical\n const a = serializeGraph(cold.graph);\n const b = serializeGraph((await buildGraph({ root, generatedAt: PIN, noCache: true })).graph);\n const peak = sampler.stop();\n const deterministic = a === b;\n\n const after = process.memoryUsage();\n const corpusBytes = cold.fileStats.reduce((s, f) => s + f.size, 0);\n const graphJsonBytes = Buffer.byteLength(a, 'utf8');\n const nodes = cold.graph.meta.counts.nodes;\n\n // 4. token reduction vs a grep/read baseline\n const questions = deriveQuestions(cold.graph);\n const fileSizes = fileSizeIndex(root);\n const perQuestion = questions.map((q) => {\n const vgTokens = queryGraph(cold.graph, q, { budget }).tokensEstimate;\n const baseTokens = grepBaselineTokens(q, fileSizes);\n return { question: q, vgTokens, baselineTokens: baseTokens, ratio: baseTokens > 0 ? round(baseTokens / Math.max(vgTokens, 1)) : 1 };\n });\n const totalVg = perQuestion.reduce((s, x) => s + x.vgTokens, 0);\n const totalBase = perQuestion.reduce((s, x) => s + x.baselineTokens, 0);\n const aggregateRatio = totalVg > 0 ? round(totalBase / totalVg) : 0;\n\n return {\n repo: { files: cold.totalFiles, nodes, edges: cold.graph.meta.counts.edges },\n build: { coldMs: round(coldMs), incrementalMs: round(warmMs), reusedOnWarm: warm.reused },\n throughput: {\n corpusBytes,\n filesPerSec: coldMs > 0 ? round((cold.totalFiles / coldMs) * 1000) : 0,\n // 6-decimal precision: a small corpus at 3 decimals would round to 0.\n mbPerSec: coldMs > 0 ? round6((mb(corpusBytes) / coldMs) * 1000) : 0,\n },\n memory: {\n baselineRssMb: round(mb(baseline.rss)),\n peakRssMb: round(mb(Math.max(peak.rss, baseline.rss))),\n peakHeapMb: round(mb(Math.max(peak.heapUsed, baseline.heapUsed))),\n // Heap growth across the run ≈ what the loaded graphs + caches retain.\n retainedHeapMb: round(Math.max(0, mb(after.heapUsed - baseline.heapUsed))),\n graphJsonBytes,\n bytesPerNode: nodes > 0 ? round(graphJsonBytes / nodes) : 0,\n note: 'sampled at 25ms + phase boundaries; GC timing makes these approximate',\n },\n limits: resolveLimits(),\n determinism: { byteIdentical: deterministic },\n tokenReduction: { questions: perQuestion, aggregateRatio, note: 'estimates (~4 chars/token); scales with repo size' },\n };\n}\n\n/**\n * Track peak RSS / heapUsed while the build runs: a 25ms sampling interval\n * (unref'd so it never holds the process open) catches the high-water mark\n * between phase boundaries; `stop()` takes one final sample so short runs\n * that finish inside one interval still register.\n */\nfunction startMemorySampler(): { stop: () => { rss: number; heapUsed: number } } {\n let rss = 0;\n let heapUsed = 0;\n const sample = (): void => {\n const m = process.memoryUsage();\n if (m.rss > rss) rss = m.rss;\n if (m.heapUsed > heapUsed) heapUsed = m.heapUsed;\n };\n const timer = setInterval(sample, 25);\n timer.unref?.();\n return {\n stop: () => {\n clearInterval(timer);\n sample();\n return { rss, heapUsed };\n },\n };\n}\n\nfunction deriveQuestions(graph: VgGraph): string[] {\n // Deterministic, repo-derived question set: the top hub names. Reproducible\n // and meaningful without hardcoding anything repo-specific.\n return graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 5)\n .map((n) => n.name);\n}\n\nfunction fileSizeIndex(root: string): { rel: string; abs: string; size: number }[] {\n return discover({ root }).map((f) => ({ rel: f.rel, abs: f.abs, size: safeSize(f.abs) }));\n}\n\nfunction grepBaselineTokens(term: string, files: { abs: string; size: number }[]): number {\n // Baseline = an agent greps for the term and reads every matching file.\n const lower = term.toLowerCase();\n let bytes = 0;\n for (const f of files) {\n if (f.size > 512 * 1024) continue; // skip huge files in the baseline\n let content = '';\n try {\n content = fs.readFileSync(f.abs, 'utf8');\n } catch {\n continue;\n }\n if (content.toLowerCase().includes(lower)) bytes += content.length;\n }\n return Math.ceil(bytes / 4);\n}\n\nfunction safeSize(abs: string): number {\n try {\n return fs.statSync(abs).size;\n } catch {\n return 0;\n }\n}\n\nfunction mb(bytes: number): number {\n return bytes / (1024 * 1024);\n}\nfunction now(): number {\n return Number(process.hrtime.bigint() / 1000n) / 1000;\n}\nfunction round(x: number): number {\n return Math.round(x * 1000) / 1000;\n}\nfunction round6(x: number): number {\n return Math.round(x * 1_000_000) / 1_000_000;\n}\nfunction pad(s: string, n: number): string {\n return s.padStart(n, ' ');\n}\n","import { execSync } from 'node:child_process';\nimport { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { coveringTests, detectRunner } from '../engine/test-query.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg tests <name>` (VG-CLI-SPEC §3.4) — which tests cover it, with the linkage\n * basis and confidence. `--missing` flips to untested nodes nearby; `--run`\n * prints (or `--exec` runs) the minimal command to exercise exactly those tests.\n */\nexport function registerTests(program: Command): void {\n const cmd = program\n .command('tests')\n .description('which tests cover a node (call/coverage linkage)')\n .argument('<name>', 'node to inspect')\n .option('--missing', 'show untested nodes nearby instead')\n .option('--run', 'print the command to run exactly these tests')\n .option('--exec', 'run that command')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { missing?: boolean; run?: boolean; exec?: boolean; pick?: string }) {\n const global = readGlobal(this);\n const { root, graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n if (opts.missing) {\n const nearby = graph.nodes\n .filter((n) => n.file === node.file && (n.kind === 'function' || n.kind === 'method') && n.tested === false)\n .sort((a, b) => b.importance - a.importance);\n if (global.json) {\n json({ file: node.file, untested: nearby.map((n) => ({ name: n.qualifiedName, line: n.span.start })) });\n return;\n }\n info(`${c.cyan('vg tests --missing')} · untested in ${node.file} (${nearby.length})`);\n for (const n of nearby) info(` ${c.yellow('○')} ${n.qualifiedName} ${c.dim(`:${n.span.start}`)}`);\n return;\n }\n\n const covers = coveringTests(graph, node);\n const testFiles = covers.filter((c) => c.basis === 'call').map((c) => c.file);\n\n if (opts.run || opts.exec) {\n const runner = detectRunner(rootOf(global), node.lang);\n const command = runner.command(testFiles);\n if (opts.exec) {\n info(c.dim(`$ ${command}`));\n execSync(command, { cwd: root, stdio: 'inherit' });\n return;\n }\n if (global.json) json({ runner: runner.name, command, testFiles });\n else info(command);\n return;\n }\n\n if (global.json) {\n json({ node: node.qualifiedName, tested: node.tested, coverage: node.coverage ?? null, covers });\n return;\n }\n\n info(`${c.cyan('vg tests')} · ${c.bold(node.qualifiedName)} ${node.tested ? c.green('tested') : c.yellow('untested')}`);\n if (typeof node.coverage === 'number') info(c.dim(` line coverage ${(node.coverage * 100).toFixed(0)}%`));\n if (covers.length === 0) {\n info(c.dim(' no covering tests found'));\n return;\n }\n for (const t of covers) {\n info(` ${c.green('✔')} ${t.file} ${c.dim(`(${t.basis}, conf ${t.confidence.toFixed(2)})`)}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg facts <name>` (VG-CLI-SPEC §5) — the deterministic open facts for a node,\n * epistemic-typed (declared/static → Observed/Derived; never learned/Hypothesized).\n * Facts are derived with `--deep`.\n */\nexport function registerFacts(program: Command): void {\n const cmd = program\n .command('facts')\n .description('the deterministic facts for a node (contract / invariant / characterization)')\n .argument('<name>', 'node to inspect')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n if (!graph.facts) {\n if (global.json) json({ node: node.qualifiedName, facts: [], note: 'facts require a --deep build' });\n else info(`${c.cyan('vg facts')} · run ${c.bold('vg --deep')} to derive facts (none in this map)`);\n return;\n }\n\n const facts = graph.facts.filter((f) => f.subjectIds.includes(node.id));\n if (global.json) {\n json({ node: node.qualifiedName, facts });\n return;\n }\n info(`${c.cyan('vg facts')} · ${c.bold(node.qualifiedName)} (${facts.length})`);\n if (facts.length === 0) {\n info(c.dim(' no facts derived for this node'));\n return;\n }\n for (const f of facts) {\n info(` ${c.bold(f.kind)} ${c.dim(`[${f.derivedBy}→${f.confidence}]`)}: ${summarize(f.predicate)}`);\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction summarize(predicate: unknown): string {\n if (predicate && typeof predicate === 'object') {\n const o = predicate as Record<string, unknown>;\n if (typeof o.signature === 'string') return o.signature;\n if (typeof o.guard === 'string') return `guards: ${o.guard}`;\n if (Array.isArray(o.pinnedBy)) return `pinned by ${(o.pinnedBy as string[]).join(', ')}`;\n }\n return JSON.stringify(predicate);\n}\n","import { Command } from 'commander';\nimport { resolveOne } from '../engine/lookup.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph } from './util.js';\nimport { ambiguityError } from './ambiguity.js';\nimport { FREE_PACK } from '../grounding/pack.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg guide <name>` (VG-CLI-SPEC §5) — cited relevant standards/practices for a\n * node from the free knowledge pack (own content + OWASP/CWE/NIST). Honest about\n * recommended vs conjectured, with citations.\n */\nexport function registerGuide(program: Command): void {\n const cmd = program\n .command('guide')\n .description('cited relevant standards/practices for a node (free pack)')\n .argument('<name>', 'node to inspect')\n .option('--pick <n>', 'pick the nth candidate when ambiguous')\n .action(function (this: Command, name: string, opts: { pick?: string }) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const { node, candidates } = resolveOne(graph, name, opts.pick ? Number(opts.pick) : undefined);\n if (!node) throw ambiguityError(`\"${name}\" ${candidates.length ? 'is ambiguous' : 'not found'}`, candidates);\n\n const entries = new Map(FREE_PACK.entries.map((e) => [e.id, e]));\n const grounding = (graph.grounding ?? []).filter((g) => g.src === node.id);\n\n if (global.json) {\n json({\n node: node.qualifiedName,\n guidance: grounding.map((g) => ({\n kind: g.kind,\n rationale: g.rationale,\n confidence: g.confidence,\n topic: entries.get(g.packEntryId)?.topic ?? g.packEntryId,\n summary: entries.get(g.packEntryId)?.summary ?? '',\n citation: g.citation,\n })),\n });\n return;\n }\n\n info(`${c.cyan('vg guide')} · ${c.bold(node.qualifiedName)} (${grounding.length})`);\n if (grounding.length === 0) {\n info(c.dim(' no matching guidance (no security-relevant signals detected)'));\n return;\n }\n for (const g of grounding) {\n const entry = entries.get(g.packEntryId);\n const tag = g.rationale === 'recommended' ? c.green(g.kind) : c.yellow(g.kind);\n info(` ${tag} ${c.dim(`(${g.rationale}, conf ${g.confidence.toFixed(2)})`)}`);\n if (entry) {\n info(` ${entry.summary}`);\n info(c.dim(` ${entry.citation.title} — ${entry.citation.url}`));\n }\n }\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { buildVersionTimelines, findPackageAnyEcosystem, gitHistoryAvailable } from '../core-open/index.js';\nimport { readScanArtifact } from '../mcp/vuln-data.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg why <package>` — who introduced a dependency, and any open vulnerabilities\n * it carries, from git history. Thin blame/why surface over the Phase-0 version\n * timeline plus the last scan's attributed vulnerability data. Offline + local.\n */\nexport function registerWhy(program: Command): void {\n const cmd = program\n .command('why')\n .description('who introduced a dependency (and any open vulnerabilities), from git history')\n .argument('<package>', 'package name to explain')\n .action(async function (this: Command, pkg: string) {\n const global = readGlobal(this);\n const root = rootOf(global);\n\n if (!(await gitHistoryAvailable(root))) {\n throw new CliError(\n 'git history is required for `vg why` (not a git repository, or git is unavailable)',\n ExitCode.USAGE_ERROR,\n );\n }\n\n const timelines = await buildVersionTimelines(root);\n const pt = timelines ? findPackageAnyEcosystem(timelines, pkg) ?? null : null;\n\n // Open vulnerabilities for this package, from the last `vg scan --vulns`.\n const artifact = readScanArtifact(root);\n const vulnPkg = artifact?.extended?.vulnerabilities?.packages.find((p) => p.package === pkg) ?? null;\n\n if (global.json) {\n json({ package: pkg, history: pt?.changes ?? [], vulnerabilities: vulnPkg?.advisories ?? [] });\n return;\n }\n\n info(`${c.cyan('vg why')} ${c.bold(pkg)}`);\n if (!pt || pt.changes.length === 0) {\n info(c.dim(' no git history found for this package (npm lockfile). It may not be an npm dependency,'));\n info(c.dim(' or the lockfile predates its introduction.'));\n } else {\n for (let i = 0; i < pt.changes.length; i++) {\n const ch = pt.changes[i];\n const verb = i === 0 ? c.green('added') : c.yellow('→');\n const date = ch.commit.date.slice(0, 10);\n info(\n ` ${verb} ${c.bold(ch.version)} ${c.dim(`${ch.commit.shortSha} ${date} ${ch.commit.authorName}`)}`,\n );\n info(c.dim(` ${ch.commit.subject}`));\n }\n }\n\n if (vulnPkg && vulnPkg.advisories.length) {\n info('');\n info(c.red(` ${vulnPkg.advisories.length} open vulnerabilit${vulnPkg.advisories.length === 1 ? 'y' : 'ies'} at ${pkg}@${vulnPkg.version}:`));\n for (const adv of vulnPkg.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 cvss = adv.cvss != null ? ` cvss ${adv.cvss}` : '';\n const fixed = adv.fixedVersions.length ? ` — fixed in ${adv.fixedVersions.join(', ')}` : ' — no fix available';\n info(` ${severityTag(adv.severity)} ${idLabel}${c.dim(cvss)}${c.dim(fixed)}`);\n if (adv.introduced) {\n const exposure = adv.exposureDays != null ? `, ${adv.exposureDays}d exposed` : '';\n info(\n c.dim(\n ` introduced by ${adv.introduced.authorName} in ${adv.introduced.shortSha} on ${adv.introduced.date.slice(0, 10)}${exposure}`,\n ),\n );\n }\n }\n } else if (artifact?.extended?.vulnerabilities) {\n info('');\n info(c.green(' no known vulnerabilities for this package in the last scan'));\n } else {\n info('');\n info(c.dim(' run `vg scan --vulns` to check this package for known vulnerabilities'));\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction severityTag(severity: string): string {\n switch (severity) {\n case 'critical':\n return c.red('critical');\n case 'high':\n return c.red('high');\n case 'moderate':\n return c.yellow('moderate');\n case 'low':\n return c.dim('low');\n default:\n return c.dim(severity);\n }\n}\n","import { Command } from 'commander';\nimport {\n buildVersionTimelines,\n findPackageAnyEcosystem,\n findVersionCrossings,\n gitHistoryAvailable,\n normalizeConstraint,\n versionSatisfies,\n type VersionCrossing,\n} from '../core-open/index.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg bisect <package> <constraint>` — pinpoint the commit where a dependency\n * crossed a version line, from git history. Where `vg why` narrates every version\n * transition, `bisect` answers a targeted question: \"when did we cross *this*\n * line\" — e.g. when a vulnerable dependency was finally patched past the fixed\n * version, or when a major was adopted. A thin surface over the same offline,\n * no-checkout version timeline that attribution uses. Offline + local.\n *\n * `--assert` turns it into a CI gate: exit non-zero when the current resolved\n * version does NOT satisfy the constraint (the fix has not been adopted yet).\n */\nexport function registerBisect(program: Command): void {\n const cmd = program\n .command('bisect')\n .description('pinpoint the commit where a dependency crossed a version line, from git history')\n .argument('<package>', 'package name to bisect')\n .argument('<constraint>', 'target version or semver range (a bare version means \">=\" that version)')\n .option('--assert', 'exit non-zero when the current version does not satisfy the constraint (CI gate)')\n .action(async function (this: Command, pkg: string, constraintArg: string) {\n const global = readGlobal(this);\n const opts = this.opts<{ assert?: boolean }>();\n const root = rootOf(global);\n\n if (!(await gitHistoryAvailable(root))) {\n throw new CliError(\n 'git history is required for `vg bisect` (not a git repository, or git is unavailable)',\n ExitCode.USAGE_ERROR,\n );\n }\n\n const range = normalizeConstraint(constraintArg);\n if (!range) {\n throw new CliError(\n `not a valid version or semver range: ${constraintArg}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const timelines = await buildVersionTimelines(root);\n const pt = timelines ? findPackageAnyEcosystem(timelines, pkg) ?? null : null;\n\n // No history for this package (not an npm/pip/... dependency, or the\n // lockfile predates it) — distinct from \"found, but never crossed\".\n if (!pt || pt.changes.length === 0) {\n if (global.json) {\n json({ package: pkg, constraint: range, found: false, satisfiedNow: false, crossings: [] });\n return;\n }\n info(`${c.cyan('vg bisect')} ${c.bold(pkg)} ${c.dim(range)}`);\n info(c.dim(' no git history found for this package (lockfile). It may not be a resolved'));\n info(c.dim(' dependency in a supported ecosystem, or the lockfile predates its introduction.'));\n throw new CliError(`no version history for ${pkg}`, ExitCode.NOT_FOUND);\n }\n\n const crossings = findVersionCrossings(pt, range);\n const current = pt.changes[pt.changes.length - 1];\n const satisfiedNow = versionSatisfies(current.version, range);\n const firstEntered = crossings.find((cr) => cr.kind === 'entered') ?? null;\n\n if (global.json) {\n json({\n package: pt.name,\n ecosystem: pt.ecosystem,\n constraint: range,\n currentVersion: current.version,\n satisfiedNow,\n firstEntered,\n crossings,\n });\n } else {\n info(`${c.cyan('vg bisect')} ${c.bold(pt.name)} ${c.dim(range)}`);\n const verdict = satisfiedNow\n ? c.green(`current ${current.version} satisfies ${range}`)\n : c.yellow(`current ${current.version} does not satisfy ${range}`);\n info(` ${verdict}`);\n info('');\n\n if (!firstEntered) {\n info(c.dim(` never crossed ${range} in git history`));\n info(\n c.dim(\n ` latest in history: ${current.version} ${c.dim(`(${current.commit.shortSha} ${current.commit.date.slice(0, 10)})`)}`,\n ),\n );\n } else {\n info(` ${c.bold('first reached')} ${range}:`);\n printCrossing(firstEntered, true);\n // Surface later flips (a downgrade that left the line, a re-bump) so a\n // regression after the fix isn't silently hidden behind the first hit.\n const rest = crossings.slice(crossings.indexOf(firstEntered) + 1);\n if (rest.length) {\n info('');\n info(c.dim(` ${rest.length} later crossing${rest.length === 1 ? '' : 's'}:`));\n for (const cr of rest) printCrossing(cr, false);\n }\n }\n }\n\n if (opts.assert && !satisfiedNow) {\n throw new CliError(\n `${pt.name}@${current.version} does not satisfy ${range}`,\n ExitCode.GATE_FAILED,\n );\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction printCrossing(cr: VersionCrossing, primary: boolean): void {\n const arrow = cr.kind === 'entered' ? c.green('→') : c.yellow('↓');\n const date = cr.commit.date.slice(0, 10);\n const from = cr.previousVersion ? c.dim(` from ${cr.previousVersion}`) : c.dim(' (added)');\n const ver = primary ? c.bold(cr.version) : cr.version;\n info(` ${arrow} ${ver}${from} ${c.dim(`${cr.commit.shortSha} ${date} ${cr.commit.authorName}`)}`);\n info(c.dim(` ${cr.commit.subject}`));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Enterprise standards gate (VG-LIB-SUPERSET-PLAN §8/§9 S5 / D9) — the LOCAL, committable half\n * of enterprise sovereignty that complements the hosted `enterprise_strict` rerank (S5.1).\n *\n * A team commits a `.vibgrate/standards.json` policy of BANNED packages, each pointing at the\n * APPROVED alternative + a reason. `vg drift --fail-on standards` checks the project's resolved\n * inventory against it and exits non-zero with remediation on any planted violation — so the\n * banned-→-approved rule is enforced in CI, offline, no key, no platform call.\n *\n * Pure + offline: a tolerant loader (sync fs) + a deterministic checker over the drift inventory.\n */\n\nexport interface StandardRule {\n /** Optional ecosystem scope (npm|pypi|…). When set, only that ecosystem matches. */\n ecosystem?: string;\n /** Banned package name (exact, case-insensitive). */\n name: string;\n /** The approved alternative — the remediation surfaced to the developer. */\n use?: string;\n /** Why it's banned. */\n reason?: string;\n}\n\nexport interface StandardsPolicy {\n banned: StandardRule[];\n}\n\nexport interface StandardViolation {\n ecosystem: string;\n name: string;\n installed: string | null;\n use: string | null;\n reason: string | null;\n}\n\n/** Where a committed policy lives, in precedence order. */\nexport const STANDARDS_FILES = ['.vibgrate/standards.json', 'vibgrate.standards.json'];\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' && v.trim() ? v.trim() : undefined;\n}\n\n/** Tolerant parse: accepts `{ banned: [...] }` or a bare array; drops malformed rules (need a name). */\nexport function normalizeStandards(raw: unknown): StandardsPolicy {\n const list = Array.isArray(raw) ? raw : Array.isArray((raw as { banned?: unknown })?.banned) ? (raw as { banned: unknown[] }).banned : [];\n const seen = new Set<string>();\n const banned: StandardRule[] = [];\n for (const item of list) {\n if (!item || typeof item !== 'object') continue;\n const r = item as Record<string, unknown>;\n const name = asString(r.name);\n if (!name) continue;\n const ecosystem = asString(r.ecosystem)?.toLowerCase();\n const key = `${ecosystem ?? '*'}\\0${name.toLowerCase()}`;\n if (seen.has(key)) continue;\n seen.add(key);\n banned.push({ name, ...(ecosystem ? { ecosystem } : {}), ...(asString(r.use) ? { use: asString(r.use) } : {}), ...(asString(r.reason) ? { reason: asString(r.reason) } : {}) });\n }\n return { banned };\n}\n\n/** Find + load the nearest committed standards policy from `root`. Returns null if none/invalid. */\nexport function loadStandards(root: string): { policy: StandardsPolicy | null; path: string | null } {\n for (const rel of STANDARDS_FILES) {\n const p = path.join(root, rel);\n let text: string;\n try {\n text = fs.readFileSync(p, 'utf8');\n } catch {\n continue;\n }\n try {\n return { policy: normalizeStandards(JSON.parse(text)), path: p };\n } catch {\n // present but malformed JSON — surface it as a usage problem at the call site\n return { policy: null, path: p };\n }\n }\n return { policy: null, path: null };\n}\n\n/** Deterministic check of the inventory against the policy. One violation per matched dependency. */\nexport function checkStandards(policy: StandardsPolicy, records: DepRecord[]): StandardViolation[] {\n const out: StandardViolation[] = [];\n for (const r of records) {\n const rule = policy.banned.find((b) => b.name.toLowerCase() === r.name.toLowerCase() && (!b.ecosystem || b.ecosystem === r.ecosystem));\n if (rule) out.push({ ecosystem: r.ecosystem, name: r.name, installed: r.installed ?? null, use: rule.use ?? null, reason: rule.reason ?? null });\n }\n return out.sort((a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.name.localeCompare(b.name));\n}\n","import { Command } from 'commander';\nimport { inventory, enrichOnline, ECOSYSTEMS } from '../engine/drift.js';\nimport { loadStandards, checkStandards, STANDARDS_FILES, type StandardViolation } from '../engine/standards.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg drift` (VG-CLI-SPEC §5) — dependency currency. Offline by default\n * (inventory + installed versions); `--online` opt-in queries the npm registry\n * for latest versions. Full CVE/EOL governance is the Vibgrate platform.\n */\nexport function registerDrift(program: Command): void {\n const cmd = program\n .command('drift')\n .description('what is outdated across dependencies (offline; --online for currency)')\n .option('--online', 'query the npm registry for latest versions (opt-in network)')\n .option('--fail-on <level>', 'exit 2 on violations — major|minor (version drift) or standards (enterprise policy)')\n .action(async function (this: Command, opts: { online?: boolean; failOn?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n if (opts.online && global.local) {\n throw new CliError('--online conflicts with --local (no network in local mode)', ExitCode.USAGE_ERROR);\n }\n if (opts.failOn && !['major', 'minor', 'standards'].includes(opts.failOn)) {\n throw new CliError(`--fail-on must be one of: major, minor, standards (got \"${opts.failOn}\")`, ExitCode.USAGE_ERROR);\n }\n const inv = inventory(root);\n if (opts.online && !global.local) await enrichOnline(inv.records);\n\n // Enterprise standards gate (D9/S5.2): check the inventory against the committed policy.\n let standards: { policyPath: string | null; defined: boolean; violations: StandardViolation[] } | null = null;\n if (opts.failOn === 'standards') {\n const loaded = loadStandards(root);\n if (loaded.path && !loaded.policy) {\n throw new CliError(`standards policy at ${loaded.path} is not valid JSON`, ExitCode.USAGE_ERROR);\n }\n standards = { policyPath: loaded.path, defined: !!loaded.policy, violations: loaded.policy ? checkStandards(loaded.policy, inv.records) : [] };\n }\n\n if (global.json) {\n json(standards ? { ...inv, standards } : inv);\n } else {\n const breakdown = ECOSYSTEMS.filter((e) => inv.counts[e] > 0).map((e) => `${e} ${inv.counts[e]}`).join(' · ');\n info(`${c.cyan('vg drift')} · ${inv.counts.total} dependencies${breakdown ? ` (${breakdown})` : ''}`);\n if (opts.online) {\n const drifted = inv.records.filter((r) => r.drift && r.drift !== 'current' && r.drift !== 'unknown');\n if (drifted.length === 0) info(c.green(' all checked dependencies are current'));\n for (const r of drifted.sort((a, b) => rank(b.drift) - rank(a.drift))) {\n const tag = r.drift === 'major' ? c.red('major') : r.drift === 'minor' ? c.yellow('minor') : c.dim('patch');\n info(` ${tag} ${r.name} ${c.dim(`${r.installed} → ${r.latest}`)}`);\n }\n } else {\n info(c.dim(' offline inventory — run with --online for currency vs the npm registry'));\n info(c.dim(' CVE/EOL/governance: the Vibgrate platform (vg push)'));\n }\n if (standards) printStandards(standards);\n }\n\n if (standards && standards.violations.length) {\n throw new CliError(`${standards.violations.length} banned dependency(ies) violate standards`, ExitCode.GATE_FAILED);\n }\n if (opts.failOn && opts.failOn !== 'standards') {\n const threshold = opts.failOn === 'minor' ? 2 : 3; // minor includes major\n const bad = inv.records.filter((r) => rank(r.drift) >= threshold);\n if (bad.length) {\n throw new CliError(`${bad.length} dependency(ies) drift at/above ${opts.failOn}`, ExitCode.GATE_FAILED);\n }\n }\n });\n applyGlobalOptions(cmd);\n}\n\nfunction rank(drift?: string): number {\n return drift === 'major' ? 3 : drift === 'minor' ? 2 : drift === 'patch' ? 1 : 0;\n}\n\nfunction printStandards(s: { defined: boolean; violations: StandardViolation[] }): void {\n if (!s.defined) {\n info(c.dim(` no standards policy (${STANDARDS_FILES.join(' or ')}) — nothing to enforce`));\n return;\n }\n if (s.violations.length === 0) {\n info(c.green(' standards: no banned dependencies in use'));\n return;\n }\n info(c.red(` standards: ${s.violations.length} banned dependency(ies)`));\n for (const v of s.violations) {\n const fix = v.use ? c.dim(` → use ${v.use}`) : '';\n const why = v.reason ? c.dim(` (${v.reason})`) : '';\n info(` ${c.red('banned')} ${v.ecosystem}:${v.name}${v.installed ? c.dim(` ${v.installed}`) : ''}${fix}${why}`);\n }\n}\n","import { Command } from 'commander';\nimport { discoverModels } from '../engine/models.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg models` (VG-CLI-SPEC §5) — the local-model fleet discovered on disk\n * (Ollama / LM Studio / llama.cpp gguf). Offline, no network, no launch.\n */\nexport function registerModels(program: Command): void {\n const cmd = program\n .command('models')\n .description('the local model fleet (Ollama / LM Studio / gguf), discovered offline')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const models = discoverModels();\n if (global.json) {\n json({ models });\n return;\n }\n info(`${c.cyan('vg models')} · ${models.length} local model(s) discovered`);\n if (models.length === 0) {\n info(c.dim(' none found (looked in ~/.ollama, ~/.lmstudio, ~/models, ~/.cache)'));\n return;\n }\n for (const m of models) info(` ${c.bold(m.runtime.padEnd(10))} ${m.name}`);\n });\n applyGlobalOptions(cmd);\n}\n","import { Command } from 'commander';\nimport { clearSavings, readSavings, readUsage, type UsageReport } from '../engine/savings.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg savings` (VG-DEVELOPMENT-PLAN §5) — a local, privacy-safe, honestly\n * estimated report of context tokens / $ saved vs a grep/read baseline.\n * Nothing leaves the machine. Recording is opt-in via `vg serve --savings`.\n */\nexport function registerSavings(program: Command): void {\n const cmd = program\n .command('savings')\n .description('local, privacy-safe report of tokens/$ saved vs a grep baseline (estimates)')\n .option('--days <n>', 'window in days', '30')\n .option('--clear', 'delete the recorded usage data for this repo')\n .action(function (this: Command) {\n const global = readGlobal(this);\n const days = Number(this.opts().days) || 30;\n const root = rootOf(global);\n\n if (this.opts().clear) {\n const existed = clearSavings(root);\n if (global.json) {\n json({ ok: true, cleared: existed });\n return;\n }\n info(\n existed\n ? `${c.cyan('vg savings')} ${c.dim('--clear')} · usage data deleted for this repo`\n : `${c.cyan('vg savings')} ${c.dim('--clear')} · nothing recorded here — nothing to delete`,\n );\n return;\n }\n\n const now = Date.now();\n const report = readSavings(root, days, now);\n const usage = readUsage(root, days, now);\n\n if (global.json) {\n json({ ...report, usage });\n return;\n }\n\n info(`${c.cyan('vg savings')} · last ${days} days ${c.dim('(local, nothing left your machine)')}`);\n if (usage.totals.calls === 0) {\n info(\n c.dim(\n report.enabled\n ? ' no calls recorded yet in this window'\n : ' recording is off. Enable it for MCP with `vg serve --savings`, and for CLI calls by passing `--client=<ai>` to vg.',\n ),\n );\n return;\n }\n\n // Token-savings summary — only the grep-baseline tools (query_graph / get_node).\n if (report.queries > 0) {\n info(` queries ${report.queries} · context tokens ${fmt(report.vgTokens)} (grep/read baseline ≈ ${fmt(report.baselineTokens)}) → ${report.ratio}× fewer`);\n info(` est. cost (${report.rateLabel}): $${report.estCostVg} vs $${report.estCostBaseline} → saved ≈ $${report.saved}`);\n info(c.dim(' estimates with stated assumptions (~4 chars/token; ~400 tokens/file baseline); scales with repo size.'));\n }\n\n // Per-command breakdown — every recorded tool, its outcomes, and success rate.\n printBreakdown(usage);\n // The command-vs-MCP split and which AI is calling.\n printSplit(usage);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction fmt(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\n/** Render the per-command usage table: calls, complete/partial/miss, success %. */\nfunction printBreakdown(usage: UsageReport): void {\n info('');\n info(c.bold(' by command') + c.dim(' (complete = full result · partial = capped/paginated · miss = no result)'));\n const nameW = Math.max(7, ...usage.commands.map((cmd) => cmd.tool.length));\n const header =\n ' ' +\n 'command'.padEnd(nameW) +\n ['calls', 'complete', 'partial', 'miss', 'success%', 'avg ms'].map((h) => h.padStart(9)).join('');\n info(c.dim(header));\n for (const cmd of usage.commands) {\n info(\n ' ' +\n cmd.tool.padEnd(nameW) +\n String(cmd.calls).padStart(9) +\n String(cmd.complete).padStart(9) +\n String(cmd.partial).padStart(9) +\n String(cmd.miss).padStart(9) +\n `${cmd.successPct}%`.padStart(9) +\n // Absent ≠ zero: calls recorded before timing existed show '—'.\n (cmd.avgMs === null ? '—' : String(cmd.avgMs)).padStart(9),\n );\n }\n const t = usage.totals;\n info(c.dim(' ' + '─'.repeat(nameW + 54)));\n info(\n ' ' +\n c.bold('total'.padEnd(nameW)) +\n String(t.calls).padStart(9) +\n String(t.complete).padStart(9) +\n String(t.partial).padStart(9) +\n String(t.miss).padStart(9) +\n ''.padStart(9) +\n ''.padStart(9),\n );\n info(c.dim(` avg success across commands: ${usage.avgSuccessPct}%`));\n}\n\n/**\n * Render the command-vs-MCP split (how calls arrived) and which AI client made\n * them — the signals that show whether assistants use the MCP tools or shell out\n * to `vg`, and that feed the opt-in share-stats upload.\n */\nfunction printSplit(usage: UsageReport): void {\n const label = (key: string): string => (key === 'mcp' ? 'MCP tools' : key === 'cli' ? 'vg CLI' : key);\n if (usage.sources.length) {\n info('');\n info(c.bold(' by source') + c.dim(' (how the call arrived)'));\n for (const s of usage.sources) {\n const pct = usage.totals.calls ? Math.round((s.calls / usage.totals.calls) * 100) : 0;\n info(` ${label(s.key).padEnd(12)} ${String(s.calls).padStart(6)} calls ${c.dim(`(${pct}%)`)}`);\n }\n }\n if (usage.clients.length) {\n info('');\n info(c.bold(' by client') + c.dim(' (which AI is calling; pass --client to vg to attribute CLI calls)'));\n for (const cl of usage.clients) {\n info(` ${cl.key.padEnd(12)} ${String(cl.calls).padStart(6)} calls`);\n }\n }\n}\n","import { Command } from 'commander';\nimport {\n loadCatalog,\n resolveLib,\n addLibrary,\n readDoc,\n driftFor,\n resolveVersion,\n localPackageDocs,\n localApiSurface,\n libId,\n} from '../engine/lib.js';\nimport type { DriftNote } from '../engine/lib.js';\nimport { selectForBudget, symbolsFromApi } from '../engine/select.js';\nimport { assessDocQuality } from '../engine/quality.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { publishPrivateLibrary, type HostedDocsResult } from '../engine/hosted.js';\nimport { fetchHostedDocsCached } from '../engine/hosted-cache.js';\nimport { resolveDsn } from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, json, out } from '../util/output.js';\n\n/**\n * `vg lib` (VG-CLI-SPEC §5) — library currency: version-correct, drift-annotated\n * usage docs. Family:\n * vg lib list the catalog\n * vg lib <name> version-correct, drift-annotated docs for <name>\n * vg lib add <source> ingest docs (local path; --online for a URL/llms.txt/git repo)\n * vg lib resolve <name> name → catalog id + version\n * vg lib refresh re-ingest local sources\n */\nexport function registerLib(program: Command): void {\n const cmd = program\n .command('lib')\n .description('library currency: version-correct, drift-annotated usage docs')\n .argument('[args...]', 'a library name, or: add <source> | publish <name> | resolve <name> | refresh')\n .option('--name <name>', 'library name for `add`')\n .option('--version <v>', 'pin the doc version for `add`/`publish`')\n .option('--online', '(deprecated; network is on by default) allow network for add/refresh URL sources')\n .option('-b, --budget <n>', 'trim docs to ~N tokens')\n .option('--readme <path>', 'README path for `publish` (default ./README.md)')\n .option('--dts <path>', 'TypeScript declaration (.d.ts) path for `publish`')\n .option('--language <lang>', 'primary language for `publish`')\n .option('--region <region>', 'data-residency region for the hosted catalog (same as scans; default us)')\n .option('--ingest <url>', 'hosted catalog/ingest URL override (host extracted; wins over --region)')\n .action(async function (this: Command, args: string[], opts: { name?: string; version?: string; online?: boolean; budget?: string; readme?: string; dts?: string; language?: string; region?: string; ingest?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const [verb, ...rest] = args;\n\n // Network is ON BY DEFAULT (local-first, hosted-on-miss). `--local` is the hard airgap:\n // no network ever. `--online` is kept only as a back-compat no-op for add/refresh sources.\n const network = !global.local;\n if (!verb) return listCatalog(root, global.json);\n // add/refresh still gate URL/git fetching behind --online (or network default) to avoid surprise fetches.\n const online = (Boolean(opts.online) || network) && !global.local;\n if (verb === 'add') return addCmd(root, rest, { ...opts, online }, global.json);\n if (verb === 'publish') return publishCmd(root, rest, opts, global, global.json);\n if (verb === 'resolve') return resolveCmd(root, rest, global.json);\n if (verb === 'refresh') return refreshCmd(root, { online }, global.json);\n // `vg lib <name>`: local-first; on a thin/missing local doc, fall through to the hosted\n // catalog automatically unless --local. No flag required.\n return showCmd(root, args.join(' '), opts.budget ? Number(opts.budget) : undefined, global.json, {\n online: network, // hosted-on-miss allowed unless --local\n region: opts.region,\n ingest: opts.ingest,\n });\n });\n applyGlobalOptions(cmd);\n}\n\nfunction listCatalog(root: string, asJson?: boolean): void {\n const catalog = loadCatalog(root);\n const libs = Object.values(catalog.libraries).sort((a, b) => a.name.localeCompare(b.name));\n if (asJson) {\n json(libs.map((l) => ({ id: l.id, name: l.name, version: l.version, source: l.source.type })));\n return;\n }\n info(`${c.cyan('vg lib')} · ${libs.length} library(ies) in the catalog`);\n for (const l of libs) {\n const d = driftFor(root, l);\n const tag = d.drift === 'behind' ? c.yellow(' (docs behind your version)') : d.drift === 'ahead' ? c.dim(' (docs ahead)') : '';\n info(` ${c.bold(l.name)} ${c.dim(`@${l.version}`)} ${c.dim(`[${l.source.type}]`)}${tag}`);\n }\n if (!libs.length) info(c.dim(' empty — add docs with `vg lib add <path|url>`'));\n}\n\nasync function addCmd(root: string, rest: string[], opts: { name?: string; version?: string; online?: boolean }, asJson?: boolean): Promise<void> {\n const source = rest[0];\n if (!source) throw usageError('usage: vg lib add <path|url|git> [--name <name>] [--version <v>] [--online]');\n let entry;\n try {\n entry = await addLibrary(source, { root, name: opts.name, version: opts.version, allowNetwork: opts.online });\n } catch (err) {\n throw new CliError((err as Error).message, ExitCode.ERROR);\n }\n if (asJson) {\n json(entry);\n return;\n }\n info(`${c.green('✔')} added ${c.bold(entry.name)} ${c.dim(`@${entry.version}`)} (${entry.bytes} bytes) → ${entry.docFile}`);\n}\n\nfunction readPackageVersion(root: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as { version?: unknown };\n return typeof pkg.version === 'string' ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\nfunction readOptionalFile(p: string): string | undefined {\n try {\n const t = fs.readFileSync(p, 'utf8');\n return t.trim() ? t : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * `vg lib publish <name>` (S6) — upload a PRIVATE library's docs to the hosted catalog. Requires a\n * DSN (workspace identity) and a paid plan; the index token cost is billed to the MCP-token meter.\n * Reads local README (+ optional .d.ts); private docs stay tenant-isolated.\n */\nasync function publishCmd(\n root: string,\n rest: string[],\n opts: { name?: string; version?: string; readme?: string; dts?: string; language?: string; region?: string; ingest?: string },\n global: { local?: boolean },\n asJson?: boolean,\n): Promise<void> {\n if (global.local) throw usageError('vg lib publish uploads to the hosted catalog — it needs network (remove --local)');\n const name = (rest.join(' ') || opts.name || '').trim();\n if (!name) throw usageError('usage: vg lib publish <name> [--version <v>] [--readme <path>] [--dts <path>] [--language <lang>]');\n\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n if (!parsed) throw new CliError('publishing a private library requires a DSN — run `vibgrate login` or set VIBGRATE_DSN', ExitCode.USAGE_ERROR);\n\n const version = (opts.version || readPackageVersion(root) || '').trim();\n if (!version) throw usageError('a --version is required (or run from a package whose package.json has a version)');\n\n const readme = readOptionalFile(opts.readme ? path.resolve(opts.readme) : path.join(root, 'README.md'));\n const dts = opts.dts ? readOptionalFile(path.resolve(opts.dts)) : undefined;\n if (!readme && !dts) throw usageError('nothing to publish — no README.md found and no --dts given');\n\n const result = await publishPrivateLibrary(\n { name, version, readme, dts, language: opts.language },\n { region: opts.region, ingest: opts.ingest, auth: { keyId: parsed.keyId, secret: parsed.secret } },\n );\n if (!result.ok) {\n const msg = result.message || result.error || `publish failed (HTTP ${result.status})`;\n const code = result.status === 402 ? ExitCode.GATE_FAILED : result.status === 401 ? ExitCode.USAGE_ERROR : ExitCode.ERROR;\n throw new CliError(msg, code);\n }\n if (asJson) {\n json(result);\n return;\n }\n info(`${c.green('✔')} published ${c.bold(name)} ${c.dim(`@${version}`)} · ${result.entities} entities · ${result.indexedTokens} tokens indexed (MCP-token meter)`);\n info(c.dim(` private to your workspace · targetId ${result.targetId}`));\n}\n\nfunction resolveCmd(root: string, rest: string[], asJson?: boolean): void {\n const name = rest.join(' ');\n if (!name) throw usageError('usage: vg lib resolve <name>');\n const entry = resolveLib(loadCatalog(root), name);\n if (!entry) throw new CliError(`no library matches \"${name}\" (id ${libId(name)})`, ExitCode.NOT_FOUND);\n if (asJson) json({ id: entry.id, name: entry.name, version: entry.version });\n else info(`${entry.id} ${c.dim(`(${entry.name}@${entry.version})`)}`);\n}\n\nasync function refreshCmd(root: string, opts: { online?: boolean }, asJson?: boolean): Promise<void> {\n const catalog = loadCatalog(root);\n const results: { name: string; ok: boolean }[] = [];\n for (const entry of Object.values(catalog.libraries)) {\n try {\n await addLibrary(entry.source.location, { root, name: entry.name, version: entry.version, allowNetwork: opts.online });\n results.push({ name: entry.name, ok: true });\n } catch {\n results.push({ name: entry.name, ok: false });\n }\n }\n if (asJson) json({ refreshed: results });\n else info(`${c.cyan('vg lib refresh')} · ${results.filter((r) => r.ok).length}/${results.length} re-ingested`);\n}\n\ninterface ShowOpts {\n online?: boolean;\n region?: string;\n ingest?: string;\n}\n\nasync function showCmd(root: string, name: string, budget: number | undefined, asJson?: boolean, opts: ShowOpts = {}): Promise<void> {\n const online = opts.online;\n const catalog = loadCatalog(root);\n const entry = resolveLib(catalog, name);\n const ver = resolveVersion(root, name);\n\n const displayName = entry?.name ?? name;\n let localDoc: string | undefined;\n let docVersion = ver.served ?? '*';\n let docSource: string | undefined;\n let drift: DriftNote | undefined;\n\n if (entry) {\n // 1. Committed catalog (drift-annotated).\n localDoc = readDoc(root, entry);\n docVersion = entry.version;\n drift = driftFor(root, entry);\n } else {\n // 2. Local-first: docs from the installed package on disk, version-correct, offline.\n const local = localPackageDocs(root, name);\n if (local) {\n localDoc = local.docs;\n docVersion = local.version ?? ver.served ?? '*';\n docSource = local.source;\n }\n }\n\n // Quality gate (D18): assess the full local extraction. An insufficient doc (no example /\n // stub / off-topic) — or no local doc at all — is a candidate for hosted escalation.\n const apiSurface = localApiSurface(root, displayName);\n const quality =\n localDoc !== undefined\n ? assessDocQuality([localDoc, apiSurface].filter(Boolean).join('\\n\\n'), { name: displayName, symbols: symbolsFromApi(apiSurface) })\n : { sufficient: false, score: 0, reasons: ['no local docs'] };\n\n // D18 escalation (D7 no-key funnel): only when --online AND local is missing/insufficient.\n // Disk-cached (`.vibgrate/cache/hosted-docs.json`, 24h TTL) so repeat lookups answer instantly;\n // fetchHostedDocsCached fails closed to null, so the local path never breaks.\n let hosted: HostedDocsResult | null = null;\n if (online && !quality.sufficient) {\n // Identify with the stored DSN (if any) so CLI users get the workspace tier; anon otherwise.\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n hosted = await fetchHostedDocsCached(\n root,\n { name: displayName, query: name, maxTokens: budget },\n { region: opts.region, ingest: opts.ingest, auth: parsed ? { keyId: parsed.keyId, secret: parsed.secret } : undefined },\n );\n }\n\n if (localDoc === undefined && !hosted) {\n throw new CliError(\n `no library docs for \"${name}\" — add with \\`vg lib add <path|url> --name ${name}\\` or install the package${online ? '' : ' (or retry with --online for the hosted catalog)'}`,\n ExitCode.NOT_FOUND,\n );\n }\n\n let doc: string;\n if (hosted) {\n doc = hosted.content;\n docSource = 'hosted';\n docVersion = hosted.version ?? docVersion;\n } else {\n doc = selectForBudget({ readme: localDoc!, apiSurface, budget }).text;\n }\n\n if (asJson) {\n json({\n id: entry?.id,\n name: displayName,\n version: docVersion,\n source: docSource ?? 'catalog',\n drift: drift ?? null,\n version_mismatch: ver.mismatch ?? null,\n quality: { sufficient: quality.sufficient, score: quality.score, reasons: quality.reasons },\n escalate: quality.sufficient ? null : 'hosted',\n escalated: Boolean(hosted),\n docs: doc,\n });\n return;\n }\n info(`${c.cyan('vg lib')} · ${c.bold(displayName)} ${c.dim(`@${docVersion}`)}${docSource ? c.dim(` (from ${docSource})`) : ''}`);\n if (ver.mismatch) info(c.yellow(` ⚠ ${ver.mismatch.note}`));\n if (hosted) info(c.green(' ✔ local docs were thin — served richer docs from the hosted catalog'));\n else if (!quality.sufficient) info(c.yellow(` ⚠ local docs look thin (${quality.reasons.join(', ')})${online ? ' — hosted catalog had nothing better' : ' — run without --local for the hosted catalog'}`));\n if (drift?.drift === 'behind') info(c.yellow(` ⚠ docs are for ${drift.cataloged}, but your installed version is ${drift.installed} — refresh the docs`));\n else if (drift?.drift === 'current') info(c.green(` ✔ docs match your installed version (${drift.installed})`));\n info('');\n out(doc);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { exportGraph, formatForExt, type ExportFormat } from '../engine/export.js';\nimport { inventory } from '../engine/drift.js';\nimport { discoverModels } from '../engine/models.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { requireGraph, rootOf } from './util.js';\nimport { usageError } from '../util/exit.js';\nimport { c, info, out } from '../util/output.js';\n\n/**\n * `vg export <file>` (VG-CLI-SPEC §4.2) — one verb, format inferred from the\n * extension: json · ndjson · graphml · dot · cypher · sql · md · html · cdx.json\n * (CycloneDX SBOM/AI-BOM) · spdx.json. `-` writes to stdout.\n */\nexport function registerExport(program: Command): void {\n const cmd = program\n .command('export')\n .description('export the map (format inferred: json|ndjson|graphml|dot|cypher|sql|md|html|cdx.json|spdx.json)')\n .argument('[file]', 'target file (or - for stdout)', 'map.json')\n .action(function (this: Command, file: string) {\n const global = readGlobal(this);\n const { graph } = requireGraph(global);\n const root = rootOf(global);\n\n const format = detectFormat(file);\n if (!format) throw usageError(`unknown export format for \"${file}\"`);\n\n const needsDeps = format === 'cyclonedx' || format === 'spdx';\n const content = exportGraph(format, {\n graph,\n deps: needsDeps ? inventory(root).records : undefined,\n models: needsDeps && !global.local ? discoverModels() : undefined,\n generatedAt: graph.generatedAt,\n });\n\n if (file === '-') {\n out(content.trimEnd());\n return;\n }\n fs.mkdirSync(path.dirname(path.resolve(file)), { recursive: true });\n fs.writeFileSync(file, content);\n info(`${c.green('✔')} wrote ${file} ${c.dim(`(${format})`)}`);\n });\n applyGlobalOptions(cmd);\n}\n\nfunction detectFormat(file: string): ExportFormat | null {\n const lower = file.toLowerCase();\n if (lower.endsWith('.cdx.json')) return 'cyclonedx';\n if (lower.endsWith('.spdx.json')) return 'spdx';\n if (file === '-') return 'json';\n return formatForExt(path.extname(file));\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { resolvedGrammarFiles, grammarSetVersion } from '../engine/grammars.js';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { catalogPath, libDir } from '../engine/lib.js';\nimport { stableStringify } from '../engine/serialize.js';\nimport { VERSION } from '../version.js';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg bundle --offline -o <dir>` (VG-INSTALL-MATRIX §9) — assemble an air-gapped\n * bundle: the grammar .wasm set, the current graph, and the library catalog,\n * plus a manifest. Point an offline machine at it with `vg build --grammars`.\n * Deterministic; no network.\n */\nexport function registerBundle(program: Command): void {\n const cmd = program\n .command('bundle')\n .description('build an air-gapped bundle (grammars + graph + library catalog)')\n .option('--offline', 'offline bundle (default; present for clarity)')\n .option('-o, --out <dir>', 'output directory', 'vg-bundle')\n .action(function (this: Command, opts: { out?: string }) {\n const global = readGlobal(this);\n const root = rootOf(global);\n const outDir = path.resolve(root, opts.out ?? 'vg-bundle');\n\n // Per-language resolution (not a directory copy) so the bundle carries\n // the exact grammar files a scan would load — including any vendored\n // overlay that replaces a defective prebuilt.\n let grammarFiles;\n try {\n grammarFiles = resolvedGrammarFiles();\n } catch {\n throw new CliError('no grammars found to bundle (run a build first)', ExitCode.ERROR);\n }\n fs.mkdirSync(path.join(outDir, 'grammars'), { recursive: true });\n let grammarCount = 0;\n for (const { fileName, absPath } of grammarFiles) {\n fs.copyFileSync(absPath, path.join(outDir, 'grammars', fileName));\n grammarCount++;\n }\n\n const included: string[] = [`grammars/ (${grammarCount} .wasm)`];\n\n const graphSrc = global.graph ?? defaultGraphPath(root);\n if (fs.existsSync(graphSrc)) {\n fs.copyFileSync(graphSrc, path.join(outDir, 'graph.json'));\n included.push('graph.json');\n }\n\n const cat = catalogPath(root);\n if (fs.existsSync(cat)) {\n fs.copyFileSync(cat, path.join(outDir, 'vibgrate.lib.json'));\n included.push('vibgrate.lib.json');\n if (fs.existsSync(libDir(root))) {\n fs.cpSync(libDir(root), path.join(outDir, 'lib'), { recursive: true });\n included.push('lib/');\n }\n }\n\n const manifest = {\n tool: 'vg',\n version: VERSION,\n grammars: grammarSetVersion(),\n grammarCount,\n included,\n usage: 'Run `vg build --grammars <this dir>/grammars` to build fully offline.',\n };\n fs.writeFileSync(path.join(outDir, 'MANIFEST.json'), `${stableStringify(manifest, 2)}\\n`);\n\n if (global.json) {\n json({ out: path.relative(root, outDir), ...manifest });\n return;\n }\n info(`${c.cyan('vg bundle')} · wrote ${path.relative(root, outDir)}/`);\n for (const i of included) info(` ${c.green('✔')} ${i}`);\n info(c.dim(` offline: vg build --grammars \"${path.relative(root, outDir)}/grammars\"`));\n });\n applyGlobalOptions(cmd);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadGraph } from '../engine/load.js';\nimport { defaultGraphPath } from '../engine/artifacts.js';\nimport { probeFreshness, driftCount } from '../engine/freshness.js';\nimport { loadCatalog, catalogPath } from '../engine/lib.js';\nimport { hostedBase } from '../engine/hosted.js';\nimport { telemetryOptOut, isCI, statsEndpoint } from '../engine/stats-share.js';\nimport { detectServeLaunch } from '../install/registry.js';\nimport {\n credentialsPath,\n readStoredCredentials,\n homeCredentialsPath,\n projectCredentialsPath,\n} from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { VERSION } from '../version.js';\nimport { c, info, json } from '../util/output.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\nimport { rootOf } from './util.js';\n\n/**\n * `vg doctor` — one read-only diagnostic pass over everything a support thread\n * would otherwise ask for one item at a time: which config file won, which\n * credential source won, is there a map and is it fresh, can the hosted catalog\n * be reached, what would `vg install` register as the MCP launch, and what the\n * telemetry opt-outs currently say. Prints state; changes nothing.\n *\n * Secrets never appear in the output (GUARDRAILS §1.1): for a configured DSN we\n * show only its source, host, and workspace id — never the key id or secret.\n */\nexport function registerDoctor(program: Command): void {\n const cmd = program\n .command('doctor')\n .description('diagnose your setup: config, credentials, map freshness, hosted reachability, MCP launch')\n .action(async function (this: Command) {\n await runDoctor(readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\n/** How long the hosted reachability probe waits before reporting unreachable. */\nconst REACH_TIMEOUT_MS = 3000;\n\nconst CONFIG_BASENAMES = ['vibgrate.config.ts', 'vibgrate.config.js', 'vibgrate.config.json'];\n\ninterface Diagnosis {\n version: string;\n node: string;\n platform: string;\n root: string;\n configFile: string | null;\n map: {\n path: string;\n built: boolean;\n generatedAt: string | null;\n staleFiles: number | null;\n };\n libCatalog: { path: string; present: boolean; libraries: number };\n credentials: {\n source: 'env' | 'project' | 'home' | 'none';\n path: string | null;\n host: string | null;\n workspaceId: string | null;\n };\n hosted: { base: string; checked: boolean; reachable: boolean | null };\n mcpLaunch: { command: string; args: string[]; note: string | null };\n telemetry: { optOut: string | null; ci: boolean; endpoint: string };\n}\n\nasync function runDoctor(global: GlobalOpts): Promise<void> {\n const root = rootOf(global);\n const local = global.local === true;\n const graphPath = global.graph ?? defaultGraphPath(root);\n\n const configFile = CONFIG_BASENAMES.find((f) => fs.existsSync(path.join(root, f))) ?? null;\n\n const graph = loadGraph(root, graphPath);\n let staleFiles: number | null = null;\n if (graph) {\n // Exact when the freshness snapshot exists (written by every build);\n // otherwise unknown — doctor stays cheap and never walks the whole tree.\n const probe = probeFreshness(root);\n if (probe) staleFiles = driftCount(probe.drift);\n }\n\n const catalog = loadCatalog(root);\n const libCount = Object.keys(catalog.libraries).length;\n\n const creds = diagnoseCredentials(root);\n const base = hostedBase();\n const reachable = local ? null : await probeReachable(base);\n const launch = detectServeLaunch();\n const optOut = telemetryOptOut();\n\n const d: Diagnosis = {\n version: VERSION,\n node: process.version,\n platform: `${process.platform}/${process.arch}`,\n root,\n configFile,\n map: {\n path: path.relative(root, graphPath),\n built: graph !== null,\n generatedAt: graph?.generatedAt ?? null,\n staleFiles,\n },\n libCatalog: {\n path: path.relative(root, catalogPath(root)),\n present: fs.existsSync(catalogPath(root)),\n libraries: libCount,\n },\n credentials: creds,\n hosted: { base, checked: !local, reachable },\n mcpLaunch: { command: launch.command, args: launch.args, note: launch.note ?? null },\n telemetry: { optOut, ci: isCI(), endpoint: statsEndpoint() },\n };\n\n if (global.json) {\n json(d);\n return;\n }\n\n info(`${c.cyan('vg')} doctor · v${d.version} · node ${d.node} · ${d.platform}`);\n info(` root ${d.root}`);\n info(` config ${d.configFile ? c.green(d.configFile) : c.dim('none (defaults) — `vg init` writes one')}`);\n\n if (!d.map.built) {\n info(` map ${c.yellow('none')} — run ${c.bold('vg')} to build ${c.dim(d.map.path)}`);\n } else {\n const fresh =\n d.map.staleFiles == null\n ? c.dim('freshness unknown (no snapshot)')\n : d.map.staleFiles === 0\n ? c.green('up to date')\n : c.yellow(`${d.map.staleFiles} file(s) stale — auto-refreshes on next query`);\n info(` map ${c.green('built')} ${c.dim(d.map.generatedAt ?? '')} · ${fresh}`);\n }\n\n info(\n ` lib ${\n d.libCatalog.present\n ? `${c.green(String(d.libCatalog.libraries))} librar${d.libCatalog.libraries === 1 ? 'y' : 'ies'} in ${d.libCatalog.path}`\n : c.dim('no catalog — `vg lib add <source>` starts one; `vg lib <name>` works without it')\n }`,\n );\n\n if (d.credentials.source === 'none') {\n info(` auth ${c.dim('anonymous — fine for everything local; `vg login` enables push/publish')}`);\n } else {\n info(\n ` auth ${c.green(d.credentials.source)} ${c.dim(d.credentials.path ?? '')} · workspace ${d.credentials.workspaceId ?? '?'} · ${d.credentials.host ?? '?'}`,\n );\n }\n\n if (!d.hosted.checked) {\n info(` hosted ${c.dim(`skipped under --local (${d.hosted.base})`)}`);\n } else {\n info(\n ` hosted ${d.hosted.base} · ${d.hosted.reachable ? c.green('reachable') : c.yellow('unreachable — local answers still work')}`,\n );\n }\n\n info(\n ` mcp ${c.bold(`${d.mcpLaunch.command} ${d.mcpLaunch.args.join(' ')}`)}${d.mcpLaunch.note ? c.dim(` (${d.mcpLaunch.note})`) : ''}`,\n );\n\n const tel = d.telemetry.optOut\n ? c.green(`opted out via ${d.telemetry.optOut}`)\n : 'off by default — only `vg serve --share-stats` ever uploads';\n info(` telemetry ${tel}${d.telemetry.ci ? c.dim(' · CI detected') : ''}`);\n}\n\nfunction diagnoseCredentials(root: string): Diagnosis['credentials'] {\n const none = { source: 'none' as const, path: null, host: null, workspaceId: null };\n // Mirror resolveDsn()'s precedence (env → store), reporting the source instead\n // of the value. The secret itself is never read into the output.\n if (process.env.VIBGRATE_DSN) {\n const parsed = parseDsn(process.env.VIBGRATE_DSN);\n return { source: 'env', path: null, host: parsed?.host ?? null, workspaceId: parsed?.workspaceId ?? null };\n }\n const stored = readStoredCredentials({ cwd: root });\n if (!stored) return none;\n const file = credentialsPath({ cwd: root });\n const source =\n process.env.VIBGRATE_CREDENTIALS ? 'env' : file === projectCredentialsPath(root) ? 'project' : 'home';\n const parsed = parseDsn(stored.dsn);\n return {\n source,\n path: shortenHome(file),\n host: stored.ingestHost ?? parsed?.host ?? null,\n workspaceId: stored.workspaceId ?? parsed?.workspaceId ?? null,\n };\n}\n\n/** ~-abbreviate a path under the home dir for display. */\nfunction shortenHome(p: string): string {\n const home = homeCredentialsPath().slice(0, -'/.vibgrate/credentials.json'.length);\n return p.startsWith(home) ? `~${p.slice(home.length)}` : p;\n}\n\n/**\n * Reachability = \"we got ANY HTTP response from the host\" — a 404 proves the\n * network path works just as well as a 200 does. Only a transport-level failure\n * (DNS, TLS, timeout) reports unreachable. Never throws.\n */\nasync function probeReachable(base: string): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REACH_TIMEOUT_MS);\n timer.unref?.();\n try {\n await fetch(base, { method: 'HEAD', signal: controller.signal });\n return true;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ensureDir, pathExists } from '../utils/fs.js';\nimport { writeDefaultConfig } from '../../core-open/index.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize vibgrate in a project')\n .argument('[path]', 'Path to initialize', '.')\n .option('--baseline', 'Create initial baseline after init')\n .option('--yes', 'Skip confirmation prompts')\n .action(async (targetPath: string, opts: { baseline?: boolean; yes?: boolean }) => {\n const rootDir = path.resolve(targetPath);\n const vibgrateDir = path.join(rootDir, '.vibgrate');\n\n await ensureDir(vibgrateDir);\n console.log(chalk.green('✔') + ` Created ${chalk.bold('.vibgrate/')} directory`);\n\n const configPath = path.join(rootDir, 'vibgrate.config.ts');\n if (await pathExists(configPath)) {\n console.log(chalk.dim(' vibgrate.config.ts already exists, skipping'));\n } else {\n await writeDefaultConfig(rootDir);\n console.log(chalk.green('✔') + ` Created ${chalk.bold('vibgrate.config.ts')}`);\n }\n\n if (opts.baseline) {\n const { runBaseline } = await import('./baseline.js');\n await runBaseline(rootDir);\n }\n\n console.log('');\n console.log(chalk.bold('Next steps:'));\n console.log(` ${chalk.cyan('vibgrate scan')} Scan for upgrade drift`);\n console.log(` ${chalk.cyan('vibgrate baseline')} Create a drift baseline`);\n console.log('');\n });\n","/**\n * Local vulnerable-symbol reachability analysis.\n *\n * Matches the risky-symbol manifest (from `POST /v1/ingest/scan/preflight/symbols`)\n * against the LOCAL code map (`vg` graph): is the vulnerable package imported\n * anywhere, and is any of its vulnerable symbols referenced from an importing\n * file? Source never leaves the machine — only the tier verdicts and the\n * module-import evidence are attached to the scan artifact.\n *\n * Tier semantics (kept deliberately conservative — precision only ever\n * resolves UP toward \"reachable\", never down):\n * - reachable — the package is imported AND a vulnerable symbol is\n * referenced in an importing file (lexical match,\n * confidence-scaled; dynamic access can't be ruled in\n * or out, hence < 1.0 confidence).\n * - potentially_reachable — the package is imported but the symbols could not\n * be resolved (no symbol data, or names too generic\n * to match safely).\n * - not_reached — the package appears in no import in the code map\n * (or none of its vulnerable symbols is referenced).\n * - unknown — no code map, or an ecosystem the import matcher\n * does not support. Inert in scoring: unknown ≠ safe.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n ScanReachabilityResult,\n ScanReachabilityFinding,\n ReachabilityTier,\n RiskySymbolManifestEntry,\n SymbolsPreflightDependency,\n} from '../core-open/index.js';\nimport type { VgGraph, GraphNode } from '../schema.js';\nimport { indexFor } from '../engine/relations.js';\n\nexport const REACHABILITY_ANALYZER_VERSION = 'vg-reach-1.0';\n\n/** Base confidence of the per-ecosystem import matcher (specifier ↔ package). */\nconst ECOSYSTEM_MATCH_CONFIDENCE: Record<string, number> = {\n npm: 0.8,\n Go: 0.8,\n 'crates.io': 0.7,\n PyPI: 0.65,\n RubyGems: 0.6,\n};\n\n/** Symbol names too generic for a lexical match to mean anything. */\nconst GENERIC_SYMBOL_NAMES = new Set([\n 'get', 'set', 'run', 'main', 'init', 'call', 'apply', 'exec', 'send', 'open',\n 'read', 'write', 'parse', 'load', 'save', 'start', 'stop', 'new', 'create',\n 'update', 'delete', 'handle', 'process', 'render', 'value', 'data', 'next',\n]);\n\nconst MAX_FILES_PER_PACKAGE = 25;\nconst MAX_FILE_BYTES = 256 * 1024;\nconst MAX_MODULES_PER_PACKAGE = 50;\nconst MAX_IMPORTED_MODULE_PACKAGES = 500;\nconst MAX_FINDINGS = 1000;\n\ninterface PackageImportEvidence {\n /** Whether the matcher supports this ecosystem at all. */\n supported: boolean;\n /** Matched import specifiers (external node names). */\n modules: string[];\n /** Repo-relative paths of files importing the package. */\n importingFiles: string[];\n}\n\nfunction normalizePython(name: string): string {\n return name.toLowerCase().replace(/[-.]/g, '_');\n}\n\n/** Does this import specifier belong to the given package, per ecosystem rules? */\nexport function specifierMatchesPackage(ecosystem: string, pkg: string, spec: string): boolean {\n switch (ecosystem) {\n case 'npm':\n case 'Go':\n case 'RubyGems':\n return spec === pkg || spec.startsWith(`${pkg}/`);\n case 'PyPI': {\n const top = spec.split('.')[0] ?? spec;\n return normalizePython(top) === normalizePython(pkg);\n }\n case 'crates.io': {\n const top = (spec.split('::')[0] ?? spec).toLowerCase().replace(/-/g, '_');\n return top === pkg.toLowerCase().replace(/-/g, '_');\n }\n default:\n return false;\n }\n}\n\n/** The identifier a lexical reference to a vulnerable symbol would use. */\nexport function symbolIdentifier(symbol: string): string {\n const cleaned = symbol.replace(/\\(.*\\)$/, '');\n const segments = cleaned.split(/[./:#]|::/).filter(Boolean);\n return segments[segments.length - 1] ?? cleaned;\n}\n\n/** Whether a lexical match on this identifier is meaningful evidence. */\nexport function isMatchableIdentifier(identifier: string): boolean {\n return identifier.length >= 3 && !GENERIC_SYMBOL_NAMES.has(identifier.toLowerCase());\n}\n\n/** Collect import evidence for one package from the graph's external nodes. */\nfunction collectPackageImports(\n graph: VgGraph,\n ecosystem: string,\n pkg: string,\n): PackageImportEvidence {\n if (!(ecosystem in ECOSYSTEM_MATCH_CONFIDENCE)) {\n return { supported: false, modules: [], importingFiles: [] };\n }\n const idx = indexFor(graph);\n const modules = new Set<string>();\n const files = new Set<string>();\n for (const node of graph.nodes) {\n if (node.kind !== 'external') continue;\n if (!specifierMatchesPackage(ecosystem, pkg, node.name)) continue;\n modules.add(node.name);\n for (const edge of idx.in(node.id, 'import')) {\n const src = idx.nodeById.get(edge.src) as GraphNode | undefined;\n if (src?.file) files.add(src.file);\n }\n }\n return {\n supported: true,\n modules: [...modules].sort(),\n importingFiles: [...files].sort(),\n };\n}\n\nasync function fileReferencesIdentifier(\n rootDir: string,\n relFile: string,\n identifier: string,\n readFile: (absPath: string) => Promise<string | null>,\n): Promise<boolean> {\n const content = await readFile(path.join(rootDir, relFile));\n if (!content) return false;\n const escaped = identifier.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`\\\\b${escaped}\\\\b`).test(content);\n}\n\nasync function defaultReadFile(absPath: string): Promise<string | null> {\n try {\n const stat = await fs.stat(absPath);\n if (!stat.isFile() || stat.size > MAX_FILE_BYTES) return null;\n return await fs.readFile(absPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nexport interface ReachabilityAnalysisInput {\n /** The freshly built code map; null when unavailable (all findings Unknown). */\n graph: VgGraph | null;\n rootDir: string;\n /** Risky-symbol manifest from the symbols preflight. */\n manifest: RiskySymbolManifestEntry[];\n /** The dependency coordinates that were posted (for module-import evidence). */\n dependencies: SymbolsPreflightDependency[];\n /** Injectable for tests. */\n readFile?: (absPath: string) => Promise<string | null>;\n}\n\n/**\n * Run the local reachability query. Never throws for per-file problems; a\n * missing/unreadable file simply yields no lexical evidence.\n */\nexport async function analyzeReachability(\n input: ReachabilityAnalysisInput,\n): Promise<ScanReachabilityResult> {\n const generatedAt = new Date().toISOString();\n const readFile = input.readFile ?? defaultReadFile;\n\n if (!input.graph) {\n return {\n analyzerVersion: REACHABILITY_ANALYZER_VERSION,\n source: 'none',\n generatedAt,\n manifestAdvisoryCount: input.manifest.length,\n findings: input.manifest.slice(0, MAX_FINDINGS).map((entry) => ({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'unknown' as ReachabilityTier,\n evidence: 'no code map available for this scan',\n graphConfidence: 0,\n })),\n };\n }\n\n // Module-import evidence for every posted dependency in a supported\n // ecosystem — including \"looked, found no import\" (importingFiles: 0), which\n // the server needs to distinguish from \"never evaluated\" (entry absent).\n const evidenceByPackage = new Map<string, PackageImportEvidence>();\n const importedModules: NonNullable<ScanReachabilityResult['importedModules']> = [];\n const seenPackages = new Set<string>();\n for (const dep of input.dependencies) {\n const key = `${dep.ecosystem}|${dep.package}`;\n if (seenPackages.has(key)) continue;\n seenPackages.add(key);\n const evidence = collectPackageImports(input.graph, dep.ecosystem, dep.package);\n evidenceByPackage.set(key, evidence);\n if (evidence.supported && importedModules.length < MAX_IMPORTED_MODULE_PACKAGES) {\n importedModules.push({\n ecosystem: dep.ecosystem,\n package: dep.package,\n modules: evidence.modules.slice(0, MAX_MODULES_PER_PACKAGE),\n importingFiles: evidence.importingFiles.length,\n });\n }\n }\n importedModules.sort(\n (a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.package.localeCompare(b.package),\n );\n\n const findings: ScanReachabilityFinding[] = [];\n\n for (const entry of input.manifest) {\n const key = `${entry.ecosystem}|${entry.package}`;\n const evidence =\n evidenceByPackage.get(key) ?? collectPackageImports(input.graph, entry.ecosystem, entry.package);\n const baseConfidence = ECOSYSTEM_MATCH_CONFIDENCE[entry.ecosystem] ?? 0;\n\n if (!evidence.supported) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'unknown',\n evidence: `import matching is not supported for the ${entry.ecosystem} ecosystem yet`,\n graphConfidence: 0,\n });\n continue;\n }\n\n if (evidence.importingFiles.length === 0) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'not_reached',\n evidence: `no import of ${entry.package} was found in the code map`,\n graphConfidence: baseConfidence,\n });\n continue;\n }\n\n const matchableSymbols = entry.symbols\n .map((s) => ({ symbol: s.symbol, identifier: symbolIdentifier(s.symbol) }))\n .filter((s) => isMatchableIdentifier(s.identifier));\n\n if (entry.symbolCoverage !== 'function' || matchableSymbols.length === 0) {\n // Module imported, but no usable symbol data (pending extraction, module\n // coverage, or names too generic to match safely) → potentially reachable.\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'potentially_reachable',\n evidence: `${entry.package} is imported by ${evidence.importingFiles.length} file${evidence.importingFiles.length === 1 ? '' : 's'}; vulnerable symbols unresolved (coverage: ${entry.symbolCoverage})`,\n callPath: evidence.importingFiles.slice(0, 10),\n graphConfidence: Math.min(baseConfidence, 0.6),\n });\n continue;\n }\n\n // Symbol-level check: lexical reference to any vulnerable symbol in an\n // importing file. Bounded fan-out so huge repos stay fast.\n const filesToCheck = evidence.importingFiles.slice(0, MAX_FILES_PER_PACKAGE);\n let anySymbolFound = false;\n for (const { symbol, identifier } of matchableSymbols) {\n const referencingFiles: string[] = [];\n for (const relFile of filesToCheck) {\n if (await fileReferencesIdentifier(input.rootDir, relFile, identifier, readFile)) {\n referencingFiles.push(relFile);\n if (referencingFiles.length >= 5) break;\n }\n }\n if (referencingFiles.length > 0) {\n anySymbolFound = true;\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n symbol,\n tier: 'reachable',\n evidence: `vulnerable symbol \\`${identifier}\\` is referenced in ${referencingFiles.length} importing file${referencingFiles.length === 1 ? '' : 's'}`,\n callPath: referencingFiles,\n graphConfidence: Math.min(baseConfidence, 0.75),\n });\n }\n }\n\n if (!anySymbolFound) {\n findings.push({\n advisoryId: entry.advisoryId,\n ecosystem: entry.ecosystem,\n package: entry.package,\n version: entry.version,\n tier: 'not_reached',\n evidence: `${entry.package} is imported, but none of its ${matchableSymbols.length} vulnerable symbol${matchableSymbols.length === 1 ? '' : 's'} is referenced in the ${filesToCheck.length} importing file${filesToCheck.length === 1 ? '' : 's'} checked`,\n callPath: evidence.importingFiles.slice(0, 10),\n graphConfidence: Math.min(baseConfidence, 0.55),\n });\n }\n }\n\n findings.sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.advisoryId.localeCompare(b.advisoryId) ||\n (a.symbol ?? '').localeCompare(b.symbol ?? ''),\n );\n\n return {\n analyzerVersion: REACHABILITY_ANALYZER_VERSION,\n source: 'graph',\n generatedAt,\n manifestAdvisoryCount: input.manifest.length,\n importedModules,\n findings: findings.slice(0, MAX_FINDINGS),\n };\n}\n\n/**\n * Collect the deduped dependency coordinates to post to the symbols preflight\n * from the scan artifact's per-project dependency rows.\n */\nexport function collectPreflightDependencies(\n projects: Array<{\n type: string;\n dependencies: Array<{ package: string; resolvedVersion: string | null; currentSpec: string }>;\n }>,\n projectTypeToEcosystem: Partial<Record<string, string>>,\n): SymbolsPreflightDependency[] {\n const deduped = new Map<string, SymbolsPreflightDependency>();\n for (const project of projects) {\n const ecosystem = projectTypeToEcosystem[project.type];\n if (!ecosystem) continue;\n for (const dep of project.dependencies) {\n const version = dep.resolvedVersion || normalizeVersionSpec(dep.currentSpec);\n if (!version) continue;\n const key = `${ecosystem}:${dep.package}:${version}`;\n if (!deduped.has(key)) {\n deduped.set(key, { ecosystem, package: dep.package, version });\n }\n }\n }\n return [...deduped.values()].sort(\n (a, b) =>\n a.ecosystem.localeCompare(b.ecosystem) ||\n a.package.localeCompare(b.package) ||\n a.version.localeCompare(b.version),\n );\n}\n\nfunction normalizeVersionSpec(spec: string): string | null {\n const match = spec.trim().match(/\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?/);\n return match?.[0] ?? null;\n}\n","/** Machine-parseable ingest id for CI, AMI, and other automation (plain stdout, no ANSI). */\nexport function emitIngestIdLine(ingestId: string, options?: { unchanged?: boolean }): void {\n console.log(`VIBGRATE_INGEST_ID=${ingestId}`);\n if (options?.unchanged) {\n console.log('VIBGRATE_INGEST_UNCHANGED=1');\n }\n}\n\n/**\n * Machine-parseable drift score for automation (plain stdout, no ANSI). The Vibgrate\n * remediation agent reads this to gate a run on before/after drift, rather than\n * scraping the human-formatted report. Emitted only when a consumer asks for it\n * (VIBGRATE_EMIT_MARKERS=1, set by the migration agent) so normal CLI output is\n * unchanged.\n */\nexport function emitDriftScoreLine(score: number): void {\n if (process.env.VIBGRATE_EMIT_MARKERS !== '1') return;\n console.log(`VIBGRATE_DRIFT_SCORE=${score}`);\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { pathExists } from '../core-open/index.js';\nimport { resolveCliInvocation } from '../util/cli-invocation.js';\n\n// Map of AI assistant config file/dir patterns to the `vg install <name>` argument.\n// Checked in priority order — first match wins.\nconst AI_ASSISTANT_DETECTORS: Array<{ files: string[]; name: string }> = [\n { files: ['CLAUDE.md', '.claude'], name: 'claude' },\n { files: ['.cursor', '.cursorrules'], name: 'cursor' },\n { files: ['.windsurf'], name: 'windsurf' },\n { files: ['.github/copilot-instructions.md', '.copilot'], name: 'copilot' },\n { files: ['.gemini'], name: 'gemini' },\n { files: ['.continuerc.json'], name: 'continue' },\n { files: ['.codex'], name: 'codex' },\n];\n\nexport async function detectAiAssistant(rootDir: string): Promise<string | null> {\n for (const detector of AI_ASSISTANT_DETECTORS) {\n for (const file of detector.files) {\n if (await pathExists(path.join(rootDir, file))) {\n return detector.name;\n }\n }\n }\n return null;\n}\n\nexport function printAiContextPrompt(detectedAssistant: string | null): void {\n const teal = chalk.hex('#3FB0A4');\n const mint = chalk.hex('#4FE3C1');\n // Prefix with whatever actually runs this CLI for the user: `vg` when it's\n // installed on PATH, or `npx @vibgrate/cli` when they ran via npx (where a\n // bare `vg install` would not resolve).\n const cli = resolveCliInvocation();\n const installArgs = detectedAssistant ? `install ${detectedAssistant}` : 'install --all';\n const installCmd = `${cli} ${installArgs}`;\n const detectedNote = detectedAssistant\n ? chalk.dim(` (${detectedAssistant} config detected)`)\n : '';\n\n console.log('');\n console.log(teal(' ╭──────────────────────────────────────────────────╮'));\n console.log(teal(' │') + ' ' + mint('◆') + ' ' + chalk.bold.white('Get AI-aware answers in your editor') + ' ' + teal('│'));\n console.log(teal(' ╰──────────────────────────────────────────────────╯'));\n console.log('');\n console.log(' ' + chalk.bold.white(installCmd) + detectedNote);\n console.log('');\n console.log(' ' + teal('·') + ' ' + chalk.white('Code map in your assistant') + chalk.dim(' — call trees, impact surfaces, import paths'));\n console.log(' ' + teal('·') + ' ' + chalk.white('Offline drift') + chalk.dim(' — DriftScore and upgrade priorities, right inside your editor'));\n console.log(' ' + teal('·') + ' ' + chalk.white('Version-correct library docs') + chalk.dim(' — pinned to your lockfile, no hallucinated APIs'));\n console.log('');\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n runCoreScan,\n pathExists,\n parseDsn,\n prepareCompressedUpload,\n fetchScanPreflight,\n fetchRiskySymbols,\n PROJECT_TYPE_TO_OSV_ECOSYSTEM,\n computeRepoFingerprint,\n detectVcs,\n resolveRepositoryName,\n parseExcludePatterns,\n loadConfig,\n} from '../../core-open/index.js';\nimport type { ScanOptions, ScanArtifact } from '../../core-open/index.js';\nimport { analyzeReachability, collectPreflightDependencies } from '../reachability.js';\nimport type { VgGraph } from '../../schema.js';\nimport { inventory } from '../../engine/drift.js';\nimport { loadStandards, checkStandards } from '../../engine/standards.js';\nimport { loadAdvancedScanHook } from '../advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { dashHostForIngestHost } from '../regions.js';\nimport { resolveDsn } from '../credentials.js';\nimport { emitIngestIdLine, emitDriftScoreLine } from '../utils/ingest-id-output.js';\nimport { uploadScanArtifact } from '../utils/upload.js';\nimport { buildGraph } from '../../engine/build.js';\nimport { writeArtifacts } from '../../engine/artifacts.js';\nimport { writeSnapshot } from '../../engine/freshness.js';\nimport { detectAiAssistant, printAiContextPrompt } from '../ai-context-prompt.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\n\n/**\n * Whether `scan` should build the local code map after scoring drift.\n *\n * The code map is a *local artifact* — it writes `.vibgrate/graph.json`, the\n * graph report/html, and a freshness snapshot, and building it runs the\n * memory-heavy in-process TypeScript program. It is therefore skipped whenever\n * the caller has opted out of local artifacts:\n *\n * - `--no-graph` (`opts.graph === false`) — explicit opt-out.\n * - `--max-privacy` — strongest privacy mode, which means \"no local artifacts\".\n * - `--no-local-artifacts` — \"Do not write .vibgrate JSON artifacts to disk\";\n * graph.json is one of those artifacts, so building it violated the flag's\n * contract *and* let the optional map build OOM-kill baseline scans (e.g. the\n * migration `scan --push --no-local-artifacts` path), taking `--push` down\n * with it even though drift and findings were already computed.\n */\nexport function shouldBuildCodeMap(opts: {\n graph?: boolean;\n maxPrivacy?: boolean;\n noLocalArtifacts?: boolean;\n}): boolean {\n return opts.graph !== false && !opts.maxPrivacy && !opts.noLocalArtifacts;\n}\n\n/**\n * Reachability hand-off: post the scan's dependency coordinates to the scan\n * symbols preflight, run the local graph query against the returned risky-symbol\n * manifest, and attach the verdicts to the artifact (uploaded with the push).\n * Best-effort — a failure here never fails or delays the scan.\n */\nasync function attachReachability(\n artifact: ScanArtifact,\n rootDir: string,\n opts: ScanOptions,\n graph: VgGraph,\n): Promise<void> {\n try {\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) return;\n const parsed = parseDsn(dsn);\n if (!parsed) return;\n const ingestHost = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n\n const dependencies = collectPreflightDependencies(artifact.projects, PROJECT_TYPE_TO_OSV_ECOSYSTEM);\n if (dependencies.length === 0) return;\n\n const manifest = await fetchRiskySymbols(parsed, ingestHost, dependencies);\n if (manifest.status !== 'ok' || !manifest.advisories) return;\n\n artifact.reachability = await analyzeReachability({\n graph,\n rootDir,\n manifest: manifest.advisories,\n dependencies,\n });\n\n if (!opts.quiet && manifest.advisories.length > 0) {\n const tiers = artifact.reachability.findings.reduce<Record<string, number>>((acc, f) => {\n acc[f.tier] = (acc[f.tier] ?? 0) + 1;\n return acc;\n }, {});\n const parts = [\n tiers.reachable ? `${tiers.reachable} reachable` : null,\n tiers.potentially_reachable ? `${tiers.potentially_reachable} potentially reachable` : null,\n tiers.not_reached ? `${tiers.not_reached} not reached` : null,\n tiers.unknown ? `${tiers.unknown} unknown` : null,\n ].filter(Boolean);\n console.log(\n chalk.dim(\n `Reachability: ${manifest.advisories.length} advisor${manifest.advisories.length === 1 ? 'y' : 'ies'} checked against the code map — ${parts.join(', ')}`,\n ),\n );\n }\n } catch (e: unknown) {\n // Unknown ≠ safe: the server scores these findings at full weight. Surface\n // the reason only in strict-less informational form.\n if (!opts.quiet) {\n const msg = e instanceof Error ? e.message : String(e);\n console.log(chalk.dim(`Reachability check skipped: ${msg}`));\n }\n }\n}\n\n/** Auto-push scan artifact to Vibgrate API */\nasync function autoPush(\n artifact: ScanArtifact,\n rootDir: string,\n opts: ScanOptions,\n): Promise<void> {\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) {\n console.error(chalk.red('No DSN provided for push.'));\n console.error(chalk.dim('Run \"vibgrate login\", set VIBGRATE_DSN, or use the --dsn flag.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n // Compact and compress artifact for upload. `databaseSchemaCaps` lets\n // `scanners.databaseSchema` in vibgrate.config.ts raise/lower the default\n // upload caps (see DOCS.md § Database Schema).\n const config = await loadConfig(rootDir);\n const databaseSchemaCaps = config.scanners !== false ? config.scanners?.databaseSchema : undefined;\n const { body, contentEncoding } = await prepareCompressedUpload(artifact, { databaseSchemaCaps });\n const timestamp = String(Date.now());\n\n let host = parsed.host;\n if (opts.region) {\n try {\n host = resolveIngestHost(opts.region);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n if (opts.strict) process.exit(1);\n return;\n }\n }\n\n const originalSize = JSON.stringify(artifact).length;\n const compressedSize = body.length;\n const ratio = ((1 - compressedSize / originalSize) * 100).toFixed(0);\n console.log(chalk.dim(`Uploading to ${host}... (${(compressedSize / 1024).toFixed(0)} KB, ${ratio}% smaller)`));\n\n try {\n // Auto-retries against the workspace's pinned region on a 409 REGION_MISMATCH.\n const { response, host: uploadedHost } = await uploadScanArtifact({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n body,\n contentEncoding,\n timestamp,\n force: opts.force,\n // Set only by an automated caller running the scan on the workspace's\n // behalf (e.g. a Vibgrate-hosted remediation run) — never a customer flag.\n runId: process.env.VIBGRATE_SCAN_RUN_ID,\n runToken: process.env.VIBGRATE_SCAN_RUN_TOKEN,\n });\n host = uploadedHost;\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = await response.json() as {\n status: string;\n ingestId?: string;\n unchanged?: boolean;\n previousIngestId?: string;\n lastScannedAt?: string;\n };\n\n if (result.unchanged) {\n console.log(\n chalk.green('✔')\n + ` Repository unchanged since ${result.lastScannedAt ?? 'last scan'} — skipped upload (no credit used).`,\n );\n if (result.previousIngestId) {\n emitIngestIdLine(result.previousIngestId, { unchanged: true });\n const dashUrl = `https://${dashHostForIngestHost(host)}/${parsed.workspaceId}/scan/${result.previousIngestId}`;\n console.log(chalk.dim(` Previous report: ${dashUrl}`));\n } else if (opts.strict) {\n console.error(chalk.red('Repository unchanged but no previous ingest id returned.'));\n process.exit(1);\n }\n return;\n }\n\n console.log(chalk.green('✔') + ` Scan queued for processing (${result.ingestId ?? 'ok'})`);\n if (result.ingestId) {\n emitIngestIdLine(result.ingestId);\n const dashUrl = `https://${dashHostForIngestHost(host)}/${parsed.workspaceId}/scan/${result.ingestId}`;\n // On Windows, stderr/stdout desync can leave residual content on lines.\n // Use ANSI escape: \\x1B[0G = move to column 0, \\x1B[2K = erase entire line\n const CLEAR_LINE = process.platform === 'win32' ? '\\x1B[0G\\x1B[2K' : '';\n console.log('');\n console.log(CLEAR_LINE + chalk.dim(' Processing continues in the background. Results available shortly.'));\n console.log('');\n console.log(CLEAR_LINE + chalk.cyan('────────────────────────────────────────────────────────────────────────────────'));\n console.log(CLEAR_LINE + chalk.bold(' 📊 View Scan Report'));\n console.log(CLEAR_LINE + ' ' + chalk.underline.cyan(dashUrl));\n console.log(CLEAR_LINE + chalk.cyan('────────────────────────────────────────────────────────────────────────────────'));\n console.log('');\n console.log('');\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Upload failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n}\n\n/**\n * Commander collector for the repeatable `--exclude` flag. Each occurrence\n * may itself hold several comma/semicolon-separated globs, so we expand and\n * accumulate them across every use of the flag.\n */\nfunction collectExcludes(value: string, previous: string[]): string[] {\n return [...previous, ...parseExcludePatterns(value)];\n}\n\n/**\n * `--full` extra: report banned dependencies against a committed standards policy\n * (`.vibgrate/standards.json` etc.). Silent when no policy is present, and never\n * changes the exit code — gating stays with `vg drift --fail-on standards`.\n */\nfunction reportStandards(rootDir: string): void {\n const loaded = loadStandards(rootDir);\n if (!loaded.policy) return;\n const violations = checkStandards(loaded.policy, inventory(rootDir).records);\n if (violations.length === 0) {\n console.log(chalk.green('✔') + ' Standards: no banned dependencies in use');\n return;\n }\n console.log(chalk.red(`\\n⚠ Standards: ${violations.length} banned dependency(ies) in use`));\n for (const v of violations) {\n const fix = v.use ? chalk.dim(` → use ${v.use}`) : '';\n const why = v.reason ? chalk.dim(` (${v.reason})`) : '';\n console.log(` ${chalk.red('banned')} ${v.ecosystem}:${v.name}${v.installed ? chalk.dim(` ${v.installed}`) : ''}${fix}${why}`);\n }\n}\n\nfunction parseNonNegativeNumber(value: string | undefined, label: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative number.`);\n }\n return parsed;\n}\n\nexport const scanCommand = new Command('scan')\n .description('Scan a project for upgrade drift')\n .argument('[path]', 'Path to scan', '.')\n .option('--out <file>', 'Output file path')\n .option('--format <format>', 'Output format (text|json|sarif|md)', 'text')\n .option('--fail-on <level>', 'Fail on warn or error')\n .option('--baseline <file>', 'Compare against baseline')\n .option('--changed-only', 'Only scan changed files')\n .option(\n '-e, --exclude <glob>',\n 'Exclude paths matching a glob pattern. Repeatable, and a single value may list several patterns separated by commas or semicolons (e.g. --exclude \"legacy/**,vendor/**\"). Merged with excludes from the config file.',\n collectExcludes,\n [],\n )\n .option('--concurrency <n>', 'Max concurrent npm calls', '8')\n .option('--push', 'Auto-push results to Vibgrate API after scan')\n .option('--dsn <dsn>', 'DSN token for push (or use VIBGRATE_DSN env)')\n .option('--region <region>', 'Override data residency region for push (us, eu)')\n .option('--strict', 'Fail on push errors')\n .option('--ui-purpose', 'Enable optional UI purpose evidence extraction (slower)')\n .option('--no-local-artifacts', 'Do not write .vibgrate JSON artifacts to disk')\n .option('--max-privacy', 'Enable strongest privacy mode (minimal scanners, no local artifacts)')\n .option('--offline', 'Run without network calls; do not upload results')\n .option('--full', 'Comprehensive scan: turns on known-vulnerability detection (= --vulns) and, when a standards policy exists, a banned-dependency report — on top of drift scoring and the code map')\n .option('--vulns', 'Also scan installed dependencies for known vulnerabilities (OSV online, or advisories from --package-manifest when offline)')\n .option('--package-manifest <file>', 'Use local package-version manifest JSON/ZIP (for offline mode)')\n .option('--project-scan-timeout <seconds>', 'Per-project scan timeout in seconds (default: 180)')\n .option('--drift-budget <score>', 'Fail if DriftScore is above budget (0-100)')\n .option('--drift-worsening <percent>', 'Fail if drift worsens by more than % since baseline')\n .option('--repository-name <name>', 'Override the repository name recorded for this scan (defaults to the directory or package.json name)')\n .option('--force', 'Always create a fresh scan ingest, even if the repository is unchanged since the last scan (skips the unchanged/reuse optimization). Used by scheduled and dashboard-triggered scans.')\n .option('--no-graph', 'Skip building the local code map (the AI/docs index) that scan produces after scoring drift')\n .option('--quiet', 'Suppress promotional output (the free-plan tracking panel and the AI Context install prompt); scan results are unaffected')\n .action(async (targetPath: string, opts: {\n out?: string;\n format: string;\n failOn?: string;\n baseline?: string;\n changedOnly?: boolean;\n exclude: string[];\n concurrency: string;\n push?: boolean;\n dsn?: string;\n region?: string;\n strict?: boolean;\n uiPurpose?: boolean;\n // Commander maps the `--no-local-artifacts` negation flag to\n // `localArtifacts` (default `true`, `false` when the flag is passed) — NOT\n // to `noLocalArtifacts`. Reading the wrong name silently ignored the flag.\n localArtifacts?: boolean;\n maxPrivacy?: boolean;\n offline?: boolean;\n full?: boolean;\n vulns?: boolean;\n packageManifest?: string;\n projectScanTimeout?: string;\n driftBudget?: string;\n driftWorsening?: string;\n repositoryName?: string;\n force?: boolean;\n graph?: boolean;\n quiet?: boolean;\n }) => {\n const rootDir = path.resolve(targetPath);\n if (!(await pathExists(rootDir))) {\n console.error(chalk.red(`Path does not exist: ${rootDir}`));\n process.exit(1);\n }\n\n const hasDsn = !!resolveDsn(opts.dsn);\n const willPush = !opts.offline && (opts.push || hasDsn);\n\n // `--no-local-artifacts` arrives from commander as `localArtifacts === false`\n // (the negation flag's camelCase key), so normalise it once here. Reading\n // `opts.noLocalArtifacts` (which never exists) had silently ignored the flag:\n // every .vibgrate artifact — including the memory-heavy code map — was still\n // written, which OOM-killed migration baseline scans mid-map.\n const noLocalArtifacts = opts.localArtifacts === false;\n\n // Capture first-run before the scan writes .vibgrate/scan_result.json.\n const isFirstRun = !(await pathExists(path.join(rootDir, '.vibgrate', 'scan_result.json')));\n\n // Region the workspace is pinned to, learned from preflight. Used to route\n // the upload to the correct ingest host up front (the push path also\n // self-heals on a 409 REGION_MISMATCH if preflight didn't run).\n let pinnedRegion: string | undefined;\n // Workspace billing tier + upgrade link, learned from preflight. They select\n // the free-plan upsell panel's audience: a free-tier workspace shows the\n // panel with an upgrade CTA; any paid tier suppresses it. Left undefined when\n // preflight does not run (offline / no push), which keeps the panel hidden\n // for authenticated users rather than risk mislabelling a paid plan.\n let planTier: string | undefined;\n let upgradeUrl: string | undefined;\n\n if (willPush && hasDsn) {\n const dsn = resolveDsn(opts.dsn)!;\n const parsed = parseDsn(dsn);\n if (parsed) {\n const ingestHost = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n const vcs = await detectVcs(rootDir);\n const fingerprint = await computeRepoFingerprint(rootDir, vcs);\n const repositoryName = opts.repositoryName?.trim() || await resolveRepositoryName(rootDir);\n try {\n const preflight = await fetchScanPreflight(parsed, ingestHost, {\n repositoryName,\n vcsSha: fingerprint.vcsSha,\n });\n pinnedRegion = preflight.region;\n planTier = preflight.plan?.tier;\n // Prefer the server's canonical upgrade link; otherwise point at the\n // workspace dashboard on the (possibly region-pinned) ingest host.\n upgradeUrl =\n preflight.upgradeUrl ??\n `https://${dashHostForIngestHost(preflight.ingestHost ?? ingestHost)}/${parsed.workspaceId}`;\n if (preflight.vm && !preflight.vm.allowed) {\n console.error(chalk.red(preflight.error ?? 'VM meter usage exhausted'));\n console.error(\n chalk.dim(\n `VM minutes: ${preflight.vm.used}/${preflight.vm.limit} (${preflight.plan.label} plan) — enable overages or upgrade your plan.`,\n ),\n );\n process.exit(1);\n }\n // A new repository that would breach the plan's repository cap is\n // blocked before the (expensive) local scan runs. Re-scanning an\n // already-mapped repository is never blocked here.\n if (preflight.repositories && !preflight.repositories.allowed) {\n console.error(\n chalk.red(\n preflight.error ??\n `Repository limit reached for the ${preflight.plan.label} plan — cannot scan a new repository.`,\n ),\n );\n const max =\n preflight.repositories.max < 0 ? 'unlimited' : String(preflight.repositories.max);\n console.error(\n chalk.dim(\n `Repositories: ${preflight.repositories.total}/${max} (${preflight.plan.label} plan) — archive a repository or upgrade your plan.`,\n ),\n );\n if (preflight.upgradeUrl) {\n console.error(chalk.dim(` Upgrade: ${preflight.upgradeUrl}`));\n }\n process.exit(1);\n }\n if (preflight.status === 'error' || !preflight.scans.allowed) {\n console.error(chalk.red(preflight.error ?? 'Scan ingestion not allowed for this workspace.'));\n console.error(\n chalk.dim(\n `Credits: ${preflight.scans.used}/${preflight.scans.limit} (${preflight.plan.label} plan)`,\n ),\n );\n if (opts.strict) process.exit(1);\n process.exit(1);\n }\n console.log(\n chalk.dim(\n `Plan: ${preflight.plan.label} — scan credits ${preflight.scans.used}/${preflight.scans.limit} this month`,\n ),\n );\n // `--force` opts out of the unchanged short-circuit so scheduled and\n // dashboard-triggered scans always produce a fresh report.\n if (preflight.repository?.unchanged && !opts.force) {\n console.log(\n chalk.green('✔')\n + ` Repository unchanged at ${preflight.repository.lastVcsSha?.slice(0, 7) ?? 'same revision'} — skipping scan.`,\n );\n if (preflight.repository.lastIngestId) {\n emitIngestIdLine(preflight.repository.lastIngestId, { unchanged: true });\n const dashUrl = `https://${dashHostForIngestHost(ingestHost)}/${parsed.workspaceId}/scan/${preflight.repository.lastIngestId}`;\n console.log(chalk.dim(` Latest report: ${dashUrl}`));\n } else if (opts.strict) {\n console.error(chalk.red('Repository unchanged but no previous ingest id available.'));\n process.exit(1);\n }\n return;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.yellow(`Preflight check failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n }\n }\n\n const scanOpts: ScanOptions = {\n vibgrateVersion: VERSION,\n out: opts.out,\n format: (opts.format as 'text' | 'json' | 'sarif' | 'md') || 'text',\n failOn: opts.failOn as 'warn' | 'error' | undefined,\n baseline: opts.baseline,\n changedOnly: opts.changedOnly,\n exclude: opts.exclude,\n concurrency: parseInt(opts.concurrency, 10) || 8,\n push: opts.push,\n dsn: opts.dsn,\n // An explicit --region wins; otherwise route to the workspace's pinned\n // region as reported by preflight.\n region: opts.region ?? pinnedRegion,\n strict: opts.strict,\n uiPurpose: opts.uiPurpose,\n noLocalArtifacts,\n maxPrivacy: opts.maxPrivacy,\n offline: opts.offline,\n // `--full` is the comprehensive umbrella: it turns on vulnerability scanning.\n vulns: opts.vulns || opts.full,\n packageManifest: opts.packageManifest,\n driftBudget: parseNonNegativeNumber(opts.driftBudget, '--drift-budget'),\n driftWorseningPercent: parseNonNegativeNumber(opts.driftWorsening, '--drift-worsening'),\n projectScanTimeout: opts.projectScanTimeout ? parseInt(opts.projectScanTimeout, 10) || undefined : undefined,\n repositoryName: opts.repositoryName?.trim() || undefined,\n force: opts.force,\n quiet: opts.quiet,\n // Auth + plan signals for the free-plan upsell panel. `hasDsn` resolves the\n // full credential precedence — `--dsn`, `VIBGRATE_DSN`, and the stored login\n // credential (`~/.vibgrate/credentials.json`) — which the scanner's own\n // dsn/env-only check cannot see. `planTier`/`upgradeUrl` come from preflight.\n // Together they pick the panel audience: signed out → login CTA; signed in\n // on free → upgrade CTA; signed in on a paid plan → no panel. Without the\n // auth signal, a logged-in user running a bare scan was mislabelled\n // \"Vibgrate Free\" and shown the login panel even as the run pushed.\n authenticated: hasDsn,\n planTier,\n upgradeUrl,\n // Prefix for the upsell panel's `login → push` hint — `vg` when installed,\n // `npx @vibgrate/cli` when the user ran via npx (where bare `vg` fails).\n invocation: resolveCliInvocation(),\n };\n\n // `scan` also builds the local code map (the AI/docs index) so one command\n // yields both the DriftScore and a ready graph for `vg ask`/`guide`/`lib`\n // and MCP. We run it as the scan's final `postScan` step so it shares the\n // *single* progress bar (no second bar/logo). Fail-soft — a map problem\n // never fails the scan. Skipped under --no-graph, --max-privacy, and\n // --no-local-artifacts (the map is a local .vibgrate artifact; see\n // shouldBuildCodeMap). An uncatchable OOM in the map build otherwise takes\n // the whole scan — and its --push — down with it.\n const wantGraph = shouldBuildCodeMap({ graph: opts.graph, maxPrivacy: opts.maxPrivacy, noLocalArtifacts });\n // Retained by the postScan hook so the reachability query below can run\n // against the freshly built map without a second (memory-heavy) build.\n let builtGraph: VgGraph | null = null;\n if (wantGraph) {\n scanOpts.postScan = async (report) => {\n const result = await buildGraph({\n root: rootDir,\n exclude: opts.exclude,\n onParseProgress: (done, total) => report(done, total, 'parsing'),\n });\n builtGraph = result.graph;\n writeArtifacts(result.graph, { root: rootDir });\n // Freshness snapshot → lets `vg serve`/`vg ask` auto-refresh this map\n // when the working tree drifts (see engine/freshness.ts).\n writeSnapshot(rootDir, result.graph.provenance.corpusHash, result.fileStats, {\n exclude: opts.exclude,\n });\n const { counts } = result.graph.meta;\n return `${counts.nodes.toLocaleString()} nodes · ${counts.edges.toLocaleString()} edges`;\n };\n }\n\n // Open base scan. The optional advanced-analysis hook is a no-op in this\n // open build, so the scan runs entirely on the open base engine.\n const advanced = await loadAdvancedScanHook();\n const artifact = await runCoreScan(rootDir, scanOpts, advanced);\n\n // Machine-readable drift score for the remediation agent's before/after gate\n // (no-op unless VIBGRATE_EMIT_MARKERS=1). Emitted from the freshly computed\n // local artifact, so it is available even without --push.\n emitDriftScoreLine(artifact.drift.score);\n\n // `--full` also surfaces the offline standards/policy check (otherwise only\n // reachable via `vg drift --fail-on standards`). Report-only here — it never\n // changes the exit code; use `vg drift --fail-on standards` to gate CI.\n if (opts.full) {\n reportStandards(rootDir);\n }\n\n // Check fail-on thresholds\n if (opts.failOn) {\n const hasErrors = artifact.findings.some((f: { level: string }) => f.level === 'error');\n const hasWarnings = artifact.findings.some((f: { level: string }) => f.level === 'warning');\n\n if (opts.failOn === 'error' && hasErrors) {\n console.error(chalk.red(`\\nFailing: ${artifact.findings.filter((f: { level: string }) => f.level === 'error').length} error finding(s) detected.`));\n process.exit(2);\n }\n if (opts.failOn === 'warn' && (hasErrors || hasWarnings)) {\n console.error(chalk.red(`\\nFailing: findings detected at warn level or above.`));\n process.exit(2);\n }\n }\n\n if (scanOpts.driftBudget !== undefined && artifact.drift.score > scanOpts.driftBudget) {\n console.error(chalk.red(`\\nFailing fitness function: DriftScore ${artifact.drift.score}/100 exceeds budget ${scanOpts.driftBudget}.`));\n process.exit(2);\n }\n\n if (scanOpts.driftWorseningPercent !== undefined) {\n if (artifact.delta === undefined) {\n console.error(chalk.red('\\nFailing fitness function: --drift-worsening requires --baseline to compare against previous drift.'));\n process.exit(2);\n }\n\n if (artifact.delta > 0) {\n const baselineScore = artifact.drift.score - artifact.delta;\n const denominator = Math.max(Math.abs(baselineScore), 0.0001);\n const worseningPercent = (artifact.delta / denominator) * 100;\n\n if (worseningPercent > scanOpts.driftWorseningPercent) {\n console.error(chalk.red(`\\nFailing fitness function: drift worsened by ${worseningPercent.toFixed(2)}% (threshold ${scanOpts.driftWorseningPercent}%).`));\n process.exit(2);\n }\n }\n }\n\n // Reachability hand-off (before push): post the dependency coordinates the\n // scan found in the package manifests to the symbols preflight, then query\n // the freshly built local code map for vulnerable-symbol usage and attach\n // the verdicts to the artifact. Coordinates only go up — never source.\n // Strictly best-effort: any failure leaves reachability absent (Unknown\n // server-side); it never delays exit codes or blocks the push.\n if (willPush && hasDsn && builtGraph) {\n await attachReachability(artifact, rootDir, scanOpts, builtGraph);\n }\n\n if (willPush) {\n await autoPush(artifact, rootDir, scanOpts);\n }\n\n // On first run with no cloud connection and text output, prompt the user\n // to wire Vibgrate AI Context into their AI assistant.\n const showAiPrompt =\n scanOpts.format === 'text' &&\n !opts.quiet &&\n !hasDsn &&\n !opts.offline &&\n !noLocalArtifacts &&\n !opts.maxPrivacy &&\n isFirstRun;\n\n if (showAiPrompt) {\n const detectedAssistant = await detectAiAssistant(rootDir);\n printAiContextPrompt(detectedAssistant);\n }\n });\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Is a prior `vg` scan artifact still up to date with the working tree?\n *\n * `vg fix` reads dependency drift from `.vibgrate/scan_result.json`. If the user\n * edited a dependency manifest — or a lockfile moved because they ran an install\n * or a previous `vg fix` — since that scan, the artifact describes a repository\n * that no longer exists, and the upgrade plan would be built against stale\n * versions (GUARDRAILS §1.4 — output integrity). So before planning, we check\n * whether any dependency manifest or lockfile is *newer* than the artifact and,\n * if so, re-scan.\n *\n * The signal is deliberately scoped to dependency manifests + lockfiles (not the\n * whole source tree): those are the only inputs that change what `vg fix`\n * analyses, and keying on them makes the check cheap and, crucially, loop-free —\n * a re-scan rewrites the artifact, bumping its mtime past every manifest, so the\n * next `vg fix` sees a fresh scan rather than re-scanning forever.\n *\n * Fail-open everywhere: a stat/read error reports \"fresh\". Freshness is an\n * optimisation, not a gate — a transient filesystem hiccup must never wedge\n * `vg fix` into a spurious re-scan (or a crash).\n */\n\n/** Dependency manifests + lockfiles whose modification invalidates a prior scan. */\nconst WATCHED_FILES = new Set([\n // npm\n 'package.json',\n 'package-lock.json',\n 'npm-shrinkwrap.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'bun.lockb',\n // pypi\n 'requirements.txt',\n 'pyproject.toml',\n 'poetry.lock',\n 'Pipfile',\n 'Pipfile.lock',\n 'uv.lock',\n // go\n 'go.mod',\n 'go.sum',\n // rust\n 'Cargo.toml',\n 'Cargo.lock',\n // ruby\n 'Gemfile',\n 'Gemfile.lock',\n // php\n 'composer.json',\n 'composer.lock',\n // swift\n 'Package.swift',\n 'Package.resolved',\n // dart\n 'pubspec.yaml',\n 'pubspec.lock',\n // java\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n 'gradle.lockfile',\n // dotnet\n 'packages.lock.json',\n]);\n\n/** .NET project files carry their dependency versions inline (`<PackageReference>`). */\nconst WATCHED_EXT = /\\.(cs|fs)proj$/i;\n\n/**\n * Directories never worth descending into when hunting for manifests. Mirrors\n * `engine/drift.ts` `findManifests` so both agree on what counts as project\n * source rather than a build/vendor/dependency directory.\n */\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.vibgrate',\n 'vendor',\n '.venv',\n 'venv',\n 'env',\n '__pycache__',\n 'target',\n '.next',\n '.nuxt',\n 'coverage',\n '.cache',\n]);\n\nexport interface StalenessResult {\n /** True when a manifest/lockfile is newer than the scan artifact. */\n stale: boolean;\n /**\n * The repo-relative path of the newest changed manifest, for an actionable\n * \"re-scanning because X changed\" message. Undefined when not stale.\n */\n newestChanged?: string;\n}\n\n/**\n * Decide whether `artifactPath` is out of date with the dependency manifests and\n * lockfiles under `rootDir`. See the module comment for the rationale and the\n * fail-open contract.\n */\nexport function scanStaleness(rootDir: string, artifactPath: string): StalenessResult {\n let ref: number;\n try {\n ref = fs.statSync(artifactPath).mtimeMs;\n } catch {\n // No artifact to compare against — the caller handles \"missing\" on its own.\n return { stale: false };\n }\n\n let newest = -Infinity;\n let newestChanged: string | undefined;\n\n // Bounded walk (depth + entry cap), matching engine/drift.ts findManifests, so\n // a pathological tree can never make freshness the slow part of `vg fix`.\n const MAX_ENTRIES = 20000;\n let scanned = 0;\n const walk = (dir: string, depth: number): void => {\n if (depth > 8 || scanned > MAX_ENTRIES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n scanned++;\n if (scanned > MAX_ENTRIES) break;\n if (e.isDirectory()) {\n if (!SKIP_DIRS.has(e.name) && !e.name.startsWith('.')) walk(path.join(dir, e.name), depth + 1);\n continue;\n }\n if (!WATCHED_FILES.has(e.name) && !WATCHED_EXT.test(e.name)) continue;\n const abs = path.join(dir, e.name);\n let mtimeMs: number;\n try {\n mtimeMs = fs.statSync(abs).mtimeMs;\n } catch {\n continue;\n }\n if (mtimeMs > newest) {\n newest = mtimeMs;\n newestChanged = path.relative(rootDir, abs) || e.name;\n }\n }\n };\n walk(rootDir, 0);\n\n return newest > ref ? { stale: true, newestChanged } : { stale: false };\n}\n\n/** Convenience predicate over {@link scanStaleness}. */\nexport function isScanStale(rootDir: string, artifactPath: string): boolean {\n return scanStaleness(rootDir, artifactPath).stale;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * \"Contract\" extraction for `vg fix`: the named symbols the source imports from\n * a package (its default, namespace, named exports, and destructured requires).\n *\n * These are the API surfaces an upgrade must preserve, so the report can point a\n * developer (or a breaking-change analysis) at exactly what to re-verify against\n * the new version. The parser is pure and exported for tests; {@link collectContracts}\n * is a bounded, deterministic walk of the source tree.\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;\n/** Cap on the distinct contract symbols reported per package (keeps output bounded). */\nexport const MAX_CONTRACTS = 40;\n\nconst SOURCE_EXT: Record<'npm' | 'pypi', 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/** Parse the specifiers of one ESM/CJS import clause (`Default, { A, B as C }` / `* as NS`). */\nfunction parseJsClause(clause: string, out: Set<string>): void {\n const trimmed = clause.trim();\n if (!trimmed) return;\n // Namespace import: `* as NS`\n if (/^\\*\\s+as\\s+\\w+/.test(trimmed)) {\n out.add('* (namespace)');\n return;\n }\n // Named block `{ ... }`, with an optional leading default identifier.\n const braceMatch = /\\{([^}]*)\\}/.exec(trimmed);\n const beforeBrace = braceMatch ? trimmed.slice(0, braceMatch.index) : trimmed;\n const defaultId = beforeBrace.replace(/,/g, '').trim();\n if (defaultId && /^\\w+$/.test(defaultId)) out.add('default');\n if (braceMatch) {\n for (const raw of braceMatch[1].split(',')) {\n const name = raw.trim().split(/\\s+as\\s+/)[0]?.trim();\n if (name && /^[\\w$]+$/.test(name)) out.add(name);\n }\n }\n}\n\n/** Extract the imported contract symbols for `pkg` from a single file's `content`. */\nexport function extractContracts(content: string, pkg: string, ecosystem: 'npm' | 'pypi' | 'unknown'): string[] {\n const out = new Set<string>();\n const e = escapeRegExp(pkg);\n if (ecosystem === 'npm') {\n const importRe = new RegExp(`import\\\\s+([^;'\"\\\\n]*?)\\\\s+from\\\\s+['\"]${e}(?:/[^'\"]*)?['\"]`, 'g');\n let m: RegExpExecArray | null;\n while ((m = importRe.exec(content))) parseJsClause(m[1], out);\n const requireDestructureRe = new RegExp(`\\\\{([^}]*)\\\\}\\\\s*=\\\\s*require\\\\(\\\\s*['\"]${e}(?:/[^'\"]*)?['\"]\\\\s*\\\\)`, 'g');\n while ((m = requireDestructureRe.exec(content))) {\n for (const raw of m[1].split(',')) {\n const name = raw.trim().split(':')[0]?.trim();\n if (name && /^[\\w$]+$/.test(name)) out.add(name);\n }\n }\n } else if (ecosystem === 'pypi') {\n const fromRe = new RegExp(`^\\\\s*from\\\\s+${e}(?:\\\\.[\\\\w.]+)?\\\\s+import\\\\s+(.+)$`, 'gm');\n let m: RegExpExecArray | null;\n while ((m = fromRe.exec(content))) {\n const names = m[1].replace(/[()]/g, '').split(',');\n for (const raw of names) {\n const name = raw.trim().split(/\\s+as\\s+/)[0]?.trim();\n if (name === '*') out.add('* (module)');\n else if (name && /^[\\w.]+$/.test(name)) out.add(name);\n }\n }\n const importRe = new RegExp(`^\\\\s*import\\\\s+${e}\\\\b`, 'gm');\n if (importRe.test(content)) out.add(`${pkg} (module)`);\n }\n return [...out].sort();\n}\n\n/**\n * Walk the source tree (bounded) collecting the distinct contract symbols used\n * from `pkg`. Deterministic: files are visited in sorted order and the result is\n * sorted and capped at {@link MAX_CONTRACTS}.\n */\nexport function collectContracts(root: string, pkg: string, ecosystem: 'npm' | 'pypi' | 'unknown'): string[] {\n if (ecosystem === 'unknown') return [];\n const exts = SOURCE_EXT[ecosystem];\n if (!exts) return [];\n const found = new Set<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 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 if (fs.statSync(full).size > MAX_FILE_BYTES) continue;\n content = fs.readFileSync(full, 'utf8');\n } catch {\n continue;\n }\n for (const sym of extractContracts(content, pkg, ecosystem)) found.add(sym);\n }\n }\n };\n walk(root, 0);\n return [...found].sort().slice(0, MAX_CONTRACTS);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { extractContracts, MAX_CONTRACTS } from './contracts.js';\n\n/**\n * A single bounded pass over the source tree that, for every candidate package\n * at once, counts import sites and collects the contract symbols in use. Doing\n * this in one walk (rather than one walk per package) keeps `vg fix` fast on\n * repos with many dependencies. Deterministic: sorted traversal, sorted output.\n *\n * This is pure input-gathering the CLI must do locally — it reads the user's own\n * source, which never leaves the machine. The counts and contracts are shipped\n * to the hosted planner; the risk classification they feed is computed there.\n */\n\nexport type SourceEcosystem = 'npm' | 'pypi' | 'unknown';\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;\n\nconst EXT_ECOSYSTEM: Record<string, SourceEcosystem> = {\n '.ts': 'npm', '.tsx': 'npm', '.js': 'npm', '.jsx': 'npm', '.mjs': 'npm', '.cjs': 'npm',\n '.mts': 'npm', '.cts': 'npm', '.vue': 'npm', '.svelte': 'npm',\n '.py': 'pypi',\n};\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction importPattern(ecosystem: 'npm' | 'pypi', pkg: string): RegExp {\n const e = escapeRegExp(pkg);\n if (ecosystem === 'npm') {\n return new RegExp(`(?:from\\\\s+|require\\\\(\\\\s*|import\\\\(\\\\s*)['\"]${e}(?:/[^'\"]*)?['\"]`, 'g');\n }\n return new RegExp(`^\\\\s*(?:import\\\\s+${e}(?:[.\\\\s]|$)|from\\\\s+${e}(?:[.\\\\s]))`, 'gm');\n}\n\nexport interface PackageUsage {\n importSites: number;\n filesTouched: number;\n contracts: string[];\n}\n\ninterface Tracked {\n name: string;\n ecosystem: 'npm' | 'pypi';\n pattern: RegExp;\n importSites: number;\n filesTouched: number;\n contracts: Set<string>;\n}\n\n/**\n * Walk `root` once, returning per-package usage keyed by package name. Packages\n * with an `unknown` ecosystem are returned with empty usage (no source scanning\n * applies).\n */\nexport function analyzeTree(\n root: string,\n packages: Array<{ name: string; ecosystem: SourceEcosystem }>,\n): Map<string, PackageUsage> {\n const result = new Map<string, PackageUsage>();\n const tracked: Tracked[] = [];\n for (const p of packages) {\n if (p.ecosystem === 'npm' || p.ecosystem === 'pypi') {\n tracked.push({\n name: p.name,\n ecosystem: p.ecosystem,\n pattern: importPattern(p.ecosystem, p.name),\n importSites: 0,\n filesTouched: 0,\n contracts: new Set(),\n });\n } else {\n result.set(p.name, { importSites: 0, filesTouched: 0, contracts: [] });\n }\n }\n if (tracked.length === 0) return result;\n\n let filesSeen = 0;\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 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 continue;\n }\n const fileEco = EXT_ECOSYSTEM[path.extname(entry.name)];\n if (!fileEco || fileEco === 'unknown') continue;\n filesSeen++;\n const full = path.join(dir, entry.name);\n let content: string;\n try {\n if (fs.statSync(full).size > MAX_FILE_BYTES) continue;\n content = fs.readFileSync(full, 'utf8');\n } catch {\n continue;\n }\n for (const t of tracked) {\n if (t.ecosystem !== fileEco) continue;\n t.pattern.lastIndex = 0;\n const matches = content.match(t.pattern);\n if (matches && matches.length) {\n t.importSites += matches.length;\n t.filesTouched++;\n if (t.contracts.size < MAX_CONTRACTS) {\n for (const sym of extractContracts(content, t.name, t.ecosystem)) t.contracts.add(sym);\n }\n }\n }\n }\n };\n walk(root, 0);\n\n for (const t of tracked) {\n result.set(t.name, {\n importSites: t.importSites,\n filesTouched: t.filesTouched,\n contracts: [...t.contracts].sort().slice(0, MAX_CONTRACTS),\n });\n }\n return result;\n}\n","/**\n * Transport for the hosted upgrade planner (`POST /v1/fix/plan`).\n *\n * `vg fix` is a thin, DSN-authenticated client: it sends drifted-dependency\n * candidates (versions + the usage/contract signals measured from local source)\n * and renders the plan the server returns. All planning intelligence lives\n * server-side. Mirrors the residency-aware retry of the scan upload transport —\n * a workspace is pinned to one region, so a 409 `REGION_MISMATCH` transparently\n * retries against the named regional host.\n */\n\nimport { ingestHostForRegionId } from '../regions.js';\nimport type { FixPlanRequest, FixPlanResponse } from '../planning/types.js';\n\nexport interface FixPlanInput {\n scheme: string;\n host: string;\n keyId: string;\n secret: string;\n request: FixPlanRequest;\n timestamp: string;\n}\n\nexport interface FixPlanResult {\n response: Response;\n /** The host the final request was sent to — differs from input.host on a region redirect. */\n host: string;\n}\n\nfunction postOnce(input: FixPlanInput, host: string): Promise<Response> {\n return fetch(`${input.scheme}://${host}/v1/fix/plan`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Vibgrate-Timestamp': input.timestamp,\n Authorization: `VibgrateDSN ${input.keyId}:${input.secret}`,\n Connection: 'close',\n },\n body: JSON.stringify(input.request),\n });\n}\n\nasync function regionRedirectHost(response: Response): Promise<string | undefined> {\n try {\n const payload = (await response.clone().json()) as { code?: string; region?: string };\n if (payload?.code !== 'REGION_MISMATCH' || !payload.region) return undefined;\n return ingestHostForRegionId(payload.region);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Request an upgrade plan from the hosted planner, transparently retrying\n * against the workspace's pinned region on a residency mismatch.\n */\nexport async function requestFixPlan(input: FixPlanInput): Promise<FixPlanResult> {\n let host = input.host;\n let response = await postOnce(input, host);\n\n if (response.status === 409) {\n const target = await regionRedirectHost(response);\n if (target && target !== host) {\n host = target;\n response = await postOnce(input, host);\n }\n }\n return { response, host };\n}\n\n/** Parse a fix-plan response body, tolerating an error envelope. */\nexport async function parseFixPlanResponse(response: Response): Promise<FixPlanResponse> {\n return (await response.json()) as FixPlanResponse;\n}\n","import chalk from 'chalk';\nimport type { VulnSeverity } from '../../core-open/index.js';\nimport type { FixPlanResponse, UpgradePlan, VulnDelta } from './types.js';\n\n/**\n * Human-facing renderers for the planner's response. `--json` bypasses these\n * entirely (the {@link FixPlanResponse} is emitted verbatim); these are for\n * `text` and `md`.\n */\n\nconst SEVERITY_ORDER: VulnSeverity[] = ['critical', 'high', 'moderate', 'low', 'unknown'];\n\nfunction deltaSummary(delta: VulnDelta): string {\n if (delta.total === 0) return 'none';\n const parts = SEVERITY_ORDER.filter((s) => delta.bySeverity[s]).map((s) => `${delta.bySeverity[s]} ${s}`);\n return parts.length ? parts.join(', ') : `${delta.total}`;\n}\n\nfunction riskLabel(score: number): string {\n if (score <= 15) return chalk.green(`${score}/100 low`);\n if (score <= 40) return chalk.yellow(`${score}/100 moderate`);\n return chalk.red(`${score}/100 high`);\n}\n\nfunction planBlock(plan: UpgradePlan, recommended: boolean): string {\n const lines: string[] = [];\n const marker = recommended ? chalk.green('● recommended') : chalk.dim('○');\n lines.push(`${marker} ${chalk.bold(plan.label)} — ${chalk.dim(plan.description)}`);\n const drift =\n typeof plan.expectedDriftScore === 'number' && typeof plan.driftDelta === 'number'\n ? ` · DriftScore →${plan.expectedDriftScore} (${plan.driftDelta <= 0 ? '' : '+'}${plan.driftDelta})`\n : '';\n lines.push(\n ` risk ${riskLabel(plan.riskScore)} · ${plan.upgrades.length} upgrade(s) · ` +\n `fixes ${deltaSummary(plan.fixes)}${drift}`,\n );\n if (plan.introduces.total) {\n lines.push(chalk.red(` ⚠ introduces ${deltaSummary(plan.introduces)} advisory(ies) in target versions`));\n }\n const shown = plan.upgrades.slice(0, 12);\n for (const u of shown) {\n const codemod = u.playbook?.codemod ? chalk.magenta(` [codemod: ${u.playbook.codemod}]`) : '';\n lines.push(` ${chalk.cyan(u.package)} ${chalk.dim(`${u.from ?? '?'} → ${u.to ?? '?'}`)} ${chalk.dim(u.reason)}${codemod}`);\n }\n if (plan.upgrades.length > shown.length) {\n lines.push(chalk.dim(` … and ${plan.upgrades.length - shown.length} more`));\n }\n return lines.join('\\n');\n}\n\nfunction dataNote(report: FixPlanResponse): string | null {\n if (report.vulnerabilityData === 'unavailable') {\n return chalk.dim('Advisory data was unavailable — vulnerability impact is not shown.');\n }\n if (report.vulnerabilityData === 'partial') {\n return chalk.dim('Advisory data was partial — some ecosystems were not checked.');\n }\n return null;\n}\n\nexport function renderText(report: FixPlanResponse): string {\n const out: string[] = [];\n out.push(chalk.bold('Vibgrate fix — upgrade plan'));\n out.push(\n chalk.dim(\n `${report.totalCandidates} drifted dependency(ies) analysed · ` +\n `${report.deepAnalysis ? 'deep (major) analysis on' : 'preflight only'}`,\n ),\n );\n const note = dataNote(report);\n if (note) out.push(note);\n if (report.exploitability && report.exploitability.kevPackages > 0) {\n const epss = report.exploitability.maxEpss != null ? `, peak EPSS ${(report.exploitability.maxEpss * 100).toFixed(0)}%` : '';\n out.push(chalk.red(`⚠ ${report.exploitability.kevPackages} package(s) carry a KNOWN-EXPLOITED (KEV) advisory${epss} — prioritise these.`));\n }\n out.push('');\n const visiblePlans = report.plans.filter((plan) => plan.upgrades.length > 0);\n if (visiblePlans.length === 0) {\n out.push(chalk.green('✔ Nothing to upgrade — every tracked dependency is current.'));\n out.push('');\n } else {\n for (const plan of visiblePlans) {\n out.push(planBlock(plan, plan.tier === report.recommended));\n out.push('');\n }\n }\n out.push(chalk.bold('Recommendation'));\n out.push(` ${chalk.green(report.plans.find((p) => p.tier === report.recommended)?.label ?? report.recommended)} — ${report.rationale}`);\n if (report.unresolved.total) {\n out.push('');\n out.push(chalk.red(`⚠ ${deltaSummary(report.unresolved)} advisory(ies) have no upgrade path in any plan.`));\n }\n return out.join('\\n');\n}\n\nexport function renderMarkdown(report: FixPlanResponse): string {\n const out: string[] = [];\n out.push('# Vibgrate fix — upgrade plan');\n out.push('');\n out.push(\n `${report.totalCandidates} drifted dependency(ies) analysed · ${report.deepAnalysis ? 'deep (major) analysis on' : 'preflight only'}.`,\n );\n const note = dataNote(report);\n if (note) {\n out.push('');\n out.push(`_${report.vulnerabilityData === 'unavailable' ? 'Advisory data was unavailable — vulnerability impact is not shown.' : 'Advisory data was partial — some ecosystems were not checked.'}_`);\n }\n out.push('');\n const visiblePlans = report.plans.filter((plan) => plan.upgrades.length > 0);\n if (visiblePlans.length === 0) {\n out.push('✔ Nothing to upgrade — every tracked dependency is current.');\n out.push('');\n }\n for (const plan of visiblePlans) {\n const rec = plan.tier === report.recommended ? ' ✅ **recommended**' : '';\n out.push(`## ${plan.label}${rec}`);\n out.push('');\n out.push(`_${plan.description}_`);\n out.push('');\n out.push(`- Risk: **${plan.riskScore}/100** (${plan.confidence} confidence)`);\n out.push(`- Upgrades: **${plan.upgrades.length}**`);\n out.push(`- Fixes advisories: ${deltaSummary(plan.fixes)}`);\n if (plan.introduces.total) {\n out.push(`- ⚠ Introduces advisories in target versions: ${deltaSummary(plan.introduces)}`);\n }\n out.push('');\n out.push('| Package | From | To | Kind | Reason |');\n out.push('|---|---|---|---|---|');\n for (const u of plan.upgrades) {\n out.push(`| \\`${u.package}\\` | ${u.from ?? '?'} | ${u.to ?? '?'} | ${u.kind} | ${u.reason} |`);\n }\n out.push('');\n }\n out.push('## Recommendation');\n out.push('');\n const recLabel = report.plans.find((p) => p.tier === report.recommended)?.label ?? report.recommended;\n out.push(`**${recLabel}** — ${report.rationale}`);\n if (report.unresolved.total) {\n out.push('');\n out.push(`> ⚠ ${deltaSummary(report.unresolved)} advisory(ies) have no upgrade path in any plan.`);\n }\n return out.join('\\n');\n}\n","import type { PlanTier, UpgradePlan } from './types.js';\n\n/**\n * Collapse duplicate plans onto the lowest-risk tier.\n *\n * The hosted planner always returns all three tiers, and in small estates they\n * frequently converge on the identical upgrade set (e.g. one drifted package\n * with only a minor update available). Presenting three indistinguishable\n * \"choices\" is noise, so a plan whose upgrade set is identical to a lower-risk\n * plan's is dropped and its tier is aliased to that surviving plan.\n */\n\n/** Tier order from lowest to highest risk — the survivor of a duplicate group is the earliest. */\nconst TIER_ORDER: PlanTier[] = ['safe', 'balanced', 'aggressive'];\n\nexport interface DedupedPlans {\n /** Surviving plans, in the planner's original order. */\n plans: UpgradePlan[];\n /** Every original tier → the tier of the surviving plan with the identical upgrade set. */\n canonicalTier: Map<PlanTier, PlanTier>;\n}\n\n/** Order-insensitive identity of a plan's upgrade set. */\nfunction upgradeSetKey(plan: UpgradePlan): string {\n return plan.upgrades\n .map((u) => `${u.ecosystem}\\0${u.package}\\0${u.from ?? ''}\\0${u.to ?? ''}`)\n .sort()\n .join('\\n');\n}\n\nexport function dedupePlans(plans: UpgradePlan[]): DedupedPlans {\n const byTier = (plan: UpgradePlan): number => {\n const i = TIER_ORDER.indexOf(plan.tier);\n return i === -1 ? TIER_ORDER.length : i;\n };\n const ordered = [...plans].sort((a, b) => byTier(a) - byTier(b));\n\n const survivorByKey = new Map<string, UpgradePlan>();\n const canonicalTier = new Map<PlanTier, PlanTier>();\n for (const plan of ordered) {\n const key = upgradeSetKey(plan);\n const survivor = survivorByKey.get(key) ?? plan;\n if (!survivorByKey.has(key)) survivorByKey.set(key, plan);\n canonicalTier.set(plan.tier, survivor.tier);\n }\n\n const survivors = new Set(survivorByKey.values());\n return { plans: plans.filter((p) => survivors.has(p)), canonicalTier };\n}\n","import { computeDriftScore } from '../../core-open/index.js';\nimport type { ScanArtifact, ProjectScan } from '../../core-open/index.js';\n\n/**\n * Estimate the DriftScore after applying a plan's upgrades.\n *\n * The DriftScore is a pure function of the scan's per-project state\n * (`computeDriftScore`), so we project the post-upgrade score by mutating a copy\n * of the scan to reflect the plan landing, then recomputing:\n *\n * - each upgraded dependency row lands at latest: `current`, zero majors\n * behind, and zero calendar-time drift (libyears/ageDays) — because the\n * driftscore-3.0 dependency pillar reads the per-dependency rows directly\n * (time-primary), not the age buckets;\n * - the age buckets are updated in lockstep for any legacy/aggregate consumer;\n * - each upgraded framework's `majorsBehind` is zeroed.\n *\n * It is a principled estimate, not a re-scan, but under v3 a fully-upgraded set\n * projects to 0 dependency drift (current version AND no time distance).\n * Deterministic.\n */\n\n/** Recompute the DriftScore assuming every package named in `upgraded` lands at latest. */\nexport function estimateDriftScore(artifact: ScanArtifact, upgraded: Set<string>): number {\n const projects: ProjectScan[] = JSON.parse(JSON.stringify(artifact.projects ?? []));\n for (const p of projects) {\n const buckets = p.dependencyAgeBuckets;\n for (const dep of p.dependencies ?? []) {\n if (!upgraded.has(dep.package)) continue;\n const mb = dep.majorsBehind ?? 0;\n // v3: project the upgrade onto the row — landed at latest ⇒ current, no\n // version lag, no calendar-time drift. Without this the time term (T)\n // would keep an upgraded dependency scoring > 0.\n dep.majorsBehind = 0;\n dep.drift = 'current';\n if (dep.libyears != null) dep.libyears = 0;\n if (dep.ageDays != null) dep.ageDays = 0;\n if (dep.latestStable) dep.resolvedVersion = dep.latestStable;\n if (mb >= 2 && buckets.twoPlusBehind > 0) {\n buckets.twoPlusBehind--;\n buckets.current++;\n } else if (mb === 1 && buckets.oneBehind > 0) {\n buckets.oneBehind--;\n buckets.current++;\n }\n }\n for (const fw of p.frameworks ?? []) {\n if (upgraded.has(fw.name)) fw.majorsBehind = 0;\n }\n }\n return computeDriftScore(projects).score;\n}\n","import { spawnSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport type { PlannedUpgrade } from './types.js';\n\n/**\n * Applies a chosen plan by running each ecosystem's native package manager to\n * pin the target version — which edits the manifest AND installs in one step.\n * `--dry-run` prints the commands without executing. Ecosystems without a clean\n * one-shot pin command are reported as \"manual\", never silently skipped.\n *\n * In a monorepo, a dependency lives in a specific workspace package's manifest,\n * not necessarily the repo root. Running the pin command at the root would edit\n * the wrong `package.json` (and pnpm refuses a bare `pnpm add` at a workspace\n * root: ERR_PNPM_ADDING_TO_ROOT). So callers resolve each upgrade to the\n * workspace package(s) that own it and we run the command in that package's\n * directory. Only when a dependency is declared in the root manifest of a pnpm\n * workspace do we add `-w`.\n */\n\n/** The npm-family package manager detected for a project. */\nexport type NpmPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport interface UpgradeCommand {\n cmd: string;\n args: string[];\n}\n\n/**\n * A manifest that owns an upgrade, as a directory relative to the repo root\n * (`'.'` or `''` = the root manifest).\n */\nexport interface WorkspaceTarget {\n /** Directory of the owning manifest, relative to the repo root. */\n dir: string;\n /**\n * True only when `dir` is the root of a pnpm workspace — the one case where\n * `pnpm add` needs `-w`. Workspace *members* never need it.\n */\n isWorkspaceRoot: boolean;\n}\n\n/** A `dir` referring to the repo root rather than a nested workspace package. */\nfunction isRootDir(dir: string): boolean {\n return dir === '' || dir === '.';\n}\n\nexport interface PmCommandOptions {\n /** When true and the package manager is pnpm, add the `-w` workspace-root flag. */\n workspaceRoot?: boolean;\n}\n\n/**\n * Build the native command that pins `pkg` to `version` for an ecosystem. Pure\n * and exported for tests. Returns null for ecosystems with no clean one-shot pin\n * (java, hex) — those are reported as manual.\n */\nexport function pmCommandFor(\n ecosystem: string,\n pkg: string,\n version: string,\n pm: NpmPackageManager = 'npm',\n opts: PmCommandOptions = {},\n): UpgradeCommand | null {\n // Only pnpm needs an explicit flag to write the workspace-root manifest.\n const ws = opts.workspaceRoot && pm === 'pnpm' ? ['-w'] : [];\n switch (ecosystem) {\n case 'npm':\n if (pm === 'pnpm') return { cmd: 'pnpm', args: ['add', ...ws, `${pkg}@${version}`] };\n if (pm === 'yarn') return { cmd: 'yarn', args: ['add', `${pkg}@${version}`] };\n if (pm === 'bun') return { cmd: 'bun', args: ['add', `${pkg}@${version}`] };\n return { cmd: 'npm', args: ['install', `${pkg}@${version}`] };\n case 'pypi':\n return { cmd: 'pip', args: ['install', `${pkg}==${version}`] };\n case 'cargo':\n return { cmd: 'cargo', args: ['add', `${pkg}@${version}`] };\n case 'go':\n return { cmd: 'go', args: ['get', `${pkg}@${version.startsWith('v') ? version : `v${version}`}`] };\n case 'composer':\n return { cmd: 'composer', args: ['require', `${pkg}:${version}`] };\n case 'nuget':\n return { cmd: 'dotnet', args: ['add', 'package', pkg, '--version', version] };\n case 'dotnet':\n return { cmd: 'dotnet', args: ['add', 'package', pkg, '--version', version] };\n case 'dart':\n case 'pub':\n return { cmd: 'dart', args: ['pub', 'add', `${pkg}:${version}`] };\n case 'rubygems':\n case 'ruby':\n // Bundler has no clean per-gem pin via CLI; update within the Gemfile's\n // constraint (best-effort). A hard pin needs a manual Gemfile edit.\n return { cmd: 'bundle', args: ['update', pkg] };\n default:\n return null; // java (maven/gradle), hex, swift → manual\n }\n}\n\nexport interface AppliedUpgrade {\n package: string;\n to: string | null;\n status: 'applied' | 'failed' | 'manual' | 'skipped';\n detail?: string;\n}\n\nexport interface RunResult {\n ok: boolean;\n detail?: string;\n /** The package-manager binary was not found on PATH (report as manual, not failed). */\n toolMissing?: boolean;\n}\n\nexport interface ApplyOptions {\n dryRun?: boolean;\n /** npm-family package manager for npm upgrades (from the scan). */\n packageManager?: NpmPackageManager;\n /**\n * Resolve which workspace manifest(s) own an upgrade, so the pin command runs\n * in the right directory instead of blindly at the repo root. Returns the\n * owning targets; an empty array falls back to the root manifest. Defaults to\n * a single root target (repo-root install, no `-w`).\n */\n resolveTargets?: (upgrade: PlannedUpgrade) => WorkspaceTarget[];\n /** Runner override for tests. */\n run?: (cmd: UpgradeCommand, cwd: string) => RunResult;\n}\n\nfunction defaultRun(cmd: UpgradeCommand, cwd: string): RunResult {\n const res = spawnSync(cmd.cmd, cmd.args, { cwd, stdio: 'inherit', shell: false });\n if (res.error) {\n // ENOENT = the toolchain (cargo, pip, go, …) isn't installed here. That's an\n // environment gap the user must resolve, not an upgrade that \"failed\".\n if ((res.error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { ok: false, toolMissing: true, detail: `${cmd.cmd} is not installed or not on PATH` };\n }\n return { ok: false, detail: res.error.message };\n }\n if (res.status !== 0) return { ok: false, detail: `exit ${res.status ?? 'signal'}` };\n return { ok: true };\n}\n\nconst ROOT_TARGET: WorkspaceTarget[] = [{ dir: '.', isWorkspaceRoot: false }];\n\n/** Apply a plan's upgrades. Returns per-package outcomes (nothing is silently dropped). */\nexport function applyPlan(rootDir: string, upgrades: PlannedUpgrade[], opts: ApplyOptions = {}): AppliedUpgrade[] {\n const run = opts.run ?? defaultRun;\n const resolveTargets = opts.resolveTargets ?? (() => ROOT_TARGET);\n const results: AppliedUpgrade[] = [];\n for (const u of upgrades) {\n if (!u.to) {\n results.push({ package: u.package, to: u.to, status: 'skipped', detail: 'no target version' });\n continue;\n }\n // Probe ecosystem support once (it never varies by target directory).\n if (!pmCommandFor(u.ecosystem, u.package, u.to, opts.packageManager)) {\n results.push({ package: u.package, to: u.to, status: 'manual', detail: `${u.ecosystem}: update the manifest to ${u.to} manually` });\n continue;\n }\n const targets = resolveTargets(u);\n const effective = targets.length > 0 ? targets : ROOT_TARGET;\n // Only tag a directory when disambiguation matters (a nested package, or\n // more than one owner) so single-root results read cleanly.\n const labelled = effective.length > 1;\n const where = (t: WorkspaceTarget) => (labelled || !isRootDir(t.dir) ? `${t.dir || '.'}: ` : '');\n\n if (opts.dryRun) {\n const detail = effective\n .map((t) => {\n const c = pmCommandFor(u.ecosystem, u.package, u.to as string, opts.packageManager, { workspaceRoot: t.isWorkspaceRoot });\n return `would run: ${c!.cmd} ${c!.args.join(' ')}${labelled || !isRootDir(t.dir) ? ` (in ${t.dir || '.'})` : ''}`;\n })\n .join('; ');\n results.push({ package: u.package, to: u.to, status: 'skipped', detail });\n continue;\n }\n const outcomes = effective.map((t) => {\n const c = pmCommandFor(u.ecosystem, u.package, u.to as string, opts.packageManager, { workspaceRoot: t.isWorkspaceRoot });\n return { t, res: run(c!, path.join(rootDir, t.dir)) };\n });\n const failures = outcomes.filter((o) => !o.res.ok);\n if (failures.length === 0) {\n results.push({\n package: u.package,\n to: u.to,\n status: 'applied',\n detail: labelled ? `applied in ${effective.map((t) => t.dir || '.').join(', ')}` : undefined,\n });\n } else if (failures.every((o) => o.res.toolMissing)) {\n // The toolchain (cargo, pip, go, …) isn't installed here — an environment\n // gap for the user to resolve, not an upgrade that \"failed\". Report manual.\n results.push({\n package: u.package,\n to: u.to,\n status: 'manual',\n detail: failures.map((o) => `${where(o.t)}${o.res.detail ?? 'tool missing'} — upgrade manually`).join('; '),\n });\n } else {\n results.push({\n package: u.package,\n to: u.to,\n status: 'failed',\n detail: failures.map((o) => `${where(o.t)}${o.res.detail ?? 'failed'}`).join('; '),\n });\n }\n }\n return results;\n}\n","import * 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","import { execSync } from 'node:child_process';\nimport * as fsSync from 'node:fs';\nimport * as os from 'node:os';\nimport * as readline from 'node:readline';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from '../version.js';\nimport { fetchLatestVersion } from '../utils/update-check.js';\nimport { pathExists } from '../utils/fs.js';\nimport { liveStatsDir, reapOtherVersionServers, type ReapedServer } from '../../mcp/live-stats.js';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nconst PACKAGE_NAME = '@vibgrate/cli';\n\n/**\n * Check if the CLI is running from a global install by examining where it's\n * running from. Returns the package manager if global, null if local.\n *\n * Global bins are usually symlinks (`/usr/local/bin/vg` →\n * `../lib/node_modules/@vibgrate/cli/…`), so the launch path must be\n * realpath-resolved before inspecting it — the symlink itself contains no\n * `node_modules` segment and would defeat the check.\n */\nexport function detectGlobalInstall(\n execPath: string = process.argv[1] || '',\n cwd: string = process.cwd(),\n): PackageManager | null {\n if (!execPath) return null;\n let resolved = execPath;\n try {\n resolved = fsSync.realpathSync(execPath);\n } catch {\n // Path may not exist (tests, unusual launchers) — inspect it as given.\n }\n const p = resolved.replace(/\\\\/g, '/');\n if (!p.includes('/node_modules/')) return null;\n // One-off runner caches (npx / pnpm dlx / bunx) live outside the project but\n // are not installs — nothing to update there.\n if (p.includes('/_npx/') || p.includes('/dlx-') || p.includes('/.bunx/')) return null;\n // Inside the current project's own node_modules → a local install.\n const workdir = cwd.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (workdir && (p === workdir || p.startsWith(workdir + '/'))) return null;\n if (p.includes('/pnpm/')) return 'pnpm';\n if (p.includes('/yarn/') || p.includes('/.yarn/')) return 'yarn';\n if (p.includes('/.bun/')) return 'bun';\n return 'npm';\n}\n\n/** Runs a shell command and returns trimmed stdout; used by the global-root probe. */\nexport type CommandRunner = (cmd: string) => string;\n\nconst defaultRunner: CommandRunner = (cmd) =>\n execSync(cmd, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 15_000 });\n\n/**\n * Check whether the package is installed globally under any known package\n * manager, even when the current process wasn't launched from that install\n * (e.g. `vg` run via a local dependency while a global copy also exists).\n * Probes each manager's global root and returns the first that contains the\n * package, or null when none does. Managers that aren't installed just fail\n * their probe and are skipped.\n */\nexport async function findGlobalInstall(\n pkg: string = PACKAGE_NAME,\n run: CommandRunner = defaultRunner,\n): Promise<PackageManager | null> {\n const tryRun = (cmd: string): string | null => {\n try {\n const out = run(cmd).trim().split('\\n')[0]?.trim();\n return out || null;\n } catch {\n return null;\n }\n };\n\n const probes: Array<{ pm: PackageManager; root: () => string | null }> = [\n { pm: 'npm', root: () => tryRun('npm root -g') },\n { pm: 'pnpm', root: () => tryRun('pnpm root -g') },\n {\n pm: 'yarn',\n root: () => {\n const dir = tryRun('yarn global dir');\n return dir ? path.join(dir, 'node_modules') : null;\n },\n },\n { pm: 'bun', root: () => path.join(os.homedir(), '.bun', 'install', 'global', 'node_modules') },\n ];\n\n for (const probe of probes) {\n const root = probe.root();\n if (root && (await pathExists(path.join(root, pkg)))) return probe.pm;\n }\n return null;\n}\n\nfunction getGlobalUpdateCommand(pm: PackageManager, pkg: string, version: string): string {\n const spec = `${pkg}@${version}`;\n switch (pm) {\n case 'pnpm':\n return `pnpm add -g ${spec}`;\n case 'yarn':\n return `yarn global add ${spec}`;\n case 'bun':\n return `bun add -g ${spec}`;\n case 'npm':\n default:\n return `npm install -g ${spec}`;\n }\n}\n\n/**\n * Detect which package manager is being used in the current project\n * by checking for lockfiles in the working directory.\n */\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await pathExists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await pathExists(path.join(cwd, 'bun.lockb'))) return 'bun';\n if (await pathExists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm'; // default\n}\n\n/**\n * Detect whether `cwd` is a monorepo/workspace root.\n *\n * pnpm refuses a plain `pnpm add` at a workspace root (ERR_PNPM_ADDING_TO_ROOT)\n * unless `-w`/`--workspace-root` is passed, because adding to the root touches the\n * root `package.json` rather than a package. A pnpm workspace is declared by a\n * `pnpm-workspace.yaml`; npm/yarn workspaces are declared by the `workspaces`\n * field in `package.json`. We treat any of these as a workspace root.\n */\nexport async function detectWorkspaceRoot(cwd: string): Promise<boolean> {\n if (await pathExists(path.join(cwd, 'pnpm-workspace.yaml'))) return true;\n try {\n const pkgPath = path.join(cwd, 'package.json');\n const raw = await (await import('node:fs/promises')).readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as { workspaces?: unknown };\n return pkg.workspaces != null;\n } catch {\n return false;\n }\n}\n\nexport interface InstallCommandOptions {\n /** When true and the package manager is pnpm, add the `-w` workspace-root flag. */\n workspaceRoot?: boolean;\n}\n\nexport function getInstallCommand(\n pm: PackageManager,\n pkg: string,\n version: string,\n isDev: boolean,\n opts: InstallCommandOptions = {},\n): string {\n const spec = `${pkg}@${version}`;\n // Only pnpm needs an explicit workspace-root flag; npm/yarn/bun add to the\n // root package.json without complaint.\n const ws = opts.workspaceRoot && pm === 'pnpm' ? ' -w' : '';\n switch (pm) {\n case 'pnpm':\n return isDev ? `pnpm add${ws} -D ${spec}` : `pnpm add${ws} ${spec}`;\n case 'yarn':\n return isDev ? `yarn add --dev ${spec}` : `yarn add ${spec}`;\n case 'bun':\n return isDev ? `bun add -d ${spec}` : `bun add ${spec}`;\n case 'npm':\n default:\n return isDev ? `npm install --save-dev ${spec}` : `npm install ${spec}`;\n }\n}\n\n/** How the package is declared in the project's package.json, if at all. */\nexport type LocalDependencyState = 'dev' | 'prod' | null;\n\n/**\n * Read how the package is declared in the project's package.json.\n * Returns null when there is no package.json or the package isn't declared.\n */\nexport async function getLocalDependencyState(\n cwd: string,\n pkg: string = PACKAGE_NAME,\n): Promise<LocalDependencyState> {\n try {\n const pkgPath = path.join(cwd, 'package.json');\n const raw = await (await import('node:fs/promises')).readFile(pkgPath, 'utf-8');\n const parsed = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (parsed.devDependencies?.[pkg]) return 'dev';\n if (parsed.dependencies?.[pkg]) return 'prod';\n } catch {\n // No package.json / unreadable — not a declared dependency.\n }\n return null;\n}\n\n/**\n * Ask the user to confirm updating at a workspace root, which needs `-w` and\n * writes to the root package.json. Returns false when not attached to a TTY so\n * the aggressive add never runs unattended (e.g. in CI) without an explicit flag.\n */\nasync function confirmWorkspaceRoot(pm: PackageManager): Promise<boolean> {\n if (!(process.stdin.isTTY && process.stdout.isTTY)) return false;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.yellow(`Update the ${pm} workspace root with -w? [y/N]: `), (ans) => {\n rl.close();\n const t = ans.trim().toLowerCase();\n resolve(t === 'y' || t === 'yes');\n });\n });\n}\n\nexport const updateCommand = new Command('update')\n .description('Update vibgrate to the latest version')\n .option('--check', 'Only check for updates, do not install')\n .option('--pm <manager>', 'Package manager to use (npm, pnpm, yarn, bun)')\n .option('--global', 'Update global installation')\n .option('-y, --yes', 'Skip confirmation prompts (e.g. installing at a workspace root)')\n .option('-w, --workspace-root', 'Allow updating the pnpm workspace root (implies --yes for that prompt)')\n .option('--no-reap', 'Do not signal running vg serve processes on an older version to restart')\n .action(\n async (opts: {\n check?: boolean;\n pm?: string;\n global?: boolean;\n yes?: boolean;\n workspaceRoot?: boolean;\n reap?: boolean;\n }) => {\n console.log(chalk.dim(`Current version: ${VERSION}`));\n console.log(chalk.dim('Checking npm registry...'));\n\n const latest = await fetchLatestVersion();\n\n if (!latest) {\n console.error(chalk.red('Could not reach the npm registry. Check your network connection.'));\n process.exit(1);\n }\n\n const semver = await import('semver');\n if (!semver.gt(latest, VERSION)) {\n console.log(chalk.green('✔') + ` You are on the latest version (${VERSION}).`);\n // Even on the latest binary, an assistant-spawned `vg serve` started\n // before a prior update may still be executing an OLDER build (a\n // long-lived stdio child the client never restarted). Retire those so\n // the client respawns them on this version — the exact \"stale spawned\n // server\" case that makes fixes look absent until an editor restart.\n if (opts.reap !== false) reapAndReport(process.cwd(), VERSION);\n return;\n }\n\n console.log(chalk.yellow(`Update available: ${VERSION} → ${latest}`));\n\n if (opts.check) {\n console.log(chalk.dim('Run \"vg update\" to install.'));\n return;\n }\n\n const cwd = process.cwd();\n\n // Decide the update target. A global copy is updated in place — the\n // project's package.json is only touched when the package is actually\n // declared there (or when there is no global install to update).\n const runtimeGlobalPm = detectGlobalInstall();\n let globalPm: PackageManager | null = runtimeGlobalPm;\n let isGlobal = Boolean(opts.global) || runtimeGlobalPm !== null;\n let localState: LocalDependencyState = null;\n\n if (!isGlobal) {\n localState = await getLocalDependencyState(cwd);\n if (localState === null) {\n // Not declared in this project. If a global install exists, update\n // that instead of adding the CLI to this project's package.json.\n globalPm = await findGlobalInstall();\n if (globalPm) {\n isGlobal = true;\n console.log(\n chalk.dim(`Found a global ${globalPm} installation of ${PACKAGE_NAME} — updating it instead of this project.`),\n );\n }\n }\n }\n\n const pm: PackageManager = (opts.pm as PackageManager) || globalPm || (await detectPackageManager(cwd));\n\n let cmd: string;\n if (isGlobal) {\n cmd = getGlobalUpdateCommand(pm, PACKAGE_NAME, latest);\n console.log(chalk.dim(`Updating global installation with ${pm}: ${cmd}`));\n } else {\n // A CLI belongs in devDependencies: install as a dev dependency unless\n // the project has explicitly declared it under `dependencies`.\n const isDev = localState !== 'prod';\n\n // pnpm refuses `pnpm add` at a workspace root without -w. Detect that up\n // front so we can offer to run the workspace-root-aware command instead of\n // failing with ERR_PNPM_ADDING_TO_ROOT.\n let workspaceRoot = false;\n if (pm === 'pnpm' && (await detectWorkspaceRoot(cwd))) {\n console.log(\n chalk.yellow('Detected a pnpm workspace root.') +\n chalk.dim(' Installing here needs the -w flag and updates the root package.json.'),\n );\n const proceed = opts.yes || opts.workspaceRoot || (await confirmWorkspaceRoot(pm));\n if (!proceed) {\n const rootCmd = getInstallCommand(pm, PACKAGE_NAME, latest, isDev, { workspaceRoot: true });\n console.log(chalk.dim(`Skipped. To update the workspace root, run: ${rootCmd}`));\n console.log(chalk.dim('or re-run \"vg update --yes\" (or --workspace-root) to let vg do it.'));\n return;\n }\n workspaceRoot = true;\n }\n\n cmd = getInstallCommand(pm, PACKAGE_NAME, latest, isDev, { workspaceRoot });\n console.log(chalk.dim(`Using ${pm}: ${cmd}`));\n }\n\n try {\n execSync(cmd, { cwd, stdio: 'inherit' });\n console.log(chalk.green('✔') + ` Updated to ${PACKAGE_NAME}@${latest}`);\n } catch {\n console.error(chalk.red(`Update failed. Run manually: ${cmd}`));\n process.exit(1);\n }\n\n // Retire any running vg serve on the OLD build so the client respawns it\n // on the one just installed. Without this the update lands on disk but a\n // long-lived assistant-spawned server keeps answering from the old code.\n if (opts.reap !== false) reapAndReport(cwd, latest);\n },\n );\n\n/**\n * Signal every running vg serve in `cwd`'s repo that is NOT on `keepVersion`,\n * and tell the user what happened. Best-effort and never throws — a reap\n * problem must not fail an otherwise-successful update.\n */\nfunction reapAndReport(cwd: string, keepVersion: string): void {\n let reaped: ReapedServer[] = [];\n try {\n reaped = reapOtherVersionServers(liveStatsDir(cwd), keepVersion);\n } catch {\n return; // registry unreadable / no permission to signal — nothing to report\n }\n if (reaped.length === 0) return;\n const list = reaped.map((r) => `pid ${r.pid} (v${r.version})`).join(', ');\n console.log(\n chalk.dim(\n `Signalled ${reaped.length} running vg serve process${reaped.length === 1 ? '' : 'es'} on an older version to restart: ${list}.`,\n ),\n );\n console.log(\n chalk.dim(\n 'Your editor/agent will respawn them on the new version. Restart your AI session if a server does not reconnect.',\n ),\n );\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n runCoreScan,\n projectTypeToVulnEcosystem,\n detectVcs,\n computeRepoFingerprint,\n resolveRepositoryName,\n parseDsn,\n type ScanOptions,\n type ScanArtifact,\n type ProjectType,\n type VulnSeverity,\n} from '../../core-open/index.js';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { scanStaleness } from '../utils/scan-freshness.js';\nimport { loadAdvancedScanHook } from '../advanced-hook.js';\nimport { VERSION } from '../version.js';\nimport { resolveDsn } from '../credentials.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { dashHostForIngestHost } from '../regions.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\nimport * as readline from 'node:readline';\nimport { analyzeTree, type SourceEcosystem } from '../planning/usage.js';\nimport { requestFixPlan, parseFixPlanResponse } from '../utils/fix-plan.js';\nimport { renderText, renderMarkdown } from '../planning/render.js';\nimport { dedupePlans } from '../planning/dedupe.js';\nimport { estimateDriftScore } from '../planning/expected-drift.js';\nimport { applyPlan, type NpmPackageManager, type WorkspaceTarget } from '../planning/apply.js';\nimport { detectWorkspaceRoot } from './update.js';\nimport type { FixCandidateInput, FixPlanRequest, FixPlanResponse, PlanTier, PlannedUpgrade, UpgradePlan } from '../planning/types.js';\n\nconst SEVERITY_RANK: Record<VulnSeverity, number> = { unknown: 0, low: 1, moderate: 2, high: 3, critical: 4 };\n\n/** Map a scanned project type to the ecosystem id sent to the planner (all ecosystems, not just npm). */\nfunction ecosystemId(type: ProjectType): string {\n return projectTypeToVulnEcosystem(type) ?? type;\n}\n\n/** Which ecosystems we can cheaply read source for, to gather usage + contracts. */\nfunction sourceEcosystem(ecosystem: string): SourceEcosystem {\n if (ecosystem === 'npm') return 'npm';\n if (ecosystem === 'pypi') return 'pypi';\n return 'unknown';\n}\n\ninterface RawCandidate {\n package: string;\n ecosystem: string;\n source: SourceEcosystem;\n from: string | null;\n to: string | null;\n majorsBehind: number | null;\n section?: string;\n}\n\n/** Collect deduped, drifted dependencies across every ecosystem in the scan artifact. */\nfunction collectCandidates(artifact: ScanArtifact): RawCandidate[] {\n const seen = new Set<string>();\n const out: RawCandidate[] = [];\n for (const project of artifact.projects ?? []) {\n const ecosystem = ecosystemId(project.type);\n for (const dep of project.dependencies ?? []) {\n const key = `${ecosystem}\\0${dep.package}`;\n if (seen.has(key)) continue;\n if (!dep.latestStable || dep.latestStable === dep.resolvedVersion) continue;\n if (dep.drift === 'current' || dep.drift === 'unknown') continue;\n seen.add(key);\n out.push({\n package: dep.package,\n ecosystem,\n source: sourceEcosystem(ecosystem),\n from: dep.resolvedVersion,\n to: dep.latestStable,\n majorsBehind: dep.majorsBehind,\n section: dep.section,\n });\n }\n }\n out.sort((a, b) => a.ecosystem.localeCompare(b.ecosystem) || a.package.localeCompare(b.package));\n return out;\n}\n\n/**\n * Runs a drift scan for `vg fix` when no usable prior scan exists. Injectable so\n * tests can exercise the auto-scan decision without a network round-trip; the\n * default runs the real core scan WITHOUT the code map (drift is all `fix`\n * needs), writing JSON quietly to a scratch file so nothing lands on stdout.\n */\nexport type FixScanner = (rootDir: string) => Promise<ScanArtifact>;\n\nconst defaultFixScanner: FixScanner = async (rootDir) => {\n const scratch = path.join(os.tmpdir(), `vg-fix-scan-${process.pid}.json`);\n const scanOpts: ScanOptions = { vibgrateVersion: VERSION, format: 'json', out: scratch, quiet: true, concurrency: 8 };\n const advanced = await loadAdvancedScanHook();\n return runCoreScan(rootDir, scanOpts, advanced);\n};\n\n/**\n * Load the scan artifact `vg fix` plans against, re-scanning when there is no\n * usable prior scan. A scan is re-run when the artifact is **missing** OR when it\n * is **out of date** with the working tree — a manifest edit or a lockfile bump\n * (e.g. from a previous `vg fix`) since the scan means the on-disk drift no\n * longer reflects the repository, so planning against it would upgrade the wrong\n * versions. Freshness is scoped to dependency manifests/lockfiles and fails open\n * (see {@link scanStaleness}).\n */\nexport async function loadArtifact(\n rootDir: string,\n inFile: string,\n scan: FixScanner = defaultFixScanner,\n): Promise<ScanArtifact> {\n const artifactPath = path.isAbsolute(inFile) ? inFile : path.join(rootDir, inFile);\n if (await pathExists(artifactPath)) {\n const staleness = scanStaleness(rootDir, artifactPath);\n if (!staleness.stale) {\n return readJsonFile<ScanArtifact>(artifactPath);\n }\n console.error(\n chalk.dim(\n `Scan is out of date (${staleness.newestChanged ?? 'a dependency manifest'} changed since the last scan) — re-running a drift scan first (code map skipped)…`,\n ),\n );\n } else {\n console.error(chalk.dim('No scan found — running a drift scan first (code map skipped)…'));\n }\n return scan(rootDir);\n}\n\n/** Best-effort, non-sensitive repository identity for dataset association + plan caching. */\nasync function repositoryIdentity(rootDir: string, override?: string): Promise<{ name?: string; vcsSha?: string }> {\n try {\n const vcs = await detectVcs(rootDir);\n const fingerprint = await computeRepoFingerprint(rootDir, vcs);\n const name = override?.trim() || (await resolveRepositoryName(rootDir));\n return { name, vcsSha: fingerprint.vcsSha };\n } catch {\n return { name: override?.trim() || undefined };\n }\n}\n\nexport const fixCommand = new Command('fix')\n .description('Get ranked, risk-tiered upgrade plans from the hosted planner and optionally apply them (prompts before changing files; --yes applies non-interactively, --dry-run previews, --no-apply only prints). Requires login/DSN.')\n .argument('[path]', 'Path to analyse', '.')\n .option('--in <file>', 'Scan artifact to read', '.vibgrate/scan_result.json')\n .option('--format <format>', 'Output format (text|json|md)', 'text')\n .option('--dsn <dsn>', 'DSN token (or use VIBGRATE_DSN env / \"vg login\")')\n .option('--region <region>', 'Override data residency region (us, eu)')\n .option('--repository-name <name>', 'Override the repository name recorded for this plan')\n .option('--plan <tier>', 'Apply a specific plan non-interactively (safe|balanced|aggressive)')\n .option('--yes', 'Apply the recommended plan without prompting')\n .option('--dry-run', 'Show what would change without applying')\n .option('--no-apply', 'Only print the plans; never modify the project')\n .option('--fail-on-vulns <severity>', 'Exit non-zero if the recommended plan leaves an advisory at/above this severity unresolved (low|moderate|high|critical)')\n .action(async (targetPath: string, opts: {\n in: string;\n format: string;\n dsn?: string;\n region?: string;\n repositoryName?: string;\n plan?: string;\n yes?: boolean;\n dryRun?: boolean;\n apply?: boolean; // commander maps --no-apply → apply === false\n failOnVulns?: string;\n }) => {\n const rootDir = path.resolve(targetPath);\n if (!(await pathExists(rootDir))) {\n console.error(chalk.red(`Path does not exist: ${rootDir}`));\n process.exit(1);\n }\n\n const failOn = opts.failOnVulns as VulnSeverity | undefined;\n if (failOn && !(failOn in SEVERITY_RANK)) {\n console.error(chalk.red(`Invalid --fail-on-vulns value '${opts.failOnVulns}'. Use one of: low, moderate, high, critical.`));\n process.exit(1);\n }\n\n // `vg fix` is a paid, hosted capability — it needs a DSN. No local planning\n // fallback exists (the planning intelligence is server-side by design).\n const dsn = resolveDsn(opts.dsn);\n if (!dsn) {\n const cli = resolveCliInvocation();\n console.error(chalk.red('vg fix needs a Vibgrate login.'));\n console.error(\n chalk.dim(\n `Run \"${cli} login\" (or set VIBGRATE_DSN / pass --dsn) to analyse upgrades with the hosted planner. ` +\n 'See https://vibgrate.com/cli for details.',\n ),\n );\n process.exit(1);\n }\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format. Re-run \"vg login\" or check VIBGRATE_DSN.'));\n process.exit(1);\n }\n\n let host: string;\n try {\n host = opts.region ? resolveIngestHost(opts.region) : parsed.host;\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n let artifact: ScanArtifact;\n try {\n artifact = await loadArtifact(rootDir, opts.in);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const raw = collectCandidates(artifact);\n\n // Gather usage + contracts from local source (never leaves the machine except\n // as the aggregate counts/symbols the planner needs). One bounded walk.\n const usage = analyzeTree(\n rootDir,\n raw.filter((c) => c.source !== 'unknown').map((c) => ({ name: c.package, ecosystem: c.source })),\n );\n\n const candidates: FixCandidateInput[] = raw.map((c) => {\n const u = usage.get(c.package);\n return {\n package: c.package,\n ecosystem: c.ecosystem,\n currentVersion: c.from,\n latestVersion: c.to,\n majorsBehind: c.majorsBehind,\n section: c.section,\n ...(u && (u.importSites > 0 || u.filesTouched > 0)\n ? { usage: { importSites: u.importSites, filesTouched: u.filesTouched } }\n : {}),\n ...(u && u.contracts.length ? { contracts: u.contracts } : {}),\n };\n });\n\n const request: FixPlanRequest = {\n cliVersion: VERSION,\n repository: await repositoryIdentity(rootDir, opts.repositoryName),\n candidates,\n };\n\n let response: FixPlanResponse;\n try {\n const { response: httpResponse } = await requestFixPlan({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n request,\n timestamp: String(Date.now()),\n });\n if (!httpResponse.ok) {\n handleHttpError(httpResponse, parsed.workspaceId, host);\n return; // handleHttpError exits, but keep the type-checker happy.\n }\n response = await parseFixPlanResponse(httpResponse);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Could not reach the upgrade planner: ${msg}`));\n console.error(chalk.dim('Check your connection and try again, or see https://vibgrate.com/help.'));\n process.exit(1);\n }\n\n if (response.status === 'error') {\n console.error(chalk.red(response.error ?? 'The planner returned an error.'));\n if (response.requestId) console.error(chalk.dim(` (ref ${response.requestId})`));\n process.exit(1);\n }\n\n // Collapse duplicate plans onto the lowest-risk tier before anything is\n // rendered or selected: a tier whose upgrade set is identical to a\n // lower-risk tier's adds no real choice. Requests for a collapsed tier\n // (--plan, the server's recommendation) resolve via the alias map.\n const { plans: dedupedPlans, canonicalTier } = dedupePlans(response.plans);\n response.plans = dedupedPlans;\n response.recommended = canonicalTier.get(response.recommended) ?? response.recommended;\n\n // Augment each plan with an estimated post-upgrade DriftScore (client-side).\n const currentDrift = artifact.drift?.score;\n if (typeof currentDrift === 'number') {\n response.currentDriftScore = currentDrift;\n for (const plan of response.plans) {\n const upgraded = new Set(plan.upgrades.map((u) => u.package));\n const expected = estimateDriftScore(artifact, upgraded);\n plan.expectedDriftScore = expected;\n plan.driftDelta = expected - currentDrift;\n }\n }\n\n emit(response, opts.format);\n\n // Apply flow (text mode only; --no-apply / json / md are report-only).\n if (opts.format === 'text' && opts.apply !== false) {\n await runApplyFlow(rootDir, artifact, response, opts, canonicalTier);\n }\n\n if (failOn) {\n // Advisories the *recommended* plan does not remediate = the estate's open\n // advisories minus what the recommended plan fixes, evaluated by severity.\n const recommended = response.plans.find((p) => p.tier === response.recommended);\n const threshold = SEVERITY_RANK[failOn];\n let stillOpen = 0;\n for (const sev of Object.keys(SEVERITY_RANK) as VulnSeverity[]) {\n if (SEVERITY_RANK[sev] < threshold) continue;\n const open = response.unresolved.bySeverity[sev] ?? 0;\n // Anything the recommended plan itself does not fix also counts as open.\n // Measured against the most-fixing plan (not the 'aggressive' tier by\n // name — that tier may have been collapsed as a duplicate).\n const maxFixable = Math.max(0, ...response.plans.map((p) => p.fixes.bySeverity[sev] ?? 0));\n const notFixedByRecommended = maxFixable - (recommended?.fixes.bySeverity[sev] ?? 0);\n stillOpen += open + Math.max(0, notFixedByRecommended);\n }\n if (stillOpen > 0) {\n console.error(\n chalk.red(`\\nFailing: the recommended plan leaves ${stillOpen} advisory(ies) at/above ${failOn} unresolved.`),\n );\n process.exit(2);\n }\n }\n });\n\n/** Turn a non-2xx planner response into an actionable, non-leaky error and exit. */\nfunction handleHttpError(response: Response, workspaceId: string, host: string): never {\n const upgradeUrl = `https://${dashHostForIngestHost(host)}/${workspaceId}`;\n if (response.status === 401 || response.status === 403) {\n console.error(chalk.red('Not authorised. Your DSN may be invalid or lack access to this workspace.'));\n console.error(chalk.dim('Re-run \"vg login\" or check VIBGRATE_DSN.'));\n process.exit(1);\n }\n if (response.status === 402) {\n console.error(chalk.red('vg fix is a paid capability that is not enabled on your current plan.'));\n console.error(chalk.dim(`Upgrade to enable the hosted upgrade planner: ${upgradeUrl}`));\n process.exit(1);\n }\n if (response.status === 429) {\n console.error(chalk.red('Rate limited by the planner. Wait a moment and try again.'));\n process.exit(1);\n }\n console.error(chalk.red(`The planner returned HTTP ${response.status}.`));\n console.error(chalk.dim('Try again shortly, or see https://vibgrate.com/help.'));\n process.exit(1);\n}\n\nfunction emit(report: FixPlanResponse, format: string): void {\n switch (format) {\n case 'json':\n console.log(JSON.stringify(report, null, 2));\n break;\n case 'md':\n console.log(renderMarkdown(report));\n break;\n case 'text':\n default:\n console.log(renderText(report));\n break;\n }\n}\n\n/** Normalise a project's scan path to a directory relative to the repo root. */\nfunction relProjectDir(rootDir: string, projectPath: string): string {\n const rel = path.isAbsolute(projectPath) ? path.relative(rootDir, projectPath) : projectPath;\n return rel === '' ? '.' : rel;\n}\n\n/**\n * Build a resolver mapping each upgrade to the workspace manifest(s) that\n * actually declare it, so the pin command edits the right `package.json` (and\n * a monorepo dep never lands in the root manifest by accident).\n *\n * Ownership is keyed by `${ecosystem}\\0${package}` — identical to how\n * {@link collectCandidates} keys candidates — but drawn from *every* project in\n * the artifact, not deduped, so a dependency declared in several workspace\n * packages resolves to all of them. Dirs are sorted for deterministic output.\n * A dependency with no located owner falls back to the root manifest (with\n * `-w` when the root is a pnpm workspace, so the command no longer crashes).\n */\nexport async function buildTargetResolver(\n rootDir: string,\n artifact: ScanArtifact,\n): Promise<(upgrade: PlannedUpgrade) => WorkspaceTarget[]> {\n const rootIsWorkspace = await detectWorkspaceRoot(rootDir);\n const owners = new Map<string, Set<string>>();\n for (const project of artifact.projects ?? []) {\n const ecosystem = ecosystemId(project.type);\n const dir = relProjectDir(rootDir, project.path);\n for (const dep of project.dependencies ?? []) {\n const key = `${ecosystem}\\0${dep.package}`;\n (owners.get(key) ?? owners.set(key, new Set()).get(key)!).add(dir);\n }\n }\n const rootFallback: WorkspaceTarget[] = [{ dir: '.', isWorkspaceRoot: rootIsWorkspace }];\n return (upgrade) => {\n const dirs = owners.get(`${upgrade.ecosystem}\\0${upgrade.package}`);\n if (!dirs || dirs.size === 0) return rootFallback;\n return [...dirs]\n .sort((a, b) => a.localeCompare(b))\n .map((dir) => ({ dir, isWorkspaceRoot: dir === '.' && rootIsWorkspace }));\n };\n}\n\n/** The npm-family package manager to drive npm upgrades, from the scan. */\nfunction npmPackageManager(artifact: ScanArtifact): NpmPackageManager {\n for (const p of artifact.projects ?? []) {\n if ((p.type === 'node' || p.type === 'typescript') && p.packageManager) {\n const pm = p.packageManager;\n if (pm === 'pnpm' || pm === 'yarn' || pm === 'bun' || pm === 'npm') return pm;\n }\n }\n return 'npm';\n}\n\n/** Interactive plan picker (TTY). Resolves to the chosen tier, or null to cancel. */\nfunction promptPlanSelection(response: FixPlanResponse): Promise<PlanTier | null> {\n const plans = response.plans.filter((p) => p.upgrades.length > 0);\n console.log(chalk.bold('\\nSelect a plan to apply:'));\n plans.forEach((p, i) => {\n const rec = p.tier === response.recommended ? chalk.green(' (recommended)') : '';\n const drift =\n typeof p.expectedDriftScore === 'number' && typeof response.currentDriftScore === 'number'\n ? ` · DriftScore ${response.currentDriftScore}→${p.expectedDriftScore}`\n : '';\n console.log(` ${i + 1}) ${chalk.bold(p.label)}${rec} risk ${p.riskScore}/100 · ${p.upgrades.length} upgrade(s)${drift}`);\n });\n const defaultIdx = plans.findIndex((p) => p.tier === response.recommended);\n const def = defaultIdx >= 0 ? defaultIdx + 1 : 1;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(`Plan [1-${plans.length}, default ${def}, q to cancel]: `, (ans) => {\n rl.close();\n const t = ans.trim().toLowerCase();\n if (t === 'q' || t === 'quit') return resolve(null);\n const n = t === '' ? def : Number.parseInt(t, 10);\n if (!Number.isInteger(n) || n < 1 || n > plans.length) return resolve(null);\n resolve(plans[n - 1].tier);\n });\n });\n}\n\n/** Choose a plan (flags → single-plan → interactive → non-interactive default), apply it, and report. */\nasync function runApplyFlow(\n rootDir: string,\n artifact: ScanArtifact,\n response: FixPlanResponse,\n opts: { plan?: string; yes?: boolean; dryRun?: boolean },\n canonicalTier?: Map<PlanTier, PlanTier>,\n): Promise<void> {\n const nonEmpty = response.plans.filter((p) => p.upgrades.length > 0);\n if (nonEmpty.length === 0) {\n console.log(chalk.green('\\n✔ Nothing to upgrade — every tracked dependency is current.'));\n return;\n }\n\n let chosen: UpgradePlan | undefined;\n if (opts.plan) {\n // A tier collapsed as a duplicate resolves to the surviving lower-risk plan.\n const tier = canonicalTier?.get(opts.plan as PlanTier) ?? opts.plan;\n chosen = response.plans.find((p) => p.tier === tier);\n if (!chosen) {\n console.error(chalk.red(`Unknown plan '${opts.plan}'. Use safe, balanced, or aggressive.`));\n process.exit(1);\n }\n } else if (nonEmpty.length === 1) {\n chosen = nonEmpty[0];\n } else if (opts.yes) {\n chosen = response.plans.find((p) => p.tier === response.recommended) ?? nonEmpty[0];\n } else if (process.stdin.isTTY && process.stdout.isTTY) {\n const tier = await promptPlanSelection(response);\n if (!tier) {\n console.log(chalk.dim('No plan applied.'));\n return;\n }\n chosen = response.plans.find((p) => p.tier === tier);\n } else {\n console.log(chalk.dim('\\nMultiple plans available — re-run with --plan <tier> or --yes to apply, or --dry-run to preview.'));\n return;\n }\n if (!chosen || chosen.upgrades.length === 0) {\n console.log(chalk.dim('Selected plan has no upgrades.'));\n return;\n }\n\n const pm = npmPackageManager(artifact);\n const resolveTargets = await buildTargetResolver(rootDir, artifact);\n const results = applyPlan(rootDir, chosen.upgrades, { dryRun: opts.dryRun, packageManager: pm, resolveTargets });\n\n if (opts.dryRun) {\n console.log(chalk.bold(`\\nDry run — ${chosen.label} plan (${chosen.upgrades.length} upgrade(s)):`));\n for (const r of results) {\n if (r.status === 'manual') console.log(chalk.yellow(` ⚠ ${r.package}: ${r.detail}`));\n else console.log(chalk.dim(` ${r.package}: ${r.detail}`));\n }\n if (typeof chosen.expectedDriftScore === 'number') {\n console.log(chalk.dim(`Expected DriftScore after apply: ~${chosen.expectedDriftScore} (was ${response.currentDriftScore ?? '?'}).`));\n }\n return;\n }\n\n const applied = results.filter((r) => r.status === 'applied');\n const failed = results.filter((r) => r.status === 'failed');\n const manual = results.filter((r) => r.status === 'manual');\n\n console.log(chalk.bold(`\\nApplied the ${chosen.label} plan:`));\n console.log(\n chalk.green(` ✔ ${applied.length} upgraded`) +\n (failed.length ? chalk.red(` ✖ ${failed.length} failed`) : '') +\n (manual.length ? chalk.yellow(` ⚠ ${manual.length} need manual work`) : ''),\n );\n for (const r of failed) console.log(chalk.red(` ✖ ${r.package} → ${r.to}: ${r.detail ?? 'failed'}`));\n for (const r of manual) console.log(chalk.yellow(` ⚠ ${r.package} → ${r.to}: ${r.detail}`));\n if (typeof chosen.expectedDriftScore === 'number' && typeof response.currentDriftScore === 'number') {\n const delta = chosen.expectedDriftScore - response.currentDriftScore;\n console.log(\n ` Expected DriftScore: ${response.currentDriftScore} → ~${chosen.expectedDriftScore} (${delta <= 0 ? '' : '+'}${delta}). ` +\n 'Re-run `vg` to confirm the actual score.',\n );\n }\n if (failed.length) process.exitCode = 2;\n}\n","import chalk from 'chalk';\nimport type { ScanArtifact, ExtendedScanResults, InventoryItem, ServiceDependencyItem, ArchitectureResult } from '../types.js';\nimport { VERSION } from '../version.js';\nimport { driftBar } from '../../core-open/ui/bar.js';\nimport { titleBox } from '../../core-open/ui/box.js';\n\nexport function formatText(artifact: ScanArtifact): string {\n const lines: string[] = [];\n\n // Brand colours from docs/design logo bundle\n const teal = chalk.hex('#3FB0A4');\n const mint = chalk.hex('#4FE3C1');\n\n lines.push('');\n lines.push(' ' + teal('╭──────╮') + mint('➜'));\n lines.push(' ' + chalk.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + chalk.dim('├') + ' ' + chalk.bold.white('vibgrate'));\n lines.push(' ' + chalk.dim('┤') + teal('│') + ' ' + chalk.dim('▁▁') + ' ' + teal('│') + chalk.dim('├') + ' ' + chalk.dim(`Code Intelligence Engine v${VERSION}`));\n lines.push(' ' + teal('╰──────╯'));\n lines.push('');\n lines.push(...titleBox('Vibgrate Drift Report', teal));\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 // Lower is better: a positive delta means drift increased (worse → red),\n // a negative delta means drift decreased (improved → green).\n const deltaStr = artifact.delta > 0\n ? chalk.red(`+${artifact.delta}`)\n : artifact.delta < 0\n ? chalk.green(`${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 — drift score is lower-is-better (0 = no drift).\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 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 return lines.join('\\n');\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 // 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 scores)`,\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","import type { ScanArtifact } from '../types.js';\n\n/** Generate a Markdown report from scan artifact */\nexport function formatMarkdown(artifact: ScanArtifact): string {\n const lines: string[] = [];\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 _(lower is better; 0 = no drift)_ |`);\n lines.push(`| **Risk Level** | ${artifact.drift.riskLevel.toUpperCase()} |`);\n lines.push(`| **Projects** | ${artifact.projects.length} |`);\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 // Lower is better: a rise (positive delta) means drift worsened; a fall means it improved.\n const dir = artifact.delta > 0 ? '📈' : artifact.delta < 0 ? '📉' : '➡️';\n const trend = artifact.delta > 0 ? ' _(worsened)_' : artifact.delta < 0 ? ' _(improved)_' : '';\n lines.push(`## Drift Delta: ${dir} ${artifact.delta > 0 ? '+' : ''}${artifact.delta} vs baseline${trend}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { formatText } from '../formatters/text.js';\nimport { formatMarkdown } from '../formatters/markdown.js';\nimport type { ScanArtifact } from '../types.js';\n\nexport const reportCommand = new Command('report')\n .description('Generate a drift report from a scan artifact')\n .option('--in <file>', 'Input artifact file', '.vibgrate/scan_result.json')\n .option('--format <format>', 'Output format (md|text|json)', 'text')\n .action(async (opts: { in: string; format: string }) => {\n const artifactPath = path.resolve(opts.in);\n\n if (!(await pathExists(artifactPath))) {\n console.error(chalk.red(`Artifact not found: ${artifactPath}`));\n console.error(chalk.dim('Run \"vibgrate scan\" first to generate a scan artifact.'));\n process.exit(1);\n }\n\n const artifact = await readJsonFile<ScanArtifact>(artifactPath);\n\n switch (opts.format) {\n case 'md':\n console.log(formatMarkdown(artifact));\n break;\n case 'json':\n console.log(JSON.stringify(artifact, null, 2));\n break;\n case 'text':\n default:\n console.log(formatText(artifact));\n break;\n }\n });\n","import { spawn } from 'node:child_process';\n\n/**\n * Best-effort open of a URL in the user's default browser. Returns true if a\n * launcher was spawned (not a guarantee the browser actually opened). Callers\n * should always print the URL too, in case this fails or we're headless.\n */\nexport function openUrl(url: string): boolean {\n const platform = process.platform;\n let command: string;\n let args: string[];\n\n if (platform === 'darwin') {\n command = 'open';\n args = [url];\n } else if (platform === 'win32') {\n command = 'cmd';\n // `start` needs an empty title arg first when the URL contains special chars.\n args = ['/c', 'start', '', url];\n } else {\n command = 'xdg-open';\n args = [url];\n }\n\n try {\n const child = spawn(command, args, { stdio: 'ignore', detached: true });\n child.on('error', () => {\n /* swallow — caller falls back to printing the URL */\n });\n child.unref();\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { availableRegionIds } from '../regions.js';\nimport { resolveIngestHost, createWorkspaceDsn } from './dsn.js';\nimport { writeStoredCredentials, credentialsPath, gitignoreEntryForCredentials } from '../credentials.js';\nimport type { StoredCredentials } from '../credentials.js';\nimport { findGitRoot, ensureGitignored } from '../utils/gitignore.js';\nimport { resolveCliInvocation } from '../../util/cli-invocation.js';\nimport * as path from 'node:path';\nimport { openUrl } from '../utils/open-url.js';\n\ninterface StartResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface TokenResponse {\n status:\n | 'authorization_pending'\n | 'complete'\n | 'access_denied'\n | 'expired'\n | 'invalid'\n | 'error';\n dsn?: string;\n keyId?: string;\n workspaceId?: string;\n ingestHost?: string;\n error?: string;\n}\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** True when `file` resolves to a path inside the `dir` tree. */\nfunction isInside(dir: string, file: string): boolean {\n const rel = path.relative(dir, file);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n}\n\nexport const loginCommand = new Command('login')\n .description('Authenticate the CLI with your Vibgrate workspace via the browser')\n .option('--ingest <url>', 'Ingest API URL (overrides --region)')\n .option('--region <region>', `Data residency region (${availableRegionIds().join(', ')})`, 'us')\n .option('--no-browser', 'Do not attempt to open a browser automatically')\n .option(\n '--local',\n 'Store credentials in this project (.vibgrate/credentials.json) instead of ~/.vibgrate',\n )\n .action(async (opts: { ingest?: string; region: string; browser: boolean; local?: boolean }) => {\n let ingestHost: string;\n try {\n ingestHost = resolveIngestHost(opts.region, opts.ingest);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const base = `https://${ingestHost}/v1/auth/device`;\n\n // 1. Start the device authorization request.\n let start: StartResponse;\n try {\n const res = await fetch(`${base}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: '{}',\n });\n if (!res.ok) {\n console.error(chalk.red(`Failed to start login (HTTP ${res.status}).`));\n process.exit(1);\n }\n start = (await res.json()) as StartResponse;\n } catch (e: unknown) {\n console.error(chalk.red(`Could not reach ${ingestHost}: ${e instanceof Error ? e.message : String(e)}`));\n process.exit(1);\n }\n\n // 2. Prompt the user to approve in the browser.\n console.log('');\n console.log('To finish signing in, open this URL and approve the request:');\n console.log('');\n console.log(' ' + chalk.cyan(start.verificationUri));\n console.log('');\n console.log(' Your code: ' + chalk.bold(start.userCode));\n console.log('');\n\n if (opts.browser) {\n const opened = openUrl(start.verificationUriComplete);\n if (opened) {\n console.log(chalk.dim('Opening your browser… (if it does not open, use the URL above)'));\n }\n }\n console.log(chalk.dim('Waiting for approval…'));\n\n // 3. Poll for completion.\n const intervalMs = Math.max(2, start.interval || 5) * 1000;\n const deadline = Date.now() + (start.expiresIn || 900) * 1000;\n\n while (Date.now() < deadline) {\n await delay(intervalMs);\n let token: TokenResponse;\n try {\n const res = await fetch(`${base}/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify({ deviceCode: start.deviceCode }),\n });\n token = (await res.json()) as TokenResponse;\n } catch {\n // Transient network error — keep polling until the deadline.\n continue;\n }\n\n if (token.status === 'authorization_pending') continue;\n\n if (token.status === 'complete') {\n // Resolve the DSN. An existing account comes back with one from the\n // device flow; a brand-new account has no workspace yet, so we\n // provision one automatically in the user's region rather than making\n // the user run \"dsn create\" by hand. Login itself already succeeded —\n // only the workspace setup can still fail here.\n let creds: StoredCredentials;\n if (token.dsn) {\n creds = {\n dsn: token.dsn,\n workspaceId: token.workspaceId,\n keyId: token.keyId,\n ingestHost: token.ingestHost ?? ingestHost,\n savedAt: new Date().toISOString(),\n };\n } else {\n console.log(chalk.dim('Setting up your workspace…'));\n try {\n const provisioned = await createWorkspaceDsn({\n region: opts.region,\n ingest: opts.ingest,\n });\n creds = {\n dsn: provisioned.dsn,\n workspaceId: provisioned.workspaceId,\n keyId: provisioned.keyId,\n ingestHost: provisioned.ingestHost,\n savedAt: new Date().toISOString(),\n };\n } catch (e: unknown) {\n console.error(\n chalk.red('✖ Signed in, but workspace setup failed: ') +\n (e instanceof Error ? e.message : String(e)),\n );\n console.error(\n chalk.dim(' Finish setup with \"vibgrate dsn create --workspace new\".'),\n );\n process.exit(1);\n }\n }\n\n const storeOpts = { local: opts.local === true };\n writeStoredCredentials(creds, storeOpts);\n const credsFile = credentialsPath(storeOpts);\n console.log('');\n console.log(chalk.green('✔') + ' Logged in.');\n if (creds.workspaceId) {\n console.log(' Workspace: ' + chalk.bold(creds.workspaceId));\n }\n console.log(chalk.dim(` Credentials saved to ${credsFile}`));\n\n // Defense in depth (GUARDRAILS §1.1): the DSN we just stored is a\n // credential and must never be committed. Only touch .gitignore when the\n // credentials file actually lives inside the repo (the project-local\n // store) — a home-directory store is already outside version control, so\n // there is nothing to ignore. This is best-effort: never fail an\n // otherwise-successful login over .gitignore housekeeping.\n try {\n const root = findGitRoot();\n if (root && isInside(root, credsFile)) {\n const res = ensureGitignored(gitignoreEntryForCredentials(root, credsFile), root);\n if (res.status === 'created') {\n console.log(chalk.dim(` Created .gitignore and ignored ${res.entry}`));\n } else if (res.status === 'added') {\n console.log(chalk.dim(` Added ${res.entry} to .gitignore`));\n }\n }\n } catch {\n /* non-fatal */\n }\n\n console.log(chalk.dim(` You can now run \"${resolveCliInvocation()} scan --push\".`));\n return;\n }\n\n if (token.status === 'access_denied') {\n console.error(chalk.red('✖ Login was denied in the browser.'));\n process.exit(1);\n }\n if (token.status === 'expired' || token.status === 'invalid') {\n console.error(chalk.red('✖ Login request expired. Run \"vibgrate login\" again.'));\n process.exit(1);\n }\n if (token.status === 'error') {\n console.error(chalk.red(`✖ ${token.error ?? 'Login failed.'}`));\n process.exit(1);\n }\n }\n\n console.error(chalk.red('✖ Timed out waiting for approval. Run \"vibgrate login\" again.'));\n process.exit(1);\n });\n","/**\n * Shell-aware hints for the CLI.\n *\n * When we tell a user how to unset an environment variable, the syntax depends\n * on their shell — `unset` (POSIX sh/bash/zsh), `set -e` (fish),\n * `unsetenv` (csh/tcsh), `Remove-Item Env:` (PowerShell), `set VAR=` (cmd.exe).\n * Printing one hardcoded form is wrong for everyone else, so we pick the command\n * that matches the environment we can actually detect.\n */\n\nexport interface ShellEnv {\n /** Defaults to `process.platform`. */\n platform?: NodeJS.Platform;\n /** Defaults to `process.env.SHELL` (the user's login shell on Unix). */\n shell?: string;\n}\n\n/**\n * Return the command that unsets `varName` in the caller's shell.\n *\n * Detection is best-effort and honest about its limits:\n * - Unix: keyed off `$SHELL` (the login shell). fish and csh/tcsh get their\n * own syntax; everything else falls back to POSIX `unset`, which covers\n * sh/bash/zsh/ksh. `$SHELL` is the *default* shell, not guaranteed to be the\n * one currently running, but it is the only signal available.\n * - Windows: PowerShell and cmd.exe can't be told apart reliably from the\n * environment, so we show both forms rather than guess wrong.\n */\nexport function unsetEnvCommand(varName: string, env: ShellEnv = {}): string {\n const platform = env.platform ?? process.platform;\n\n if (platform === 'win32') {\n return `PowerShell: Remove-Item Env:${varName} | cmd.exe: set ${varName}=`;\n }\n\n const shell = env.shell ?? process.env.SHELL ?? '';\n const base = shell.split('/').pop() ?? '';\n if (base === 'fish') return `set -e ${varName}`;\n if (base === 'csh' || base === 'tcsh') return `unsetenv ${varName}`;\n return `unset ${varName}`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { clearStoredCredentials, credentialsPath } from '../credentials.js';\nimport { unsetEnvCommand } from '../utils/shell.js';\n\nexport const logoutCommand = new Command('logout')\n .description('Clear stored Vibgrate login credentials')\n .action(() => {\n const cleared = clearStoredCredentials();\n if (cleared) {\n console.log(chalk.green('✔') + ' Logged out. Stored credentials removed.');\n } else {\n console.log(chalk.dim(`No stored credentials found at ${credentialsPath()}.`));\n }\n\n // The stored file is not the only DSN source: resolveDsn() also honors the\n // VIBGRATE_DSN env var (and a --dsn flag). Deleting the file does not clear\n // those, so the user can still be authenticated after \"logout\". Warn them —\n // but never echo the value itself (GUARDRAILS §1.1), only that it is set.\n if (process.env.VIBGRATE_DSN) {\n console.log('');\n console.log(\n chalk.yellow('⚠') +\n ' VIBGRATE_DSN is still set in your environment, so commands will keep using it.',\n );\n console.log(\n chalk.dim(` Unset it to fully sign out: ${unsetEnvCommand('VIBGRATE_DSN')}`),\n );\n }\n });\n","import * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile, writeTextFile } from '../utils/fs.js';\n\n/**\n * The in-toto predicate type for an OpenVEX attestation. Passed to\n * `cosign attest --type …` in the release pipeline and verified by buyers.\n */\nexport const OPENVEX_PREDICATE_TYPE = 'openvex';\n\n/** OpenVEX context URI (spec version this generator emits). */\nconst OPENVEX_CONTEXT = 'https://openvex.dev/ns/v0.2.0';\n\n/** Valid OpenVEX statement statuses. */\nconst VEX_STATUSES = ['not_affected', 'affected', 'fixed', 'under_investigation'] as const;\nexport type VexStatus = (typeof VEX_STATUSES)[number];\n\n/** Justifications permitted for a `not_affected` status (OpenVEX spec). */\nconst VEX_JUSTIFICATIONS = [\n 'component_not_present',\n 'vulnerable_code_not_present',\n 'vulnerable_code_not_in_execute_path',\n 'vulnerable_code_cannot_be_controlled_by_adversary',\n 'inline_mitigations_already_exist',\n] as const;\nexport type VexJustification = (typeof VEX_JUSTIFICATIONS)[number];\n\nexport interface VexStatementInput {\n vulnerability: string;\n /** Product references (e.g. `pkg:…` or an image digest). Falls back to the document default. */\n products?: string[];\n status: VexStatus;\n justification?: VexJustification;\n impact_statement?: string;\n action_statement?: string;\n}\n\ninterface OpenVexStatement {\n vulnerability: { name: string };\n products: Array<{ '@id': string }>;\n status: VexStatus;\n justification?: VexJustification;\n impact_statement?: string;\n action_statement?: string;\n}\n\nexport interface OpenVexDocument {\n '@context': string;\n '@id': string;\n author: string;\n timestamp: string;\n version: number;\n statements: OpenVexStatement[];\n}\n\nexport interface BuildVexOptions {\n author: string;\n /** Default product applied to statements that don't carry their own. */\n defaultProduct?: string;\n timestamp?: string;\n id?: string;\n statements: VexStatementInput[];\n}\n\n/** A validation problem found while assembling the document. */\nexport class VexValidationError extends Error {}\n\n/**\n * Builds a spec-compliant OpenVEX document from a set of statements. Pure: given\n * the same inputs (including an explicit `timestamp`/`id`) it returns the same\n * document, so an attested VEX is reproducible. A document with zero statements\n * is valid and honest — it asserts no known affected components.\n */\nexport function buildVexDocument(opts: BuildVexOptions): OpenVexDocument {\n const statements: OpenVexStatement[] = opts.statements.map((s, i) => {\n if (!s.vulnerability || typeof s.vulnerability !== 'string') {\n throw new VexValidationError(`statement[${i}]: \"vulnerability\" is required`);\n }\n if (!VEX_STATUSES.includes(s.status)) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): invalid status \"${s.status}\". Expected one of: ${VEX_STATUSES.join(', ')}`,\n );\n }\n\n const products = (s.products && s.products.length > 0\n ? s.products\n : opts.defaultProduct\n ? [opts.defaultProduct]\n : []);\n if (products.length === 0) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): no product. Set \"products\" on the statement or pass --product.`,\n );\n }\n\n // OpenVEX requires a justification or impact_statement for not_affected, and\n // an action_statement is expected for affected.\n if (s.status === 'not_affected' && !s.justification && !s.impact_statement) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): \"not_affected\" requires a justification or impact_statement.`,\n );\n }\n if (s.justification && !VEX_JUSTIFICATIONS.includes(s.justification)) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): invalid justification \"${s.justification}\". Expected one of: ${VEX_JUSTIFICATIONS.join(', ')}`,\n );\n }\n if (s.status === 'affected' && !s.action_statement) {\n throw new VexValidationError(\n `statement[${i}] (${s.vulnerability}): \"affected\" requires an action_statement.`,\n );\n }\n\n const out: OpenVexStatement = {\n vulnerability: { name: s.vulnerability },\n products: products.map((p) => ({ '@id': p })),\n status: s.status,\n };\n if (s.justification) out.justification = s.justification;\n if (s.impact_statement) out.impact_statement = s.impact_statement;\n if (s.action_statement) out.action_statement = s.action_statement;\n return out;\n });\n\n return {\n '@context': OPENVEX_CONTEXT,\n '@id': opts.id ?? `https://vibgrate.com/vex/${randomUUID()}`,\n author: opts.author,\n timestamp: opts.timestamp ?? new Date().toISOString(),\n version: 1,\n statements,\n };\n}\n\n/**\n * Reads statements from a JSON file. Accepts either a bare array of statements or\n * an object with a `statements` array (e.g. an existing OpenVEX document).\n */\nasync function loadStatementsFile(filePath: string): Promise<VexStatementInput[]> {\n const data = await readJsonFile<unknown>(filePath);\n const arr = Array.isArray(data)\n ? data\n : (data && typeof data === 'object' && Array.isArray((data as { statements?: unknown }).statements)\n ? (data as { statements: unknown[] }).statements\n : null);\n if (!arr) {\n throw new VexValidationError(\n `${filePath}: expected a JSON array of statements or an object with a \"statements\" array.`,\n );\n }\n return arr as VexStatementInput[];\n}\n\nfunction collectStatement(value: string, previous: VexStatementInput[]): VexStatementInput[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new VexValidationError(`--statement must be a JSON object: ${value.slice(0, 60)}…`);\n }\n return [...previous, parsed as VexStatementInput];\n}\n\nexport const vexCommand = new Command('vex')\n .description('Generate an OpenVEX document (exploitability statements) for attestation')\n .option('--from <file>', 'Read statements from a JSON file (array, or an object with a \"statements\" array)')\n .option(\n '--statement <json>',\n 'Add a statement as inline JSON, e.g. \\'{\"vulnerability\":\"CVE-2024-1\",\"status\":\"not_affected\",\"justification\":\"vulnerable_code_not_present\"}\\'. Repeatable.',\n collectStatement,\n [] as VexStatementInput[],\n )\n .option('--product <ref>', 'Default product reference applied to statements without their own (e.g. an image digest)')\n .option('--author <name>', 'Document author', 'Vibgrate')\n .option('--timestamp <iso>', 'Override the document timestamp (ISO 8601) for reproducible output')\n .option('--id <uri>', 'Override the document @id (otherwise a uuid URN is generated)')\n .option('--out <file>', 'Write the document to a file (default: stdout)')\n .action(async (opts: {\n from?: string;\n statement: VexStatementInput[];\n product?: string;\n author: string;\n timestamp?: string;\n id?: string;\n out?: string;\n }) => {\n try {\n const statements: VexStatementInput[] = [];\n if (opts.from) {\n const fromPath = path.resolve(opts.from);\n if (!(await pathExists(fromPath))) {\n process.stderr.write(chalk.red(`Statements file not found: ${fromPath}\\n`));\n process.exit(1);\n }\n statements.push(...(await loadStatementsFile(fromPath)));\n }\n statements.push(...opts.statement);\n\n const doc = buildVexDocument({\n author: opts.author,\n defaultProduct: opts.product,\n timestamp: opts.timestamp,\n id: opts.id,\n statements,\n });\n\n const json = JSON.stringify(doc, null, 2);\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), json + '\\n');\n process.stderr.write(\n chalk.green('✔') + ` Wrote OpenVEX document (${doc.statements.length} statement(s)) to ${path.resolve(opts.out)}\\n`,\n );\n } else {\n process.stdout.write(json + '\\n');\n }\n } catch (err) {\n if (err instanceof VexValidationError) {\n process.stderr.write(chalk.red(`VEX validation error: ${err.message}\\n`));\n process.exit(1);\n }\n throw err;\n }\n });\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile, writeTextFile } from '../utils/fs.js';\nimport type { DependencyRow, ScanArtifact } from '../types.js';\nimport { vexCommand } from './vex.js';\n\ntype SbomFormat = 'cyclonedx' | 'spdx';\n\ninterface FlattenedDependency {\n project: string;\n package: string;\n version: string;\n currentSpec: string;\n drift: DependencyRow['drift'];\n majorsBehind: number | null;\n}\n\n/**\n * Deterministic RFC 9562 version-8 UUID derived from `seed`, so an SBOM's\n * serialNumber / documentNamespace is stable for identical content instead of\n * random. A stable id makes `vg sbom export` reproducible for a given scan and\n * format. Uses a salted FNV-1a hash; a collision is only cosmetic — the SBOM\n * content, not this id, is what a consumer verifies.\n *\n * Kept in sync with the identical helper in the API\n * (`packages/vibgrate-api/src/lib/sbom-export.ts`).\n */\nexport function deterministicUuid(seed: string): string {\n const bytes = new Uint8Array(16);\n for (let block = 0; block < 4; block++) {\n let h = 0x811c9dc5;\n const s = `${block} ${seed}`;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n h >>>= 0;\n bytes[block * 4] = (h >>> 24) & 0xff;\n bytes[block * 4 + 1] = (h >>> 16) & 0xff;\n bytes[block * 4 + 2] = (h >>> 8) & 0xff;\n bytes[block * 4 + 3] = h & 0xff;\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x80; // version 8 (custom)\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Stable seed for the document id: format + root + the ordered dependency set. */\nfunction sbomSerialSeed(format: string, artifact: ScanArtifact, deps: FlattenedDependency[]): string {\n return [\n format,\n artifact.rootPath ?? '',\n artifact.timestamp ?? '',\n artifact.vibgrateVersion ?? '',\n ...deps.map((d) => `${d.package}|${d.version}|${d.currentSpec}|${d.project}|${d.drift}|${d.majorsBehind ?? ''}`),\n ].join('\\n');\n}\n\nexport function flattenDependencies(artifact: ScanArtifact): FlattenedDependency[] {\n const rows: FlattenedDependency[] = [];\n for (const project of artifact.projects) {\n for (const dep of project.dependencies) {\n rows.push({\n project: project.name,\n package: dep.package,\n version: dep.resolvedVersion ?? dep.currentSpec,\n currentSpec: dep.currentSpec,\n drift: dep.drift,\n majorsBehind: dep.majorsBehind,\n });\n }\n }\n return rows;\n}\n\nexport function toCycloneDx(artifact: ScanArtifact): Record<string, unknown> {\n const dependencies = flattenDependencies(artifact);\n return {\n bomFormat: 'CycloneDX',\n specVersion: '1.5',\n serialNumber: `urn:uuid:${deterministicUuid(sbomSerialSeed('cyclonedx', artifact, dependencies))}`,\n version: 1,\n metadata: {\n timestamp: artifact.timestamp,\n tools: [\n {\n vendor: 'Vibgrate',\n name: '@vibgrate/cli',\n version: artifact.vibgrateVersion,\n },\n ],\n component: {\n type: 'application',\n name: artifact.rootPath,\n },\n },\n components: dependencies.map((dep) => ({\n type: 'library',\n name: dep.package,\n version: dep.version,\n properties: [\n { name: 'vibgrate:project', value: dep.project },\n { name: 'vibgrate:currentSpec', value: dep.currentSpec },\n { name: 'vibgrate:drift', value: dep.drift },\n { name: 'vibgrate:majorsBehind', value: String(dep.majorsBehind ?? 'unknown') },\n ],\n })),\n };\n}\n\nexport function toSpdx(artifact: ScanArtifact): Record<string, unknown> {\n const dependencies = flattenDependencies(artifact);\n return {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: `${artifact.rootPath}-sbom`,\n documentNamespace: `https://vibgrate.com/spdx/${artifact.rootPath}/${deterministicUuid(sbomSerialSeed('spdx', artifact, dependencies))}`,\n creationInfo: {\n created: artifact.timestamp,\n creators: [`Tool: @vibgrate/cli-${artifact.vibgrateVersion}`],\n },\n packages: dependencies.map((dep, i) => ({\n name: dep.package,\n SPDXID: `SPDXRef-Package-${i + 1}`,\n versionInfo: dep.version,\n downloadLocation: 'NOASSERTION',\n filesAnalyzed: false,\n externalRefs: [\n {\n referenceCategory: 'PACKAGE-MANAGER',\n referenceType: 'purl',\n referenceLocator: `pkg:npm/${encodeURIComponent(dep.package)}@${encodeURIComponent(dep.version)}`,\n },\n ],\n annotations: [\n {\n annotationType: 'OTHER',\n annotator: 'Tool: @vibgrate/cli',\n annotationDate: artifact.timestamp,\n comment: `project=${dep.project}; drift=${dep.drift}; majorsBehind=${dep.majorsBehind ?? 'unknown'}`,\n },\n ],\n })),\n };\n}\n\nfunction projectDependencyMap(artifact: ScanArtifact): Map<string, DependencyRow> {\n const map = new Map<string, DependencyRow>();\n for (const project of artifact.projects) {\n for (const dep of project.dependencies) {\n map.set(`${project.name}:${dep.package}`, dep);\n }\n }\n return map;\n}\n\nexport function formatDeltaText(base: ScanArtifact, current: ScanArtifact): string {\n const baseMap = projectDependencyMap(base);\n const currentMap = projectDependencyMap(current);\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [key, dep] of currentMap.entries()) {\n if (!baseMap.has(key)) {\n added.push(`${key} @ ${dep.resolvedVersion ?? dep.currentSpec}`);\n continue;\n }\n const prev = baseMap.get(key)!;\n const prevVersion = prev.resolvedVersion ?? prev.currentSpec;\n const nowVersion = dep.resolvedVersion ?? dep.currentSpec;\n if (prevVersion !== nowVersion || prev.majorsBehind !== dep.majorsBehind) {\n changed.push(`${key} ${prevVersion} -> ${nowVersion} (majorsBehind ${prev.majorsBehind ?? 'unknown'} -> ${dep.majorsBehind ?? 'unknown'})`);\n }\n }\n\n for (const [key, dep] of baseMap.entries()) {\n if (!currentMap.has(key)) {\n removed.push(`${key} @ ${dep.resolvedVersion ?? dep.currentSpec}`);\n }\n }\n\n const lines = [\n 'Vibgrate SBOM Delta',\n '===================',\n `Baseline: ${base.timestamp}`,\n `Current: ${current.timestamp}`,\n `DriftScore delta: ${(current.drift.score - base.drift.score).toFixed(2)} points`,\n '',\n `Added dependencies (${added.length})`,\n ...added.map((d) => ` + ${d}`),\n '',\n `Removed dependencies (${removed.length})`,\n ...removed.map((d) => ` - ${d}`),\n '',\n `Changed dependencies (${changed.length})`,\n ...changed.map((d) => ` * ${d}`),\n ];\n\n return lines.join('\\n');\n}\n\nasync function readArtifactOrExit(filePath: string): Promise<ScanArtifact> {\n const absolutePath = path.resolve(filePath);\n if (!(await pathExists(absolutePath))) {\n console.error(chalk.red(`Artifact not found: ${absolutePath}`));\n process.exit(1);\n }\n return readJsonFile<ScanArtifact>(absolutePath);\n}\n\nconst exportCommand = new Command('export')\n .description('Export scan artifact as SBOM')\n .option('--in <file>', 'Input artifact file', '.vibgrate/scan_result.json')\n .option('--out <file>', 'Output SBOM file')\n .option('--format <format>', 'SBOM format (cyclonedx|spdx)', 'cyclonedx')\n .action(async (opts: { in: string; out?: string; format: string }) => {\n const artifact = await readArtifactOrExit(opts.in);\n const format = opts.format.toLowerCase() as SbomFormat;\n\n if (format !== 'cyclonedx' && format !== 'spdx') {\n console.error(chalk.red('Invalid SBOM format. Use cyclonedx or spdx.'));\n process.exit(1);\n }\n\n const sbom = format === 'cyclonedx' ? toCycloneDx(artifact) : toSpdx(artifact);\n const body = JSON.stringify(sbom, null, 2);\n\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), body);\n console.log(chalk.green('✔') + ` SBOM written to ${opts.out}`);\n } else {\n console.log(body);\n }\n });\n\nconst deltaCommand = new Command('delta')\n .description('Show SBOM delta between two scan artifacts')\n .requiredOption('--from <file>', 'Baseline scan artifact path')\n .requiredOption('--to <file>', 'Current scan artifact path')\n .option('--out <file>', 'Write report to file')\n .action(async (opts: { from: string; to: string; out?: string }) => {\n const base = await readArtifactOrExit(opts.from);\n const current = await readArtifactOrExit(opts.to);\n const report = formatDeltaText(base, current);\n\n if (opts.out) {\n await writeTextFile(path.resolve(opts.out), report);\n console.log(chalk.green('✔') + ` SBOM delta report written to ${opts.out}`);\n } else {\n console.log(report);\n }\n });\n\nexport const sbomCommand = new Command('sbom')\n .description('Supply-chain evidence: SBOM export/delta and OpenVEX generation')\n .addCommand(exportCommand)\n .addCommand(deltaCommand)\n .addCommand(vexCommand);\n","#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { realpathSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { Command, CommanderError } from 'commander';\nimport { VERSION } from './version.js';\nimport { resolveCliInvocation, NPX_INVOCATION } from './util/cli-invocation.js';\nimport { registerBuild, runBuild } from './commands/build.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerAsk } from './commands/ask.js';\nimport { registerEmbed } from './commands/embed.js';\nimport { registerShow } from './commands/show.js';\nimport { registerPath } from './commands/path.js';\nimport { registerTree } from './commands/tree.js';\nimport { registerInsights } from './commands/insights.js';\nimport { registerImpact } from './commands/impact.js';\nimport { registerUnknowns } from './commands/unknowns.js';\nimport { registerServe } from './commands/serve.js';\nimport { registerLsp } from './commands/lsp.js';\nimport { registerInstall } from './commands/install.js';\nimport { registerShare } from './commands/share.js';\nimport { registerBenchmark } from './commands/benchmark.js';\nimport { registerTests } from './commands/tests.js';\nimport { registerFacts } from './commands/facts.js';\nimport { registerGuide } from './commands/guide.js';\nimport { registerWhy } from './commands/why.js';\nimport { registerBisect } from './commands/bisect.js';\nimport { registerDrift } from './commands/drift.js';\nimport { registerModels } from './commands/models.js';\nimport { registerSavings } from './commands/savings.js';\nimport { registerLib } from './commands/lib.js';\nimport { registerExport } from './commands/export.js';\nimport { registerBundle } from './commands/bundle.js';\nimport { registerDoctor } from './commands/doctor.js';\nimport { CliError, ExitCode } from './util/exit.js';\nimport { c, info, disableColor } from './util/output.js';\n\n// Drift-reporting commands (merged from the Vibgrate CLI). These run on the\n// open base engine (`@vibgrate/core-open`) — no proprietary kernel.\nimport { initCommand } from './reporting/commands/init.js';\nimport { scanCommand } from './reporting/commands/scan.js';\nimport { fixCommand } from './reporting/commands/fix.js';\nimport { baselineCommand } from './reporting/commands/baseline.js';\nimport { reportCommand } from './reporting/commands/report.js';\nimport { dsnCommand } from './reporting/commands/dsn.js';\nimport { loginCommand } from './reporting/commands/login.js';\nimport { logoutCommand } from './reporting/commands/logout.js';\nimport { pushCommand } from './reporting/commands/push.js';\nimport { updateCommand } from './reporting/commands/update.js';\nimport { sbomCommand } from './reporting/commands/sbom.js';\n\n/** The set of registered subcommand names (kept in sync with registration). */\nexport const KNOWN_COMMANDS = new Set([\n 'build',\n 'status',\n 'ask',\n 'embed',\n 'show',\n 'path',\n 'tree',\n 'impact',\n 'unknowns',\n 'tests',\n 'facts',\n 'guide',\n 'why',\n 'bisect',\n 'drift',\n 'models',\n 'savings',\n 'lib',\n 'export',\n 'push',\n 'bundle',\n 'map',\n 'hubs',\n 'areas',\n 'oddities',\n 'serve',\n 'lsp',\n 'doctor',\n 'install',\n 'uninstall',\n 'share',\n 'benchmark',\n 'help',\n // Drift-reporting verbs (merged from the Vibgrate CLI).\n 'init',\n 'scan',\n 'fix',\n 'baseline',\n 'report',\n 'login',\n 'logout',\n 'dsn',\n 'update',\n 'sbom',\n]);\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name('vg')\n .description(\n 'vg — local codebase intelligence for AI coding agents: a deterministic, ' +\n 'no-API-key code graph + MCP server, drift reporting, and version-correct library docs',\n )\n .version(VERSION, '--version', 'output the version number')\n .showSuggestionAfterError(true)\n .addHelpText('after', () => {\n // Show commands with the prefix that actually runs this CLI for the reader:\n // `vg` when installed, `npx @vibgrate/cli` when they invoked it via npx.\n const cli = resolveCliInvocation();\n const aliasNote =\n cli === 'vg'\n ? 'The `vibgrate` command is an alias for `vg`.\\n'\n : cli === NPX_INVOCATION\n ? 'Install globally (`npm i -g @vibgrate/cli`) to use the shorter `vg` command.\\n'\n : '';\n return (\n `\\nRun \\`${cli}\\` to scan + map the current folder, \\`${cli} \"<question>\"\\` to ask, ` +\n `\\`${cli} status\\` for state, \\`${cli} build --verify\\` to re-verify the map.\\n` +\n `Drift: \\`${cli} scan\\` / \\`${cli} report\\`. Wire into your AI agent: \\`${cli} install\\`.\\n` +\n `${aliasNote}Docs: https://vibgrate.com/help`\n );\n });\n\n // Global flags live on each subcommand (see cli-options.applyGlobalOptions),\n // so the dispatch can place the command token first and let flags follow.\n registerBuild(program);\n registerStatus(program);\n registerAsk(program);\n registerEmbed(program);\n registerShow(program);\n registerPath(program);\n registerTree(program);\n registerInsights(program);\n registerImpact(program);\n registerUnknowns(program);\n registerServe(program);\n registerLsp(program);\n registerInstall(program);\n registerShare(program);\n registerBenchmark(program);\n registerTests(program);\n registerFacts(program);\n registerGuide(program);\n registerWhy(program);\n registerBisect(program);\n registerDrift(program);\n registerModels(program);\n registerSavings(program);\n registerLib(program);\n registerExport(program);\n registerBundle(program);\n registerDoctor(program);\n\n // Drift-reporting commands (merged from the Vibgrate CLI). `push` here is the\n // real scan-artifact upload, so it replaces the graph engine's no-op `push`.\n program.addCommand(initCommand);\n program.addCommand(scanCommand);\n program.addCommand(fixCommand);\n program.addCommand(baselineCommand);\n program.addCommand(reportCommand);\n program.addCommand(loginCommand);\n program.addCommand(logoutCommand);\n program.addCommand(dsnCommand);\n program.addCommand(pushCommand);\n program.addCommand(updateCommand);\n program.addCommand(sbomCommand);\n\n return program;\n}\n\n/**\n * The \"simple as Google\" dispatch (VG-CLI-SPEC §1):\n * vg → scan + map the current folder\n * vg <path-that-exists> → scan + map that path\n * vg \"<quoted question>\" → ask (contains a space or ends with '?')\n * vg <known-command> … → run that command\n * vg <other-word> → ask (bare-string search)\n */\n/**\n * Flags that consume the following token as their value. Includes global flags\n * and command-level value options, so the dispatcher never mistakes a flag's\n * value (e.g. the `4` in `vg --jobs 4`) for the command/positional.\n */\nconst VALUE_FLAGS = new Set([\n '-C',\n '--cwd',\n '--generated-at',\n '--graph',\n '--jobs',\n '--only',\n '--exclude',\n '--export',\n '-o',\n '--budget',\n '-b',\n]);\n\n/**\n * Build-only flags that `scan` has no equivalent for. When one of these appears\n * on an otherwise-default invocation (`vg --json`, `vg --jobs 4`, `vg . --only ts`),\n * we keep routing to `build` so the flag still means \"map\", rather than handing\n * it to `scan` (which would reject the unknown option).\n */\nconst BUILD_ONLY_FLAGS = new Set([\n '--json',\n '--jobs',\n '--only',\n '--export',\n '--graph',\n '--generated-at',\n '--no-cache',\n '--deep',\n '--scip',\n '--no-scip',\n '--tsc',\n '--no-tsc',\n '--ground',\n '--no-ground',\n '--html',\n '--no-html',\n '--report',\n '--no-report',\n '--warm',\n]);\n\nfunction hasBuildOnlyFlag(args: string[]): boolean {\n return args.some((a) => BUILD_ONLY_FLAGS.has(a.split('=')[0]));\n}\n\nexport function dispatch(argv: string[], cwd: string): string[] {\n const args = [...argv];\n const firstPositionalIdx = findFirstPositional(args);\n\n // No positional at all (e.g. `vg`, `vg --quiet`): default to scan, which also\n // builds the map (one command → DriftScore + AI/docs index). A terminal flag\n // like --help/--version is left for commander; a build-only flag keeps `build`.\n if (firstPositionalIdx === -1) {\n if (args.includes('--help') || args.includes('-h') || args.includes('--version')) {\n return args;\n }\n return [hasBuildOnlyFlag(args) ? 'build' : 'scan', ...args];\n }\n\n const first = args[firstPositionalIdx];\n\n // Explicit command → move it to the front (commander needs the command first;\n // global flags live on the subcommand so they can follow in any order).\n if (KNOWN_COMMANDS.has(first)) {\n const rest = [...args];\n rest.splice(firstPositionalIdx, 1);\n return [first, ...rest];\n }\n\n const looksLikeQuestion = /\\s/.test(first) || first.endsWith('?');\n if (looksLikeQuestion) return ['ask', ...args];\n\n // A path (relative to cwd) → scan + map it (a build-only flag keeps `build`).\n if (fs.existsSync(path.resolve(cwd, first))) {\n return [hasBuildOnlyFlag(args) ? 'build' : 'scan', ...args];\n }\n\n // Recently-moved verbs: a migration hint beats a confusing search fall-through.\n const moved = MOVED_COMMANDS[first];\n if (moved) {\n throw new CliError(`\\`vg ${first}\\` has moved to \\`${moved}\\``, ExitCode.USAGE_ERROR);\n }\n\n // Bare word that is neither a command nor a path → treat as a search query.\n return ['ask', ...args];\n}\n\n/** Verbs folded into the build lifecycle — guide the user to the new form. */\nconst MOVED_COMMANDS: Record<string, string> = {\n verify: 'vg build --verify',\n attest: 'vg build --attest',\n};\n\n/** The first real positional, skipping value-taking global flags and their values. */\nfunction findFirstPositional(args: string[]): number {\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a.startsWith('-')) {\n // `--flag=value` consumes nothing extra; a bare value-flag consumes next.\n if (VALUE_FLAGS.has(a)) i++;\n continue;\n }\n return i;\n }\n return -1;\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const raw = argv.slice(2);\n\n // Honor NO_COLOR / --no-color early so even bootstrap messages obey it.\n if (process.env.NO_COLOR || raw.includes('--no-color')) disableColor();\n\n // We need cwd for path-based dispatch; read -C/--cwd from the raw args.\n const cwd = readCwd(raw);\n\n const program = buildProgram();\n program.exitOverride((err) => {\n throw err;\n });\n // Route commander's own output through our streams; errors are handled below.\n program.configureOutput({\n writeErr: (str) => process.stderr.write(str),\n writeOut: (str) => process.stdout.write(str),\n });\n\n try {\n // dispatch() can throw (e.g. a moved-command hint) — keep it inside the\n // handler so those surface as a clean `error:` line, not a raw stack.\n const dispatched = dispatch(raw, cwd);\n await program.parseAsync(dispatched, { from: 'user' });\n } catch (err) {\n handleError(err);\n }\n}\n\nfunction readCwd(raw: string[]): string {\n const i = raw.findIndex((a) => a === '-C' || a === '--cwd');\n if (i >= 0 && raw[i + 1]) return path.resolve(raw[i + 1]);\n const eq = raw.find((a) => a.startsWith('--cwd='));\n if (eq) return path.resolve(eq.slice('--cwd='.length));\n return process.cwd();\n}\n\nfunction handleError(err: unknown): never {\n if (err instanceof CommanderError) {\n // Help/version are not errors.\n if (err.code === 'commander.helpDisplayed' || err.code === 'commander.help') {\n process.exit(ExitCode.OK);\n }\n if (err.code === 'commander.version') process.exit(ExitCode.OK);\n // Unknown command / bad option / missing argument → usage error.\n process.exit(ExitCode.USAGE_ERROR);\n }\n if (err instanceof CliError) {\n info(c.red(`error: ${err.message}`));\n process.exit(err.code);\n }\n const message = err instanceof Error ? err.message : String(err);\n const correlation = Math.random().toString(36).slice(2, 10);\n info(c.red(`error: ${message}`));\n info(c.dim(` (ref ${correlation}) — re-run with --json for detail, or report at https://vibgrate.com/help`));\n process.exit(ExitCode.ERROR);\n}\n\n// Export for programmatic/default-build use and tests.\nexport { runBuild };\n\n// Run only when invoked as the process entry (not when imported by a test or\n// the embedding API). Robust across dev (tsx .ts), the built bin, and bin\n// symlinks by comparing realpaths.\nfunction isEntry(): boolean {\n try {\n if (!process.argv[1]) return false;\n return realpathSync(process.argv[1]) === fileURLToPath(import.meta.url);\n } catch {\n return false;\n }\n}\n\nif (isEntry()) {\n void main();\n}\n"]}