blitzstrike 1.0.72 → 1.0.74
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 +22 -0
- package/dist/index.js +50 -2
- package/package.json +1 -1
- package/skills/bs-orchestrate-engagement.md +6 -0
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
|
+
## [1.0.74] — 2026-09-13
|
|
9
|
+
|
|
10
|
+
### Fixed — banner now visibly surfaces in the terminal
|
|
11
|
+
|
|
12
|
+
- `run_engagement` now returns the "orchestrator in control" banner as a
|
|
13
|
+
standalone first text block (plus a one-line status summary), instead of
|
|
14
|
+
burying it inside the JSON result — so it actually appears in the client
|
|
15
|
+
terminal when the engagement starts.
|
|
16
|
+
- `bs-orchestrate-engagement` now instructs the driving agent to relay the
|
|
17
|
+
banner verbatim and drive `blitz_status` for live progress.
|
|
18
|
+
|
|
19
|
+
## [1.0.73] — 2026-09-13
|
|
20
|
+
|
|
21
|
+
### Added — orchestrator "in control" banner + live progress
|
|
22
|
+
|
|
23
|
+
- `run_engagement` now returns a terminal-friendly banner announcing the
|
|
24
|
+
engagement ("orchestrator in control") with the target, mode, and the
|
|
25
|
+
canonical scope→recon→analyze→verify→review→report pipeline.
|
|
26
|
+
- New `blitz_status` MCP tool: format a live progress snapshot (current stage,
|
|
27
|
+
checkmark/active/pending markers, finding counts, task status) so a driving
|
|
28
|
+
agent can announce progress to the user as it works.
|
|
29
|
+
|
|
8
30
|
## [1.0.72] — 2026-09-13
|
|
9
31
|
|
|
10
32
|
### Changed — coordinated agent guidance
|
package/dist/index.js
CHANGED
|
@@ -30787,6 +30787,33 @@ function resolveFinding(finding, verdict) {
|
|
|
30787
30787
|
}
|
|
30788
30788
|
|
|
30789
30789
|
// src/orchestrator.ts
|
|
30790
|
+
var ENGAGEMENT_STAGES = ["scope", "recon", "analyze", "verify", "review", "report"];
|
|
30791
|
+
function engagementBanner(target, mode) {
|
|
30792
|
+
return [
|
|
30793
|
+
"⚡ BLITZ engagement — orchestrator in control",
|
|
30794
|
+
` target: ${target}`,
|
|
30795
|
+
` mode: ${mode}`,
|
|
30796
|
+
` stages: ${ENGAGEMENT_STAGES.join(" → ")}`
|
|
30797
|
+
].join(`
|
|
30798
|
+
`);
|
|
30799
|
+
}
|
|
30800
|
+
function formatStatus(opts) {
|
|
30801
|
+
const lines = [];
|
|
30802
|
+
const idx = opts.phase ? ENGAGEMENT_STAGES.indexOf(opts.phase) : -1;
|
|
30803
|
+
lines.push(`BLITZ engagement${idx >= 0 ? ` — ${opts.phase} (${idx + 1}/${ENGAGEMENT_STAGES.length})` : ""}`);
|
|
30804
|
+
if (idx >= 0) {
|
|
30805
|
+
lines.push(` stages: ${ENGAGEMENT_STAGES.map((s, i) => i < idx ? `${s} ✓` : i === idx ? `${s} ▶` : `${s} ☐`).join(" ")}`);
|
|
30806
|
+
}
|
|
30807
|
+
if (opts.findings) {
|
|
30808
|
+
const f = opts.findings;
|
|
30809
|
+
lines.push(` findings: ${[`${f.detected ?? 0} detected`, `${f.hypothesis ?? 0} hypothesis`, `${f.confirmed ?? 0} confirmed`, `${f.false_positive ?? 0} false_positive`].join(" · ")}`);
|
|
30810
|
+
}
|
|
30811
|
+
if (opts.tasks && opts.tasks.length) {
|
|
30812
|
+
lines.push(` tasks: ${opts.tasks.map((t) => `${t.objective} (${t.status})`).join(" · ")}`);
|
|
30813
|
+
}
|
|
30814
|
+
return lines.join(`
|
|
30815
|
+
`);
|
|
30816
|
+
}
|
|
30790
30817
|
var _chainsCache = null;
|
|
30791
30818
|
function loadChains() {
|
|
30792
30819
|
if (_chainsCache)
|
|
@@ -30904,6 +30931,7 @@ function enrichScan(path, maxFiles = 2000) {
|
|
|
30904
30931
|
}
|
|
30905
30932
|
function runEngagement(target, scope = "", mode = "bug-bounty", maxFiles = 2000, remember = true) {
|
|
30906
30933
|
const report = {
|
|
30934
|
+
banner: engagementBanner(target, mode),
|
|
30907
30935
|
target,
|
|
30908
30936
|
mode,
|
|
30909
30937
|
tiers: {},
|
|
@@ -31057,7 +31085,7 @@ function listChains() {
|
|
|
31057
31085
|
}
|
|
31058
31086
|
var LIVE_SWEEP_PARAMS = ["q", "search", "query", "s", "id", "url", "redirect", "name", "page"];
|
|
31059
31087
|
async function runLiveEngagement(url, scope = "", mode = "bug-bounty") {
|
|
31060
|
-
const report = { target: url, mode, findings: [], scope: null, status: "" };
|
|
31088
|
+
const report = { banner: engagementBanner(url, mode), target: url, mode, findings: [], scope: null, status: "" };
|
|
31061
31089
|
const sc = scopeCheck(url, scope, mode);
|
|
31062
31090
|
report.scope = sc;
|
|
31063
31091
|
if (!sc.allowed) {
|
|
@@ -53490,8 +53518,28 @@ function createServer() {
|
|
|
53490
53518
|
}, async ({ target, scope, mode, max_files, remember }) => {
|
|
53491
53519
|
const isUrl = /^https?:\/\//i.test(target);
|
|
53492
53520
|
const r = isUrl ? await runLiveEngagement(target, scope ?? "", mode ?? "bug-bounty") : runEngagement(target, scope ?? "", mode ?? "bug-bounty", max_files ?? 2000, remember ?? true);
|
|
53521
|
+
const banner = typeof r.banner === "string" ? r.banner : "";
|
|
53522
|
+
const statusLine = r.status === "BLOCKED" ? `✋ BLOCKED — ${r.reason ?? "scope required"}` : `→ ${Array.isArray(r.findings) ? r.findings.length : 0} finding(s), status=${r.status ?? "COMPLETE"}`;
|
|
53493
53523
|
return {
|
|
53494
|
-
content: [
|
|
53524
|
+
content: [
|
|
53525
|
+
{ type: "text", text: banner ? `${banner}
|
|
53526
|
+
|
|
53527
|
+
${statusLine}` : statusLine },
|
|
53528
|
+
{ type: "text", text: JSON.stringify(r) }
|
|
53529
|
+
]
|
|
53530
|
+
};
|
|
53531
|
+
});
|
|
53532
|
+
server.registerTool("blitz_status", {
|
|
53533
|
+
title: "Engagement progress banner",
|
|
53534
|
+
description: "Format a terminal-friendly live progress snapshot of the running engagement — current stage (of the scope→recon→analyze→verify→review→report pipeline), finding counts, and task status. Call it to announce progress to the user as you drive the audit.",
|
|
53535
|
+
inputSchema: {
|
|
53536
|
+
phase: string2().optional().describe("Current stage: scope/recon/analyze/verify/review/report"),
|
|
53537
|
+
findings: record(string2(), number2()).optional().describe("Finding counts, e.g. {detected:4,hypothesis:2,confirmed:1,false_positive:0}"),
|
|
53538
|
+
tasks: array(object2({ id: string2(), objective: string2(), status: string2() })).optional().describe("Task list with status")
|
|
53539
|
+
}
|
|
53540
|
+
}, async ({ phase, findings, tasks }) => {
|
|
53541
|
+
return {
|
|
53542
|
+
content: [{ type: "text", text: formatStatus({ phase, findings, tasks }) }]
|
|
53495
53543
|
};
|
|
53496
53544
|
});
|
|
53497
53545
|
server.registerTool("list_chains", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.74",
|
|
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": {
|
|
@@ -15,6 +15,12 @@ deterministic MCP tools; never guess a finding — produce it from tool output.
|
|
|
15
15
|
Static source paths on disk are always in-scope; live URLs require an
|
|
16
16
|
explicit scope.
|
|
17
17
|
|
|
18
|
+
**Announce takeover.** When you start an engagement, `run_engagement`
|
|
19
|
+
returns a `banner` ("orchestrator in control") as a standalone text block.
|
|
20
|
+
RELAY that banner verbatim to the user — it is the visible signal that you
|
|
21
|
+
have taken control, not a detail to bury in a JSON dump. Then drive
|
|
22
|
+
`blitz_status` at each stage to show live progress.
|
|
23
|
+
|
|
18
24
|
2. **Recon (passive-first).** For a live target: `live_recon` (fingerprint, WAF,
|
|
19
25
|
endpoints, tech). For a source tree: `blitz_scan` (entry points + sinks),
|
|
20
26
|
`detect_framework`, `list_attack_vectors`.
|