@vibgrate/cli 1.0.89 → 1.0.90

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.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  baselineCommand,
3
3
  runBaseline
4
- } from "./chunk-257KSYYQ.js";
5
- import "./chunk-V6ML65PC.js";
4
+ } from "./chunk-2VJCLUTR.js";
5
+ import "./chunk-XCIPC2J7.js";
6
6
  import "./chunk-JQHUH6A3.js";
7
7
  export {
8
8
  baselineCommand,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runScan
3
- } from "./chunk-V6ML65PC.js";
3
+ } from "./chunk-XCIPC2J7.js";
4
4
  import {
5
5
  writeJsonFile
6
6
  } from "./chunk-JQHUH6A3.js";
@@ -7241,7 +7241,6 @@ var ScanProgress = class {
7241
7241
  startTime = Date.now();
7242
7242
  isTTY;
7243
7243
  useLiveUpdates;
7244
- output;
7245
7244
  rootDir = "";
7246
7245
  /** Last rendered frame content (strip to compare for dirty-checking) */
7247
7246
  lastFrame = "";
@@ -7258,14 +7257,13 @@ var ScanProgress = class {
7258
7257
  /** Last emitted step snapshot for append-only output modes */
7259
7258
  lastLoggedStates = /* @__PURE__ */ new Map();
7260
7259
  constructor(rootDir) {
7261
- this.output = process.stderr.isTTY ? process.stderr : process.stdout;
7262
- this.isTTY = this.output.isTTY ?? false;
7260
+ this.isTTY = process.stderr.isTTY ?? false;
7263
7261
  this.useLiveUpdates = this.isTTY && process.env.VIBGRATE_PROGRESS_MODE !== "plain";
7264
7262
  this.rootDir = rootDir;
7265
7263
  if (this.isTTY) {
7266
7264
  const restore = () => {
7267
7265
  if (this.cursorHidden) {
7268
- this.output.write("\x1B[?25h");
7266
+ process.stderr.write("\x1B[?25h");
7269
7267
  this.cursorHidden = false;
7270
7268
  }
7271
7269
  };
@@ -7304,7 +7302,7 @@ var ScanProgress = class {
7304
7302
  ` ${ROBOT[3]} ${chalk4.dim(this.rootDir)}`,
7305
7303
  ""
7306
7304
  ].join("\n") + "\n";
7307
- this.output.write(header);
7305
+ process.stderr.write(header);
7308
7306
  if (this.useLiveUpdates) {
7309
7307
  this.startSpinner();
7310
7308
  }
@@ -7404,25 +7402,25 @@ var ScanProgress = class {
7404
7402
  buf += "\x1B[J";
7405
7403
  }
7406
7404
  buf += "\x1B[?25h";
7407
- if (buf) this.output.write(buf);
7405
+ if (buf) process.stderr.write(buf);
7408
7406
  this.cursorHidden = false;
7409
7407
  this.lastRowCount = 0;
7410
7408
  }
7411
7409
  const elapsed = this.formatElapsed(Date.now() - this.startTime);
7412
7410
  const doneCount = this.steps.filter((s) => s.status === "done").length;
7413
- this.output.write(
7411
+ process.stderr.write(
7414
7412
  chalk4.dim(` \u2714 ${doneCount} scanners completed in ${elapsed}
7415
7413
 
7416
7414
  `)
7417
7415
  );
7418
7416
  if (this.isTTY && process.platform === "win32") {
7419
- this.output.write("\x1B[0G\x1B[K");
7417
+ process.stdout.write("\x1B[0G\x1B[K");
7420
7418
  }
7421
7419
  }
7422
7420
  // ── Internal rendering ──
7423
7421
  startSpinner() {
7424
7422
  if (!this.cursorHidden) {
7425
- this.output.write("\x1B[?25l");
7423
+ process.stderr.write("\x1B[?25l");
7426
7424
  this.cursorHidden = true;
7427
7425
  }
7428
7426
  this.timer = setInterval(() => {
@@ -7438,6 +7436,10 @@ var ScanProgress = class {
7438
7436
  return;
7439
7437
  }
7440
7438
  const lines = [];
7439
+ for (const step of this.steps) {
7440
+ lines.push(this.renderStep(step));
7441
+ }
7442
+ lines.push("");
7441
7443
  const totalWeight = this.steps.reduce((sum, s) => sum + (s.weight ?? 1), 0);
7442
7444
  let completedWeight = 0;
7443
7445
  for (const step of this.steps) {
@@ -7467,10 +7469,6 @@ var ScanProgress = class {
7467
7469
  lines.push("");
7468
7470
  lines.push(this.renderStats());
7469
7471
  lines.push("");
7470
- for (const step of this.steps) {
7471
- lines.push(this.renderStep(step));
7472
- }
7473
- lines.push("");
7474
7472
  const content = lines.join("\n") + "\n";
7475
7473
  const rowCount = this.countRenderedRows(lines);
7476
7474
  if (content === this.lastFrame && this.lastRowCount === rowCount) {
@@ -7483,11 +7481,11 @@ var ScanProgress = class {
7483
7481
  buf += "\x1B[J";
7484
7482
  }
7485
7483
  buf += content;
7486
- this.output.write(buf);
7484
+ process.stderr.write(buf);
7487
7485
  this.lastRowCount = rowCount;
7488
7486
  }
7489
7487
  countRenderedRows(lines) {
7490
- const columns = Math.max(this.output.columns ?? 80, 20);
7488
+ const columns = Math.max(process.stderr.columns ?? 80, 20);
7491
7489
  return lines.reduce((total, line) => total + this.countWrappedRows(line, columns), 0);
7492
7490
  }
7493
7491
  countWrappedRows(line, columns) {
@@ -7584,19 +7582,19 @@ var ScanProgress = class {
7584
7582
  }
7585
7583
  this.lastLoggedStates.set(step.id, stateKey);
7586
7584
  if (step.status === "active") {
7587
- this.output.write(` \u25C9 ${step.label}...
7585
+ process.stderr.write(` \u25C9 ${step.label}...
7588
7586
  `);
7589
7587
  continue;
7590
7588
  }
7591
7589
  if (step.status === "done") {
7592
7590
  const detail = this.formatLoggedStepDetail(step);
7593
- this.output.write(` \u2714 ${step.label}${detail}
7591
+ process.stderr.write(` \u2714 ${step.label}${detail}
7594
7592
  `);
7595
7593
  continue;
7596
7594
  }
7597
7595
  if (step.status === "skipped") {
7598
7596
  const detail = step.detail ? ` \xB7 ${step.detail}` : "";
7599
- this.output.write(` \u25CC ${step.label}${detail}
7597
+ process.stderr.write(` \u25CC ${step.label}${detail}
7600
7598
  `);
7601
7599
  }
7602
7600
  }
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  baselineCommand
4
- } from "./chunk-257KSYYQ.js";
4
+ } from "./chunk-2VJCLUTR.js";
5
5
  import {
6
6
  VERSION,
7
7
  computeHmac,
@@ -12,7 +12,7 @@ import {
12
12
  pushCommand,
13
13
  scanCommand,
14
14
  writeDefaultConfig
15
- } from "./chunk-V6ML65PC.js";
15
+ } from "./chunk-XCIPC2J7.js";
16
16
  import {
17
17
  Semaphore,
18
18
  ensureDir,
@@ -42,7 +42,7 @@ var initCommand = new Command("init").description("Initialize vibgrate in a proj
42
42
  console.log(chalk.green("\u2714") + ` Created ${chalk.bold("vibgrate.config.ts")}`);
43
43
  }
44
44
  if (opts.baseline) {
45
- const { runBaseline } = await import("./baseline-BRTNOHRU.js");
45
+ const { runBaseline } = await import("./baseline-QZZXBT74.js");
46
46
  await runBaseline(rootDir);
47
47
  }
48
48
  console.log("");
@@ -213604,7 +213604,7 @@ var require_path_browserify = __commonJS({
213604
213604
  assertPath(path2);
213605
213605
  return path2.length > 0 && path2.charCodeAt(0) === 47;
213606
213606
  },
213607
- join: function join4() {
213607
+ join: function join5() {
213608
213608
  if (arguments.length === 0)
213609
213609
  return ".";
213610
213610
  var joined;
@@ -270264,7 +270264,7 @@ var require_Utils = __commonJS({
270264
270264
  return escapeSpaces ? s.replace(/ /, "\xB7") : s.replace(/\t/, "\\t").replace(/\n/, "\\n").replace(/\r/, "\\r");
270265
270265
  }
270266
270266
  exports.escapeWhitespace = escapeWhitespace;
270267
- function join4(collection, separator) {
270267
+ function join5(collection, separator) {
270268
270268
  let buf = "";
270269
270269
  let first = true;
270270
270270
  for (let current of collection) {
@@ -270277,7 +270277,7 @@ var require_Utils = __commonJS({
270277
270277
  }
270278
270278
  return buf;
270279
270279
  }
270280
- exports.join = join4;
270280
+ exports.join = join5;
270281
270281
  function equals(x, y) {
270282
270282
  if (x === y) {
270283
270283
  return true;
@@ -314101,16 +314101,35 @@ var import_ts_morph18 = __toESM(require_ts_morph(), 1);
314101
314101
 
314102
314102
  // src/facts/fact-emitter.ts
314103
314103
  init_esm_shims();
314104
- import { createHash } from "crypto";
314104
+ import { createHash, randomBytes } from "crypto";
314105
+ import { homedir, tmpdir } from "os";
314106
+ import { join } from "path";
314107
+ import { createReadStream, createWriteStream, unlinkSync } from "fs";
314108
+ import { createInterface } from "readline";
314109
+ var MIN_REF_FREQUENCY = 3;
314110
+ var MIN_REF_LENGTH = 20;
314111
+ var MAX_REFS = 15;
314105
314112
  var NdjsonFactEmitter = class {
314106
314113
  language = "typescript";
314107
314114
  scanner = "ts-morph";
314108
314115
  scannerVersion = "0.2.0";
314109
314116
  emittedAt;
314110
314117
  output;
314118
+ home;
314119
+ // Temp file used for streaming facts without full in-memory buffering
314120
+ tmpPath;
314121
+ tmpStream;
314122
+ // Model registry — tiny, bounded by unique (factType×language×scanner×version) combos
314123
+ modelsByKey = /* @__PURE__ */ new Map();
314124
+ modelCounter = 0;
314125
+ // Path frequency map — bounded by unique path prefix strings seen
314126
+ pathFreq = /* @__PURE__ */ new Map();
314111
314127
  constructor(output = process.stdout) {
314112
314128
  this.output = output;
314113
314129
  this.emittedAt = (/* @__PURE__ */ new Date()).toISOString();
314130
+ this.home = homedir();
314131
+ this.tmpPath = join(tmpdir(), `vibgrate-hcs-${randomBytes(8).toString("hex")}.ndjson.tmp`);
314132
+ this.tmpStream = createWriteStream(this.tmpPath, { encoding: "utf8" });
314114
314133
  }
314115
314134
  setLanguage(language) {
314116
314135
  this.language = language;
@@ -314167,7 +314186,6 @@ var NdjsonFactEmitter = class {
314167
314186
  emitAnnotationFound(p) {
314168
314187
  this.emit("AnnotationFound", `${p.targetSymbol}:${p.annotationType}`, p);
314169
314188
  }
314170
- // ── New ABI fact emitters ────────────────────────────────────────
314171
314189
  emitFileIndexed(p) {
314172
314190
  this.emit("FileIndexed", p.fileId, p);
314173
314191
  }
@@ -314193,7 +314211,6 @@ var NdjsonFactEmitter = class {
314193
314211
  const id = p.objectId ?? `${p.objectName}:${p.filePath}:${p.line}`;
314194
314212
  this.emit("SqlObjectDeclared", id, p);
314195
314213
  }
314196
- // ── Frontend / UI fact emitters ──────────────────────────────────
314197
314214
  emitComponentDeclared(p) {
314198
314215
  this.emit("ComponentDeclared", p.componentId, p);
314199
314216
  }
@@ -314209,7 +314226,6 @@ var NdjsonFactEmitter = class {
314209
314226
  emitHookDeclared(p) {
314210
314227
  this.emit("HookDeclared", p.hookId, p);
314211
314228
  }
314212
- // ── COBOL fact emitters ──────────────────────────────────────────
314213
314229
  emitCopybookResolved(p) {
314214
314230
  this.emit("CopybookResolved", p.copybookId, p);
314215
314231
  }
@@ -314237,24 +314253,128 @@ var NdjsonFactEmitter = class {
314237
314253
  emitCobolConfidenceReport(p) {
314238
314254
  this.emit("CobolConfidenceReport", p.programId, p);
314239
314255
  }
314240
- // ── Core emit ────────────────────────────────────────────
314256
+ // ── Core emit — streams to temp file ────────────────────
314241
314257
  emit(factType, idSeed, payload) {
314242
- const envelope = {
314243
- factId: this.generateFactId(factType, idSeed),
314244
- factType,
314245
- language: this.language,
314246
- scanner: this.scanner,
314247
- scannerVersion: this.scannerVersion,
314248
- emittedAt: this.emittedAt,
314249
- payload
314258
+ const strippedPayload = transformStrings(payload, (s) => stripHome(s, this.home));
314259
+ collectPathFrequencies(strippedPayload, this.pathFreq);
314260
+ const modelKey = `${factType}\0${this.language}\0${this.scanner}\0${this.scannerVersion}`;
314261
+ let model = this.modelsByKey.get(modelKey);
314262
+ if (!model) {
314263
+ model = {
314264
+ id: `m${this.modelCounter++}`,
314265
+ factType,
314266
+ language: this.language,
314267
+ scanner: this.scanner,
314268
+ scannerVersion: this.scannerVersion
314269
+ };
314270
+ this.modelsByKey.set(modelKey, model);
314271
+ }
314272
+ const line = {
314273
+ factId: generateFactId(factType, idSeed),
314274
+ m: model.id,
314275
+ payload: strippedPayload
314250
314276
  };
314251
- this.output.write(JSON.stringify(envelope) + "\n");
314277
+ this.tmpStream.write(JSON.stringify(line) + "\n");
314252
314278
  }
314253
- generateFactId(factType, seed) {
314254
- const hash = createHash("sha256").update(seed).digest("hex").substring(0, 16);
314255
- return `hcs:${factType}:${hash}`;
314279
+ // ── Flush: emit preamble then stream temp file ───────────
314280
+ async flush() {
314281
+ await new Promise((resolve3, reject) => {
314282
+ this.tmpStream.end((err) => err ? reject(err) : resolve3());
314283
+ });
314284
+ const refs = buildRefs(this.pathFreq);
314285
+ const models = [...this.modelsByKey.values()];
314286
+ const modelsFact = {
314287
+ factType: "Models",
314288
+ emittedAt: this.emittedAt,
314289
+ payload: { models }
314290
+ };
314291
+ this.output.write(JSON.stringify(modelsFact) + "\n");
314292
+ if (refs.length > 0) {
314293
+ const refsFact = {
314294
+ factType: "References",
314295
+ emittedAt: this.emittedAt,
314296
+ payload: { references: refs }
314297
+ };
314298
+ this.output.write(JSON.stringify(refsFact) + "\n");
314299
+ }
314300
+ await streamWithRefSubstitution(this.tmpPath, refs, this.output);
314301
+ try {
314302
+ unlinkSync(this.tmpPath);
314303
+ } catch {
314304
+ }
314256
314305
  }
314257
314306
  };
314307
+ function generateFactId(factType, seed) {
314308
+ const hash = createHash("sha256").update(seed).digest("hex").substring(0, 16);
314309
+ return `hcs:${factType}:${hash}`;
314310
+ }
314311
+ function stripHome(s, home) {
314312
+ if (home && s.startsWith(home + "/")) return s.slice(home.length);
314313
+ return s;
314314
+ }
314315
+ function transformStrings(value, fn) {
314316
+ if (typeof value === "string") return fn(value);
314317
+ if (Array.isArray(value)) return value.map((v) => transformStrings(v, fn));
314318
+ if (value !== null && typeof value === "object") {
314319
+ const out = {};
314320
+ for (const [k, v] of Object.entries(value)) {
314321
+ out[k] = transformStrings(v, fn);
314322
+ }
314323
+ return out;
314324
+ }
314325
+ return value;
314326
+ }
314327
+ function collectPathFrequencies(value, freq) {
314328
+ if (typeof value === "string") {
314329
+ if (!value.startsWith("/") || value.length < 2) return;
314330
+ const parts = value.split("/");
314331
+ for (let i = 2; i < parts.length; i++) {
314332
+ const prefix = parts.slice(0, i).join("/");
314333
+ if (prefix.length >= MIN_REF_LENGTH) {
314334
+ freq.set(prefix, (freq.get(prefix) ?? 0) + 1);
314335
+ }
314336
+ }
314337
+ return;
314338
+ }
314339
+ if (Array.isArray(value)) {
314340
+ for (const v of value) collectPathFrequencies(v, freq);
314341
+ return;
314342
+ }
314343
+ if (value !== null && typeof value === "object") {
314344
+ for (const v of Object.values(value)) collectPathFrequencies(v, freq);
314345
+ }
314346
+ }
314347
+ function buildRefs(freq) {
314348
+ const REF_TOKEN_LEN = 9;
314349
+ return [...freq.entries()].filter(([seg, count]) => count >= MIN_REF_FREQUENCY && seg.length >= MIN_REF_LENGTH).map(([seg, count]) => ({ seg, savings: count * seg.length - REF_TOKEN_LEN })).filter(({ savings }) => savings > 0).sort((a, b) => b.savings - a.savings).slice(0, MAX_REFS).map(({ seg }) => ({ id: `@@${shortHash(seg)}`, value: seg })).sort((a, b) => b.value.length - a.value.length);
314350
+ }
314351
+ function applyRefs(s, refs) {
314352
+ if (!s.startsWith("/")) return s;
314353
+ for (const { id, value } of refs) {
314354
+ if (s === value) return id;
314355
+ if (s.startsWith(value + "/")) return id + s.slice(value.length);
314356
+ }
314357
+ return s;
314358
+ }
314359
+ function shortHash(s) {
314360
+ return createHash("sha256").update(s).digest("hex").substring(0, 6).toUpperCase();
314361
+ }
314362
+ async function streamWithRefSubstitution(tmpPath, refs, output) {
314363
+ const rl = createInterface({
314364
+ input: createReadStream(tmpPath, { encoding: "utf8" }),
314365
+ crlfDelay: Infinity
314366
+ });
314367
+ for await (const line of rl) {
314368
+ if (!line) continue;
314369
+ if (refs.length === 0) {
314370
+ output.write(line + "\n");
314371
+ continue;
314372
+ }
314373
+ const parsed = JSON.parse(line);
314374
+ parsed.payload = transformStrings(parsed.payload, (s) => applyRefs(s, refs));
314375
+ output.write(JSON.stringify(parsed) + "\n");
314376
+ }
314377
+ }
314258
314378
 
314259
314379
  // src/extractors/symbol-call-graph.ts
314260
314380
  init_esm_shims();
@@ -318703,7 +318823,7 @@ function isInAsyncContext(sf, line) {
318703
318823
  init_esm_shims();
318704
318824
  var import_ts_morph17 = __toESM(require_ts_morph(), 1);
318705
318825
  import { readFileSync, existsSync } from "fs";
318706
- import { basename as basename2, extname as extname2, dirname as dirname2, join } from "path";
318826
+ import { basename as basename2, extname as extname2, dirname as dirname2, join as join2 } from "path";
318707
318827
  var SqlObjectDeclaredExtractor = class {
318708
318828
  async extract(sourceFiles, emitter) {
318709
318829
  for (const sf of sourceFiles) {
@@ -318723,7 +318843,7 @@ var SqlObjectDeclaredExtractor = class {
318723
318843
  for (const sf of sourceFiles) {
318724
318844
  const base = dirname2(sf.getFilePath());
318725
318845
  for (const candidate of ["prisma/schema.prisma", "../prisma/schema.prisma"]) {
318726
- const schemaPath = join(base, candidate);
318846
+ const schemaPath = join2(base, candidate);
318727
318847
  if (existsSync(schemaPath)) {
318728
318848
  this.extractFromPrismaSchema(schemaPath, emitter);
318729
318849
  }
@@ -393930,6 +394050,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393930
394050
  }
393931
394051
  emitter.setLanguage("swift");
393932
394052
  await runSwiftTextExtractors(swiftPath, emitter);
394053
+ await emitter.flush();
393933
394054
  return;
393934
394055
  }
393935
394056
  if (opts.vb6Project) {
@@ -393941,6 +394062,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393941
394062
  }
393942
394063
  emitter.setLanguage("vb6");
393943
394064
  await runVB6TextExtractors(vb6Path, emitter);
394065
+ await emitter.flush();
393944
394066
  return;
393945
394067
  }
393946
394068
  if (opts.rustProject) {
@@ -393952,6 +394074,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393952
394074
  }
393953
394075
  emitter.setLanguage("rust");
393954
394076
  await runRustTextExtractors(rustPath, emitter);
394077
+ await emitter.flush();
393955
394078
  return;
393956
394079
  }
393957
394080
  if (opts.rubyProject) {
@@ -393963,6 +394086,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393963
394086
  }
393964
394087
  emitter.setLanguage("ruby");
393965
394088
  await runRubyTextExtractors(rubyPath, emitter);
394089
+ await emitter.flush();
393966
394090
  return;
393967
394091
  }
393968
394092
  if (opts.phpProject) {
@@ -393974,6 +394098,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393974
394098
  }
393975
394099
  emitter.setLanguage("php");
393976
394100
  await runPhpTextExtractors(phpPath, emitter);
394101
+ await emitter.flush();
393977
394102
  return;
393978
394103
  }
393979
394104
  if (opts.dartProject) {
@@ -393985,6 +394110,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393985
394110
  }
393986
394111
  emitter.setLanguage("dart");
393987
394112
  await runDartTextExtractors(dartPath, emitter);
394113
+ await emitter.flush();
393988
394114
  return;
393989
394115
  }
393990
394116
  if (opts.scalaProject) {
@@ -393996,6 +394122,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
393996
394122
  }
393997
394123
  emitter.setLanguage("scala");
393998
394124
  await runScalaTextExtractors(scalaPath, emitter);
394125
+ await emitter.flush();
393999
394126
  return;
394000
394127
  }
394001
394128
  if (opts.cplusplusProject) {
@@ -394007,6 +394134,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
394007
394134
  }
394008
394135
  emitter.setLanguage("cplusplus");
394009
394136
  await runCppTextExtractors(cppPath, emitter);
394137
+ await emitter.flush();
394010
394138
  return;
394011
394139
  }
394012
394140
  if (opts.cobolProject) {
@@ -394019,6 +394147,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
394019
394147
  const copybookPaths = opts.cobolCopybookPaths ? opts.cobolCopybookPaths.split(",").map((p) => resolve2(p.trim())) : [];
394020
394148
  emitter.setLanguage("cobol");
394021
394149
  await runCobolTextExtractors(cobolPath, copybookPaths, emitter);
394150
+ await emitter.flush();
394022
394151
  return;
394023
394152
  }
394024
394153
  try {
@@ -394034,6 +394163,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
394034
394163
  if (sourceFiles.length === 0 && webMarkupFiles.length > 0) {
394035
394164
  emitter.setLanguage("web");
394036
394165
  await runWebMarkupExtractors(projectPath, emitter, webMarkupFiles);
394166
+ await emitter.flush();
394037
394167
  return;
394038
394168
  }
394039
394169
  const language = detectLanguage(sourceFiles);
@@ -394048,6 +394178,7 @@ program2.name("vibgrate-hcs-node").description("ts-morph-based HCS fact extracto
394048
394178
  emitter.setLanguage("web");
394049
394179
  await runWebMarkupExtractors(projectPath, emitter, webMarkupFiles);
394050
394180
  }
394181
+ await emitter.flush();
394051
394182
  emitProgress({ phase: "done", language, fileCount: sourceFiles.length });
394052
394183
  } catch (err) {
394053
394184
  const error = err instanceof Error ? err : new Error(String(err));
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  formatText,
6
6
  generateFindings,
7
7
  runScan
8
- } from "./chunk-V6ML65PC.js";
8
+ } from "./chunk-XCIPC2J7.js";
9
9
  import "./chunk-JQHUH6A3.js";
10
10
  export {
11
11
  computeDriftScore,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibgrate/cli",
3
- "version": "1.0.89",
3
+ "version": "1.0.90",
4
4
  "description": "CLI for measuring upgrade drift across Node, .NET, Python & Java projects",
5
5
  "type": "module",
6
6
  "bin": {