blitzstrike 2.4.98 → 2.4.100

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/CHANGELOG.md CHANGED
@@ -5,6 +5,28 @@ All notable changes to Blitz Strike are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
+ ## [2.4.100] — 2026-09-17
9
+
10
+ ### Fixed — data-file resolution was `process.cwd()`-dependent (broke under npx)
11
+
12
+ - `watchlist()` / `watchlistCveMatches()` resolved `intelligence/watchlist.json`
13
+ via `process.cwd()`; `run_enterprise_benchmark()` resolved `bench/enterprise`
14
+ fixtures the same way. When the MCP server / compiled binary runs from any
15
+ directory other than the package root (the `npx blitzstrike` case), both threw
16
+ `ENOENT`. Now both resolve via `import.meta.url` (module-relative), matching
17
+ every other data loader (`patterns.ts`, `chains.json`, `tools-catalog.json`).
18
+ Verified: `watchlist()` and the enterprise fixtures load from an arbitrary cwd.
19
+
20
+ ## [2.4.99] — 2026-09-17
21
+
22
+ ### Fixed — grounding completeness for the CVE watchlist class tags
23
+
24
+ - The CVE watchlist's `class` tags (`auth_bypass`, `infoleak`) did not resolve
25
+ to a detector pattern. Added synonyms (`auth bypass`/`authentication bypass`
26
+ → `type_juggling`; `infoleak`/`info|information disclosure|exposure|leak` →
27
+ `hardcoded_secret`). Every one of the 18 CVE class tags now resolves to a
28
+ grounded pattern (locked by a regression check).
29
+
8
30
  ## [2.4.98] — 2026-09-17
9
31
 
10
32
  ### Added — fingerprint-first CVE matching wired into live_recon
package/dist/index.js CHANGED
@@ -17287,7 +17287,7 @@ document.getElementById('out').innerHTML = u;
17287
17287
  // src/variants.ts
17288
17288
  import { readFileSync as readFileSync21 } from "node:fs";
17289
17289
  import { join as join21, dirname as dirname5 } from "node:path";
17290
- import { fileURLToPath as fileURLToPath11 } from "node:url";
17290
+ import { fileURLToPath as fileURLToPath12 } from "node:url";
17291
17291
  function loadVariants() {
17292
17292
  try {
17293
17293
  const doc = JSON.parse(readFileSync21(join21(__dirname5, "..", "intelligence", "variants.json"), "utf8"));
@@ -17344,7 +17344,7 @@ function variantCoverageText() {
17344
17344
  var __dirname5, CROSS_FILE_ONLY;
17345
17345
  var init_variants = __esm(() => {
17346
17346
  init_complex_bugs();
17347
- __dirname5 = dirname5(fileURLToPath11(import.meta.url));
17347
+ __dirname5 = dirname5(fileURLToPath12(import.meta.url));
17348
17348
  CROSS_FILE_ONLY = new Set(["priv_esc"]);
17349
17349
  });
17350
17350
 
@@ -17352,7 +17352,7 @@ var init_variants = __esm(() => {
17352
17352
  import { mkdirSync as mkdirSync10, writeFileSync as writeFileSync9, readFileSync as readFileSync27, readdirSync as readdirSync7, statSync as statSync4, rmSync as rmSync5 } from "node:fs";
17353
17353
  import { join as join26 } from "node:path";
17354
17354
  import { homedir as homedir10 } from "node:os";
17355
- import { fileURLToPath as fileURLToPath13 } from "node:url";
17355
+ import { fileURLToPath as fileURLToPath15 } from "node:url";
17356
17356
  import { spawnSync as spawnSync4 } from "node:child_process";
17357
17357
  function dirExists(p) {
17358
17358
  try {
@@ -17392,8 +17392,8 @@ function syncData() {
17392
17392
  data_root: DATA_ROOT2
17393
17393
  };
17394
17394
  }
17395
- const localPayloads = join26(ROOT7, "payloads");
17396
- const localTemplates = join26(ROOT7, "templates");
17395
+ const localPayloads = join26(ROOT8, "payloads");
17396
+ const localTemplates = join26(ROOT8, "templates");
17397
17397
  let payloadsSynced = false;
17398
17398
  let templatesSynced = false;
17399
17399
  if (!hasPayloads && dirExists(localPayloads)) {
@@ -17448,9 +17448,9 @@ function manualCopy(src, dst) {
17448
17448
  writeFileSync9(d, readFileSync27(s));
17449
17449
  }
17450
17450
  }
17451
- var ROOT7, DATA_ROOT2, GITHUB_REPO = "https://github.com/shinthink/blitzstrike.git";
17451
+ var ROOT8, DATA_ROOT2, GITHUB_REPO = "https://github.com/shinthink/blitzstrike.git";
17452
17452
  var init_sync = __esm(() => {
17453
- ROOT7 = join26(fileURLToPath13(new URL(".", import.meta.url)), "..");
17453
+ ROOT8 = join26(fileURLToPath15(new URL(".", import.meta.url)), "..");
17454
17454
  DATA_ROOT2 = process.env.BLITZSTRIKE_DATA ?? join26(homedir10(), ".blitzstrike", "data");
17455
17455
  });
17456
17456
 
@@ -17498,13 +17498,13 @@ var init_update = __esm(() => {
17498
17498
  // src/release.ts
17499
17499
  import { readFileSync as readFileSync29, existsSync as existsSync16 } from "node:fs";
17500
17500
  import { join as join27 } from "node:path";
17501
- import { fileURLToPath as fileURLToPath14 } from "node:url";
17501
+ import { fileURLToPath as fileURLToPath16 } from "node:url";
17502
17502
  import { execSync as execSync4 } from "node:child_process";
17503
17503
  function validateRelease() {
17504
17504
  const checks = [];
17505
17505
  checks.push({ name: "package.json version", ok: true, detail: VERSION });
17506
17506
  try {
17507
- const changelog = readFileSync29(join27(ROOT8, "CHANGELOG.md"), "utf8");
17507
+ const changelog = readFileSync29(join27(ROOT9, "CHANGELOG.md"), "utf8");
17508
17508
  const m = changelog.match(/^##\s+\[([0-9]+\.[0-9]+\.[0-9]+)\]/m);
17509
17509
  const changelogVersion = m?.[1] ?? null;
17510
17510
  checks.push({
@@ -17516,7 +17516,7 @@ function validateRelease() {
17516
17516
  checks.push({ name: "CHANGELOG version", ok: false, detail: "CHANGELOG.md not found" });
17517
17517
  }
17518
17518
  try {
17519
- const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT8, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
17519
+ const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT9, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
17520
17520
  checks.push({ name: "Git tag", ok: tag === `v${VERSION}`, detail: tag, soft: true });
17521
17521
  } catch {
17522
17522
  checks.push({ name: "Git tag", ok: true, detail: "unavailable (no git/tags)", soft: true });
@@ -17536,22 +17536,22 @@ function validateRelease() {
17536
17536
  return { version: VERSION, checks, consistent: checks.filter((c) => !c.soft).every((c) => c.ok) };
17537
17537
  }
17538
17538
  function lockfilePresent() {
17539
- return existsSync16(join27(ROOT8, "package-lock.json")) || existsSync16(join27(ROOT8, "bun.lock")) || existsSync16(join27(ROOT8, "bun.lockb"));
17539
+ return existsSync16(join27(ROOT9, "package-lock.json")) || existsSync16(join27(ROOT9, "bun.lock")) || existsSync16(join27(ROOT9, "bun.lockb"));
17540
17540
  }
17541
- var ROOT8;
17541
+ var ROOT9;
17542
17542
  var init_release = __esm(() => {
17543
17543
  init_version();
17544
- ROOT8 = join27(fileURLToPath14(new URL(".", import.meta.url)), "..");
17544
+ ROOT9 = join27(fileURLToPath16(new URL(".", import.meta.url)), "..");
17545
17545
  });
17546
17546
 
17547
17547
  // src/dependency.ts
17548
17548
  import { readFileSync as readFileSync30 } from "node:fs";
17549
17549
  import { join as join28 } from "node:path";
17550
- import { fileURLToPath as fileURLToPath15 } from "node:url";
17550
+ import { fileURLToPath as fileURLToPath17 } from "node:url";
17551
17551
  function checkDependencies() {
17552
17552
  let pkg = {};
17553
17553
  try {
17554
- pkg = JSON.parse(readFileSync30(join28(ROOT9, "package.json"), "utf8"));
17554
+ pkg = JSON.parse(readFileSync30(join28(ROOT10, "package.json"), "utf8"));
17555
17555
  } catch {
17556
17556
  return { install_scripts: [], git_dependencies: [], total_dependencies: 0, safe: false };
17557
17557
  }
@@ -17572,16 +17572,16 @@ function checkDependencies() {
17572
17572
  safe: installScripts.length === 0 && gitDependencies.length === 0
17573
17573
  };
17574
17574
  }
17575
- var ROOT9;
17575
+ var ROOT10;
17576
17576
  var init_dependency = __esm(() => {
17577
- ROOT9 = join28(fileURLToPath15(new URL(".", import.meta.url)), "..");
17577
+ ROOT10 = join28(fileURLToPath17(new URL(".", import.meta.url)), "..");
17578
17578
  });
17579
17579
 
17580
17580
  // src/cli.ts
17581
17581
  import { readFileSync as readFileSync31, existsSync as existsSync17, writeFileSync as writeFileSync10, mkdirSync as mkdirSync11 } from "node:fs";
17582
17582
  import { join as join29, dirname as dirname6 } from "node:path";
17583
17583
  import { homedir as homedir11 } from "node:os";
17584
- import { fileURLToPath as fileURLToPath16 } from "node:url";
17584
+ import { fileURLToPath as fileURLToPath18 } from "node:url";
17585
17585
  import { spawnSync as spawnSync5 } from "node:child_process";
17586
17586
  function which(cmd) {
17587
17587
  return spawnSync5("sh", ["-c", 'command -v "$1" >/dev/null 2>&1', "sh", cmd]).status === 0;
@@ -17624,7 +17624,7 @@ async function runDoctor() {
17624
17624
  detail: h1 ? `X-HackerOne-Research: ${h1}` : "H1_USERNAME not set",
17625
17625
  fix: h1 ? undefined : "export H1_USERNAME=<your-hackerone-username> (adds X-HackerOne-Research to outbound requests)"
17626
17626
  });
17627
- const dataOk = existsSync17(join29(ROOT10, "chains.json")) && existsSync17(join29(ROOT10, "tools-catalog.json"));
17627
+ const dataOk = existsSync17(join29(ROOT11, "chains.json")) && existsSync17(join29(ROOT11, "tools-catalog.json"));
17628
17628
  issues.push({
17629
17629
  name: "Data layers (chains + tools-catalog)",
17630
17630
  status: dataOk ? "ok" : "fail",
@@ -17675,14 +17675,14 @@ BlitzStrike — ${verdict}`);
17675
17675
  function resolveCommand() {
17676
17676
  if (which("blitzstrike"))
17677
17677
  return { command: "blitzstrike", args: ["serve", "--mcp"] };
17678
- const src = join29(ROOT10, "src", "index.ts");
17678
+ const src = join29(ROOT11, "src", "index.ts");
17679
17679
  if (which("bun") && existsSync17(src))
17680
17680
  return { command: "bun", args: ["run", src, "serve", "--mcp"] };
17681
17681
  if (which("npx"))
17682
17682
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
17683
17683
  if (which("bunx"))
17684
17684
  return { command: "bunx", args: ["blitzstrike", "serve", "--mcp"] };
17685
- const dist = join29(ROOT10, "dist", "index.js");
17685
+ const dist = join29(ROOT11, "dist", "index.js");
17686
17686
  if (existsSync17(dist))
17687
17687
  return { command: "bun", args: [dist, "serve", "--mcp"] };
17688
17688
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
@@ -17722,7 +17722,7 @@ function opencodeWrite(p) {
17722
17722
  };
17723
17723
  }
17724
17724
  function copyOpenCodeAgents() {
17725
- const srcDir = join29(ROOT10, "opencode-agents");
17725
+ const srcDir = join29(ROOT11, "opencode-agents");
17726
17726
  const dstDir = join29(homedir11(), ".config", "opencode", "agents");
17727
17727
  if (!existsSync17(srcDir))
17728
17728
  return;
@@ -17966,13 +17966,13 @@ Failed (${failedList.length}) — reason per tool:`);
17966
17966
  Common causes: missing toolchain, pip/git network failures, or very heavy builds. ` + `Re-run after installing the missing toolchain — failed tools are skipped, not fatal.`);
17967
17967
  }
17968
17968
  }
17969
- var ROOT10;
17969
+ var ROOT11;
17970
17970
  var init_cli = __esm(() => {
17971
17971
  init_catalog();
17972
17972
  init_release();
17973
17973
  init_dependency();
17974
17974
  init_mcp_status();
17975
- ROOT10 = join29(fileURLToPath16(new URL(".", import.meta.url)), "..");
17975
+ ROOT11 = join29(fileURLToPath18(new URL(".", import.meta.url)), "..");
17976
17976
  });
17977
17977
 
17978
17978
  // node_modules/zod/v3/helpers/util.js
@@ -32695,7 +32695,7 @@ async function nvdLookup(cveId) {
32695
32695
  init_scanner();
32696
32696
  import { readFileSync as readFileSync11, existsSync as existsSync8, statSync as statSync2 } from "node:fs";
32697
32697
  import { join as join13 } from "node:path";
32698
- import { fileURLToPath as fileURLToPath6 } from "node:url";
32698
+ import { fileURLToPath as fileURLToPath7 } from "node:url";
32699
32699
 
32700
32700
  // src/memory.ts
32701
32701
  import { readFileSync as readFileSync2, appendFileSync, mkdirSync, existsSync, writeFileSync } from "node:fs";
@@ -34489,6 +34489,14 @@ var ALIASES = {
34489
34489
  "hardcoded credential": "hardcoded_secret",
34490
34490
  "hardcoded secret": "hardcoded_secret",
34491
34491
  "credential leak": "hardcoded_secret",
34492
+ "auth bypass": "type_juggling",
34493
+ "authentication bypass": "type_juggling",
34494
+ auth_bypass: "type_juggling",
34495
+ infoleak: "hardcoded_secret",
34496
+ "info leak": "hardcoded_secret",
34497
+ "information leak": "hardcoded_secret",
34498
+ "information disclosure": "hardcoded_secret",
34499
+ "information exposure": "hardcoded_secret",
34492
34500
  "hard coded credentials": "hardcoded_secret",
34493
34501
  "priv esc": "priv_esc",
34494
34502
  privesc: "priv_esc",
@@ -36072,6 +36080,8 @@ import { execFileSync } from "node:child_process";
36072
36080
  import { resolve4, Resolver } from "node:dns/promises";
36073
36081
  import { readFileSync as readFileSync10 } from "node:fs";
36074
36082
  import { join as join12 } from "node:path";
36083
+ import { fileURLToPath as fileURLToPath6 } from "node:url";
36084
+ var ROOT4 = join12(fileURLToPath6(new URL(".", import.meta.url)), "..");
36075
36085
  var BLOCKING_KEYWORDS = /internet positif|kominfo|\.go\.id\b|pemblokiran|ditutup|dilarang|akses dibatasi|blocked|restricted|illegal|advertencia|coljuegos|regulat|forbidden|this (site|website) has been (blocked|banned)/i;
36076
36086
  var HOSTNAME_RE = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
36077
36087
  function isValidHostname(host) {
@@ -36145,7 +36155,7 @@ async function resolveCheck(host) {
36145
36155
  };
36146
36156
  }
36147
36157
  function loadWatchlist() {
36148
- const raw = readFileSync10(join12(process.cwd(), "intelligence", "watchlist.json"), "utf8");
36158
+ const raw = readFileSync10(join12(ROOT4, "intelligence", "watchlist.json"), "utf8");
36149
36159
  const data = JSON.parse(raw);
36150
36160
  return { cwe_frequency: data.cwe_frequency ?? [], cve_watchlist: data.cve_watchlist ?? [] };
36151
36161
  }
@@ -36768,7 +36778,7 @@ function loadChains() {
36768
36778
  if (_chainsCache)
36769
36779
  return _chainsCache;
36770
36780
  try {
36771
- const dir = join13(fileURLToPath6(new URL(".", import.meta.url)), "..");
36781
+ const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
36772
36782
  const path = join13(dir, "chains.json");
36773
36783
  const raw = JSON.parse(readFileSync11(path, "utf8"));
36774
36784
  _chainsCache = raw.chains ?? [];
@@ -37551,7 +37561,7 @@ var CHAIN_ID_TO_ESCALATION = {
37551
37561
  };
37552
37562
  function loadChainLinks() {
37553
37563
  try {
37554
- const dir = join13(fileURLToPath6(new URL(".", import.meta.url)), "..");
37564
+ const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
37555
37565
  const data = JSON.parse(readFileSync11(join13(dir, "intelligence", "chain_links.json"), "utf8"));
37556
37566
  return data.links ?? [];
37557
37567
  } catch {
@@ -37710,9 +37720,9 @@ function compactState(phase, findings) {
37710
37720
  // src/tasks.ts
37711
37721
  import { mkdirSync as mkdirSync6, readFileSync as readFileSync12, writeFileSync as writeFileSync3 } from "node:fs";
37712
37722
  import { join as join14 } from "node:path";
37713
- import { fileURLToPath as fileURLToPath7 } from "node:url";
37723
+ import { fileURLToPath as fileURLToPath8 } from "node:url";
37714
37724
  function tasksDir() {
37715
- return join14(fileURLToPath7(new URL(".", import.meta.url)), "..", ".blitzstrike", "tasks");
37725
+ return join14(fileURLToPath8(new URL(".", import.meta.url)), "..", ".blitzstrike", "tasks");
37716
37726
  }
37717
37727
  function taskPath(id) {
37718
37728
  return join14(tasksDir(), `${id}.json`);
@@ -58378,9 +58388,9 @@ function analyzePatchFiles(oldPath, newPath, language) {
58378
58388
  // src/frameworks.ts
58379
58389
  import { readFileSync as readFileSync18, existsSync as existsSync9 } from "node:fs";
58380
58390
  import { join as join17 } from "node:path";
58381
- import { fileURLToPath as fileURLToPath8 } from "node:url";
58382
- var ROOT4 = join17(fileURLToPath8(new URL(".", import.meta.url)), "..");
58383
- var INTEL2 = join17(ROOT4, "intelligence");
58391
+ import { fileURLToPath as fileURLToPath9 } from "node:url";
58392
+ var ROOT5 = join17(fileURLToPath9(new URL(".", import.meta.url)), "..");
58393
+ var INTEL2 = join17(ROOT5, "intelligence");
58384
58394
  var cache = null;
58385
58395
  function load3() {
58386
58396
  if (cache)
@@ -59079,8 +59089,8 @@ async function validateLeakedKey(input) {
59079
59089
  // src/hackbot-arena.ts
59080
59090
  import { readFileSync as readFileSync19 } from "node:fs";
59081
59091
  import { join as join19, dirname as dirname3 } from "node:path";
59082
- import { fileURLToPath as fileURLToPath9 } from "node:url";
59083
- var __dirname3 = dirname3(fileURLToPath9(import.meta.url));
59092
+ import { fileURLToPath as fileURLToPath10 } from "node:url";
59093
+ var __dirname3 = dirname3(fileURLToPath10(import.meta.url));
59084
59094
  function load4() {
59085
59095
  try {
59086
59096
  return JSON.parse(readFileSync19(join19(__dirname3, "..", "intelligence", "hackbot-arena.json"), "utf8"));
@@ -59247,8 +59257,8 @@ function listSeverityMap() {
59247
59257
  // src/datarefresh.ts
59248
59258
  import { readFileSync as readFileSync20 } from "node:fs";
59249
59259
  import { join as join20, dirname as dirname4 } from "node:path";
59250
- import { fileURLToPath as fileURLToPath10 } from "node:url";
59251
- var __dirname4 = dirname4(fileURLToPath10(import.meta.url));
59260
+ import { fileURLToPath as fileURLToPath11 } from "node:url";
59261
+ var __dirname4 = dirname4(fileURLToPath11(import.meta.url));
59252
59262
  function loadJson2(rel) {
59253
59263
  try {
59254
59264
  return JSON.parse(readFileSync20(join20(__dirname4, "..", rel), "utf8"));
@@ -59288,11 +59298,11 @@ init_variants();
59288
59298
  // src/benchmark.ts
59289
59299
  import { readFileSync as readFileSync22, readdirSync as readdirSync5, writeFileSync as writeFileSync6, rmSync as rmSync3, mkdirSync as mkdirSync7 } from "node:fs";
59290
59300
  import { join as join22 } from "node:path";
59291
- import { fileURLToPath as fileURLToPath12 } from "node:url";
59301
+ import { fileURLToPath as fileURLToPath13 } from "node:url";
59292
59302
  import { tmpdir as tmpdir3, homedir as homedir8 } from "node:os";
59293
59303
  init_complex_bugs();
59294
- var ROOT5 = join22(fileURLToPath12(new URL(".", import.meta.url)), "..");
59295
- var CORPUS = join22(ROOT5, "bench", "corpus");
59304
+ var ROOT6 = join22(fileURLToPath13(new URL(".", import.meta.url)), "..");
59305
+ var CORPUS = join22(ROOT6, "bench", "corpus");
59296
59306
  var CAPTURED_CORPUS_DIR = process.env.BLITZSTRIKE_CORPUS_DIR ?? join22(homedir8(), ".blitzstrike", "corpus");
59297
59307
  function parseCorpusFile(path) {
59298
59308
  let text;
@@ -61599,15 +61609,16 @@ solc = "0.8.20"
61599
61609
  // src/enterprise-benchmark.ts
61600
61610
  import { existsSync as existsSync15, readFileSync as readFileSync26, readdirSync as readdirSync6, statSync as statSync3 } from "node:fs";
61601
61611
  import { join as join25, resolve } from "node:path";
61612
+ import { fileURLToPath as fileURLToPath14 } from "node:url";
61602
61613
  init_complex_bugs();
61603
- var ROOT6 = resolve(process.cwd(), "bench", "enterprise");
61614
+ var ROOT7 = resolve(fileURLToPath14(new URL(".", import.meta.url)), "..", "bench", "enterprise");
61604
61615
  var ENTERPRISE_FIXTURES = [
61605
- { id: "php-laravel", dir: join25(ROOT6, "php-laravel"), expected_vulns: 4 },
61606
- { id: "js-express", dir: join25(ROOT6, "js-express"), expected_vulns: 2 },
61607
- { id: "py-django", dir: join25(ROOT6, "py-django"), expected_vulns: 2 },
61608
- { id: "java-spring", dir: join25(ROOT6, "java-spring"), expected_vulns: 2 },
61609
- { id: "wp-batch-route", dir: join25(ROOT6, "wp-batch-route"), expected_vulns: 3 },
61610
- { id: "php-complex", dir: join25(ROOT6, "php-complex"), expected_vulns: 4 }
61616
+ { id: "php-laravel", dir: join25(ROOT7, "php-laravel"), expected_vulns: 4 },
61617
+ { id: "js-express", dir: join25(ROOT7, "js-express"), expected_vulns: 2 },
61618
+ { id: "py-django", dir: join25(ROOT7, "py-django"), expected_vulns: 2 },
61619
+ { id: "java-spring", dir: join25(ROOT7, "java-spring"), expected_vulns: 2 },
61620
+ { id: "wp-batch-route", dir: join25(ROOT7, "wp-batch-route"), expected_vulns: 3 },
61621
+ { id: "php-complex", dir: join25(ROOT7, "php-complex"), expected_vulns: 4 }
61611
61622
  ];
61612
61623
  function sourceFiles(root) {
61613
61624
  const out = [];
@@ -63849,11 +63860,11 @@ async function serve() {
63849
63860
  init_cli();
63850
63861
  import { readFileSync as readFileSync32, existsSync as existsSync18 } from "node:fs";
63851
63862
  import { join as join30 } from "node:path";
63852
- import { fileURLToPath as fileURLToPath17 } from "node:url";
63853
- var ROOT11 = join30(fileURLToPath17(new URL(".", import.meta.url)), "..");
63863
+ import { fileURLToPath as fileURLToPath19 } from "node:url";
63864
+ var ROOT12 = join30(fileURLToPath19(new URL(".", import.meta.url)), "..");
63854
63865
  function readVersion() {
63855
63866
  try {
63856
- const p = join30(ROOT11, "package.json");
63867
+ const p = join30(ROOT12, "package.json");
63857
63868
  if (existsSync18(p))
63858
63869
  return JSON.parse(readFileSync32(p, "utf8")).version ?? "1.0.0";
63859
63870
  } catch {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.98",
3
+ "version": "2.4.100",
4
4
  "description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
5
5
  "type": "module",
6
6
  "bin": {