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.
- package/dist/index.js +113 -42
- 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
|
|
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 (!
|
|
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 (
|
|
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 (
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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(),
|
|
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
|
|
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 =
|
|
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") &&
|
|
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 (
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
51213
|
+
if (!existsSync5(srcDir))
|
|
51143
51214
|
return;
|
|
51144
|
-
if (!
|
|
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 (
|
|
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 (!
|
|
51228
|
+
if (!existsSync5(dir))
|
|
51158
51229
|
mkdirSync2(dir, { recursive: true });
|
|
51159
|
-
let existing =
|
|
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 (!
|
|
51247
|
+
if (!existsSync5(dir))
|
|
51177
51248
|
mkdirSync2(dir, { recursive: true });
|
|
51178
|
-
let existing =
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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
|
|
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 (
|
|
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.
|
|
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": {
|