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,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink Lookup — Query the threat model graph.
|
|
3
|
+
*
|
|
4
|
+
* Supports structured queries:
|
|
5
|
+
* - "asset #config" or "asset Config" → find asset by ID or path
|
|
6
|
+
* - "threat #sqli" → find threat by ID
|
|
7
|
+
* - "control #rbac" → find control by ID
|
|
8
|
+
* - "threats for #auth" → threats targeting an asset (via exposures)
|
|
9
|
+
* - "controls for #auth" → controls protecting an asset (via mitigations)
|
|
10
|
+
* - "flows into #engine" → data flows with target = engine
|
|
11
|
+
* - "flows from #config" → data flows with source = config
|
|
12
|
+
* - "unmitigated" → all unmitigated exposures
|
|
13
|
+
* - "boundary #config" → boundaries involving asset
|
|
14
|
+
* - Free text → fuzzy match across assets, threats, controls
|
|
15
|
+
*/
|
|
16
|
+
export function lookup(model, query) {
|
|
17
|
+
const q = query.trim().toLowerCase();
|
|
18
|
+
// Build ID ↔ path resolution maps
|
|
19
|
+
const idToPath = new Map();
|
|
20
|
+
const pathToId = new Map();
|
|
21
|
+
for (const a of model.assets) {
|
|
22
|
+
const path = a.path.join('.');
|
|
23
|
+
if (a.id) {
|
|
24
|
+
idToPath.set(a.id.toLowerCase(), path.toLowerCase());
|
|
25
|
+
pathToId.set(path.toLowerCase(), a.id.toLowerCase());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const t of model.threats) {
|
|
29
|
+
if (t.id)
|
|
30
|
+
idToPath.set(t.id.toLowerCase(), t.canonical_name.toLowerCase());
|
|
31
|
+
}
|
|
32
|
+
for (const c of model.controls) {
|
|
33
|
+
if (c.id)
|
|
34
|
+
idToPath.set(c.id.toLowerCase(), c.canonical_name.toLowerCase());
|
|
35
|
+
}
|
|
36
|
+
// Create a resolver that expands a ref to all known aliases
|
|
37
|
+
const resolve = (ref) => {
|
|
38
|
+
const r = ref.toLowerCase().replace(/^#/, '');
|
|
39
|
+
const aliases = [r];
|
|
40
|
+
if (idToPath.has(r))
|
|
41
|
+
aliases.push(idToPath.get(r));
|
|
42
|
+
if (pathToId.has(r))
|
|
43
|
+
aliases.push(pathToId.get(r));
|
|
44
|
+
return aliases;
|
|
45
|
+
};
|
|
46
|
+
// ── "unmitigated" ──
|
|
47
|
+
if (/^unmitigated/.test(q)) {
|
|
48
|
+
return lookupUnmitigated(model, query);
|
|
49
|
+
}
|
|
50
|
+
// ── "threats for <asset>" ──
|
|
51
|
+
const threatsFor = q.match(/^threats?\s+(?:for|targeting|on)\s+(.+)/);
|
|
52
|
+
if (threatsFor)
|
|
53
|
+
return lookupThreatsFor(model, query, threatsFor[1].trim(), resolve);
|
|
54
|
+
// ── "controls for <asset>" ──
|
|
55
|
+
const controlsFor = q.match(/^controls?\s+(?:for|protecting|on)\s+(.+)/);
|
|
56
|
+
if (controlsFor)
|
|
57
|
+
return lookupControlsFor(model, query, controlsFor[1].trim(), resolve);
|
|
58
|
+
// ── "flows into <asset>" ──
|
|
59
|
+
const flowsInto = q.match(/^flows?\s+(?:into|to)\s+(.+)/);
|
|
60
|
+
if (flowsInto)
|
|
61
|
+
return lookupFlows(model, query, 'into', flowsInto[1].trim(), resolve);
|
|
62
|
+
// ── "flows from <asset>" ──
|
|
63
|
+
const flowsFrom = q.match(/^flows?\s+(?:from|out\s+of)\s+(.+)/);
|
|
64
|
+
if (flowsFrom)
|
|
65
|
+
return lookupFlows(model, query, 'from', flowsFrom[1].trim(), resolve);
|
|
66
|
+
// ── "boundary <asset>" ──
|
|
67
|
+
const boundaryQ = q.match(/^boundar(?:y|ies)\s+(?:for|involving|of)?\s*(.+)/);
|
|
68
|
+
if (boundaryQ)
|
|
69
|
+
return lookupBoundaries(model, query, boundaryQ[1].trim(), resolve);
|
|
70
|
+
// ── "asset <id>" ──
|
|
71
|
+
const assetQ = q.match(/^asset\s+(.+)/);
|
|
72
|
+
if (assetQ)
|
|
73
|
+
return lookupAsset(model, query, assetQ[1].trim(), resolve);
|
|
74
|
+
// ── "threat <id>" ──
|
|
75
|
+
const threatQ = q.match(/^threat\s+(.+)/);
|
|
76
|
+
if (threatQ)
|
|
77
|
+
return lookupThreat(model, query, threatQ[1].trim(), resolve);
|
|
78
|
+
// ── "control <id>" ──
|
|
79
|
+
const controlQ = q.match(/^control\s+(.+)/);
|
|
80
|
+
if (controlQ)
|
|
81
|
+
return lookupControl(model, query, controlQ[1].trim(), resolve);
|
|
82
|
+
// ── "exposures for <asset>" ──
|
|
83
|
+
const exposuresFor = q.match(/^exposures?\s+(?:for|on)\s+(.+)/);
|
|
84
|
+
if (exposuresFor)
|
|
85
|
+
return lookupExposuresFor(model, query, exposuresFor[1].trim(), resolve);
|
|
86
|
+
// ── "mitigations for <asset>" ──
|
|
87
|
+
const mitigationsFor = q.match(/^mitigations?\s+(?:for|on)\s+(.+)/);
|
|
88
|
+
if (mitigationsFor)
|
|
89
|
+
return lookupMitigationsFor(model, query, mitigationsFor[1].trim(), resolve);
|
|
90
|
+
// ── Bare #id or name → try all categories ──
|
|
91
|
+
return lookupFuzzy(model, query, q);
|
|
92
|
+
}
|
|
93
|
+
// ─── Lookup implementations ──────────────────────────────────────────
|
|
94
|
+
function lookupUnmitigated(model, query) {
|
|
95
|
+
const covered = new Set();
|
|
96
|
+
for (const m of model.mitigations)
|
|
97
|
+
covered.add(`${m.asset}::${m.threat}`);
|
|
98
|
+
for (const a of model.acceptances)
|
|
99
|
+
covered.add(`${a.asset}::${a.threat}`);
|
|
100
|
+
const results = model.exposures
|
|
101
|
+
.filter(e => !covered.has(`${e.asset}::${e.threat}`))
|
|
102
|
+
.map(e => ({
|
|
103
|
+
asset: e.asset, threat: e.threat, severity: e.severity,
|
|
104
|
+
description: e.description, file: e.location.file, line: e.location.line,
|
|
105
|
+
}));
|
|
106
|
+
return { query, type: 'unmitigated_exposures', count: results.length, results };
|
|
107
|
+
}
|
|
108
|
+
function lookupThreatsFor(model, query, assetRef, resolve) {
|
|
109
|
+
const aliases = resolve(assetRef);
|
|
110
|
+
const exposures = model.exposures.filter(e => matchRef(e.asset, assetRef, aliases));
|
|
111
|
+
const threatIds = new Set(exposures.map(e => e.threat));
|
|
112
|
+
const threats = model.threats.filter(t => (t.id && threatIds.has(t.id)) || threatIds.has(t.canonical_name));
|
|
113
|
+
// Also include direct exposures info
|
|
114
|
+
const results = exposures.map(e => {
|
|
115
|
+
const threat = model.threats.find(t => t.id === e.threat || t.canonical_name === e.threat);
|
|
116
|
+
return {
|
|
117
|
+
threat: e.threat,
|
|
118
|
+
severity: e.severity || threat?.severity,
|
|
119
|
+
description: e.description || threat?.description,
|
|
120
|
+
mitigated: model.mitigations.some(m => m.asset === e.asset && m.threat === e.threat),
|
|
121
|
+
accepted: model.acceptances.some(a => a.asset === e.asset && a.threat === e.threat),
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
return { query, type: 'threats_for_asset', count: results.length, results };
|
|
125
|
+
}
|
|
126
|
+
function lookupControlsFor(model, query, assetRef, resolve) {
|
|
127
|
+
const aliases = resolve(assetRef);
|
|
128
|
+
const mits = model.mitigations.filter(m => matchRef(m.asset, assetRef, aliases));
|
|
129
|
+
const results = mits.map(m => {
|
|
130
|
+
const control = model.controls.find(c => c.id === m.control || c.canonical_name === m.control);
|
|
131
|
+
return {
|
|
132
|
+
control: m.control, threat: m.threat,
|
|
133
|
+
description: m.description || control?.description,
|
|
134
|
+
file: m.location.file, line: m.location.line,
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
return { query, type: 'controls_for_asset', count: results.length, results };
|
|
138
|
+
}
|
|
139
|
+
function lookupFlows(model, query, direction, assetRef, resolve) {
|
|
140
|
+
const aliases = resolve(assetRef);
|
|
141
|
+
const results = model.flows
|
|
142
|
+
.filter(f => direction === 'into' ? matchRef(f.target, assetRef, aliases) : matchRef(f.source, assetRef, aliases))
|
|
143
|
+
.map(f => ({
|
|
144
|
+
source: f.source, target: f.target, mechanism: f.mechanism,
|
|
145
|
+
description: f.description, file: f.location.file, line: f.location.line,
|
|
146
|
+
}));
|
|
147
|
+
return { query, type: `flows_${direction}`, count: results.length, results };
|
|
148
|
+
}
|
|
149
|
+
function lookupBoundaries(model, query, assetRef, resolve) {
|
|
150
|
+
const aliases = resolve(assetRef);
|
|
151
|
+
const results = model.boundaries
|
|
152
|
+
.filter(b => matchRef(b.asset_a, assetRef, aliases) || matchRef(b.asset_b, assetRef, aliases))
|
|
153
|
+
.map(b => ({
|
|
154
|
+
asset_a: b.asset_a, asset_b: b.asset_b, description: b.description,
|
|
155
|
+
file: b.location.file, line: b.location.line,
|
|
156
|
+
}));
|
|
157
|
+
return { query, type: 'boundaries', count: results.length, results };
|
|
158
|
+
}
|
|
159
|
+
function lookupAsset(model, query, ref, resolve) {
|
|
160
|
+
const aliases = resolve(ref);
|
|
161
|
+
const asset = model.assets.find(a => matchRef(a.id || '', ref, aliases) || matchRef(a.path.join('.'), ref, aliases));
|
|
162
|
+
if (!asset)
|
|
163
|
+
return { query, type: 'asset', count: 0, results: [] };
|
|
164
|
+
const exposures = model.exposures.filter(e => matchRef(e.asset, ref, aliases));
|
|
165
|
+
const mitigations = model.mitigations.filter(m => matchRef(m.asset, ref, aliases));
|
|
166
|
+
const inFlows = model.flows.filter(f => matchRef(f.target, ref, aliases));
|
|
167
|
+
const outFlows = model.flows.filter(f => matchRef(f.source, ref, aliases));
|
|
168
|
+
return {
|
|
169
|
+
query, type: 'asset', count: 1,
|
|
170
|
+
results: [{
|
|
171
|
+
...asset,
|
|
172
|
+
relationships: {
|
|
173
|
+
exposures: exposures.map(e => ({ threat: e.threat, severity: e.severity })),
|
|
174
|
+
mitigations: mitigations.map(m => ({ threat: m.threat, control: m.control })),
|
|
175
|
+
inbound_flows: inFlows.map(f => ({ from: f.source, mechanism: f.mechanism })),
|
|
176
|
+
outbound_flows: outFlows.map(f => ({ to: f.target, mechanism: f.mechanism })),
|
|
177
|
+
},
|
|
178
|
+
}],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function lookupThreat(model, query, ref, resolve) {
|
|
182
|
+
const aliases = resolve(ref);
|
|
183
|
+
const threat = model.threats.find(t => matchRef(t.id || '', ref, aliases) || matchRef(t.canonical_name, ref, aliases));
|
|
184
|
+
if (!threat)
|
|
185
|
+
return { query, type: 'threat', count: 0, results: [] };
|
|
186
|
+
const exposures = model.exposures.filter(e => matchRef(e.threat, ref, aliases));
|
|
187
|
+
const mitigations = model.mitigations.filter(m => matchRef(m.threat, ref, aliases));
|
|
188
|
+
return {
|
|
189
|
+
query, type: 'threat', count: 1,
|
|
190
|
+
results: [{
|
|
191
|
+
...threat,
|
|
192
|
+
affected_assets: exposures.map(e => ({ asset: e.asset, severity: e.severity, mitigated: mitigations.some(m => m.asset === e.asset) })),
|
|
193
|
+
}],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function lookupControl(model, query, ref, resolve) {
|
|
197
|
+
const aliases = resolve(ref);
|
|
198
|
+
const control = model.controls.find(c => matchRef(c.id || '', ref, aliases) || matchRef(c.canonical_name, ref, aliases));
|
|
199
|
+
if (!control)
|
|
200
|
+
return { query, type: 'control', count: 0, results: [] };
|
|
201
|
+
const mitigations = model.mitigations.filter(m => matchRef(m.control || '', ref, aliases));
|
|
202
|
+
return {
|
|
203
|
+
query, type: 'control', count: 1,
|
|
204
|
+
results: [{
|
|
205
|
+
...control,
|
|
206
|
+
protects: mitigations.map(m => ({ asset: m.asset, threat: m.threat })),
|
|
207
|
+
}],
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function lookupExposuresFor(model, query, assetRef, resolve) {
|
|
211
|
+
const aliases = resolve(assetRef);
|
|
212
|
+
const results = model.exposures
|
|
213
|
+
.filter(e => matchRef(e.asset, assetRef, aliases))
|
|
214
|
+
.map(e => ({
|
|
215
|
+
asset: e.asset, threat: e.threat, severity: e.severity,
|
|
216
|
+
description: e.description, file: e.location.file, line: e.location.line,
|
|
217
|
+
}));
|
|
218
|
+
return { query, type: 'exposures_for_asset', count: results.length, results };
|
|
219
|
+
}
|
|
220
|
+
function lookupMitigationsFor(model, query, assetRef, resolve) {
|
|
221
|
+
const aliases = resolve(assetRef);
|
|
222
|
+
const results = model.mitigations
|
|
223
|
+
.filter(m => matchRef(m.asset, assetRef, aliases))
|
|
224
|
+
.map(m => ({
|
|
225
|
+
asset: m.asset, threat: m.threat, control: m.control,
|
|
226
|
+
description: m.description, file: m.location.file, line: m.location.line,
|
|
227
|
+
}));
|
|
228
|
+
return { query, type: 'mitigations_for_asset', count: results.length, results };
|
|
229
|
+
}
|
|
230
|
+
function lookupFuzzy(model, query, q) {
|
|
231
|
+
const ref = q.replace(/^#/, '');
|
|
232
|
+
const results = [];
|
|
233
|
+
// Try assets
|
|
234
|
+
for (const a of model.assets) {
|
|
235
|
+
if (matchRef(a.id || '', ref) || matchRef(a.path.join('.'), ref)) {
|
|
236
|
+
results.push({ type: 'asset', id: a.id, path: a.path.join('.'), description: a.description });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Try threats
|
|
240
|
+
for (const t of model.threats) {
|
|
241
|
+
if (matchRef(t.id || '', ref) || matchRef(t.canonical_name, ref)) {
|
|
242
|
+
results.push({ type: 'threat', id: t.id, name: t.canonical_name, severity: t.severity });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Try controls
|
|
246
|
+
for (const c of model.controls) {
|
|
247
|
+
if (matchRef(c.id || '', ref) || matchRef(c.canonical_name, ref)) {
|
|
248
|
+
results.push({ type: 'control', id: c.id, name: c.canonical_name });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (results.length === 0) {
|
|
252
|
+
return { query, type: 'no_match', count: 0, results: [{ hint: `No match for "${query}". Try: "asset <name>", "threats for <asset>", "unmitigated", "flows into <asset>"` }] };
|
|
253
|
+
}
|
|
254
|
+
return { query, type: 'mixed', count: results.length, results };
|
|
255
|
+
}
|
|
256
|
+
// ─── Ref matching ────────────────────────────────────────────────────
|
|
257
|
+
/** Fuzzy match: #id refs, dotted paths, partial case-insensitive match */
|
|
258
|
+
function matchRef(value, ref, aliases) {
|
|
259
|
+
if (!value || !ref)
|
|
260
|
+
return false;
|
|
261
|
+
const v = value.toLowerCase().replace(/^#/, '');
|
|
262
|
+
const r = ref.toLowerCase().replace(/^#/, '');
|
|
263
|
+
// Check all aliases (resolved ID ↔ path)
|
|
264
|
+
const refs = aliases ? [r, ...aliases.map(a => a.toLowerCase().replace(/^#/, ''))] : [r];
|
|
265
|
+
for (const candidate of refs) {
|
|
266
|
+
// Exact match
|
|
267
|
+
if (v === candidate)
|
|
268
|
+
return true;
|
|
269
|
+
// Partial: ref matches last segment of dotted path
|
|
270
|
+
const lastSeg = v.split('.').pop() || '';
|
|
271
|
+
if (lastSeg === candidate)
|
|
272
|
+
return true;
|
|
273
|
+
// Substring match for short refs
|
|
274
|
+
if (candidate.length >= 3 && v.includes(candidate))
|
|
275
|
+
return true;
|
|
276
|
+
// Reverse: value is substring of candidate
|
|
277
|
+
if (v.length >= 3 && candidate.includes(v))
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/mcp/lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardLink MCP Server — Model Context Protocol integration (§8.2).
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* guardlink_parse — Parse annotations, return threat model
|
|
6
|
+
* guardlink_status — Coverage stats and unmitigated exposures
|
|
7
|
+
* guardlink_validate — Syntax errors and dangling references
|
|
8
|
+
* guardlink_suggest — Given a code diff or file, suggest annotations
|
|
9
|
+
* guardlink_lookup — Query the threat model graph
|
|
10
|
+
* guardlink_threat_report — AI threat report generation (STRIDE, DREAD, etc.)
|
|
11
|
+
* guardlink_annotate — Build annotation prompt for the calling agent
|
|
12
|
+
* guardlink_report — Generate markdown report + JSON
|
|
13
|
+
* guardlink_dashboard — Generate HTML threat model dashboard
|
|
14
|
+
* guardlink_sarif — Export SARIF 2.1.0
|
|
15
|
+
* guardlink_diff — Compare threat model against a git ref
|
|
16
|
+
* guardlink_threat_reports — List saved AI threat report files
|
|
17
|
+
*
|
|
18
|
+
* Resources:
|
|
19
|
+
* guardlink://model — Full ThreatModel JSON
|
|
20
|
+
* guardlink://definitions — Assets, threats, controls
|
|
21
|
+
* guardlink://unmitigated — Unmitigated exposures list
|
|
22
|
+
*
|
|
23
|
+
* Transport: stdio (for Claude Code .mcp.json, Cursor, etc.)
|
|
24
|
+
*
|
|
25
|
+
* @exposes #mcp to #path-traversal [high] cwe:CWE-22 -- "All tools accept root param from external AI agents"
|
|
26
|
+
* @exposes #mcp to #prompt-injection [medium] cwe:CWE-77 -- "guardlink_suggest output fed back to calling LLM"
|
|
27
|
+
* @exposes #mcp to #arbitrary-write [high] cwe:CWE-73 -- "guardlink_report and guardlink_dashboard write files"
|
|
28
|
+
* @exposes #mcp to #data-exposure [medium] cwe:CWE-200 -- "Exposes threat model details to connected agents"
|
|
29
|
+
* @accepts #path-traversal on #mcp -- "MCP clients (Claude Code, Cursor) are trusted local agents"
|
|
30
|
+
* @accepts #arbitrary-write on #mcp -- "MCP clients are trusted local agents with filesystem access"
|
|
31
|
+
* @accepts #prompt-injection on #mcp -- "Suggest output is intended for LLM consumption"
|
|
32
|
+
* @accepts #data-exposure on #mcp -- "Exposing threat model to agents is the core MCP feature"
|
|
33
|
+
* @boundary between #mcp and External_AI_Agents (#mcp-boundary) -- "Primary trust boundary: external AI agents invoke tools over stdio"
|
|
34
|
+
* @flows External_AI_Agents -> #mcp via stdio -- "Tool calls received from AI agent over stdio transport"
|
|
35
|
+
* @flows #mcp -> #parser via getModel -- "MCP tools invoke parser to build threat model"
|
|
36
|
+
* @flows #mcp -> External_AI_Agents via response -- "Tool results returned to calling agent"
|
|
37
|
+
* @handles internal on #mcp -- "Processes and exposes security-sensitive threat model data"
|
|
38
|
+
*/
|
|
39
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
40
|
+
export declare function createServer(): McpServer;
|
|
41
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCpE,wBAAgB,YAAY,IAAI,SAAS,CAwZxC"}
|