blitzstrike 1.0.22 → 1.0.23

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 (2) hide show
  1. package/dist/index.js +113 -42
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
2
3
  var __create = Object.create;
3
4
  var __getProtoOf = Object.getPrototypeOf;
4
5
  var __defProp = Object.defineProperty;
@@ -43,6 +44,7 @@ var __esm = (fn, res, err) => () => {
43
44
  throw err[0];
44
45
  return res;
45
46
  };
47
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
46
48
 
47
49
  // node_modules/ajv/dist/compile/codegen/code.js
48
50
  var require_code = __commonJS(function(exports) {
@@ -29759,6 +29761,18 @@ function listMemory() {
29759
29761
  entries: entries.sort((a, b) => a.created < b.created ? 1 : -1).map((e) => ({ id: e.id, topic: e.topic, type: e.type, verified: e.verified, created: e.created }))
29760
29762
  };
29761
29763
  }
29764
+ function forget(id) {
29765
+ const { writeFileSync } = __require("node:fs");
29766
+ const entries = loadMemory();
29767
+ const kept = entries.filter((e) => e.id !== id);
29768
+ if (kept.length === entries.length) {
29769
+ return { removed: false, id, note: "not found" };
29770
+ }
29771
+ writeFileSync(MEMORY_PATH, kept.map((e) => JSON.stringify(e)).join(`
29772
+ `) + (kept.length ? `
29773
+ ` : ""));
29774
+ return { removed: true, id };
29775
+ }
29762
29776
  function rememberIfAbsent(topic, content, type, tags, source, verified) {
29763
29777
  const r = remember(topic, content, type, tags, source, verified);
29764
29778
  return r.saved === true;
@@ -29954,6 +29968,12 @@ var DEFAULT_WEIGHTS = {
29954
29968
  negative_control: 0.1
29955
29969
  };
29956
29970
  var confidenceWeights = { ...DEFAULT_WEIGHTS };
29971
+ function setConfidenceWeights(weights) {
29972
+ confidenceWeights = { ...DEFAULT_WEIGHTS, ...weights };
29973
+ }
29974
+ function getConfidenceWeights() {
29975
+ return { ...confidenceWeights };
29976
+ }
29957
29977
  function computeConfidence(factors) {
29958
29978
  let score = 0;
29959
29979
  for (const [key, weight] of Object.entries(confidenceWeights)) {
@@ -30024,6 +30044,13 @@ function transition(finding, to) {
30024
30044
  const updated = { ...finding, status: to, timestamps: { ...finding.timestamps, updated: new Date().toISOString() } };
30025
30045
  return updated;
30026
30046
  }
30047
+ function attachEvidence(finding, evidence) {
30048
+ return {
30049
+ ...finding,
30050
+ evidence: [...finding.evidence, evidence],
30051
+ timestamps: { ...finding.timestamps, updated: new Date().toISOString() }
30052
+ };
30053
+ }
30027
30054
  function confirmFinding(finding, opts) {
30028
30055
  const evidence = opts.evidence.map((e) => makeEvidence(e));
30029
30056
  const negativeControl = opts.negative_control ?? true;
@@ -30429,7 +30456,7 @@ function ensureTool(name) {
30429
30456
  }
30430
30457
 
30431
30458
  // src/intel.ts
30432
- import { readFileSync as readFileSync6, existsSync as existsSync5 } from "node:fs";
30459
+ import { readFileSync as readFileSync6, existsSync as existsSync4 } from "node:fs";
30433
30460
  import { join as join6 } from "node:path";
30434
30461
  import { fileURLToPath as fileURLToPath4 } from "node:url";
30435
30462
  import { readdirSync as readdirSync3 } from "node:fs";
@@ -30438,7 +30465,7 @@ var ROOT3 = join6(fileURLToPath4(new URL(".", import.meta.url)), "..");
30438
30465
  var INTEL = join6(ROOT3, "intelligence");
30439
30466
  function loadJson(name) {
30440
30467
  const p = join6(INTEL, `${name}.json`);
30441
- if (!existsSync5(p))
30468
+ if (!existsSync4(p))
30442
30469
  return null;
30443
30470
  try {
30444
30471
  return JSON.parse(readFileSync6(p, "utf8"));
@@ -30454,7 +30481,6 @@ function detectWaf(headers, body = "") {
30454
30481
  const bodySigs = sigs.body_signatures ?? [];
30455
30482
  const matches = [];
30456
30483
  const headerKeys = Object.keys(headers).map((k) => k.toLowerCase());
30457
- const headerVals = Object.values(headers).join(" ").toLowerCase();
30458
30484
  for (const s of headerSigs) {
30459
30485
  const h = (s.header ?? "").toLowerCase();
30460
30486
  const pattern = (s.pattern ?? "").toLowerCase();
@@ -30553,12 +30579,12 @@ var PACKAGE_PAYLOADS = join6(ROOT3, "payloads");
30553
30579
  var PACKAGE_TEMPLATES = join6(ROOT3, "templates");
30554
30580
  var DATA_ROOT = process.env.BLITZSTRIKE_DATA ?? join6(homedir2(), ".blitzstrike", "data");
30555
30581
  function payloadsDir() {
30556
- if (existsSync5(PACKAGE_PAYLOADS))
30582
+ if (existsSync4(PACKAGE_PAYLOADS))
30557
30583
  return PACKAGE_PAYLOADS;
30558
30584
  return join6(DATA_ROOT, "payloads");
30559
30585
  }
30560
30586
  function templatesDir() {
30561
- if (existsSync5(PACKAGE_TEMPLATES))
30587
+ if (existsSync4(PACKAGE_TEMPLATES))
30562
30588
  return PACKAGE_TEMPLATES;
30563
30589
  return join6(DATA_ROOT, "templates");
30564
30590
  }
@@ -31132,7 +31158,6 @@ function walkExpression(node, env, summaries, findings, suppressed, file) {
31132
31158
  const sanitizers = tainted.flatMap((t) => t.sanitizers);
31133
31159
  const inlineSan = findSanitizers(JSON.stringify(node));
31134
31160
  const san = [...sanitizers, ...inlineSan].filter((s, i, arr) => arr.indexOf(s) === i);
31135
- const authGated = false;
31136
31161
  const cls = sink.cls;
31137
31162
  if (!isSanitized(san, cls.id)) {
31138
31163
  findings.push({
@@ -49403,7 +49428,6 @@ var phpAdapter = {
49403
49428
  }
49404
49429
  }
49405
49430
  }
49406
- const superSources = new Map;
49407
49431
  for (const n of nodes) {
49408
49432
  if (n.kind === "assign") {
49409
49433
  const target = phpVar(n.left);
@@ -49476,7 +49500,7 @@ function jsWalk(node, out) {
49476
49500
  var jsAdapter = {
49477
49501
  language: "javascript",
49478
49502
  extensions: [".js", ".mjs", ".cjs", ".jsx", ".ts", ".tsx"],
49479
- parse(code, file) {
49503
+ parse(code, _file) {
49480
49504
  let ast;
49481
49505
  try {
49482
49506
  ast = parse6(code, {
@@ -49585,7 +49609,7 @@ var PY_SANITIZERS = [
49585
49609
  var pythonAdapter = {
49586
49610
  language: "python",
49587
49611
  extensions: [".py", ".pyw"],
49588
- parse(code, file) {
49612
+ parse(code, _file) {
49589
49613
  const tree = parser2.parse(code);
49590
49614
  const sources = [];
49591
49615
  const sinks = [];
@@ -49703,7 +49727,7 @@ var JAVA_SANITIZERS = [
49703
49727
  var javaAdapter = {
49704
49728
  language: "java",
49705
49729
  extensions: [".java"],
49706
- parse(code, file) {
49730
+ parse(code, _file) {
49707
49731
  const sources = [];
49708
49732
  const sinks = [];
49709
49733
  const sanitizers = [];
@@ -50231,10 +50255,10 @@ async function liveRecon(target, includeActive = false) {
50231
50255
  }
50232
50256
 
50233
50257
  // src/strike.ts
50234
- var TIMEOUT_MS3 = 15000;
50235
- async function httpRequest(url, method, data, headers) {
50258
+ var DEFAULT_TIMEOUT_MS = 15000;
50259
+ async function httpRequest(url, method, data, headers, timeoutMs = DEFAULT_TIMEOUT_MS) {
50236
50260
  const controller = new AbortController;
50237
- const t = setTimeout(() => controller.abort(), TIMEOUT_MS3);
50261
+ const t = setTimeout(() => controller.abort(), timeoutMs);
50238
50262
  try {
50239
50263
  const res = await fetch(url, {
50240
50264
  method,
@@ -50272,12 +50296,13 @@ async function strikeVerify(input) {
50272
50296
  const marker = input.marker ?? defaultMarker();
50273
50297
  const control = input.control ?? defaultMarker();
50274
50298
  const baseUrl = input.url;
50299
+ const timeoutMs = input.timeout ?? DEFAULT_TIMEOUT_MS;
50275
50300
  const baselineTarget = inject(baseUrl, "", param).replace(/[?&]q=$/, "").replace(/[?&]$/, "");
50276
50301
  const markerTarget = inject(baseUrl, marker, param);
50277
50302
  const controlTarget = inject(baseUrl, control, param);
50278
- const baseline = await httpRequest(baselineTarget, method, input.data, input.headers);
50279
- const markerResp = await httpRequest(markerTarget, method, input.data, input.headers);
50280
- const controlResp = await httpRequest(controlTarget, method, input.data, input.headers);
50303
+ const baseline = await httpRequest(baselineTarget, method, input.data, input.headers, timeoutMs);
50304
+ const markerResp = await httpRequest(markerTarget, method, input.data, input.headers, timeoutMs);
50305
+ const controlResp = await httpRequest(controlTarget, method, input.data, input.headers, timeoutMs);
50281
50306
  if (baseline.status === 0 || markerResp.status === 0) {
50282
50307
  return {
50283
50308
  status: "blocked",
@@ -50478,7 +50503,8 @@ function createServer() {
50478
50503
  headers: hdrs,
50479
50504
  marker,
50480
50505
  control,
50481
- param
50506
+ param,
50507
+ timeout: timeout ? timeout * 1000 : undefined
50482
50508
  });
50483
50509
  return {
50484
50510
  content: [{
@@ -50703,6 +50729,13 @@ function createServer() {
50703
50729
  }, async () => {
50704
50730
  return { content: [{ type: "text", text: JSON.stringify(listMemory()) }] };
50705
50731
  });
50732
+ server.registerTool("memory_forget", {
50733
+ title: "Forget a memory entry",
50734
+ description: "MEMORY: remove a memory entry by id (append-only store; 'forget' = tombstone).",
50735
+ inputSchema: { id: string2().describe("Memory entry id (from memory_list)") }
50736
+ }, async ({ id }) => {
50737
+ return { content: [{ type: "text", text: JSON.stringify(forget(id)) }] };
50738
+ });
50706
50739
  server.registerTool("read_tool_manual", {
50707
50740
  title: "Read a tool manual",
50708
50741
  description: "Read the full deep reference manual for a security tool (270+ manuals from kali-pentest, Apache-2.0).",
@@ -50886,6 +50919,44 @@ function createServer() {
50886
50919
  const score = computeConfidence(factors);
50887
50920
  return { content: [{ type: "text", text: JSON.stringify({ score, level: confidenceLevel(score) }) }] };
50888
50921
  });
50922
+ server.registerTool("confidence_weights", {
50923
+ title: "Get/set confidence weights",
50924
+ description: "FINDINGS: inspect or override the deterministic confidence weights (configurable per the framework spec). Pass `set` (JSON object of weight overrides) to change them; omit to read the current weights.",
50925
+ inputSchema: {
50926
+ set: string2().optional().describe('JSON object of weight overrides (e.g. {"data_flow":0.3})')
50927
+ }
50928
+ }, async ({ set }) => {
50929
+ if (set) {
50930
+ let w;
50931
+ try {
50932
+ w = JSON.parse(set);
50933
+ } catch {
50934
+ return { content: [{ type: "text", text: JSON.stringify({ error: "invalid JSON" }) }] };
50935
+ }
50936
+ setConfidenceWeights(w);
50937
+ }
50938
+ return { content: [{ type: "text", text: JSON.stringify({ weights: getConfidenceWeights() }) }] };
50939
+ });
50940
+ server.registerTool("finding_attach_evidence", {
50941
+ title: "Attach evidence to a finding",
50942
+ description: "FINDINGS: attach a redacted, SHA-256-tagged evidence record to an existing canonical finding (without advancing its lifecycle).",
50943
+ inputSchema: {
50944
+ finding: string2().describe("JSON of the Finding object"),
50945
+ type: string2().describe("Evidence type (source_location/response/validation_result/negative_control/...)"),
50946
+ description: string2().describe("Evidence description"),
50947
+ content: string2().optional().describe("Evidence artifact content")
50948
+ }
50949
+ }, async ({ finding, type, description, content }) => {
50950
+ let f;
50951
+ try {
50952
+ f = JSON.parse(finding);
50953
+ } catch {
50954
+ return { content: [{ type: "text", text: JSON.stringify({ error: "invalid finding JSON" }) }] };
50955
+ }
50956
+ const ev = makeEvidence({ type, description, artifacts: content ? [{ name: "artifact", kind: "evidence", content }] : [] });
50957
+ const updated = attachEvidence(f, ev);
50958
+ return { content: [{ type: "text", text: JSON.stringify(updated) }] };
50959
+ });
50889
50960
  server.registerTool("redact", {
50890
50961
  title: "Redact secrets from text",
50891
50962
  description: "EVIDENCE: redact passwords/API keys/tokens/cookies/private keys from text before persisting evidence or reporting.",
@@ -51022,7 +51093,7 @@ async function serve() {
51022
51093
  }
51023
51094
 
51024
51095
  // src/cli.ts
51025
- import { readFileSync as readFileSync9, existsSync as existsSync6, writeFileSync, mkdirSync as mkdirSync2 } from "node:fs";
51096
+ import { readFileSync as readFileSync9, existsSync as existsSync5, writeFileSync, mkdirSync as mkdirSync2 } from "node:fs";
51026
51097
  import { join as join7, dirname } from "node:path";
51027
51098
  import { homedir as homedir3 } from "node:os";
51028
51099
  import { fileURLToPath as fileURLToPath5 } from "node:url";
@@ -51062,7 +51133,7 @@ function runDoctor() {
51062
51133
  detail: fofa ? "set" : "FOFA_EMAIL/FOFA_KEY not set",
51063
51134
  fix: fofa ? undefined : "export FOFA_EMAIL=... && export FOFA_KEY=... (enables fofa_search)"
51064
51135
  });
51065
- const dataOk = existsSync6(join7(ROOT4, "chains.json")) && existsSync6(join7(ROOT4, "tools-catalog.json"));
51136
+ const dataOk = existsSync5(join7(ROOT4, "chains.json")) && existsSync5(join7(ROOT4, "tools-catalog.json"));
51066
51137
  issues.push({
51067
51138
  name: "Data layers (chains + tools-catalog)",
51068
51139
  status: dataOk ? "ok" : "fail",
@@ -51091,14 +51162,14 @@ function resolveCommand() {
51091
51162
  if (which("blitzstrike"))
51092
51163
  return { command: "blitzstrike", args: ["serve", "--mcp"] };
51093
51164
  const src = join7(ROOT4, "src", "index.ts");
51094
- if (which("bun") && existsSync6(src))
51165
+ if (which("bun") && existsSync5(src))
51095
51166
  return { command: "bun", args: ["run", src, "serve", "--mcp"] };
51096
51167
  if (which("npx"))
51097
51168
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
51098
51169
  if (which("bunx"))
51099
51170
  return { command: "bunx", args: ["blitzstrike", "serve", "--mcp"] };
51100
51171
  const dist = join7(ROOT4, "dist", "index.js");
51101
- if (existsSync6(dist))
51172
+ if (existsSync5(dist))
51102
51173
  return { command: "bun", args: [dist, "serve", "--mcp"] };
51103
51174
  return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
51104
51175
  }
@@ -51112,7 +51183,7 @@ function readJson(p) {
51112
51183
  function jsonMcpServersWrite(p) {
51113
51184
  return (command, args) => {
51114
51185
  const dir = dirname(p);
51115
- if (!existsSync6(dir))
51186
+ if (!existsSync5(dir))
51116
51187
  mkdirSync2(dir, { recursive: true });
51117
51188
  const existing = readJson(p) ?? {};
51118
51189
  existing.mcpServers = {
@@ -51125,7 +51196,7 @@ function jsonMcpServersWrite(p) {
51125
51196
  function opencodeWrite(p) {
51126
51197
  return (_command, _args) => {
51127
51198
  const dir = dirname(p);
51128
- if (!existsSync6(dir))
51199
+ if (!existsSync5(dir))
51129
51200
  mkdirSync2(dir, { recursive: true });
51130
51201
  const existing = readJson(p) ?? {};
51131
51202
  existing.mcp = {
@@ -51139,14 +51210,14 @@ function opencodeWrite(p) {
51139
51210
  function copyOpenCodeAgents() {
51140
51211
  const srcDir = join7(ROOT4, "opencode-agents");
51141
51212
  const dstDir = join7(homedir3(), ".config", "opencode", "agents");
51142
- if (!existsSync6(srcDir))
51213
+ if (!existsSync5(srcDir))
51143
51214
  return;
51144
- if (!existsSync6(dstDir))
51215
+ if (!existsSync5(dstDir))
51145
51216
  mkdirSync2(dstDir, { recursive: true });
51146
51217
  for (const f of ["Blitz Strike.md", "Blitz.md", "Eagle Eye.md", "Strike.md"]) {
51147
51218
  const src = join7(srcDir, f);
51148
51219
  const dst = join7(dstDir, f);
51149
- if (existsSync6(src)) {
51220
+ if (existsSync5(src)) {
51150
51221
  writeFileSync(dst, readFileSync9(src, "utf8"));
51151
51222
  }
51152
51223
  }
@@ -51154,9 +51225,9 @@ function copyOpenCodeAgents() {
51154
51225
  function codexWrite(p) {
51155
51226
  return (command, args) => {
51156
51227
  const dir = dirname(p);
51157
- if (!existsSync6(dir))
51228
+ if (!existsSync5(dir))
51158
51229
  mkdirSync2(dir, { recursive: true });
51159
- let existing = existsSync6(p) ? readFileSync9(p, "utf8") : "";
51230
+ let existing = existsSync5(p) ? readFileSync9(p, "utf8") : "";
51160
51231
  if (!existing.trimEnd().endsWith(`
51161
51232
  `))
51162
51233
  existing += `
@@ -51173,9 +51244,9 @@ args = ${JSON.stringify(args)}
51173
51244
  function hermesWrite(p) {
51174
51245
  return (command, args) => {
51175
51246
  const dir = dirname(p);
51176
- if (!existsSync6(dir))
51247
+ if (!existsSync5(dir))
51177
51248
  mkdirSync2(dir, { recursive: true });
51178
- let existing = existsSync6(p) ? readFileSync9(p, "utf8") : "";
51249
+ let existing = existsSync5(p) ? readFileSync9(p, "utf8") : "";
51179
51250
  existing = existing.replace(/^ blitzstrike:\n(?: .*\n?)*/m, "");
51180
51251
  if (!existing.trimEnd().endsWith(`
51181
51252
  `))
@@ -51206,70 +51277,70 @@ function detectAgents() {
51206
51277
  agents.push({
51207
51278
  name: "Claude Code",
51208
51279
  detectPath: claudeJson,
51209
- installed: () => existsSync6(claudeJson) || which("claude"),
51280
+ installed: () => existsSync5(claudeJson) || which("claude"),
51210
51281
  write: jsonMcpServersWrite(claudeJson)
51211
51282
  });
51212
51283
  const claudeDesktop = join7(home, ".config", "Claude", "claude_desktop_config.json");
51213
51284
  agents.push({
51214
51285
  name: "Claude Desktop",
51215
51286
  detectPath: claudeDesktop,
51216
- installed: () => existsSync6(claudeDesktop),
51287
+ installed: () => existsSync5(claudeDesktop),
51217
51288
  write: jsonMcpServersWrite(claudeDesktop)
51218
51289
  });
51219
51290
  const cursor = join7(home, ".cursor", "mcp.json");
51220
51291
  agents.push({
51221
51292
  name: "Cursor",
51222
51293
  detectPath: cursor,
51223
- installed: () => existsSync6(join7(home, ".cursor")) || which("cursor"),
51294
+ installed: () => existsSync5(join7(home, ".cursor")) || which("cursor"),
51224
51295
  write: jsonMcpServersWrite(cursor)
51225
51296
  });
51226
51297
  const opencode = join7(home, ".config", "opencode", "opencode.jsonc");
51227
51298
  agents.push({
51228
51299
  name: "OpenCode",
51229
51300
  detectPath: opencode,
51230
- installed: () => existsSync6(join7(home, ".config", "opencode")) || which("opencode"),
51301
+ installed: () => existsSync5(join7(home, ".config", "opencode")) || which("opencode"),
51231
51302
  write: opencodeWrite(opencode)
51232
51303
  });
51233
51304
  const codex = join7(home, ".codex", "config.toml");
51234
51305
  agents.push({
51235
51306
  name: "Codex",
51236
51307
  detectPath: codex,
51237
- installed: () => existsSync6(join7(home, ".codex")) || which("codex"),
51308
+ installed: () => existsSync5(join7(home, ".codex")) || which("codex"),
51238
51309
  write: codexWrite(codex)
51239
51310
  });
51240
51311
  const hermes = join7(home, ".hermes", "config.yaml");
51241
51312
  agents.push({
51242
51313
  name: "Hermes",
51243
51314
  detectPath: hermes,
51244
- installed: () => existsSync6(join7(home, ".hermes")) || which("hermes"),
51315
+ installed: () => existsSync5(join7(home, ".hermes")) || which("hermes"),
51245
51316
  write: hermesWrite(hermes)
51246
51317
  });
51247
51318
  const gemini = join7(home, ".gemini", "settings.json");
51248
51319
  agents.push({
51249
51320
  name: "Gemini CLI",
51250
51321
  detectPath: gemini,
51251
- installed: () => existsSync6(join7(home, ".gemini")) || which("gemini"),
51322
+ installed: () => existsSync5(join7(home, ".gemini")) || which("gemini"),
51252
51323
  write: jsonMcpServersWrite(gemini)
51253
51324
  });
51254
51325
  const windsurf = join7(home, ".codeium", "windsurf", "mcp_config.json");
51255
51326
  agents.push({
51256
51327
  name: "Windsurf",
51257
51328
  detectPath: windsurf,
51258
- installed: () => existsSync6(join7(home, ".codeium")) || which("windsurf"),
51329
+ installed: () => existsSync5(join7(home, ".codeium")) || which("windsurf"),
51259
51330
  write: jsonMcpServersWrite(windsurf)
51260
51331
  });
51261
51332
  const copilot = join7(home, ".copilot", "mcp.json");
51262
51333
  agents.push({
51263
51334
  name: "Copilot",
51264
51335
  detectPath: copilot,
51265
- installed: () => existsSync6(join7(home, ".copilot")),
51336
+ installed: () => existsSync5(join7(home, ".copilot")),
51266
51337
  write: jsonMcpServersWrite(copilot)
51267
51338
  });
51268
51339
  const cline = join7(home, ".cline", "mcp_settings.json");
51269
51340
  agents.push({
51270
51341
  name: "Cline",
51271
51342
  detectPath: cline,
51272
- installed: () => existsSync6(join7(home, ".cline")),
51343
+ installed: () => existsSync5(join7(home, ".cline")),
51273
51344
  write: jsonMcpServersWrite(cline)
51274
51345
  });
51275
51346
  return agents;
@@ -51313,14 +51384,14 @@ Registered with ${ok}/${installed.length} agent(s).`);
51313
51384
  }
51314
51385
 
51315
51386
  // src/index.ts
51316
- import { readFileSync as readFileSync11, existsSync as existsSync8 } from "node:fs";
51387
+ import { readFileSync as readFileSync11, existsSync as existsSync6 } from "node:fs";
51317
51388
  import { join as join9 } from "node:path";
51318
51389
  import { fileURLToPath as fileURLToPath7 } from "node:url";
51319
51390
  var ROOT6 = join9(fileURLToPath7(new URL(".", import.meta.url)), "..");
51320
51391
  function readVersion() {
51321
51392
  try {
51322
51393
  const p = join9(ROOT6, "package.json");
51323
- if (existsSync8(p))
51394
+ if (existsSync6(p))
51324
51395
  return JSON.parse(readFileSync11(p, "utf8")).version ?? "1.0.0";
51325
51396
  } catch {}
51326
51397
  return "1.0.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "1.0.22",
3
+ "version": "1.0.23",
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": {