blitzstrike 2.4.15 → 2.4.16

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,17 @@ 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.16] — 2026-09-14
9
+
10
+ ### Added — auto-fallback install (toolchain provision + pip fallback)
11
+
12
+ - `go install` / `cargo install` tools now auto-provision the missing toolchain
13
+ (`apt-get install golang-go` / `cargo`) before installing — no more
14
+ "go: not found" / "cargo: not found" failures (provisioned once per run).
15
+ - `pip install --break-system-packages` now falls back to `pip install --user`
16
+ when the flag is unsupported (pip < 23.0 on older distros) — no more
17
+ "no such option: --break-system-packages".
18
+
8
19
  ## [2.4.15] — 2026-09-14
9
20
 
10
21
  ### Fixed — detection → verification loop now unmissable
package/dist/index.js CHANGED
@@ -7403,6 +7403,40 @@ import { join as join6 } from "node:path";
7403
7403
  import { fileURLToPath as fileURLToPath3 } from "node:url";
7404
7404
  import { homedir as homedir3 } from "node:os";
7405
7405
  import { spawnSync, spawn } from "node:child_process";
7406
+ function hasCommand(cmd) {
7407
+ return spawnSync(`command -v ${cmd}`, { shell: true, timeout: 8000 }).status === 0;
7408
+ }
7409
+ function requiredToolchain(cmd) {
7410
+ if (/^\s*go\s+install\b/.test(cmd))
7411
+ return "go";
7412
+ if (/^\s*cargo\s+(install|build)\b/.test(cmd))
7413
+ return "cargo";
7414
+ return null;
7415
+ }
7416
+ function provisionToolchain(cmd) {
7417
+ const tc = requiredToolchain(cmd);
7418
+ if (!tc || hasCommand(tc) || _provisioned.has(tc))
7419
+ return;
7420
+ _provisioned.add(tc);
7421
+ const inst = TOOLCHAIN_INSTALL[tc];
7422
+ if (!inst)
7423
+ return;
7424
+ spawnSync(inst, { shell: true, timeout: 300000 });
7425
+ }
7426
+ function runInstallCommand(cmd, timeoutMs) {
7427
+ provisionToolchain(cmd);
7428
+ let r = spawnSync(cmd, { shell: true, timeout: timeoutMs, cwd: TOOLS_DIR });
7429
+ let output = `${r.stdout?.toString() ?? ""}${r.stderr?.toString() ?? ""}`;
7430
+ if (r.status !== 0 && /--break-system-packages/.test(cmd)) {
7431
+ const alt = cmd.replace(/--break-system-packages/g, "--user");
7432
+ const r2 = spawnSync(alt, { shell: true, timeout: timeoutMs, cwd: TOOLS_DIR });
7433
+ if (r2.status === 0)
7434
+ r = r2;
7435
+ output = `${output}
7436
+ ${r2.stdout?.toString() ?? ""}${r2.stderr?.toString() ?? ""}`;
7437
+ }
7438
+ return { status: r.status, output };
7439
+ }
7406
7440
  function loadTools() {
7407
7441
  if (_toolsCache)
7408
7442
  return _toolsCache;
@@ -7519,14 +7553,14 @@ function ensureTool(name) {
7519
7553
  return { name: t.name, installed: false, action: "none", note: `no install command for ${platform}` };
7520
7554
  }
7521
7555
  mkdirSync3(TOOLS_DIR, { recursive: true });
7522
- const r = spawnSync(cmd, { shell: true, timeout: 300000, cwd: TOOLS_DIR });
7523
- const ok = r.status === 0;
7556
+ const { status, output } = runInstallCommand(cmd, 300000);
7557
+ const ok = status === 0;
7524
7558
  return {
7525
7559
  name: t.name,
7526
7560
  installed: ok,
7527
7561
  action: "install",
7528
7562
  command: cmd,
7529
- output: (r.stdout?.toString() ?? "").slice(-400) || (r.stderr?.toString() ?? "").slice(-400)
7563
+ output: output.slice(-400)
7530
7564
  };
7531
7565
  }
7532
7566
  function toolForHint(hint) {
@@ -7619,6 +7653,7 @@ function ensureToolAsync(name, timeoutMs = 300000) {
7619
7653
  return;
7620
7654
  }
7621
7655
  mkdirSync3(TOOLS_DIR, { recursive: true });
7656
+ provisionToolchain(cmd);
7622
7657
  const inst = spawn(cmd, { shell: true, timeout: timeoutMs, cwd: TOOLS_DIR });
7623
7658
  let out = "";
7624
7659
  inst.stdout?.on("data", (d) => {
@@ -7629,7 +7664,25 @@ function ensureToolAsync(name, timeoutMs = 300000) {
7629
7664
  });
7630
7665
  inst.on("error", (e) => resolve({ name: t.name, installed: false, action: "install", error: String(e) }));
7631
7666
  inst.on("close", (icode) => {
7632
- resolve({ name: t.name, installed: icode === 0, action: "install", command: cmd, output: out.slice(-400) });
7667
+ if (icode === 0) {
7668
+ resolve({ name: t.name, installed: true, action: "install", command: cmd, output: out.slice(-400) });
7669
+ return;
7670
+ }
7671
+ if (/--break-system-packages/.test(cmd)) {
7672
+ const alt = cmd.replace(/--break-system-packages/g, "--user");
7673
+ const r2 = spawn(alt, { shell: true, timeout: timeoutMs, cwd: TOOLS_DIR });
7674
+ let out2 = "";
7675
+ r2.stdout?.on("data", (d) => {
7676
+ out2 += d.toString();
7677
+ });
7678
+ r2.stderr?.on("data", (d) => {
7679
+ out2 += d.toString();
7680
+ });
7681
+ r2.on("error", (e) => resolve({ name: t.name, installed: false, action: "install", error: String(e) }));
7682
+ r2.on("close", (i2) => resolve({ name: t.name, installed: i2 === 0, action: "install", command: alt, output: out2.slice(-400) }));
7683
+ return;
7684
+ }
7685
+ resolve({ name: t.name, installed: false, action: "install", command: cmd, output: out.slice(-400) });
7633
7686
  });
7634
7687
  });
7635
7688
  });
@@ -7664,11 +7717,16 @@ async function installAllTools(opts = {}) {
7664
7717
  results
7665
7718
  };
7666
7719
  }
7667
- var ROOT2, TOOLS_DIR, _toolsCache = null, _skillsCache = null;
7720
+ var ROOT2, TOOLS_DIR, TOOLCHAIN_INSTALL, _provisioned, _toolsCache = null, _skillsCache = null;
7668
7721
  var init_catalog = __esm(() => {
7669
7722
  init_manuals();
7670
7723
  ROOT2 = join6(fileURLToPath3(new URL(".", import.meta.url)), "..");
7671
7724
  TOOLS_DIR = process.env.BLITZSTRIKE_TOOLS_DIR ?? join6(homedir3(), ".blitzstrike", "tools");
7725
+ TOOLCHAIN_INSTALL = {
7726
+ go: "apt-get install -y golang-go",
7727
+ cargo: "apt-get install -y cargo"
7728
+ };
7729
+ _provisioned = new Set;
7672
7730
  });
7673
7731
 
7674
7732
  // src/burp-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.15",
3
+ "version": "2.4.16",
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": {