@vibgrate/cli 1.0.69 → 1.0.71

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-DGQCRO6X.js";
5
- import "./chunk-5DTDDZHE.js";
4
+ } from "./chunk-SEMFRCWZ.js";
5
+ import "./chunk-AOCAJJFK.js";
6
6
  import "./chunk-TBE6NQ5Z.js";
7
7
  export {
8
8
  baselineCommand,
@@ -2125,15 +2125,47 @@ var KNOWN_DOTNET_FRAMEWORKS = {
2125
2125
  "LiteDB": "LiteDB",
2126
2126
  "RavenDB.Client": "RavenDB",
2127
2127
  // ── Hosting & Configuration ──
2128
+ // All Microsoft.Extensions.* and System.* packages that ship as part of the
2129
+ // .NET SDK release train are prefixed with '.NET ' so that the dashboard can
2130
+ // group them under a single '.NET X.Y.Z → A.B.C' header when they all move
2131
+ // together (e.g. .NET 8 → 10 upgrade).
2128
2132
  "Microsoft.Extensions.Hosting": ".NET Hosting",
2133
+ "Microsoft.Extensions.Hosting.Abstractions": ".NET Hosting Abstractions",
2129
2134
  "Microsoft.Extensions.DependencyInjection": ".NET DI",
2135
+ "Microsoft.Extensions.DependencyInjection.Abstractions": ".NET DI Abstractions",
2130
2136
  "Microsoft.Extensions.Configuration": ".NET Configuration",
2137
+ "Microsoft.Extensions.Configuration.Abstractions": ".NET Configuration Abstractions",
2138
+ "Microsoft.Extensions.Configuration.Binder": ".NET Configuration Binder",
2139
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": ".NET Configuration EnvVars",
2140
+ "Microsoft.Extensions.Configuration.Json": ".NET Configuration JSON",
2141
+ "Microsoft.Extensions.Configuration.UserSecrets": ".NET Configuration UserSecrets",
2131
2142
  "Microsoft.Extensions.Logging": ".NET Logging",
2143
+ "Microsoft.Extensions.Logging.Abstractions": ".NET Logging Abstractions",
2144
+ "Microsoft.Extensions.Logging.Console": ".NET Logging Console",
2145
+ "Microsoft.Extensions.Logging.Debug": ".NET Logging Debug",
2146
+ "Microsoft.Extensions.Logging.EventSource": ".NET Logging EventSource",
2132
2147
  "Microsoft.Extensions.Options": ".NET Options",
2148
+ "Microsoft.Extensions.Options.ConfigurationExtensions": ".NET Options Configuration",
2149
+ "Microsoft.Extensions.Options.DataAnnotations": ".NET Options DataAnnotations",
2133
2150
  "Microsoft.Extensions.Caching.Memory": ".NET Memory Cache",
2151
+ "Microsoft.Extensions.Caching.Abstractions": ".NET Caching Abstractions",
2134
2152
  "Microsoft.Extensions.Caching.StackExchangeRedis": ".NET Redis Cache",
2135
2153
  "Microsoft.Extensions.Http": ".NET HttpClientFactory",
2154
+ "Microsoft.Extensions.Http.Resilience": ".NET HttpClient Resilience",
2136
2155
  "Microsoft.Extensions.Resilience": ".NET Resilience",
2156
+ "Microsoft.Extensions.Diagnostics": ".NET Diagnostics",
2157
+ "Microsoft.Extensions.Diagnostics.HealthChecks": ".NET Health Checks (Extensions)",
2158
+ "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": ".NET Health Checks Abstractions",
2159
+ "Microsoft.Extensions.FileProviders.Abstractions": ".NET File Providers",
2160
+ "Microsoft.Extensions.FileProviders.Physical": ".NET File Providers Physical",
2161
+ "Microsoft.Extensions.Localization": ".NET Localization",
2162
+ "Microsoft.Extensions.Localization.Abstractions": ".NET Localization Abstractions",
2163
+ "Microsoft.Extensions.Primitives": ".NET Primitives",
2164
+ // System.* packages that ship with the .NET SDK
2165
+ "System.Text.Json": ".NET System.Text.Json",
2166
+ "System.Text.Encodings.Web": ".NET System.Text.Encodings.Web",
2167
+ "System.Net.Http.Json": ".NET System.Net.Http.Json",
2168
+ "System.ComponentModel.Annotations": ".NET ComponentModel Annotations",
2137
2169
  // ── CQRS & Mediator ──
2138
2170
  "MediatR": "MediatR",
2139
2171
  "Wolverine": "Wolverine",
@@ -2147,7 +2179,8 @@ var KNOWN_DOTNET_FRAMEWORKS = {
2147
2179
  "FluentValidation.AspNetCore": "FluentValidation ASP.NET",
2148
2180
  // ── Serialization ──
2149
2181
  "Newtonsoft.Json": "Newtonsoft.Json",
2150
- "System.Text.Json": "System.Text.Json",
2182
+ // Note: System.Text.Json is defined above under '── Hosting & Configuration ──'
2183
+ // as a .NET platform package so it groups with other .NET SDK packages.
2151
2184
  "MessagePack": "MessagePack",
2152
2185
  "protobuf-net": "protobuf-net",
2153
2186
  "CsvHelper": "CsvHelper",
@@ -2269,6 +2302,9 @@ var KNOWN_DOTNET_FRAMEWORKS = {
2269
2302
  "Microsoft.AspNetCore.SignalR.Client": "SignalR Client"
2270
2303
  };
2271
2304
  var LATEST_DOTNET_MAJOR = 9;
2305
+ function normalizePath(p) {
2306
+ return p.replace(/\\/g, "/");
2307
+ }
2272
2308
  function parseTfmMajor(tfm) {
2273
2309
  const match = tfm.match(/^net(\d+)\.\d+$/);
2274
2310
  if (match?.[1]) return parseInt(match[1], 10);
@@ -2352,7 +2388,7 @@ async function scanDotnetProjects(rootDir, nugetCache, cache) {
2352
2388
  if (result.ok) {
2353
2389
  results.push(result.value);
2354
2390
  } else {
2355
- const relPath = path5.relative(rootDir, path5.dirname(csprojPath));
2391
+ const relPath = normalizePath(path5.relative(rootDir, path5.dirname(csprojPath)));
2356
2392
  if (cache) {
2357
2393
  cache.addStuckPath(relPath || ".");
2358
2394
  }
@@ -2447,7 +2483,7 @@ async function scanOneCsproj(csprojPath, rootDir, nugetCache, cache) {
2447
2483
  }
2448
2484
  const projectReferences = data.projectReferences.map((refPath) => {
2449
2485
  const absRefPath = path5.resolve(csprojDir, refPath);
2450
- const relRefPath = path5.relative(rootDir, path5.dirname(absRefPath));
2486
+ const relRefPath = normalizePath(path5.relative(rootDir, path5.dirname(absRefPath)));
2451
2487
  const refName = path5.basename(absRefPath, ".csproj");
2452
2488
  return {
2453
2489
  path: relRefPath || ".",
@@ -2469,7 +2505,7 @@ async function scanOneCsproj(csprojPath, rootDir, nugetCache, cache) {
2469
2505
  const buckets = bucketsMut;
2470
2506
  return {
2471
2507
  type: "dotnet",
2472
- path: path5.relative(rootDir, csprojDir) || ".",
2508
+ path: normalizePath(path5.relative(rootDir, csprojDir)) || ".",
2473
2509
  name: data.projectName,
2474
2510
  targetFramework,
2475
2511
  runtime: primaryTfm,
@@ -7714,6 +7750,30 @@ function extract(content, pattern, sourceFile) {
7714
7750
  }
7715
7751
  return out;
7716
7752
  }
7753
+ function isValidCronExpression(expr) {
7754
+ const trimmed = expr.trim();
7755
+ if (/^@(?:yearly|monthly|weekly|daily|hourly|reboot)$/.test(trimmed)) return true;
7756
+ const FIELD = /^(?:\*(?:\/\d+)?|\d+(?:[,\-]\d+)*(?:\/\d+)?|[?LW]|[\dLW]#\d)$/;
7757
+ const fields = trimmed.split(/\s+/);
7758
+ if (fields.length !== 5 && fields.length !== 6) return false;
7759
+ return fields.every((f) => FIELD.test(f));
7760
+ }
7761
+ function extractValidCronLines(content, sourceFile) {
7762
+ const out = [];
7763
+ const RE = /['"`]((?:[\d*\/,\-?LW#@A-Za-z]+[ \t]+){4,5}[\d*\/,\-?LW#@A-Za-z]+)['"`]/g;
7764
+ let m;
7765
+ while ((m = RE.exec(content)) !== null) {
7766
+ const candidate = m[1].trim();
7767
+ if (isValidCronExpression(candidate)) out.push(`${candidate} (${sourceFile})`);
7768
+ }
7769
+ return out;
7770
+ }
7771
+ function deriveProjectFromPath(relPath) {
7772
+ const parts = relPath.split("/");
7773
+ if (parts.length === 1) return "root";
7774
+ if (parts[0] === "packages" && parts.length >= 2) return parts[1];
7775
+ return parts[0];
7776
+ }
7717
7777
  var LOCKFILE_NAMES = /* @__PURE__ */ new Set([
7718
7778
  "package-lock.json",
7719
7779
  "pnpm-lock.yaml",
@@ -7959,7 +8019,7 @@ async function scanApiSurface(rootDir, fileCache) {
7959
8019
  });
7960
8020
  }
7961
8021
  }
7962
- result.integrations = [...integrationMap.values()].sort((a, b) => a.provider.localeCompare(b.provider));
8022
+ result.integrations = [...integrationMap.values()].filter((i) => i.files.some((f) => !NON_CODE_EXTENSIONS.has(path23.extname(f).toLowerCase()))).sort((a, b) => a.provider.localeCompare(b.provider));
7963
8023
  result.openApiSpecifications = [...new Map(result.openApiSpecifications.map((spec) => [spec.path, spec])).values()].sort((a, b) => a.path.localeCompare(b.path));
7964
8024
  result.webhookUrls = uniq(result.webhookUrls);
7965
8025
  result.callbackEndpoints = uniq(result.callbackEndpoints);
@@ -8033,7 +8093,10 @@ async function scanOperationalResilience(rootDir, fileCache) {
8033
8093
  result.defaultCharacterEncoding.push(...extract(file.content, /\b(?:charset|encoding|UTF-?8|ISO-8859-1)\b[^\n]*/gi, file.relPath));
8034
8094
  result.sessionStores.push(...extract(file.content, /\b(?:sessionStore|redisStore|memoryStore)\b[^\n]*/gi, file.relPath));
8035
8095
  result.distributedLocks.push(...extract(file.content, /\b(?:distributed[_-]?lock|redlock|mutex)\b[^\n]*/gi, file.relPath));
8036
- result.jobSchedulers.push(...extract(file.content, /\b(?:cron|schedule|bullmq|agenda|job[_-]?scheduler)\b[^\n]*/gi, file.relPath));
8096
+ for (const cronLine of extractValidCronLines(file.content, file.relPath)) {
8097
+ const project = deriveProjectFromPath(file.relPath);
8098
+ result.jobSchedulers.push(`[${project}] ${cronLine}`);
8099
+ }
8037
8100
  result.idempotencyKeys.push(...extract(file.content, /\b(?:idempotency[_-]?key|Idempotency-Key)\b[^\n]*/gi, file.relPath));
8038
8101
  result.rateLimitingCounters.push(...extract(file.content, /\b(?:rate[_-]?limit|throttle|quota)\b[^\n]*/gi, file.relPath));
8039
8102
  result.circuitBreakerState.push(...extract(file.content, /\b(?:circuit[_-]?breaker|half[_-]?open|open[_-]?state)\b[^\n]*/gi, file.relPath));
@@ -8050,7 +8113,7 @@ async function scanOperationalResilience(rootDir, fileCache) {
8050
8113
  result.dataMaskingRules.push(...extract(file.content, /\b(?:data[_-]?mask|redact|pii[_-]?mask)\b[^\n]*/gi, file.relPath));
8051
8114
  result.transformationLogic.push(...extract(file.content, /\b(?:transform|mapper|normaliz(?:e|ation))\b[^\n]*/gi, file.relPath));
8052
8115
  result.timezoneHandling.push(...extract(file.content, /\b(?:convertTimezone|tz\(|moment\.tz|DateTimeZone)\b[^\n]*/gi, file.relPath));
8053
- result.encryptionSettings.push(...extract(file.content, /\b(?:kms|encrypt(?:ion)?|cipher|tls|minTlsVersion)\b[^\n]*/gi, file.relPath));
8116
+ result.encryptionSettings.push(...extract(file.content, /(aes-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm|ocb|wrap(?:-pad)?)|chacha20-poly1305|des-ede3?(?:-(?:cbc|cfb8?|ofb))?|bf-(?:cbc|cfb|ecb|ofb)|aria-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm)|camellia-(?:128|192|256)-(?:cbc|cfb8?|ofb|ecb)|seed-cbc|rc4(?:-(?:40|hmac-md5))?|rc2-(?:(?:40|64|128)-)?cbc)/gi, file.relPath));
8054
8117
  result.hardcodedSecretSignals.push(...extract(file.content, /\b(?:password|passwd|connectionString|api[_-]?key|secret)\b\s*[:=]\s*['"][^'"]{4,}['"]/gi, file.relPath));
8055
8118
  }
8056
8119
  Object.keys(result).forEach((key) => {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runScan
3
- } from "./chunk-5DTDDZHE.js";
3
+ } from "./chunk-AOCAJJFK.js";
4
4
  import {
5
5
  writeJsonFile
6
6
  } from "./chunk-TBE6NQ5Z.js";
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  baselineCommand
4
- } from "./chunk-DGQCRO6X.js";
4
+ } from "./chunk-SEMFRCWZ.js";
5
5
  import {
6
6
  VERSION,
7
7
  dsnCommand,
@@ -10,7 +10,7 @@ import {
10
10
  pushCommand,
11
11
  scanCommand,
12
12
  writeDefaultConfig
13
- } from "./chunk-5DTDDZHE.js";
13
+ } from "./chunk-AOCAJJFK.js";
14
14
  import {
15
15
  ensureDir,
16
16
  pathExists,
@@ -39,7 +39,7 @@ var initCommand = new Command("init").description("Initialize vibgrate in a proj
39
39
  console.log(chalk.green("\u2714") + ` Created ${chalk.bold("vibgrate.config.ts")}`);
40
40
  }
41
41
  if (opts.baseline) {
42
- const { runBaseline } = await import("./baseline-ZTTNU7WC.js");
42
+ const { runBaseline } = await import("./baseline-FBU3K6U7.js");
43
43
  await runBaseline(rootDir);
44
44
  }
45
45
  console.log("");
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  formatText,
6
6
  generateFindings,
7
7
  runScan
8
- } from "./chunk-5DTDDZHE.js";
8
+ } from "./chunk-AOCAJJFK.js";
9
9
  import "./chunk-TBE6NQ5Z.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.69",
3
+ "version": "1.0.71",
4
4
  "description": "CLI for measuring upgrade drift across Node, .NET, Python & Java projects",
5
5
  "type": "module",
6
6
  "bin": {