@vibgrate/cli 2026.731.1 → 2026.731.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/{agent-33BMKWJC.js → agent-6PPW5GIV.js} +4 -4
- package/dist/{agent-33BMKWJC.js.map → agent-6PPW5GIV.js.map} +1 -1
- package/dist/baseline-ZMHL6DXF.js +9 -0
- package/dist/{baseline-4FBHW2X2.js.map → baseline-ZMHL6DXF.js.map} +1 -1
- package/dist/{chunk-SE4JMB4W.js → chunk-4CGLQXSI.js} +3 -3
- package/dist/{chunk-SE4JMB4W.js.map → chunk-4CGLQXSI.js.map} +1 -1
- package/dist/chunk-4DZC3ADC.js +42 -0
- package/dist/chunk-4DZC3ADC.js.map +1 -0
- package/dist/chunk-4TC6RJ7U.js +326 -0
- package/dist/chunk-4TC6RJ7U.js.map +1 -0
- package/dist/{chunk-T7OFJS3X.js → chunk-5J45MN3K.js} +13 -328
- package/dist/chunk-5J45MN3K.js.map +1 -0
- package/dist/{chunk-NJT4CA6K.js → chunk-DT4KIVRI.js} +17 -8
- package/dist/chunk-DT4KIVRI.js.map +1 -0
- package/dist/{chunk-3NP2DO4G.js → chunk-EX2SH5CT.js} +3 -3
- package/dist/{chunk-3NP2DO4G.js.map → chunk-EX2SH5CT.js.map} +1 -1
- package/dist/{chunk-GPDJOCUI.js → chunk-FF5ZQ6KI.js} +4 -4
- package/dist/{chunk-GPDJOCUI.js.map → chunk-FF5ZQ6KI.js.map} +1 -1
- package/dist/{chunk-476KWSFM.js → chunk-IZNOMGR6.js} +3 -3
- package/dist/{chunk-476KWSFM.js.map → chunk-IZNOMGR6.js.map} +1 -1
- package/dist/chunk-L6BRBFBP.js +65 -0
- package/dist/chunk-L6BRBFBP.js.map +1 -0
- package/dist/{chunk-J3BQ7FIT.js → chunk-LZX5NH4V.js} +7 -7
- package/dist/{chunk-J3BQ7FIT.js.map → chunk-LZX5NH4V.js.map} +1 -1
- package/dist/chunk-NNB2H4BA.js +6 -0
- package/dist/{chunk-2XTPGYR2.js.map → chunk-NNB2H4BA.js.map} +1 -1
- package/dist/{chunk-KGWEBM2J.js → chunk-Q7HUXIUF.js} +3 -3
- package/dist/{chunk-KGWEBM2J.js.map → chunk-Q7HUXIUF.js.map} +1 -1
- package/dist/{chunk-DXSEG6SZ.js → chunk-QWOJO32H.js} +3 -3
- package/dist/{chunk-DXSEG6SZ.js.map → chunk-QWOJO32H.js.map} +1 -1
- package/dist/{chunk-C22ZY3FV.js → chunk-RIWLXMMT.js} +3 -3
- package/dist/{chunk-C22ZY3FV.js.map → chunk-RIWLXMMT.js.map} +1 -1
- package/dist/{chunk-CWB6H553.js → chunk-TNCD5VFX.js} +3 -3
- package/dist/{chunk-CWB6H553.js.map → chunk-TNCD5VFX.js.map} +1 -1
- package/dist/{chunk-UVMP7DFF.js → chunk-XRN7DQGR.js} +11 -11
- package/dist/{chunk-UVMP7DFF.js.map → chunk-XRN7DQGR.js.map} +1 -1
- package/dist/{chunk-SKIMUFCI.js → chunk-Y44GPOBL.js} +41 -65
- package/dist/chunk-Y44GPOBL.js.map +1 -0
- package/dist/cli.d.ts +5 -1
- package/dist/cli.js +205 -46
- package/dist/cli.js.map +1 -1
- package/dist/ensure-map-C3NEC2GI.js +28 -0
- package/dist/ensure-map-C3NEC2GI.js.map +1 -0
- package/dist/fs-NTQUFCXV.js +4 -0
- package/dist/fs-NTQUFCXV.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/{interactive-V6IRYZTA.js → interactive-2TAYVEHE.js} +19 -16
- package/dist/interactive-2TAYVEHE.js.map +1 -0
- package/dist/load-A5BGEQWP.js +10 -0
- package/dist/{load-KPHH26ND.js.map → load-A5BGEQWP.js.map} +1 -1
- package/dist/{run-outcome-TZ53G67B.js → run-outcome-OSIVMVT7.js} +5 -5
- package/dist/{run-outcome-TZ53G67B.js.map → run-outcome-OSIVMVT7.js.map} +1 -1
- package/dist/{runtime-session-PZKXBDJT.js → runtime-session-UPTC3E6N.js} +7 -7
- package/dist/{runtime-session-PZKXBDJT.js.map → runtime-session-UPTC3E6N.js.map} +1 -1
- package/dist/{stream-json-3YOPU3LF.js → stream-json-CFKBL3MR.js} +4 -4
- package/dist/{stream-json-3YOPU3LF.js.map → stream-json-CFKBL3MR.js.map} +1 -1
- package/dist/{vg-mcp-bridge-7NNVIVO7.js → vg-mcp-bridge-JHRKJBVT.js} +6 -6
- package/dist/{vg-mcp-bridge-7NNVIVO7.js.map → vg-mcp-bridge-JHRKJBVT.js.map} +1 -1
- package/dist/{vgd-Y2YCN75V.js → vgd-HNPOSXKZ.js} +6 -6
- package/dist/vgd-HNPOSXKZ.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-4FBHW2X2.js +0 -9
- package/dist/chunk-2XTPGYR2.js +0 -6
- package/dist/chunk-NJT4CA6K.js.map +0 -1
- package/dist/chunk-SKIMUFCI.js.map +0 -1
- package/dist/chunk-T7OFJS3X.js.map +0 -1
- package/dist/fs-HF5DOHYR.js +0 -4
- package/dist/fs-HF5DOHYR.js.map +0 -1
- package/dist/interactive-V6IRYZTA.js.map +0 -1
- package/dist/load-KPHH26ND.js +0 -10
- package/dist/vgd-Y2YCN75V.js.map +0 -1
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
import { managerFromProviderId, formatManagerBadgeLine } from './chunk-WHJMS7XC.js';
|
|
2
1
|
import { c, info, json, out } from './chunk-CT5BS56U.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { usageError, buildGraph, UsageError, ResourceLimitError, CliError, ExitCode, writeSnapshot, refreshInstalledInstructions, SMALL_REPO_FILES, epistemicBreakdown, verifyDeterminism } from './chunk-SKIMUFCI.js';
|
|
6
|
-
import { brandProgressBar, resolveHead, workingTreeDirty } from './chunk-UVMP7DFF.js';
|
|
2
|
+
import { usageError, buildGraph, UsageError, ResourceLimitError, CliError, ExitCode, writeSnapshot, refreshInstalledInstructions, SMALL_REPO_FILES, epistemicBreakdown, verifyDeterminism } from './chunk-Y44GPOBL.js';
|
|
3
|
+
import { brandProgressBar, resolveHead, workingTreeDirty } from './chunk-XRN7DQGR.js';
|
|
7
4
|
import { resolveEmbedModel, isModelReady, countPending } from './chunk-EETK7S43.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { VERSION } from './chunk-2XTPGYR2.js';
|
|
5
|
+
import { loadGraph } from './chunk-IZNOMGR6.js';
|
|
6
|
+
import { writeArtifacts, renderHtml, renderReport } from './chunk-QWOJO32H.js';
|
|
7
|
+
import { VERSION } from './chunk-NNB2H4BA.js';
|
|
12
8
|
import { serializeGraph } from './chunk-ZKNB4YH4.js';
|
|
13
9
|
import { canonicalize } from './chunk-JFGYT6BI.js';
|
|
14
10
|
import * as path from 'path';
|
|
15
11
|
import * as fs from 'fs';
|
|
16
12
|
import { spawn, execFile } from 'child_process';
|
|
17
13
|
import * as crypto from 'crypto';
|
|
18
|
-
import * as os from 'os';
|
|
19
14
|
|
|
20
15
|
// src/util/logo.ts
|
|
21
16
|
var teal = (s) => c.hex("#3FB0A4")(s);
|
|
@@ -369,7 +364,7 @@ function registerBuild(program) {
|
|
|
369
364
|
});
|
|
370
365
|
applyGlobalOptions(cmd);
|
|
371
366
|
}
|
|
372
|
-
async function runBuild(paths, opts, global) {
|
|
367
|
+
async function runBuild(paths, opts, global, hooks) {
|
|
373
368
|
const root = path.resolve(global.cwd ?? ".");
|
|
374
369
|
if (opts.verify) {
|
|
375
370
|
await verifyGraph(root, opts, global);
|
|
@@ -406,7 +401,10 @@ async function runBuild(paths, opts, global) {
|
|
|
406
401
|
noIndex: opts.index === false,
|
|
407
402
|
analysisTier,
|
|
408
403
|
generatedAt: global.generatedAt,
|
|
409
|
-
onParseProgress:
|
|
404
|
+
onParseProgress: (done, total) => {
|
|
405
|
+
bar?.update(done, total);
|
|
406
|
+
hooks?.onParseProgress?.(done, total);
|
|
407
|
+
},
|
|
410
408
|
grammarsDir: opts.grammars
|
|
411
409
|
});
|
|
412
410
|
} catch (err) {
|
|
@@ -610,320 +608,7 @@ function rel2(root) {
|
|
|
610
608
|
const r = path.relative(process.cwd(), root);
|
|
611
609
|
return r === "" ? "." : r;
|
|
612
610
|
}
|
|
613
|
-
var PROVIDER_LABELS = {
|
|
614
|
-
anthropic: "Anthropic (Claude)",
|
|
615
|
-
openai: "OpenAI (GPT)",
|
|
616
|
-
"x-ai": "xAI (Grok)",
|
|
617
|
-
google: "Google (Gemini)",
|
|
618
|
-
"meta-llama": "Meta (Llama)",
|
|
619
|
-
deepseek: "DeepSeek",
|
|
620
|
-
mistralai: "Mistral",
|
|
621
|
-
qwen: "Qwen"
|
|
622
|
-
};
|
|
623
|
-
var FEATURED_ORDER = Object.keys(PROVIDER_LABELS);
|
|
624
|
-
var OPENROUTER_MODELS_URL = "https://openrouter.ai/api/v1/models";
|
|
625
|
-
var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
626
|
-
function catalogCachePath() {
|
|
627
|
-
const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), ".cache");
|
|
628
|
-
return path.join(base, "vibgrate", "catalog", "openrouter-models.json");
|
|
629
|
-
}
|
|
630
|
-
async function fetchCatalog(options = {}) {
|
|
631
|
-
const now = options.now ?? (() => 0);
|
|
632
|
-
const fetchImpl = options.fetchImpl ?? fetch;
|
|
633
|
-
if (!options.noCache) {
|
|
634
|
-
const cached = readCache();
|
|
635
|
-
if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {
|
|
636
|
-
return { providers: groupModels(cached.models), fresh: false, source: "cache" };
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
if (options.offline) {
|
|
640
|
-
const cached = readCache();
|
|
641
|
-
if (cached) return { providers: groupModels(cached.models), fresh: false, source: "cache" };
|
|
642
|
-
return { providers: curatedFallback(), fresh: false, source: "fallback" };
|
|
643
|
-
}
|
|
644
|
-
try {
|
|
645
|
-
const controller = new AbortController();
|
|
646
|
-
const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8e3);
|
|
647
|
-
let raw;
|
|
648
|
-
try {
|
|
649
|
-
const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });
|
|
650
|
-
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
651
|
-
raw = await res.json();
|
|
652
|
-
} finally {
|
|
653
|
-
clearTimeout(timer);
|
|
654
|
-
}
|
|
655
|
-
const models = parseModels(raw);
|
|
656
|
-
if (models.length === 0) throw new Error("empty catalog");
|
|
657
|
-
writeCache(models, now());
|
|
658
|
-
return { providers: groupModels(models), fresh: true, source: "network" };
|
|
659
|
-
} catch {
|
|
660
|
-
const cached = readCache();
|
|
661
|
-
if (cached) return { providers: groupModels(cached.models), fresh: false, source: "cache" };
|
|
662
|
-
return { providers: curatedFallback(), fresh: false, source: "fallback" };
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
function parseModels(raw) {
|
|
666
|
-
const data = raw?.data;
|
|
667
|
-
if (!Array.isArray(data)) return [];
|
|
668
|
-
const out2 = [];
|
|
669
|
-
for (const entry of data) {
|
|
670
|
-
const e = entry;
|
|
671
|
-
if (typeof e.id !== "string" || !e.id.includes("/")) continue;
|
|
672
|
-
const provider = e.id.split("/")[0];
|
|
673
|
-
out2.push({
|
|
674
|
-
id: e.id,
|
|
675
|
-
name: typeof e.name === "string" ? e.name : e.id,
|
|
676
|
-
provider,
|
|
677
|
-
contextLength: numeric(e.context_length),
|
|
678
|
-
promptPricePerM: perMillion(e.pricing?.prompt),
|
|
679
|
-
completionPricePerM: perMillion(e.pricing?.completion)
|
|
680
|
-
});
|
|
681
|
-
}
|
|
682
|
-
return out2;
|
|
683
|
-
}
|
|
684
|
-
function groupModels(models) {
|
|
685
|
-
const byProvider = /* @__PURE__ */ new Map();
|
|
686
|
-
for (const m of models) {
|
|
687
|
-
const list = byProvider.get(m.provider) ?? [];
|
|
688
|
-
list.push(m);
|
|
689
|
-
byProvider.set(m.provider, list);
|
|
690
|
-
}
|
|
691
|
-
const groups = [];
|
|
692
|
-
for (const [id, list] of byProvider) {
|
|
693
|
-
groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });
|
|
694
|
-
}
|
|
695
|
-
groups.sort((a, b) => {
|
|
696
|
-
const ia = FEATURED_ORDER.indexOf(a.id);
|
|
697
|
-
const ib = FEATURED_ORDER.indexOf(b.id);
|
|
698
|
-
if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);
|
|
699
|
-
return a.label.localeCompare(b.label);
|
|
700
|
-
});
|
|
701
|
-
return groups;
|
|
702
|
-
}
|
|
703
|
-
function rankModels(a, b) {
|
|
704
|
-
const ca = isCoding(a) ? 0 : 1;
|
|
705
|
-
const cb = isCoding(b) ? 0 : 1;
|
|
706
|
-
if (ca !== cb) return ca - cb;
|
|
707
|
-
const la = a.contextLength ?? 0;
|
|
708
|
-
const lb = b.contextLength ?? 0;
|
|
709
|
-
if (la !== lb) return lb - la;
|
|
710
|
-
return a.id.localeCompare(b.id);
|
|
711
|
-
}
|
|
712
|
-
function isCoding(m) {
|
|
713
|
-
return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);
|
|
714
|
-
}
|
|
715
|
-
function topProviders(catalog, n = 6) {
|
|
716
|
-
return catalog.providers.slice(0, n);
|
|
717
|
-
}
|
|
718
|
-
function readCache() {
|
|
719
|
-
try {
|
|
720
|
-
const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), "utf8"));
|
|
721
|
-
if (Array.isArray(parsed.models) && typeof parsed.ts === "number") return parsed;
|
|
722
|
-
} catch {
|
|
723
|
-
}
|
|
724
|
-
return null;
|
|
725
|
-
}
|
|
726
|
-
function writeCache(models, ts) {
|
|
727
|
-
try {
|
|
728
|
-
const file = catalogCachePath();
|
|
729
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
730
|
-
fs.writeFileSync(file, JSON.stringify({ ts, models }));
|
|
731
|
-
} catch {
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
function curatedFallback() {
|
|
735
|
-
return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));
|
|
736
|
-
}
|
|
737
|
-
function numeric(v) {
|
|
738
|
-
const n = typeof v === "string" ? Number(v) : typeof v === "number" ? v : NaN;
|
|
739
|
-
return Number.isFinite(n) ? n : void 0;
|
|
740
|
-
}
|
|
741
|
-
function perMillion(v) {
|
|
742
|
-
const n = numeric(v);
|
|
743
|
-
if (n === void 0) return void 0;
|
|
744
|
-
return Math.round(n * 1e6 * 1e3) / 1e3;
|
|
745
|
-
}
|
|
746
|
-
function titleCase(id) {
|
|
747
|
-
return id.replace(/[-_]/g, " ").replace(/\b\w/g, (ch) => ch.toUpperCase());
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
// src/code/router.ts
|
|
751
|
-
var HOSTED_IDS = /* @__PURE__ */ new Set(["vibgrate-relay", "openrouter", "litellm", "openai", "together"]);
|
|
752
|
-
function resolveProviders(opts, deps = {}) {
|
|
753
|
-
const env = deps.env ?? process.env;
|
|
754
|
-
const discover = deps.discover ?? discoverModels;
|
|
755
|
-
if (opts.mockReply !== void 0) {
|
|
756
|
-
const providers = [new MockProvider(opts.model ?? "mock-1", opts.mockReply)];
|
|
757
|
-
return finish(providers, "mock provider (scripted, offline)");
|
|
758
|
-
}
|
|
759
|
-
if (opts.codeMode && (!opts.provider || opts.provider === "llama-cpp" || opts.provider === "vibgrate")) {
|
|
760
|
-
const gguf = resolveGgufPath({
|
|
761
|
-
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
762
|
-
modelRef: opts.model,
|
|
763
|
-
env,
|
|
764
|
-
discover
|
|
765
|
-
});
|
|
766
|
-
if (!gguf) {
|
|
767
|
-
throw new CliError(
|
|
768
|
-
"Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.",
|
|
769
|
-
ExitCode.NOT_FOUND
|
|
770
|
-
);
|
|
771
|
-
}
|
|
772
|
-
const providers = [
|
|
773
|
-
new LocalLlamaProvider(opts.model ?? basename2(gguf.path), gguf.path, void 0, !!opts.consent)
|
|
774
|
-
];
|
|
775
|
-
return finish(providers, `Code Mode \u2192 Vibgrate model manager (embedded llama.cpp \xB7 ${gguf.path})`);
|
|
776
|
-
}
|
|
777
|
-
if (opts.provider) {
|
|
778
|
-
const provider = buildExplicit(opts.provider, opts, env, discover);
|
|
779
|
-
if (opts.codeMode) {
|
|
780
|
-
return finish([provider], `Code Mode \u2192 explicit --provider ${opts.provider} (no auto-fallback)`);
|
|
781
|
-
}
|
|
782
|
-
const fallbacks = opts.local || provider.local ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === "lmstudio" }) : [];
|
|
783
|
-
return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);
|
|
784
|
-
}
|
|
785
|
-
if (opts.local) {
|
|
786
|
-
const locals2 = localFallbacks(opts, env, discover, "", { allowLmStudio: false });
|
|
787
|
-
if (locals2.length === 0) {
|
|
788
|
-
throw new CliError(
|
|
789
|
-
"no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.",
|
|
790
|
-
ExitCode.NOT_FOUND
|
|
791
|
-
);
|
|
792
|
-
}
|
|
793
|
-
return finish(locals2, "--local (on-device backends only)");
|
|
794
|
-
}
|
|
795
|
-
if (env.VIBGRATE_RELAY_TOKEN) {
|
|
796
|
-
const model = resolveHostedModel(opts, env, "vibgrate-relay");
|
|
797
|
-
const primary = buildHosted("vibgrate-relay", model);
|
|
798
|
-
return finish(
|
|
799
|
-
[primary, ...localFallbacks(opts, env, discover, "vibgrate-relay", { allowLmStudio: false })],
|
|
800
|
-
"VIBGRATE_RELAY_TOKEN is set \u2192 Vibgrate Relay (with local fallback)"
|
|
801
|
-
);
|
|
802
|
-
}
|
|
803
|
-
if (env.OPENROUTER_API_KEY) {
|
|
804
|
-
const model = resolveHostedModel(opts, env, "openrouter");
|
|
805
|
-
const primary = buildHosted("openrouter", model);
|
|
806
|
-
return finish(
|
|
807
|
-
[primary, ...localFallbacks(opts, env, discover, "openrouter", { allowLmStudio: false })],
|
|
808
|
-
"OPENROUTER_API_KEY is set \u2192 OpenRouter (with local fallback)"
|
|
809
|
-
);
|
|
810
|
-
}
|
|
811
|
-
const locals = localFallbacks(opts, env, discover, "", { allowLmStudio: false });
|
|
812
|
-
if (locals.length) return finish(locals, "a local model is available \u2192 on-device (no key needed)");
|
|
813
|
-
for (const id of ["litellm", "openai", "together"]) {
|
|
814
|
-
const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;
|
|
815
|
-
if (keyEnv && env[keyEnv]) {
|
|
816
|
-
const model = resolveHostedModel(opts, env, id);
|
|
817
|
-
return finish([buildHosted(id, model)], `${keyEnv} is set \u2192 ${OPENAI_COMPATIBLE[id].label}`);
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
throw new CliError(
|
|
821
|
-
"no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.",
|
|
822
|
-
ExitCode.NOT_FOUND
|
|
823
|
-
);
|
|
824
|
-
}
|
|
825
|
-
function finish(providers, reason) {
|
|
826
|
-
const primary = providers[0];
|
|
827
|
-
const manager = managerFromProviderId(primary?.id);
|
|
828
|
-
return {
|
|
829
|
-
providers,
|
|
830
|
-
reason,
|
|
831
|
-
manager,
|
|
832
|
-
managerLine: formatManagerBadgeLine(manager, primary?.model)
|
|
833
|
-
};
|
|
834
|
-
}
|
|
835
|
-
function buildExplicit(id, opts, env, discover) {
|
|
836
|
-
if (id === "ollama") return new OllamaProvider(resolveLocalModel(opts, discover, "ollama"), env.OLLAMA_HOST);
|
|
837
|
-
if (id === "llama-cpp" || id === "vibgrate") {
|
|
838
|
-
const resolved = resolveGgufPath({
|
|
839
|
-
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
840
|
-
modelRef: opts.model,
|
|
841
|
-
env,
|
|
842
|
-
discover
|
|
843
|
-
});
|
|
844
|
-
if (!resolved) {
|
|
845
|
-
throw new CliError(
|
|
846
|
-
"--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.",
|
|
847
|
-
ExitCode.USAGE_ERROR
|
|
848
|
-
);
|
|
849
|
-
}
|
|
850
|
-
return new LocalLlamaProvider(opts.model ?? basename2(resolved.path), resolved.path, void 0, !!opts.consent);
|
|
851
|
-
}
|
|
852
|
-
if (id === "lmstudio") return buildHosted("lmstudio", resolveHostedModel(opts, env, "lmstudio"));
|
|
853
|
-
if (id === "foundry-local" || id === "foundry") {
|
|
854
|
-
return buildHosted("foundry-local", resolveHostedModel(opts, env, "foundry-local"));
|
|
855
|
-
}
|
|
856
|
-
if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));
|
|
857
|
-
throw new CliError(
|
|
858
|
-
`unknown --provider "${id}". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,
|
|
859
|
-
ExitCode.USAGE_ERROR
|
|
860
|
-
);
|
|
861
|
-
}
|
|
862
|
-
function buildHosted(id, model) {
|
|
863
|
-
const base = OPENAI_COMPATIBLE[id];
|
|
864
|
-
const config = { ...base, id };
|
|
865
|
-
return new OpenAiCompatibleProvider(model, config);
|
|
866
|
-
}
|
|
867
|
-
function localFallbacks(opts, env, discover, exclude, fb) {
|
|
868
|
-
const out2 = [];
|
|
869
|
-
const models = safeDiscover(discover);
|
|
870
|
-
const preferOllama = env.VG_PREFER_OLLAMA === "1" || env.VIBGRATE_PREFER_OLLAMA === "1" || opts.preferEmbedded === false;
|
|
871
|
-
const gguf = exclude === "llama-cpp" || exclude === "vibgrate" ? null : resolveGgufPath({
|
|
872
|
-
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
873
|
-
modelRef: opts.model,
|
|
874
|
-
env,
|
|
875
|
-
discover: () => models
|
|
876
|
-
});
|
|
877
|
-
if (gguf && !preferOllama) {
|
|
878
|
-
out2.push(new LocalLlamaProvider(opts.model ?? basename2(gguf.path), gguf.path, void 0, !!opts.consent));
|
|
879
|
-
}
|
|
880
|
-
const ollamaModel = opts.model ?? firstOfRuntime(models, "ollama");
|
|
881
|
-
if (exclude !== "ollama" && ollamaModel) out2.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));
|
|
882
|
-
if (fb.allowLmStudio && exclude !== "lmstudio") {
|
|
883
|
-
const lmModel = opts.model ?? firstOfRuntime(models, "lm-studio");
|
|
884
|
-
if (lmModel) out2.push(buildHosted("lmstudio", lmModel));
|
|
885
|
-
}
|
|
886
|
-
if (exclude !== "foundry-local" && exclude !== "foundry" && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === "foundry-local")) {
|
|
887
|
-
try {
|
|
888
|
-
const m = opts.model || env.VG_CODE_MODEL;
|
|
889
|
-
if (m) out2.push(buildHosted("foundry-local", m));
|
|
890
|
-
} catch {
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
if (gguf && !out2.some((p) => p.id === "llama-cpp")) {
|
|
894
|
-
out2.push(new LocalLlamaProvider(opts.model ?? basename2(gguf.path), gguf.path, void 0, !!opts.consent));
|
|
895
|
-
}
|
|
896
|
-
return out2;
|
|
897
|
-
}
|
|
898
|
-
function resolveLocalModel(opts, discover, runtime) {
|
|
899
|
-
if (opts.model) return opts.model;
|
|
900
|
-
const found = firstOfRuntime(safeDiscover(discover), runtime);
|
|
901
|
-
if (found) return found;
|
|
902
|
-
throw new CliError(`--provider ${runtime} needs a model. Pull one (\`ollama pull <model>\`) then re-run, or pass --model. See \`vg models\`.`, ExitCode.NOT_FOUND);
|
|
903
|
-
}
|
|
904
|
-
function resolveHostedModel(opts, env, id) {
|
|
905
|
-
const model = opts.model || env.VG_CODE_MODEL;
|
|
906
|
-
if (model) return model;
|
|
907
|
-
throw new CliError(
|
|
908
|
-
`${OPENAI_COMPATIBLE[id].label} needs a model id \u2014 pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,
|
|
909
|
-
ExitCode.USAGE_ERROR
|
|
910
|
-
);
|
|
911
|
-
}
|
|
912
|
-
function firstOfRuntime(models, runtime) {
|
|
913
|
-
const m = models.find((x) => x.runtime === runtime);
|
|
914
|
-
return m?.name;
|
|
915
|
-
}
|
|
916
|
-
function safeDiscover(discover) {
|
|
917
|
-
try {
|
|
918
|
-
return discover();
|
|
919
|
-
} catch {
|
|
920
|
-
return [];
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
function basename2(p) {
|
|
924
|
-
return p.replace(/\\/g, "/").split("/").pop() ?? p;
|
|
925
|
-
}
|
|
926
611
|
|
|
927
|
-
export { DSSE_PAYLOAD_TYPE, ProgressBar, applyGlobalOptions, dssePae,
|
|
928
|
-
//# sourceMappingURL=chunk-
|
|
929
|
-
//# sourceMappingURL=chunk-
|
|
612
|
+
export { DSSE_PAYLOAD_TYPE, ProgressBar, applyGlobalOptions, dssePae, generateKeypair, keyId, printCodeLogo, printLogo, readGlobal, registerBuild, runBuild, sha256Hex };
|
|
613
|
+
//# sourceMappingURL=chunk-5J45MN3K.js.map
|
|
614
|
+
//# sourceMappingURL=chunk-5J45MN3K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/logo.ts","../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts"],"names":["crypto2","resolve","path2","rel","fs2"],"mappings":"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","file":"chunk-5J45MN3K.js","sourcesContent":["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\n/**\n * The **VG Code** banner (the approved marketing name for the code-editing\n * capability; see docs/NAMING-AND-MARKETING-STRATEGY.md). Same robot mark, but\n * the wordmark reads \"VG Code\" rather than \"Vibgrate Graph\".\n */\nexport function codeLogoLines(root?: string): string[] {\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('VG')} ${teal('Code')} ${c.dim(`· graph-grounded coding · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the VG Code banner to stderr, only for an interactive human (TTY). */\nexport function printCodeLogo(root?: string): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${codeLogoLines(root).join('\\n')}\\n`);\n}\n","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 { 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 // `optsWithGlobals()`, not `opts()`: a global flag (e.g. `--json`) declared on\n // both a command and its parent binds to the parent in commander, so a nested\n // subcommand (`vg models uninstall … --json`) would otherwise never see it.\n const o = cmd.optsWithGlobals() as 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 fast?: boolean;\n index?: boolean;\n analysisTier?: 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('--fast', 'skip precise tsc resolve (heuristic only — faster XL cold builds)')\n .option('--no-index', 'do not write the SQLite serve index under .vibgrate/cache/')\n .option('--analysis-tier <tier>', 'force analysis tier: full | large | xl (default: auto)')\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 interface RunBuildHooks {\n /** Invoked during the parse phase (even under --quiet / non-TTY hosts). */\n onParseProgress?: (done: number, total: number) => void;\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n hooks?: RunBuildHooks,\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). Hosts can still receive progress via hooks.onParseProgress.\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 const tierRaw = opts.analysisTier?.toLowerCase();\n const analysisTier =\n tierRaw === 'full' || tierRaw === 'large' || tierRaw === 'xl' ? tierRaw : undefined;\n if (opts.analysisTier && !analysisTier) {\n throw usageError(`--analysis-tier must be full, large, or xl (got \"${opts.analysisTier}\")`);\n }\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 fast: opts.fast === true,\n noIndex: opts.index === false,\n analysisTier,\n generatedAt: global.generatedAt,\n onParseProgress: (done, total) => {\n bar?.update(done, total);\n hooks?.onParseProgress?.(done, total);\n },\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"]}
|
|
@@ -201,6 +201,8 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
201
201
|
"Carthage",
|
|
202
202
|
// Carthage (iOS/macOS)
|
|
203
203
|
// ── Python — virtualenvs & tool caches ──
|
|
204
|
+
// Exact names only; custom-named envs (`.venv-foo`) and `site-packages`
|
|
205
|
+
// are handled by {@link isSkippedDirName}.
|
|
204
206
|
".venv",
|
|
205
207
|
"venv",
|
|
206
208
|
"virtualenv",
|
|
@@ -240,6 +242,13 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
240
242
|
"cdk.out",
|
|
241
243
|
".aws-sam"
|
|
242
244
|
]);
|
|
245
|
+
function isSkippedDirName(name) {
|
|
246
|
+
if (!name) return false;
|
|
247
|
+
if (SKIP_DIRS.has(name)) return true;
|
|
248
|
+
if (name.startsWith(".venv") || name.startsWith("venv-")) return true;
|
|
249
|
+
if (name === "site-packages") return true;
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
243
252
|
var SKIP_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
244
253
|
// Fonts
|
|
245
254
|
".woff",
|
|
@@ -524,7 +533,7 @@ var FileCache = class _FileCache {
|
|
|
524
533
|
const relPath = path2.relative(rootDir, absPath);
|
|
525
534
|
if (isExcluded && isExcluded(relPath)) continue;
|
|
526
535
|
if (e.isDirectory()) {
|
|
527
|
-
if (
|
|
536
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
528
537
|
if (isGitignored(levels, absPath, true)) continue;
|
|
529
538
|
results.push({ absPath, relPath, name: e.name, isFile: false, isDirectory: true });
|
|
530
539
|
subWalks.push(walk(absPath, levels));
|
|
@@ -770,7 +779,7 @@ async function quickTreeCount(rootDir, excludePatterns) {
|
|
|
770
779
|
const relPath = path2.relative(rootDir, absPath);
|
|
771
780
|
if (isExcluded && isExcluded(relPath)) continue;
|
|
772
781
|
if (e.isDirectory()) {
|
|
773
|
-
if (
|
|
782
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
774
783
|
if (isGitignored(levels, absPath, true)) continue;
|
|
775
784
|
totalDirs++;
|
|
776
785
|
subs.push(count(absPath, levels));
|
|
@@ -833,7 +842,7 @@ async function countFilesInDir(dir, recursive = true) {
|
|
|
833
842
|
for (const e of entries) {
|
|
834
843
|
if (e.isDirectory()) {
|
|
835
844
|
if (!recursive) continue;
|
|
836
|
-
if (
|
|
845
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
837
846
|
subs.push(walk(path2.join(currentDir, e.name)));
|
|
838
847
|
} else if (e.isFile()) {
|
|
839
848
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -859,7 +868,7 @@ async function bytesInDir(dir, recursive = true) {
|
|
|
859
868
|
for (const e of entries) {
|
|
860
869
|
if (e.isDirectory()) {
|
|
861
870
|
if (!recursive) continue;
|
|
862
|
-
if (
|
|
871
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
863
872
|
subs.push(walk(path2.join(currentDir, e.name)));
|
|
864
873
|
} else if (e.isFile()) {
|
|
865
874
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -891,7 +900,7 @@ async function findFiles(rootDir, predicate) {
|
|
|
891
900
|
const subDirectoryWalks = [];
|
|
892
901
|
for (const e of entries) {
|
|
893
902
|
if (e.isDirectory()) {
|
|
894
|
-
if (
|
|
903
|
+
if (isSkippedDirName(e.name)) continue;
|
|
895
904
|
subDirectoryWalks.push(walk(path2.join(dir, e.name)));
|
|
896
905
|
} else if (e.isFile() && predicate(e.name)) {
|
|
897
906
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -942,6 +951,6 @@ async function writeTextFile(filePath, content) {
|
|
|
942
951
|
await fs.writeFile(filePath, content, "utf8");
|
|
943
952
|
}
|
|
944
953
|
|
|
945
|
-
export { FileCache, SKIP_DIRS, SOURCE_EXCLUDE_FILES, Semaphore, bytesInDir, countFilesInDir, ensureDir, findCsprojFiles, findFiles, findPackageJsonFiles, findSolutionFiles, normalizeGlobForRipgrep, parseExcludePatterns, pathExists, quickTreeCount, readJsonFile, readTextFile, stripBom, writeJsonFile, writeTextFile };
|
|
946
|
-
//# sourceMappingURL=chunk-
|
|
947
|
-
//# sourceMappingURL=chunk-
|
|
954
|
+
export { FileCache, SKIP_DIRS, SOURCE_EXCLUDE_FILES, Semaphore, bytesInDir, countFilesInDir, ensureDir, findCsprojFiles, findFiles, findPackageJsonFiles, findSolutionFiles, isSkippedDirName, normalizeGlobForRipgrep, parseExcludePatterns, pathExists, quickTreeCount, readJsonFile, readTextFile, stripBom, writeJsonFile, writeTextFile };
|
|
955
|
+
//# sourceMappingURL=chunk-DT4KIVRI.js.map
|
|
956
|
+
//# sourceMappingURL=chunk-DT4KIVRI.js.map
|