@vibgrate/cli 2026.727.2 → 2026.727.4

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.
Files changed (101) hide show
  1. package/DOCS.md +21 -1
  2. package/README.md +2 -1
  3. package/dist/baseline-ENCOSJYQ.js +8 -0
  4. package/dist/{baseline-TG4ATZGZ.js.map → baseline-ENCOSJYQ.js.map} +1 -1
  5. package/dist/chunk-3SDV6ADQ.js +78 -0
  6. package/dist/chunk-3SDV6ADQ.js.map +1 -0
  7. package/dist/{chunk-LKVMI67M.js → chunk-6AXHLQBV.js} +220 -23
  8. package/dist/chunk-6AXHLQBV.js.map +1 -0
  9. package/dist/{chunk-6ABXHZRN.js → chunk-6UK6QPTR.js} +69 -70
  10. package/dist/chunk-6UK6QPTR.js.map +1 -0
  11. package/dist/{chunk-TCDAZZNP.js → chunk-77LYGXBI.js} +5 -5
  12. package/dist/{chunk-TCDAZZNP.js.map → chunk-77LYGXBI.js.map} +1 -1
  13. package/dist/{chunk-2XQDMLKB.js → chunk-B3YUO3NW.js} +7 -3
  14. package/dist/chunk-B3YUO3NW.js.map +1 -0
  15. package/dist/{chunk-RNP3SMTV.js → chunk-FPEOIS7K.js} +61 -26
  16. package/dist/chunk-FPEOIS7K.js.map +1 -0
  17. package/dist/{chunk-OOIG3RUM.js → chunk-GYSOQH5C.js} +18 -79
  18. package/dist/chunk-GYSOQH5C.js.map +1 -0
  19. package/dist/{chunk-6AYDFFP5.js → chunk-HK3AWUXH.js} +3 -3
  20. package/dist/{chunk-6AYDFFP5.js.map → chunk-HK3AWUXH.js.map} +1 -1
  21. package/dist/{chunk-EX4PQT6W.js → chunk-HYRAILGM.js} +4 -4
  22. package/dist/{chunk-EX4PQT6W.js.map → chunk-HYRAILGM.js.map} +1 -1
  23. package/dist/{chunk-NDMDSPFX.js → chunk-KKRSQQ3A.js} +4 -3
  24. package/dist/chunk-KKRSQQ3A.js.map +1 -0
  25. package/dist/chunk-KUIBP3LU.js +101 -0
  26. package/dist/chunk-KUIBP3LU.js.map +1 -0
  27. package/dist/{chunk-OFUC6RYN.js → chunk-KXSKFQMI.js} +6 -99
  28. package/dist/chunk-KXSKFQMI.js.map +1 -0
  29. package/dist/{chunk-KCKYKDMS.js → chunk-LJP2EPKM.js} +20 -17
  30. package/dist/chunk-LJP2EPKM.js.map +1 -0
  31. package/dist/{chunk-J4RFRKZH.js → chunk-MAUJTPQW.js} +8 -8
  32. package/dist/{chunk-J4RFRKZH.js.map → chunk-MAUJTPQW.js.map} +1 -1
  33. package/dist/{chunk-3Q7QBWFW.js → chunk-ON25BX6T.js} +9 -3
  34. package/dist/chunk-ON25BX6T.js.map +1 -0
  35. package/dist/{chunk-3V24O47U.js → chunk-PVZBYZZR.js} +19 -9
  36. package/dist/chunk-PVZBYZZR.js.map +1 -0
  37. package/dist/{chunk-CY4WKXB2.js → chunk-R6ZRVVZT.js} +4 -4
  38. package/dist/{chunk-CY4WKXB2.js.map → chunk-R6ZRVVZT.js.map} +1 -1
  39. package/dist/{chunk-WGUL45AV.js → chunk-T3AYRS7J.js} +14 -7
  40. package/dist/chunk-T3AYRS7J.js.map +1 -0
  41. package/dist/{chunk-2MBL43EJ.js → chunk-XPJZTSY7.js} +3 -3
  42. package/dist/{chunk-2MBL43EJ.js.map → chunk-XPJZTSY7.js.map} +1 -1
  43. package/dist/chunk-YCJIIGLP.js +356 -0
  44. package/dist/chunk-YCJIIGLP.js.map +1 -0
  45. package/dist/{chunk-KNELIQJO.js → chunk-YKVH2PGF.js} +640 -208
  46. package/dist/chunk-YKVH2PGF.js.map +1 -0
  47. package/dist/{chunk-KSBHGWRV.js → chunk-ZBTY6VV4.js} +4 -4
  48. package/dist/{chunk-KSBHGWRV.js.map → chunk-ZBTY6VV4.js.map} +1 -1
  49. package/dist/{chunk-K3MZIVZW.js → chunk-ZKNB4YH4.js} +19 -5
  50. package/dist/chunk-ZKNB4YH4.js.map +1 -0
  51. package/dist/cli.js +476 -393
  52. package/dist/cli.js.map +1 -1
  53. package/dist/{graph-backend-73URGTFY.js → graph-backend-UTOL3SHE.js} +5 -5
  54. package/dist/{graph-backend-73URGTFY.js.map → graph-backend-UTOL3SHE.js.map} +1 -1
  55. package/dist/index.d.ts +12 -5
  56. package/dist/index.js +12 -11
  57. package/dist/index.js.map +1 -1
  58. package/dist/{interactive-372NLI5C.js → interactive-SMHVURYK.js} +54 -24
  59. package/dist/interactive-SMHVURYK.js.map +1 -0
  60. package/dist/load-QPOWQD7C.js +8 -0
  61. package/dist/{load-I333TGNI.js.map → load-QPOWQD7C.js.map} +1 -1
  62. package/dist/model-manager-PN7HEDXD.js +9 -0
  63. package/dist/{model-orchestrator-TVONAUPS.js.map → model-manager-PN7HEDXD.js.map} +1 -1
  64. package/dist/{model-orchestrator-TVONAUPS.js → model-orchestrator-4VSYP4J4.js} +3 -3
  65. package/dist/model-orchestrator-4VSYP4J4.js.map +1 -0
  66. package/dist/parse-worker.d.ts +1 -1
  67. package/dist/parse-worker.js +1 -1
  68. package/dist/resolve-gguf-Y6FH3CNB.js +9 -0
  69. package/dist/{resolve-gguf-VPL4YQ6J.js.map → resolve-gguf-Y6FH3CNB.js.map} +1 -1
  70. package/dist/{runtime-session-JRKCQUHY.js → runtime-session-4AMZIAAG.js} +7 -7
  71. package/dist/{runtime-session-JRKCQUHY.js.map → runtime-session-4AMZIAAG.js.map} +1 -1
  72. package/dist/session-W3646AOV.js +12 -0
  73. package/dist/{session-ITPYQ5XI.js.map → session-W3646AOV.js.map} +1 -1
  74. package/dist/sql-extract-JELDZA6W.js +81 -0
  75. package/dist/sql-extract-JELDZA6W.js.map +1 -0
  76. package/dist/{stream-json-SLMDKLXP.js → stream-json-X7UQFB4T.js} +11 -10
  77. package/dist/stream-json-X7UQFB4T.js.map +1 -0
  78. package/dist/{types-7AHBUbFm.d.ts → types-DLH-Ritr.d.ts} +18 -1
  79. package/dist/{vgd-7JV5KCNJ.js → vgd-CVLKBS7K.js} +6 -6
  80. package/dist/vgd-CVLKBS7K.js.map +1 -0
  81. package/package.json +1 -1
  82. package/dist/baseline-TG4ATZGZ.js +0 -8
  83. package/dist/chunk-2XQDMLKB.js.map +0 -1
  84. package/dist/chunk-3Q7QBWFW.js.map +0 -1
  85. package/dist/chunk-3V24O47U.js.map +0 -1
  86. package/dist/chunk-6ABXHZRN.js.map +0 -1
  87. package/dist/chunk-K3MZIVZW.js.map +0 -1
  88. package/dist/chunk-KCKYKDMS.js.map +0 -1
  89. package/dist/chunk-KNELIQJO.js.map +0 -1
  90. package/dist/chunk-LKVMI67M.js.map +0 -1
  91. package/dist/chunk-NDMDSPFX.js.map +0 -1
  92. package/dist/chunk-OFUC6RYN.js.map +0 -1
  93. package/dist/chunk-OOIG3RUM.js.map +0 -1
  94. package/dist/chunk-RNP3SMTV.js.map +0 -1
  95. package/dist/chunk-WGUL45AV.js.map +0 -1
  96. package/dist/interactive-372NLI5C.js.map +0 -1
  97. package/dist/load-I333TGNI.js +0 -8
  98. package/dist/resolve-gguf-VPL4YQ6J.js +0 -8
  99. package/dist/session-ITPYQ5XI.js +0 -11
  100. package/dist/stream-json-SLMDKLXP.js.map +0 -1
  101. package/dist/vgd-7JV5KCNJ.js.map +0 -1
package/DOCS.md CHANGED
@@ -31,6 +31,7 @@ For a quick overview, see the [README](./README.md). This document covers everyt
31
31
  - [Code Graph Commands](#code-graph-commands)
32
32
  - [vg ask](#vg-ask)
33
33
  - [vg build](#vg-build)
34
+ - [vg watch](#vg-watch)
34
35
  - [vg bundle](#vg-bundle)
35
36
  - [vg code](#vg-code)
36
37
  - [vg embed](#vg-embed)
@@ -677,6 +678,25 @@ Maps source code into a graph artifact, enabling all downstream queries (`vg sho
677
678
 
678
679
  ---
679
680
 
681
+
682
+ ### vg watch
683
+
684
+ Rebuild the code map when source files change (debounced). Useful for long agent sessions.
685
+
686
+ ```bash
687
+ vg watch
688
+ vg watch src/ --fast
689
+ ```
690
+
691
+ | Flag | Default | Description |
692
+ |------|---------|-------------|
693
+ | `[paths...]` | `.` | Folders to watch |
694
+ | `--debounce <ms>` | `400` | Settle time after a change before rebuild |
695
+ | `--fast` | — | Skip precise TypeScript resolve on rebuilds |
696
+ | `--no-html` | — | Do not rewrite `graph.html` |
697
+ | `--no-report` | — | Do not rewrite `GRAPH_REPORT.md` |
698
+
699
+
680
700
  ### vg bundle
681
701
 
682
702
  Build an air-gapped bundle — grammars, the code graph, and the library catalog — for use on a machine with no network.
@@ -866,7 +886,7 @@ Deterministic open facts for a node (contract, invariant, characterization).
866
886
  vg facts <name>
867
887
  ```
868
888
 
869
- Epistemic-typed: declared/static → observed/derived. Requires `--deep` for derived facts beyond basic declarations.
889
+ Epistemic-typed: declared/static → observed/derived. Open facts (contract / invariant / characterization) ship on every build.
870
890
 
871
891
  | Flag | Description |
872
892
  |------|-------------|
package/README.md CHANGED
@@ -103,7 +103,7 @@ Browse all 21+ supported assistants and their skill descriptions at **[vibgrate.
103
103
  - **get_graph_summary** — code map overview: counts, languages, top areas and hubs.
104
104
  - **list_areas** — code areas (communities) by size.
105
105
  - **list_hubs** — most-depended-on symbols.
106
- - **get_facts** — deterministic facts for a node (contract/invariant; needs a `--deep` build).
106
+ - **get_facts** — deterministic facts for a node (contract / invariant / characterization).
107
107
  - **guide_node** — cited standards and practices for a node (OWASP/CWE).
108
108
  - **check_drift** — offline dependency inventory with optional git who-added attribution.
109
109
  - **vuln_attribution** — who introduced each open vulnerability, exposure windows, CRA remediation metrics.
@@ -316,6 +316,7 @@ Under each set, commands are listed A–Z. A short **typical path** (usual order
316
316
  | `vg models` | Code Modes (Spark / Flow / Forge) + local fleet (Ollama / LM Studio / gguf); `install` / `pull` by default (`--dry-run` to preview) |
317
317
  | `vg path <from> <to>` | How A connects to B (shortest path) |
318
318
  | `vg savings` | Local report of tokens/$ saved vs a grep baseline (estimates) |
319
+ | `vg watch` | Rebuild the map when files change |
319
320
  | `vg serve` | Start **Vibgrate AI Context** (local-first MCP: code map + drift + version-correct docs) |
320
321
  | `vg share` | Make the graph committable + auto-updating for your team |
321
322
  | `vg show <file>` | Explain a node: what it is, what it calls, what calls it |
@@ -0,0 +1,8 @@
1
+ export { baselineCommand, runBaseline } from './chunk-HYRAILGM.js';
2
+ import './chunk-T3AYRS7J.js';
3
+ import './chunk-CRAMOEBE.js';
4
+ import './chunk-RXP66R2E.js';
5
+ import './chunk-GI6W53LM.js';
6
+ import './chunk-DGUM43GV.js';
7
+ //# sourceMappingURL=baseline-ENCOSJYQ.js.map
8
+ //# sourceMappingURL=baseline-ENCOSJYQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"baseline-TG4ATZGZ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"baseline-ENCOSJYQ.js"}
@@ -0,0 +1,78 @@
1
+ import { listCachedWeights } from './chunk-GYSOQH5C.js';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+
6
+ function discoverModels(home = os.homedir()) {
7
+ return [...ollama(home), ...lmStudio(home), ...looseGguf(home), ...vibgrateWeightStore()].sort(
8
+ (a, b) => a.runtime.localeCompare(b.runtime) || a.name.localeCompare(b.name)
9
+ );
10
+ }
11
+ function vibgrateWeightStore() {
12
+ return listCachedWeights().map((w) => ({ runtime: "gguf", name: w.name, path: w.path }));
13
+ }
14
+ function ollama(home) {
15
+ const base = path.join(home, ".ollama", "models", "manifests");
16
+ const out = [];
17
+ walk(base, 4, (file) => {
18
+ const rel = path.relative(base, file).split(path.sep);
19
+ if (rel.length >= 2) {
20
+ const tag = rel[rel.length - 1];
21
+ const model = rel[rel.length - 2];
22
+ out.push({ runtime: "ollama", name: `${model}:${tag}`, path: file });
23
+ }
24
+ });
25
+ return dedupe(out);
26
+ }
27
+ function lmStudio(home) {
28
+ const bases = [path.join(home, ".lmstudio", "models"), path.join(home, ".cache", "lm-studio", "models")];
29
+ const out = [];
30
+ for (const base of bases) {
31
+ walk(base, 5, (file) => {
32
+ if (!file.endsWith(".gguf")) return;
33
+ const rel = path.relative(base, file).replace(/\\/g, "/");
34
+ out.push({ runtime: "lm-studio", name: rel, path: file });
35
+ });
36
+ }
37
+ return dedupe(out);
38
+ }
39
+ function looseGguf(home) {
40
+ const bases = [path.join(home, "models"), path.join(home, ".cache", "huggingface")];
41
+ const out = [];
42
+ for (const base of bases) {
43
+ walk(base, 4, (file) => {
44
+ if (!file.endsWith(".gguf")) return;
45
+ out.push({ runtime: "gguf", name: path.basename(file), path: file });
46
+ });
47
+ }
48
+ return dedupe(out);
49
+ }
50
+ function walk(dir, depth, onFile) {
51
+ if (depth < 0) return;
52
+ let entries;
53
+ try {
54
+ entries = fs.readdirSync(dir, { withFileTypes: true });
55
+ } catch {
56
+ return;
57
+ }
58
+ for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {
59
+ const abs = path.join(dir, e.name);
60
+ if (e.isDirectory()) walk(abs, depth - 1, onFile);
61
+ else if (e.isFile()) onFile(abs);
62
+ }
63
+ }
64
+ function dedupe(models) {
65
+ const seen = /* @__PURE__ */ new Set();
66
+ const out = [];
67
+ for (const m of models) {
68
+ const key = `${m.runtime}:${m.name}`;
69
+ if (seen.has(key)) continue;
70
+ seen.add(key);
71
+ out.push(m);
72
+ }
73
+ return out;
74
+ }
75
+
76
+ export { discoverModels };
77
+ //# sourceMappingURL=chunk-3SDV6ADQ.js.map
78
+ //# sourceMappingURL=chunk-3SDV6ADQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/models.ts"],"names":[],"mappings":"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","file":"chunk-3SDV6ADQ.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { listCachedWeights } from '../runtime/weight-store.js';\n\n/**\n * Local-model discovery (VG-LOCAL-MODELS §9.2) — be a no-key *consumer* of the\n * developer's local model fleet. Fully offline and deterministic: inspect the\n * on-disk layouts of Ollama / LM Studio / llama.cpp / the Vibgrate weight store,\n * never the network. No runtime is built or launched.\n */\n\nexport interface LocalModel {\n runtime: 'ollama' | 'lm-studio' | 'gguf';\n name: string;\n path: string;\n}\n\nexport function discoverModels(home = os.homedir()): LocalModel[] {\n return [...ollama(home), ...lmStudio(home), ...looseGguf(home), ...vibgrateWeightStore()].sort(\n (a, b) => a.runtime.localeCompare(b.runtime) || a.name.localeCompare(b.name),\n );\n}\n\n/** First-party GGUF cache (runtime/weight-store.ts). */\nfunction vibgrateWeightStore(): LocalModel[] {\n return listCachedWeights().map((w) => ({ runtime: 'gguf' as const, name: w.name, path: w.path }));\n}\n\nfunction ollama(home: string): LocalModel[] {\n const base = path.join(home, '.ollama', 'models', 'manifests');\n const out: LocalModel[] = [];\n walk(base, 4, (file) => {\n // .../library/<model>/<tag>\n const rel = path.relative(base, file).split(path.sep);\n if (rel.length >= 2) {\n const tag = rel[rel.length - 1];\n const model = rel[rel.length - 2];\n out.push({ runtime: 'ollama', name: `${model}:${tag}`, path: file });\n }\n });\n return dedupe(out);\n}\n\nfunction lmStudio(home: string): LocalModel[] {\n const bases = [path.join(home, '.lmstudio', 'models'), path.join(home, '.cache', 'lm-studio', 'models')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 5, (file) => {\n if (!file.endsWith('.gguf')) return;\n const rel = path.relative(base, file).replace(/\\\\/g, '/');\n out.push({ runtime: 'lm-studio', name: rel, path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction looseGguf(home: string): LocalModel[] {\n const bases = [path.join(home, 'models'), path.join(home, '.cache', 'huggingface')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 4, (file) => {\n if (!file.endsWith('.gguf')) return;\n out.push({ runtime: 'gguf', name: path.basename(file), path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction walk(dir: string, depth: number, onFile: (file: string) => void): void {\n if (depth < 0) 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.sort((a, b) => a.name.localeCompare(b.name))) {\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) walk(abs, depth - 1, onFile);\n else if (e.isFile()) onFile(abs);\n }\n}\n\nfunction dedupe(models: LocalModel[]): LocalModel[] {\n const seen = new Set<string>();\n const out: LocalModel[] = [];\n for (const m of models) {\n const key = `${m.runtime}:${m.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(m);\n }\n return out;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { stableStringify } from './chunk-K3MZIVZW.js';
1
+ import { stableStringify } from './chunk-ZKNB4YH4.js';
2
2
  import { shortId, canonicalize, hashString } from './chunk-JFGYT6BI.js';
3
3
  import * as fs4 from 'fs';
4
4
  import * as path4 from 'path';
@@ -1241,20 +1241,95 @@ function npmPackageDir(root, name) {
1241
1241
  }
1242
1242
  return void 0;
1243
1243
  }
1244
- function localPackageDocs(root, name) {
1244
+ var README_CANDIDATES = ["llms.txt", "README.md", "README.mdx", "README", "readme.md"];
1245
+ function packageDocsMarkdown(dir, query) {
1246
+ const docsDir = path4.join(dir, "docs");
1247
+ if (!fs4.existsSync(docsDir) || !fs4.statSync(docsDir).isDirectory()) return void 0;
1248
+ const files = [];
1249
+ const walk = (d, depth) => {
1250
+ if (depth > 3 || files.length >= 40) return;
1251
+ let entries;
1252
+ try {
1253
+ entries = fs4.readdirSync(d, { withFileTypes: true });
1254
+ } catch {
1255
+ return;
1256
+ }
1257
+ entries.sort((a, b) => a.name.localeCompare(b.name));
1258
+ for (const e of entries) {
1259
+ if (files.length >= 40) return;
1260
+ const full = path4.join(d, e.name);
1261
+ if (e.isDirectory()) {
1262
+ if (e.name.startsWith(".") || e.name === "node_modules") continue;
1263
+ walk(full, depth + 1);
1264
+ } else if (e.isFile() && /\.(md|mdx)$/i.test(e.name)) {
1265
+ files.push(full);
1266
+ }
1267
+ }
1268
+ };
1269
+ walk(docsDir, 0);
1270
+ if (!files.length) return void 0;
1271
+ const terms = (query ?? "").toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length > 2);
1272
+ const scored = files.map((f) => {
1273
+ let body = "";
1274
+ try {
1275
+ body = fs4.readFileSync(f, "utf8");
1276
+ } catch {
1277
+ return { f, body: "", score: -1 };
1278
+ }
1279
+ const lc = `${path4.basename(f)}
1280
+ ${body}`.toLowerCase();
1281
+ const score = terms.length ? terms.filter((t) => lc.includes(t)).length : 1;
1282
+ return { f, body, score };
1283
+ });
1284
+ const picked = (terms.length ? scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score || a.f.localeCompare(b.f)) : scored).filter((s) => s.body.trim()).slice(0, terms.length ? 8 : 5);
1285
+ if (!picked.length) return void 0;
1286
+ const text = picked.map((s) => `<!-- ${path4.relative(dir, s.f).split(path4.sep).join("/")} -->
1287
+ ${s.body.trim()}`).join("\n\n");
1288
+ return {
1289
+ text,
1290
+ files: picked.map((s) => path4.relative(dir, s.f).split(path4.sep).join("/"))
1291
+ };
1292
+ }
1293
+ function localPackageDocs(root, name, opts) {
1245
1294
  const dir = npmPackageDir(root, name);
1246
1295
  if (!dir) return void 0;
1247
1296
  const version = resolveVersion(root, name).served;
1248
- for (const f of ["llms.txt", "README.md", "README.mdx", "README", "readme.md"]) {
1297
+ let primary;
1298
+ for (const f of README_CANDIDATES) {
1249
1299
  const p = path4.join(dir, f);
1250
1300
  try {
1251
1301
  const docs = fs4.readFileSync(p, "utf8");
1252
1302
  if (docs.trim()) {
1253
- return { docs, version, source: path4.relative(root, p).split(path4.sep).join("/") };
1303
+ primary = { docs, source: path4.relative(root, p).split(path4.sep).join("/") };
1304
+ break;
1254
1305
  }
1255
1306
  } catch {
1256
1307
  }
1257
1308
  }
1309
+ const extra = packageDocsMarkdown(dir, opts?.query);
1310
+ if (primary && extra) {
1311
+ return {
1312
+ docs: `${primary.docs.trim()}
1313
+
1314
+ ## Package docs
1315
+
1316
+ ${extra.text}`,
1317
+ version,
1318
+ source: `${primary.source}+docs/`,
1319
+ readmeOnly: false
1320
+ };
1321
+ }
1322
+ if (primary) {
1323
+ return { ...primary, version, readmeOnly: true };
1324
+ }
1325
+ if (extra) {
1326
+ return {
1327
+ docs: extra.text,
1328
+ version,
1329
+ source: path4.relative(root, path4.join(dir, "docs")).split(path4.sep).join("/") + "/",
1330
+ readmeOnly: false
1331
+ };
1332
+ }
1258
1333
  try {
1259
1334
  const pkg = JSON.parse(fs4.readFileSync(path4.join(dir, "package.json"), "utf8"));
1260
1335
  if (pkg.description?.trim()) {
@@ -1263,35 +1338,104 @@ function localPackageDocs(root, name) {
1263
1338
 
1264
1339
  ${pkg.description}`,
1265
1340
  version: version ?? pkg.version,
1266
- source: path4.relative(root, path4.join(dir, "package.json")).split(path4.sep).join("/")
1341
+ source: path4.relative(root, path4.join(dir, "package.json")).split(path4.sep).join("/"),
1342
+ readmeOnly: true
1267
1343
  };
1268
1344
  }
1269
1345
  } catch {
1270
1346
  }
1271
1347
  return void 0;
1272
1348
  }
1349
+ function typesFromPkg(dir, pkg) {
1350
+ const tryRel = (rel) => {
1351
+ if (typeof rel !== "string") return void 0;
1352
+ const p = path4.join(dir, rel);
1353
+ return fs4.existsSync(p) ? p : void 0;
1354
+ };
1355
+ const top = tryRel(pkg.types) ?? tryRel(pkg.typings);
1356
+ if (top) return top;
1357
+ const exp = pkg.exports;
1358
+ if (!exp || typeof exp !== "object") return void 0;
1359
+ const roots = [];
1360
+ if ("." in exp) roots.push(exp["."]);
1361
+ else roots.push(...Object.values(exp));
1362
+ for (const entry of roots) {
1363
+ if (typeof entry === "string") {
1364
+ const hit = tryRel(entry.endsWith(".d.ts") ? entry : void 0);
1365
+ if (hit) return hit;
1366
+ continue;
1367
+ }
1368
+ if (entry && typeof entry === "object") {
1369
+ const o = entry;
1370
+ for (const key of ["types", "typings", "import", "require", "default"]) {
1371
+ const v = o[key];
1372
+ if (typeof v === "string") {
1373
+ const hit = tryRel(v.endsWith(".ts") || v.endsWith(".d.ts") || v.endsWith(".mts") || v.endsWith(".cts") ? v : void 0);
1374
+ if (hit) return hit;
1375
+ } else if (v && typeof v === "object" && typeof v.types === "string") {
1376
+ const hit = tryRel(v.types);
1377
+ if (hit) return hit;
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+ return void 0;
1383
+ }
1273
1384
  function dtsEntry(dir) {
1274
1385
  try {
1275
1386
  const pkg = JSON.parse(fs4.readFileSync(path4.join(dir, "package.json"), "utf8"));
1276
- const rel = pkg.types ?? pkg.typings;
1277
- if (typeof rel === "string") {
1278
- const p = path4.join(dir, rel);
1279
- if (fs4.existsSync(p)) return p;
1280
- }
1387
+ const fromPkg = typesFromPkg(dir, pkg);
1388
+ if (fromPkg) return fromPkg;
1281
1389
  } catch {
1282
1390
  }
1283
- for (const c of ["index.d.ts", "dist/index.d.ts", "lib/index.d.ts", "types/index.d.ts"]) {
1391
+ for (const c of [
1392
+ "index.d.ts",
1393
+ "dist/index.d.ts",
1394
+ "dist/types/index.d.ts",
1395
+ "lib/index.d.ts",
1396
+ "types/index.d.ts",
1397
+ "build/index.d.ts"
1398
+ ]) {
1284
1399
  const p = path4.join(dir, c);
1285
1400
  if (fs4.existsSync(p)) return p;
1286
1401
  }
1287
1402
  return void 0;
1288
1403
  }
1404
+ var MAX_DTS_FILES = 30;
1405
+ var MAX_DTS_BYTES = 512e3;
1406
+ function collectDtsFiles(dir) {
1407
+ const out = [];
1408
+ const walk = (d, depth) => {
1409
+ if (depth > 4 || out.length >= MAX_DTS_FILES) return;
1410
+ let entries;
1411
+ try {
1412
+ entries = fs4.readdirSync(d, { withFileTypes: true });
1413
+ } catch {
1414
+ return;
1415
+ }
1416
+ entries.sort((a, b) => a.name.localeCompare(b.name));
1417
+ for (const e of entries) {
1418
+ if (out.length >= MAX_DTS_FILES) return;
1419
+ if (e.name === "node_modules" || e.name.startsWith(".")) continue;
1420
+ const full = path4.join(d, e.name);
1421
+ if (e.isDirectory()) walk(full, depth + 1);
1422
+ else if (e.isFile() && /\.d\.(ts|mts|cts)$/.test(e.name)) out.push(full);
1423
+ }
1424
+ };
1425
+ walk(dir, 0);
1426
+ return out;
1427
+ }
1289
1428
  function extractDtsApi(src, maxDecls = 200) {
1290
1429
  const out = [];
1291
1430
  let depth = 0;
1292
1431
  let capture = null;
1293
1432
  for (const raw of src.split("\n")) {
1294
1433
  const line = raw.trim();
1434
+ if (capture === null && depth === 0 && /^export\s+\{[^}]+\}/.test(line)) {
1435
+ out.push(raw.trim());
1436
+ if (out.length >= maxDecls) break;
1437
+ continue;
1438
+ }
1295
1439
  if (capture === null && depth === 0 && /^export\b/.test(line) && !/^export\s+(\{|\*|default\b|type\s+\{)/.test(line)) {
1296
1440
  capture = [];
1297
1441
  }
@@ -1308,19 +1452,72 @@ function extractDtsApi(src, maxDecls = 200) {
1308
1452
  }
1309
1453
  return out;
1310
1454
  }
1311
- function localApiSurface(root, name) {
1455
+ function reExportNames(decl) {
1456
+ const m = /^export\s*\{([^}]+)\}/.exec(decl.trim());
1457
+ if (!m) return [];
1458
+ const names = [];
1459
+ for (const part of m[1].split(",")) {
1460
+ const n = part.trim().split(/\s+as\s+/i).pop()?.trim();
1461
+ if (n && /^[A-Za-z_$][\w$]*$/.test(n)) names.push(n);
1462
+ }
1463
+ return names;
1464
+ }
1465
+ function localApiSurface(root, name, query) {
1312
1466
  const dir = npmPackageDir(root, name);
1313
1467
  if (!dir) return void 0;
1314
- const dts = dtsEntry(dir);
1315
- if (!dts) return void 0;
1316
- let src;
1317
- try {
1318
- src = fs4.readFileSync(dts, "utf8");
1319
- } catch {
1320
- return void 0;
1468
+ const entry = dtsEntry(dir);
1469
+ const files = entry ? [entry, ...collectDtsFiles(dir).filter((f) => f !== entry)] : collectDtsFiles(dir);
1470
+ if (!files.length) return void 0;
1471
+ const allDecls = [];
1472
+ const seen = /* @__PURE__ */ new Set();
1473
+ for (const f of files) {
1474
+ let src;
1475
+ try {
1476
+ const st = fs4.statSync(f);
1477
+ if (st.size > MAX_DTS_BYTES) continue;
1478
+ src = fs4.readFileSync(f, "utf8");
1479
+ } catch {
1480
+ continue;
1481
+ }
1482
+ for (const d of extractDtsApi(src)) {
1483
+ if (seen.has(d)) continue;
1484
+ seen.add(d);
1485
+ allDecls.push(d);
1486
+ if (allDecls.length >= 400) break;
1487
+ }
1488
+ if (allDecls.length >= 400) break;
1489
+ }
1490
+ if (!allDecls.length) return void 0;
1491
+ const terms = (query ?? "").split(/[^A-Za-z0-9_$]+/).filter((w) => w.length > 2);
1492
+ if (terms.length) {
1493
+ const lcTerms = terms.map((t) => t.toLowerCase());
1494
+ const matched = allDecls.filter((d) => {
1495
+ const lc = d.toLowerCase();
1496
+ return lcTerms.some((t) => lc.includes(t));
1497
+ });
1498
+ const expanded = [];
1499
+ const expandedSeen = /* @__PURE__ */ new Set();
1500
+ for (const d of matched) {
1501
+ const names = reExportNames(d);
1502
+ if (names.length) {
1503
+ for (const n of names) {
1504
+ const fuller = allDecls.find(
1505
+ (x) => !/^export\s*\{/.test(x) && new RegExp(`\\b${n}\\b`).test(x)
1506
+ );
1507
+ const pick = fuller ?? d;
1508
+ if (!expandedSeen.has(pick)) {
1509
+ expandedSeen.add(pick);
1510
+ expanded.push(pick);
1511
+ }
1512
+ }
1513
+ } else if (!expandedSeen.has(d)) {
1514
+ expandedSeen.add(d);
1515
+ expanded.push(d);
1516
+ }
1517
+ }
1518
+ if (expanded.length) return expanded.slice(0, 40).join("\n\n");
1321
1519
  }
1322
- const decls = extractDtsApi(src);
1323
- return decls.length ? decls.join("\n\n") : void 0;
1520
+ return allDecls.slice(0, 80).join("\n\n");
1324
1521
  }
1325
1522
  function cloneAndReadGit(url) {
1326
1523
  const dir = fs4.mkdtempSync(path4.join(os.tmpdir(), "vg-lib-git-"));
@@ -1691,5 +1888,5 @@ var EdgeSet = class {
1691
1888
  };
1692
1889
 
1693
1890
  export { ECOSYSTEMS, addLibrary, applyStaticTestLinkage, buildModuleResolver, catalogPath, driftFor, edgeId, enrichOnline, inventory, isTestFile, libDir, libId, loadCatalog, localApiSurface, localPackageDocs, nodeId, parseJsonc, readDoc, relativeResolver, resolve3 as resolve, resolveLib, resolveVersion, saveCatalog };
1694
- //# sourceMappingURL=chunk-LKVMI67M.js.map
1695
- //# sourceMappingURL=chunk-LKVMI67M.js.map
1891
+ //# sourceMappingURL=chunk-6AXHLQBV.js.map
1892
+ //# sourceMappingURL=chunk-6AXHLQBV.js.map