guardlink 1.0.0
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 +30 -0
- package/LICENSE +21 -0
- package/README.md +344 -0
- package/dist/agents/config.d.ts +46 -0
- package/dist/agents/config.d.ts.map +1 -0
- package/dist/agents/config.js +189 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/index.d.ts +24 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +42 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/launcher.d.ts +54 -0
- package/dist/agents/launcher.d.ts.map +1 -0
- package/dist/agents/launcher.js +152 -0
- package/dist/agents/launcher.js.map +1 -0
- package/dist/agents/prompts.d.ts +14 -0
- package/dist/agents/prompts.d.ts.map +1 -0
- package/dist/agents/prompts.js +120 -0
- package/dist/agents/prompts.js.map +1 -0
- package/dist/analyze/index.d.ts +80 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +306 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/llm.d.ts +52 -0
- package/dist/analyze/llm.d.ts.map +1 -0
- package/dist/analyze/llm.js +295 -0
- package/dist/analyze/llm.js.map +1 -0
- package/dist/analyze/prompts.d.ts +14 -0
- package/dist/analyze/prompts.d.ts.map +1 -0
- package/dist/analyze/prompts.js +205 -0
- package/dist/analyze/prompts.js.map +1 -0
- package/dist/analyzer/index.d.ts +5 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +5 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/sarif.d.ts +84 -0
- package/dist/analyzer/sarif.d.ts.map +1 -0
- package/dist/analyzer/sarif.js +149 -0
- package/dist/analyzer/sarif.js.map +1 -0
- package/dist/cli/index.d.ts +25 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +821 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/dashboard/data.d.ts +52 -0
- package/dist/dashboard/data.d.ts.map +1 -0
- package/dist/dashboard/data.js +93 -0
- package/dist/dashboard/data.js.map +1 -0
- package/dist/dashboard/diagrams.d.ts +25 -0
- package/dist/dashboard/diagrams.d.ts.map +1 -0
- package/dist/dashboard/diagrams.js +243 -0
- package/dist/dashboard/diagrams.js.map +1 -0
- package/dist/dashboard/generate.d.ts +17 -0
- package/dist/dashboard/generate.d.ts.map +1 -0
- package/dist/dashboard/generate.js +1258 -0
- package/dist/dashboard/generate.js.map +1 -0
- package/dist/dashboard/index.d.ts +7 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/diff/engine.d.ts +51 -0
- package/dist/diff/engine.d.ts.map +1 -0
- package/dist/diff/engine.js +153 -0
- package/dist/diff/engine.js.map +1 -0
- package/dist/diff/format.d.ts +10 -0
- package/dist/diff/format.d.ts.map +1 -0
- package/dist/diff/format.js +111 -0
- package/dist/diff/format.js.map +1 -0
- package/dist/diff/git.d.ts +24 -0
- package/dist/diff/git.d.ts.map +1 -0
- package/dist/diff/git.js +85 -0
- package/dist/diff/git.js.map +1 -0
- package/dist/diff/index.d.ts +7 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +7 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/init/detect.d.ts +42 -0
- package/dist/init/detect.d.ts.map +1 -0
- package/dist/init/detect.js +185 -0
- package/dist/init/detect.js.map +1 -0
- package/dist/init/index.d.ts +39 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +228 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/picker.d.ts +32 -0
- package/dist/init/picker.d.ts.map +1 -0
- package/dist/init/picker.js +105 -0
- package/dist/init/picker.js.map +1 -0
- package/dist/init/templates.d.ts +25 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +263 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +18 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/lookup.d.ts +27 -0
- package/dist/mcp/lookup.d.ts.map +1 -0
- package/dist/mcp/lookup.js +282 -0
- package/dist/mcp/lookup.js.map +1 -0
- package/dist/mcp/server.d.ts +41 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +388 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/suggest.d.ts +35 -0
- package/dist/mcp/suggest.d.ts.map +1 -0
- package/dist/mcp/suggest.js +268 -0
- package/dist/mcp/suggest.js.map +1 -0
- package/dist/parser/comment-strip.d.ts +15 -0
- package/dist/parser/comment-strip.d.ts.map +1 -0
- package/dist/parser/comment-strip.js +76 -0
- package/dist/parser/comment-strip.js.map +1 -0
- package/dist/parser/index.d.ts +10 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +9 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/normalize.d.ts +22 -0
- package/dist/parser/normalize.d.ts.map +1 -0
- package/dist/parser/normalize.js +42 -0
- package/dist/parser/normalize.js.map +1 -0
- package/dist/parser/parse-file.d.ts +18 -0
- package/dist/parser/parse-file.d.ts.map +1 -0
- package/dist/parser/parse-file.js +68 -0
- package/dist/parser/parse-file.js.map +1 -0
- package/dist/parser/parse-line.d.ts +21 -0
- package/dist/parser/parse-line.d.ts.map +1 -0
- package/dist/parser/parse-line.js +230 -0
- package/dist/parser/parse-line.js.map +1 -0
- package/dist/parser/parse-project.d.ts +31 -0
- package/dist/parser/parse-project.d.ts.map +1 -0
- package/dist/parser/parse-project.js +281 -0
- package/dist/parser/parse-project.js.map +1 -0
- package/dist/report/index.d.ts +6 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +6 -0
- package/dist/report/index.js.map +1 -0
- package/dist/report/mermaid.d.ts +15 -0
- package/dist/report/mermaid.d.ts.map +1 -0
- package/dist/report/mermaid.js +260 -0
- package/dist/report/mermaid.js.map +1 -0
- package/dist/report/report.d.ts +16 -0
- package/dist/report/report.d.ts.map +1 -0
- package/dist/report/report.js +211 -0
- package/dist/report/report.js.map +1 -0
- package/dist/tui/commands.d.ts +42 -0
- package/dist/tui/commands.d.ts.map +1 -0
- package/dist/tui/commands.js +1216 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/config.d.ts +27 -0
- package/dist/tui/config.d.ts.map +1 -0
- package/dist/tui/config.js +27 -0
- package/dist/tui/config.js.map +1 -0
- package/dist/tui/format.d.ts +63 -0
- package/dist/tui/format.d.ts.map +1 -0
- package/dist/tui/format.js +253 -0
- package/dist/tui/format.js.map +1 -0
- package/dist/tui/index.d.ts +18 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +470 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/input.d.ts +63 -0
- package/dist/tui/input.d.ts.map +1 -0
- package/dist/tui/input.js +454 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/types/index.d.ts +254 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink Report — Mermaid diagram generator.
|
|
3
|
+
*
|
|
4
|
+
* Design principles:
|
|
5
|
+
* 1. DFD-style: Show data flows between assets, trust boundaries, and threats
|
|
6
|
+
* 2. Only connected nodes: Assets with no flows/exposures are omitted
|
|
7
|
+
* 3. Controls stay in tables: Don't add control nodes — they clutter the graph
|
|
8
|
+
* 4. Threat markers on edges: Show exposures as red dotted edges, not separate nodes
|
|
9
|
+
* 5. Distinct shapes: Actors (()), Processes [], Data stores [()]
|
|
10
|
+
* 6. Deduplicate: One node per asset, one label per data classification
|
|
11
|
+
* 7. Top-down layout: External → boundary → internal → data
|
|
12
|
+
*/
|
|
13
|
+
/** Sanitize for Mermaid node IDs */
|
|
14
|
+
function nid(name) {
|
|
15
|
+
return name.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
16
|
+
}
|
|
17
|
+
/** Short display name from dotted path or #id */
|
|
18
|
+
function shortName(s) {
|
|
19
|
+
if (s.startsWith('#'))
|
|
20
|
+
return s.slice(1);
|
|
21
|
+
return s.split('.').pop() || s;
|
|
22
|
+
}
|
|
23
|
+
/** Escape for Mermaid labels */
|
|
24
|
+
function esc(s) {
|
|
25
|
+
return s.replace(/"/g, '#quot;').replace(/\n/g, ' ');
|
|
26
|
+
}
|
|
27
|
+
/** Truncate */
|
|
28
|
+
function trunc(s, max = 30) {
|
|
29
|
+
return s.length <= max ? s : s.slice(0, max - 1) + '…';
|
|
30
|
+
}
|
|
31
|
+
export function generateMermaid(model) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
// ── Build mitigation coverage map ──
|
|
34
|
+
const mitigatedPairs = new Set();
|
|
35
|
+
const acceptedPairs = new Set();
|
|
36
|
+
for (const m of model.mitigations)
|
|
37
|
+
mitigatedPairs.add(`${m.asset}::${m.threat}`);
|
|
38
|
+
for (const a of model.acceptances)
|
|
39
|
+
acceptedPairs.add(`${a.asset}::${a.threat}`);
|
|
40
|
+
const unmitigatedAssets = new Set();
|
|
41
|
+
const unmitigatedExposures = [];
|
|
42
|
+
for (const e of model.exposures) {
|
|
43
|
+
const key = `${e.asset}::${e.threat}`;
|
|
44
|
+
if (!mitigatedPairs.has(key) && !acceptedPairs.has(key)) {
|
|
45
|
+
unmitigatedAssets.add(e.asset);
|
|
46
|
+
unmitigatedExposures.push({ asset: e.asset, threat: e.threat, severity: e.severity });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ── Decide rendering mode based on complexity ──
|
|
50
|
+
// High-exposure models (>15 unmitigated) get compact mode: exposure counts on assets, no threat fan-out
|
|
51
|
+
const COMPACT_THRESHOLD = 15;
|
|
52
|
+
const isCompact = unmitigatedExposures.length > COMPACT_THRESHOLD;
|
|
53
|
+
lines.push('graph TD');
|
|
54
|
+
// ── Collect connected assets ──
|
|
55
|
+
const connectedAssets = new Set();
|
|
56
|
+
for (const f of model.flows) {
|
|
57
|
+
connectedAssets.add(f.source);
|
|
58
|
+
connectedAssets.add(f.target);
|
|
59
|
+
}
|
|
60
|
+
for (const e of model.exposures)
|
|
61
|
+
connectedAssets.add(e.asset);
|
|
62
|
+
for (const t of model.transfers) {
|
|
63
|
+
connectedAssets.add(t.source);
|
|
64
|
+
connectedAssets.add(t.target);
|
|
65
|
+
}
|
|
66
|
+
for (const b of model.boundaries) {
|
|
67
|
+
connectedAssets.add(b.asset_a);
|
|
68
|
+
connectedAssets.add(b.asset_b);
|
|
69
|
+
}
|
|
70
|
+
if (connectedAssets.size === 0) {
|
|
71
|
+
for (const a of model.assets)
|
|
72
|
+
connectedAssets.add(a.path.join('.'));
|
|
73
|
+
}
|
|
74
|
+
// ── Data classification ──
|
|
75
|
+
const dataClasses = new Map();
|
|
76
|
+
for (const h of model.data_handling) {
|
|
77
|
+
if (!dataClasses.has(h.asset))
|
|
78
|
+
dataClasses.set(h.asset, new Set());
|
|
79
|
+
dataClasses.get(h.asset).add(h.classification);
|
|
80
|
+
}
|
|
81
|
+
// ── Exposure counts per asset (for compact mode labels) ──
|
|
82
|
+
const assetExposureCounts = new Map();
|
|
83
|
+
for (const exp of unmitigatedExposures) {
|
|
84
|
+
if (!assetExposureCounts.has(exp.asset)) {
|
|
85
|
+
assetExposureCounts.set(exp.asset, { p0: 0, p1: 0, p2: 0, p3: 0, total: 0 });
|
|
86
|
+
}
|
|
87
|
+
const c = assetExposureCounts.get(exp.asset);
|
|
88
|
+
c.total++;
|
|
89
|
+
const sev = (exp.severity || '').toLowerCase();
|
|
90
|
+
if (sev.includes('p0') || sev.includes('critical'))
|
|
91
|
+
c.p0++;
|
|
92
|
+
else if (sev.includes('p1') || sev.includes('high'))
|
|
93
|
+
c.p1++;
|
|
94
|
+
else if (sev.includes('p2') || sev.includes('medium'))
|
|
95
|
+
c.p2++;
|
|
96
|
+
else
|
|
97
|
+
c.p3++;
|
|
98
|
+
}
|
|
99
|
+
// ── Group assets by boundary ──
|
|
100
|
+
const boundaryGroups = new Map();
|
|
101
|
+
for (const b of model.boundaries) {
|
|
102
|
+
const label = b.description || b.id || `${shortName(b.asset_a)} - ${shortName(b.asset_b)}`;
|
|
103
|
+
const key = b.id || label;
|
|
104
|
+
if (!boundaryGroups.has(key)) {
|
|
105
|
+
boundaryGroups.set(key, { label, members: new Set() });
|
|
106
|
+
}
|
|
107
|
+
const group = boundaryGroups.get(key);
|
|
108
|
+
if (connectedAssets.has(b.asset_a))
|
|
109
|
+
group.members.add(b.asset_a);
|
|
110
|
+
if (connectedAssets.has(b.asset_b))
|
|
111
|
+
group.members.add(b.asset_b);
|
|
112
|
+
}
|
|
113
|
+
// ── Emit boundary subgraphs ──
|
|
114
|
+
const emittedNodes = new Set();
|
|
115
|
+
for (const [, group] of boundaryGroups) {
|
|
116
|
+
if (group.members.size === 0)
|
|
117
|
+
continue;
|
|
118
|
+
const subId = nid(group.label);
|
|
119
|
+
lines.push(` subgraph ${subId}["${esc(trunc(group.label, 50))}"]`);
|
|
120
|
+
lines.push(` direction LR`);
|
|
121
|
+
for (const asset of group.members) {
|
|
122
|
+
emitNode(asset, lines, dataClasses, unmitigatedAssets, isCompact ? assetExposureCounts : undefined);
|
|
123
|
+
emittedNodes.add(asset);
|
|
124
|
+
}
|
|
125
|
+
lines.push(' end');
|
|
126
|
+
lines.push(` style ${subId} fill:none,stroke:#666,stroke-width:2px,stroke-dasharray:5 5`);
|
|
127
|
+
}
|
|
128
|
+
// ── Emit remaining connected assets ──
|
|
129
|
+
for (const asset of connectedAssets) {
|
|
130
|
+
if (!emittedNodes.has(asset)) {
|
|
131
|
+
emitNode(asset, lines, dataClasses, unmitigatedAssets, isCompact ? assetExposureCounts : undefined);
|
|
132
|
+
emittedNodes.add(asset);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
lines.push('');
|
|
136
|
+
// ── Data flow edges ──
|
|
137
|
+
for (const f of model.flows) {
|
|
138
|
+
if (!connectedAssets.has(f.source) || !connectedAssets.has(f.target))
|
|
139
|
+
continue;
|
|
140
|
+
const src = nid(f.source);
|
|
141
|
+
const tgt = nid(f.target);
|
|
142
|
+
const label = f.mechanism ? trunc(f.mechanism, 25) : '';
|
|
143
|
+
if (label) {
|
|
144
|
+
lines.push(` ${src} -->|"${esc(label)}"| ${tgt}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
lines.push(` ${src} --> ${tgt}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// ── Transfer edges (dotted) ──
|
|
151
|
+
for (const t of model.transfers) {
|
|
152
|
+
if (!connectedAssets.has(t.source) || !connectedAssets.has(t.target))
|
|
153
|
+
continue;
|
|
154
|
+
const label = t.threat.startsWith('#') ? t.threat.slice(1) : t.threat;
|
|
155
|
+
lines.push(` ${nid(t.source)} -.->|"${esc(trunc(label))}"| ${nid(t.target)}`);
|
|
156
|
+
}
|
|
157
|
+
// ── Unmitigated threats ──
|
|
158
|
+
const threatTargets = new Map();
|
|
159
|
+
for (const exp of unmitigatedExposures) {
|
|
160
|
+
const tid = exp.threat.startsWith('#') ? exp.threat.slice(1) : exp.threat;
|
|
161
|
+
if (!threatTargets.has(tid))
|
|
162
|
+
threatTargets.set(tid, []);
|
|
163
|
+
threatTargets.get(tid).push(exp.asset);
|
|
164
|
+
}
|
|
165
|
+
if (threatTargets.size > 0) {
|
|
166
|
+
lines.push('');
|
|
167
|
+
if (isCompact) {
|
|
168
|
+
// ── COMPACT MODE: Single summary node, no fan-out edges ──
|
|
169
|
+
// Asset labels already contain exposure counts. Just add a summary threat node.
|
|
170
|
+
lines.push(' %% Compact mode — exposure counts embedded in asset labels');
|
|
171
|
+
const p0 = unmitigatedExposures.filter(e => {
|
|
172
|
+
const s = (e.severity || '').toLowerCase();
|
|
173
|
+
return s.includes('p0') || s.includes('critical');
|
|
174
|
+
}).length;
|
|
175
|
+
const summaryLabel = `${unmitigatedExposures.length} unmitigated exposures across ${threatTargets.size} threats`;
|
|
176
|
+
const severityNote = p0 > 0 ? ` — ${p0} critical` : '';
|
|
177
|
+
lines.push(` _threat_summary{{"⚠ ${esc(summaryLabel + severityNote)}"}}`);
|
|
178
|
+
// Connect summary to most-exposed assets (top 3 only)
|
|
179
|
+
const topAssets = [...assetExposureCounts.entries()]
|
|
180
|
+
.sort((a, b) => b[1].total - a[1].total)
|
|
181
|
+
.slice(0, 3);
|
|
182
|
+
for (const [asset] of topAssets) {
|
|
183
|
+
if (emittedNodes.has(asset)) {
|
|
184
|
+
lines.push(` _threat_summary -. "see report" .-> ${nid(asset)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// ── NORMAL MODE: Individual threat nodes with edges ──
|
|
190
|
+
lines.push(' %% Unmitigated threats');
|
|
191
|
+
for (const [threat, assets] of threatTargets) {
|
|
192
|
+
const tid = nid(`threat_${threat}`);
|
|
193
|
+
lines.push(` ${tid}(("⚠ ${esc(trunc(threat, 20))}"))`);
|
|
194
|
+
for (const asset of assets) {
|
|
195
|
+
lines.push(` ${tid} -. "exposes" .-> ${nid(asset)}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ── Styling ──
|
|
201
|
+
lines.push('');
|
|
202
|
+
// Red border for unmitigated assets
|
|
203
|
+
for (const a of unmitigatedAssets) {
|
|
204
|
+
if (emittedNodes.has(a)) {
|
|
205
|
+
lines.push(` style ${nid(a)} stroke:#e74c3c,stroke-width:3px`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Red/orange fill for threat nodes
|
|
209
|
+
if (threatTargets.size > 0) {
|
|
210
|
+
if (isCompact) {
|
|
211
|
+
lines.push(` style _threat_summary fill:#fce4e4,stroke:#e74c3c,color:#c0392b`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const tids = [...threatTargets.keys()].map(t => nid(`threat_${t}`));
|
|
215
|
+
lines.push(` style ${tids.join(',')} fill:#fce4e4,stroke:#e74c3c,color:#c0392b`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return lines.join('\n');
|
|
219
|
+
}
|
|
220
|
+
function emitNode(asset, lines, dataClasses, unmitigatedAssets, exposureCounts) {
|
|
221
|
+
const id = nid(asset);
|
|
222
|
+
const name = shortName(asset);
|
|
223
|
+
const classes = dataClasses.get(asset);
|
|
224
|
+
// Build label
|
|
225
|
+
let label = name;
|
|
226
|
+
if (classes && classes.size > 0) {
|
|
227
|
+
const classStr = [...classes].join(', ');
|
|
228
|
+
label += ` (${classStr})`;
|
|
229
|
+
}
|
|
230
|
+
// In compact mode, append exposure count to label
|
|
231
|
+
if (exposureCounts) {
|
|
232
|
+
const counts = exposureCounts.get(asset);
|
|
233
|
+
if (counts && counts.total > 0) {
|
|
234
|
+
const parts = [];
|
|
235
|
+
if (counts.p0 > 0)
|
|
236
|
+
parts.push(`${counts.p0} crit`);
|
|
237
|
+
if (counts.p1 > 0)
|
|
238
|
+
parts.push(`${counts.p1} high`);
|
|
239
|
+
if (counts.p2 > 0)
|
|
240
|
+
parts.push(`${counts.p2} med`);
|
|
241
|
+
if (counts.p3 > 0)
|
|
242
|
+
parts.push(`${counts.p3} low`);
|
|
243
|
+
label += ` | ${parts.join(', ')}`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Choose shape based on naming heuristics
|
|
247
|
+
const lower = name.toLowerCase();
|
|
248
|
+
const isDataStore = /(?:db|database|store|cache|file|credential|config|secret|storage|filesystem)/i.test(lower);
|
|
249
|
+
const isActor = /(?:user|browser|client|external|attacker)/i.test(lower);
|
|
250
|
+
if (isDataStore) {
|
|
251
|
+
lines.push(` ${id}[("${esc(label)}")]`);
|
|
252
|
+
}
|
|
253
|
+
else if (isActor) {
|
|
254
|
+
lines.push(` ${id}(("${esc(label)}"))`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
lines.push(` ${id}["${esc(label)}"]`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=mermaid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/report/mermaid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink Report — Markdown report generator.
|
|
3
|
+
* Produces a human-readable threat model report with
|
|
4
|
+
* embedded Mermaid diagram, finding tables, and coverage stats.
|
|
5
|
+
*
|
|
6
|
+
* @exposes #report to #arbitrary-write [high] cwe:CWE-73 -- "Report written to user-specified output path"
|
|
7
|
+
* @exposes #report to #info-disclosure [low] cwe:CWE-200 -- "Report contains detailed threat model information"
|
|
8
|
+
* @accepts #info-disclosure on #report -- "Detailed threat model report is the intended output"
|
|
9
|
+
* @mitigates #report against #arbitrary-write using #path-validation -- "CLI resolves output path before passing to report generator"
|
|
10
|
+
* @flows #parser -> #report via ThreatModel -- "Report generator receives parsed threat model"
|
|
11
|
+
* @flows #report -> Filesystem via writeFile -- "Generated markdown written to disk by CLI"
|
|
12
|
+
* @handles internal on #report -- "Processes and formats security-sensitive threat model data"
|
|
13
|
+
*/
|
|
14
|
+
import type { ThreatModel } from '../types/index.js';
|
|
15
|
+
export declare function generateReport(model: ThreatModel): string;
|
|
16
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/report/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiC,MAAM,mBAAmB,CAAC;AAGpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAmKzD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink Report — Markdown report generator.
|
|
3
|
+
* Produces a human-readable threat model report with
|
|
4
|
+
* embedded Mermaid diagram, finding tables, and coverage stats.
|
|
5
|
+
*
|
|
6
|
+
* @exposes #report to #arbitrary-write [high] cwe:CWE-73 -- "Report written to user-specified output path"
|
|
7
|
+
* @exposes #report to #info-disclosure [low] cwe:CWE-200 -- "Report contains detailed threat model information"
|
|
8
|
+
* @accepts #info-disclosure on #report -- "Detailed threat model report is the intended output"
|
|
9
|
+
* @mitigates #report against #arbitrary-write using #path-validation -- "CLI resolves output path before passing to report generator"
|
|
10
|
+
* @flows #parser -> #report via ThreatModel -- "Report generator receives parsed threat model"
|
|
11
|
+
* @flows #report -> Filesystem via writeFile -- "Generated markdown written to disk by CLI"
|
|
12
|
+
* @handles internal on #report -- "Processes and formats security-sensitive threat model data"
|
|
13
|
+
*/
|
|
14
|
+
import { generateMermaid } from './mermaid.js';
|
|
15
|
+
export function generateReport(model) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
// ── Header ──
|
|
18
|
+
lines.push(`# Threat Model Report — ${model.project}`);
|
|
19
|
+
lines.push('');
|
|
20
|
+
lines.push(`> Generated: ${model.generated_at} `);
|
|
21
|
+
lines.push(`> Files scanned: ${model.source_files} | Annotations: ${model.annotations_parsed}`);
|
|
22
|
+
lines.push('');
|
|
23
|
+
// ── Executive Summary ──
|
|
24
|
+
lines.push('## Executive Summary');
|
|
25
|
+
lines.push('');
|
|
26
|
+
const mitigatedPairs = new Set();
|
|
27
|
+
const acceptedPairs = new Set();
|
|
28
|
+
for (const m of model.mitigations)
|
|
29
|
+
mitigatedPairs.add(`${m.asset}::${m.threat}`);
|
|
30
|
+
for (const a of model.acceptances)
|
|
31
|
+
acceptedPairs.add(`${a.asset}::${a.threat}`);
|
|
32
|
+
const unmitigated = model.exposures.filter(e => {
|
|
33
|
+
const key = `${e.asset}::${e.threat}`;
|
|
34
|
+
return !mitigatedPairs.has(key) && !acceptedPairs.has(key);
|
|
35
|
+
});
|
|
36
|
+
const severityCounts = countBySeverity(unmitigated);
|
|
37
|
+
lines.push(`| Metric | Count |`);
|
|
38
|
+
lines.push(`|--------|-------|`);
|
|
39
|
+
lines.push(`| Assets | ${model.assets.length} |`);
|
|
40
|
+
lines.push(`| Threats defined | ${model.threats.length} |`);
|
|
41
|
+
lines.push(`| Controls defined | ${model.controls.length} |`);
|
|
42
|
+
lines.push(`| Active mitigations | ${model.mitigations.length} |`);
|
|
43
|
+
lines.push(`| Accepted risks | ${model.acceptances.length} |`);
|
|
44
|
+
lines.push(`| **Unmitigated exposures** | **${unmitigated.length}** |`);
|
|
45
|
+
if (severityCounts.critical > 0)
|
|
46
|
+
lines.push(`| ↳ Critical (P0) | ${severityCounts.critical} |`);
|
|
47
|
+
if (severityCounts.high > 0)
|
|
48
|
+
lines.push(`| ↳ High (P1) | ${severityCounts.high} |`);
|
|
49
|
+
if (severityCounts.medium > 0)
|
|
50
|
+
lines.push(`| ↳ Medium (P2) | ${severityCounts.medium} |`);
|
|
51
|
+
if (severityCounts.low > 0)
|
|
52
|
+
lines.push(`| ↳ Low (P3) | ${severityCounts.low} |`);
|
|
53
|
+
lines.push(`| Data flows | ${model.flows.length} |`);
|
|
54
|
+
lines.push(`| Trust boundaries | ${model.boundaries.length} |`);
|
|
55
|
+
lines.push('');
|
|
56
|
+
// ── Threat Model Diagram ──
|
|
57
|
+
lines.push('## Threat Model Diagram');
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('```mermaid');
|
|
60
|
+
lines.push(generateMermaid(model));
|
|
61
|
+
lines.push('```');
|
|
62
|
+
lines.push('');
|
|
63
|
+
// ── Unmitigated Exposures ──
|
|
64
|
+
if (unmitigated.length > 0) {
|
|
65
|
+
lines.push('## ⚠ Unmitigated Exposures');
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push('These exposures have no matching `@mitigates` or `@accepts` and require attention.');
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push('| Severity | Asset | Threat | Description | Location |');
|
|
70
|
+
lines.push('|----------|-------|--------|-------------|----------|');
|
|
71
|
+
for (const e of sortBySeverity(unmitigated)) {
|
|
72
|
+
const sev = severityBadge(e.severity);
|
|
73
|
+
const desc = e.description ? truncate(e.description, 60) : '—';
|
|
74
|
+
const loc = `${e.location.file}:${e.location.line}`;
|
|
75
|
+
lines.push(`| ${sev} | ${e.asset} | ${e.threat} | ${desc} | ${loc} |`);
|
|
76
|
+
}
|
|
77
|
+
lines.push('');
|
|
78
|
+
}
|
|
79
|
+
// ── Accepted Risks ──
|
|
80
|
+
if (model.acceptances.length > 0) {
|
|
81
|
+
lines.push('## ✅ Accepted Risks');
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push('| Asset | Threat | Rationale | Location |');
|
|
84
|
+
lines.push('|-------|--------|-----------|----------|');
|
|
85
|
+
for (const a of model.acceptances) {
|
|
86
|
+
const desc = a.description ? truncate(a.description, 60) : '—';
|
|
87
|
+
lines.push(`| ${a.asset} | ${a.threat} | ${desc} | ${a.location.file}:${a.location.line} |`);
|
|
88
|
+
}
|
|
89
|
+
lines.push('');
|
|
90
|
+
}
|
|
91
|
+
// ── Active Mitigations ──
|
|
92
|
+
if (model.mitigations.length > 0) {
|
|
93
|
+
lines.push('## 🛡 Active Mitigations');
|
|
94
|
+
lines.push('');
|
|
95
|
+
lines.push('| Asset | Threat | Control | Description | Location |');
|
|
96
|
+
lines.push('|-------|--------|---------|-------------|----------|');
|
|
97
|
+
for (const m of model.mitigations) {
|
|
98
|
+
const desc = m.description ? truncate(m.description, 50) : '—';
|
|
99
|
+
const ctrl = m.control || '—';
|
|
100
|
+
lines.push(`| ${m.asset} | ${m.threat} | ${ctrl} | ${desc} | ${m.location.file}:${m.location.line} |`);
|
|
101
|
+
}
|
|
102
|
+
lines.push('');
|
|
103
|
+
}
|
|
104
|
+
// ── Data Flows ──
|
|
105
|
+
if (model.flows.length > 0) {
|
|
106
|
+
lines.push('## 📊 Data Flows');
|
|
107
|
+
lines.push('');
|
|
108
|
+
lines.push('| Source | Target | Mechanism | Description |');
|
|
109
|
+
lines.push('|--------|--------|-----------|-------------|');
|
|
110
|
+
for (const f of model.flows) {
|
|
111
|
+
const mech = f.mechanism || '—';
|
|
112
|
+
const desc = f.description ? truncate(f.description, 50) : '—';
|
|
113
|
+
lines.push(`| ${f.source} | ${f.target} | ${mech} | ${desc} |`);
|
|
114
|
+
}
|
|
115
|
+
lines.push('');
|
|
116
|
+
}
|
|
117
|
+
// ── Data Handling ──
|
|
118
|
+
if (model.data_handling.length > 0) {
|
|
119
|
+
lines.push('## 📋 Data Classification');
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push('| Asset | Classification | Description |');
|
|
122
|
+
lines.push('|-------|---------------|-------------|');
|
|
123
|
+
for (const h of model.data_handling) {
|
|
124
|
+
const desc = h.description ? truncate(h.description, 60) : '—';
|
|
125
|
+
lines.push(`| ${h.asset} | ${classificationBadge(h.classification)} | ${desc} |`);
|
|
126
|
+
}
|
|
127
|
+
lines.push('');
|
|
128
|
+
}
|
|
129
|
+
// ── Audit Items ──
|
|
130
|
+
if (model.audits.length > 0) {
|
|
131
|
+
lines.push('## 🔍 Audit Items');
|
|
132
|
+
lines.push('');
|
|
133
|
+
for (const a of model.audits) {
|
|
134
|
+
const desc = a.description || 'Needs review';
|
|
135
|
+
lines.push(`- **${a.asset}** — ${desc} (${a.location.file}:${a.location.line})`);
|
|
136
|
+
}
|
|
137
|
+
lines.push('');
|
|
138
|
+
}
|
|
139
|
+
// ── Assumptions ──
|
|
140
|
+
if (model.assumptions.length > 0) {
|
|
141
|
+
lines.push('## ⚡ Assumptions');
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push('These are unverified assumptions that should be periodically reviewed.');
|
|
144
|
+
lines.push('');
|
|
145
|
+
for (const a of model.assumptions) {
|
|
146
|
+
const desc = a.description || 'Unverified assumption';
|
|
147
|
+
lines.push(`- **${a.asset}** — ${desc} (${a.location.file}:${a.location.line})`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
}
|
|
151
|
+
// ── Developer Comments ──
|
|
152
|
+
if (model.comments.length > 0) {
|
|
153
|
+
lines.push('## 💬 Developer Comments');
|
|
154
|
+
lines.push('');
|
|
155
|
+
lines.push('Security-relevant notes left by developers via `@comment`.');
|
|
156
|
+
lines.push('');
|
|
157
|
+
for (const c of model.comments) {
|
|
158
|
+
const desc = c.description || 'No description';
|
|
159
|
+
lines.push(`- ${desc} (${c.location.file}:${c.location.line})`);
|
|
160
|
+
}
|
|
161
|
+
lines.push('');
|
|
162
|
+
}
|
|
163
|
+
// ── Footer ──
|
|
164
|
+
lines.push('---');
|
|
165
|
+
lines.push(`*Generated by [GuardLink](https://guardlink.bugb.io) — Security annotations for code.*`);
|
|
166
|
+
return lines.join('\n');
|
|
167
|
+
}
|
|
168
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
169
|
+
function truncate(s, max) {
|
|
170
|
+
if (s.length <= max)
|
|
171
|
+
return s;
|
|
172
|
+
return s.slice(0, max - 1) + '…';
|
|
173
|
+
}
|
|
174
|
+
const SEVERITY_ORDER = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
175
|
+
function severityBadge(sev) {
|
|
176
|
+
switch (sev) {
|
|
177
|
+
case 'critical': return '🔴 Critical';
|
|
178
|
+
case 'high': return '🟠 High';
|
|
179
|
+
case 'medium': return '🟡 Medium';
|
|
180
|
+
case 'low': return '🔵 Low';
|
|
181
|
+
default: return '⚪ Unset';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function classificationBadge(c) {
|
|
185
|
+
switch (c) {
|
|
186
|
+
case 'pii': return '🔒 PII';
|
|
187
|
+
case 'phi': return '🏥 PHI';
|
|
188
|
+
case 'financial': return '💰 Financial';
|
|
189
|
+
case 'secrets': return '🔑 Secrets';
|
|
190
|
+
case 'internal': return '🏢 Internal';
|
|
191
|
+
case 'public': return '🌐 Public';
|
|
192
|
+
default: return c;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function sortBySeverity(exposures) {
|
|
196
|
+
return [...exposures].sort((a, b) => {
|
|
197
|
+
const sa = SEVERITY_ORDER[a.severity || 'low'] ?? 4;
|
|
198
|
+
const sb = SEVERITY_ORDER[b.severity || 'low'] ?? 4;
|
|
199
|
+
return sa - sb;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function countBySeverity(exposures) {
|
|
203
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
204
|
+
for (const e of exposures) {
|
|
205
|
+
if (e.severity && e.severity in counts) {
|
|
206
|
+
counts[e.severity]++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return counts;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/report/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink TUI — Command implementations.
|
|
3
|
+
*
|
|
4
|
+
* Each command function takes (args, ctx) and prints output directly.
|
|
5
|
+
* Returns void. Throws on fatal errors.
|
|
6
|
+
*/
|
|
7
|
+
import type { ThreatModel, ThreatModelExposure } from '../types/index.js';
|
|
8
|
+
export interface TuiContext {
|
|
9
|
+
root: string;
|
|
10
|
+
model: ThreatModel | null;
|
|
11
|
+
projectName: string;
|
|
12
|
+
/** Cached exposure list for /show references */
|
|
13
|
+
lastExposures: ThreatModelExposure[];
|
|
14
|
+
/** readline interface for prompting */
|
|
15
|
+
rl: import('node:readline').Interface;
|
|
16
|
+
/** Guard: true while ask() is waiting for sub-prompt input */
|
|
17
|
+
_askActive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Re-parse the project and update context */
|
|
20
|
+
export declare function refreshModel(ctx: TuiContext): Promise<void>;
|
|
21
|
+
export declare function cmdHelp(): void;
|
|
22
|
+
export declare function cmdGal(): void;
|
|
23
|
+
export declare function cmdStatus(ctx: TuiContext): void;
|
|
24
|
+
export declare function cmdExposures(args: string, ctx: TuiContext): void;
|
|
25
|
+
export declare function cmdShow(args: string, ctx: TuiContext): void;
|
|
26
|
+
export declare function cmdAssets(ctx: TuiContext): void;
|
|
27
|
+
export declare function cmdFiles(ctx: TuiContext): void;
|
|
28
|
+
export declare function cmdView(args: string, ctx: TuiContext): void;
|
|
29
|
+
export declare function cmdInit(args: string, ctx: TuiContext): Promise<void>;
|
|
30
|
+
export declare function cmdParse(ctx: TuiContext): Promise<void>;
|
|
31
|
+
export declare function cmdScan(ctx: TuiContext): void;
|
|
32
|
+
export declare function cmdValidate(ctx: TuiContext): Promise<void>;
|
|
33
|
+
export declare function cmdDiff(args: string, ctx: TuiContext): Promise<void>;
|
|
34
|
+
export declare function cmdSarif(args: string, ctx: TuiContext): Promise<void>;
|
|
35
|
+
export declare function cmdModel(ctx: TuiContext): Promise<void>;
|
|
36
|
+
export declare function cmdThreatReport(args: string, ctx: TuiContext): Promise<void>;
|
|
37
|
+
export declare function cmdThreatReports(ctx: TuiContext): void;
|
|
38
|
+
export declare function cmdAnnotate(args: string, ctx: TuiContext): Promise<void>;
|
|
39
|
+
export declare function cmdChat(text: string, ctx: TuiContext): Promise<void>;
|
|
40
|
+
export declare function cmdReport(ctx: TuiContext): Promise<void>;
|
|
41
|
+
export declare function cmdDashboard(ctx: TuiContext): Promise<void>;
|
|
42
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/tui/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAuB3F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,uCAAuC;IACvC,EAAE,EAAE,OAAO,eAAe,EAAE,SAAS,CAAC;IACtC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,8CAA8C;AAC9C,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAoBD,wBAAgB,OAAO,IAAI,IAAI,CAyC9B;AAID,wBAAgB,MAAM,IAAI,IAAI,CAoJ7B;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA4D/C;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAiEhE;AAID,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CA0B3D;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA8C/C;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA6E9C;AAID,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAuH3D;AAID,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC1E;AAID,wBAAsB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B7D;AAID,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA0B7C;AAID,wBAAsB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhE;AAID,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B1E;AAID,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC3E;AAiDD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE7D;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHlF;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAsBtD;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D9E;AAID,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C1E;AAID,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE"}
|