@shiftleftpt/sbd-toe-mcp 0.6.3 → 0.7.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/assets/agent-guide.md +22 -19
- package/data/publish/algolia_entities_records_enriched.json +25370 -2
- package/data/publish/canonical_controls.json +1239 -0
- package/data/publish/canonical_requirements_s7.json +1859 -0
- package/data/publish/canonical_roles_s5.json +138 -0
- package/data/publish/lifecycle_user_stories.json +6558 -0
- package/data/publish/mitigated_threats.json +6945 -0
- package/data/publish/practice_assignments.json +16266 -0
- package/data/publish/sbdtoe-ontology.yaml +696 -0
- package/dist/backend/semantic-index-gateway.js +1 -1
- package/dist/index.js +230 -10
- package/dist/index.js.map +1 -1
- package/dist/resources/sbd-toe-resources.js +6 -1
- package/dist/resources/sbd-toe-resources.js.map +1 -1
- package/dist/tools/consult-security-requirements.d.ts +38 -0
- package/dist/tools/consult-security-requirements.js +115 -0
- package/dist/tools/consult-security-requirements.js.map +1 -0
- package/dist/tools/get-guide-by-role.d.ts +38 -0
- package/dist/tools/get-guide-by-role.js +109 -0
- package/dist/tools/get-guide-by-role.js.map +1 -0
- package/dist/tools/get-threat-landscape.d.ts +44 -0
- package/dist/tools/get-threat-landscape.js +116 -0
- package/dist/tools/get-threat-landscape.js.map +1 -0
- package/dist/tools/map-review-scope.js +5 -0
- package/dist/tools/map-review-scope.js.map +1 -1
- package/dist/tools/ontology-loader.d.ts +104 -0
- package/dist/tools/ontology-loader.js +206 -0
- package/dist/tools/ontology-loader.js.map +1 -0
- package/dist/tools/resolve-entities.d.ts +26 -0
- package/dist/tools/resolve-entities.js +143 -0
- package/dist/tools/resolve-entities.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ontology-loader
|
|
3
|
+
*
|
|
4
|
+
* Loads and caches the SbD-ToE ontology and entity data from data/publish/.
|
|
5
|
+
* Single source of truth for ontology-driven tools.
|
|
6
|
+
*
|
|
7
|
+
* As of kg v1.4.0, all entity types (including requirement and control) are
|
|
8
|
+
* present in algolia_entities_records_enriched.json with normalised record_type.
|
|
9
|
+
* The individual entity files (canonical_requirements_s7.json, etc.) are no
|
|
10
|
+
* longer required.
|
|
11
|
+
*
|
|
12
|
+
* Files consumed:
|
|
13
|
+
* data/publish/sbdtoe-ontology.yaml — domain_mapping, rules, pipelines
|
|
14
|
+
* data/publish/algolia_entities_records_enriched.json — all entity types by record_type
|
|
15
|
+
*
|
|
16
|
+
* All data is read from the published artefacts — nothing is invented.
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync } from "node:fs";
|
|
19
|
+
import { parse as parseYaml } from "yaml";
|
|
20
|
+
import { resolveAppPath } from "../config.js";
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Cache
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
let _cache;
|
|
25
|
+
function loadOntologyYaml() {
|
|
26
|
+
const path = resolveAppPath("data/publish/sbdtoe-ontology.yaml");
|
|
27
|
+
return parseYaml(readFileSync(path, "utf-8"));
|
|
28
|
+
}
|
|
29
|
+
function loadEnrichedEntities() {
|
|
30
|
+
const path = resolveAppPath("data/publish/algolia_entities_records_enriched.json");
|
|
31
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
32
|
+
return Array.isArray(raw.items) ? raw.items : [];
|
|
33
|
+
}
|
|
34
|
+
function isRecord(v) {
|
|
35
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
36
|
+
}
|
|
37
|
+
function strOf(rec, key) {
|
|
38
|
+
const v = rec[key];
|
|
39
|
+
return typeof v === "string" ? v : "";
|
|
40
|
+
}
|
|
41
|
+
function numOf(rec, key) {
|
|
42
|
+
const v = rec[key];
|
|
43
|
+
return typeof v === "number" ? v : NaN;
|
|
44
|
+
}
|
|
45
|
+
function arrStr(rec, key) {
|
|
46
|
+
const v = rec[key];
|
|
47
|
+
if (!Array.isArray(v))
|
|
48
|
+
return [];
|
|
49
|
+
return v.filter((x) => typeof x === "string");
|
|
50
|
+
}
|
|
51
|
+
export function getOntologyData() {
|
|
52
|
+
if (_cache)
|
|
53
|
+
return _cache;
|
|
54
|
+
// Ontology YAML — domain_mapping is the primary join key
|
|
55
|
+
const ontology = loadOntologyYaml();
|
|
56
|
+
const domainMapping = {};
|
|
57
|
+
for (const [cat, domains] of Object.entries(ontology.domain_mapping ?? {})) {
|
|
58
|
+
if (Array.isArray(domains))
|
|
59
|
+
domainMapping[cat] = domains.map(String);
|
|
60
|
+
}
|
|
61
|
+
// Concerns → categories (static, matches ontology spec §3.3)
|
|
62
|
+
const concernsMap = {
|
|
63
|
+
auth: ["AUT", "ACC", "SES"],
|
|
64
|
+
logging: ["LOG"],
|
|
65
|
+
validation: ["VAL", "ERR"],
|
|
66
|
+
api: ["API"],
|
|
67
|
+
config: ["CFG"],
|
|
68
|
+
integrity: ["INT"],
|
|
69
|
+
distribution: ["DST"],
|
|
70
|
+
ide: ["IDE"],
|
|
71
|
+
requirements: ["REQ"],
|
|
72
|
+
architecture: ["ARC"],
|
|
73
|
+
iac: ["IAC"],
|
|
74
|
+
encryption: ["ENC"],
|
|
75
|
+
};
|
|
76
|
+
// Load all entities from the enriched index (kg v1.4.0+)
|
|
77
|
+
const allItems = loadEnrichedEntities();
|
|
78
|
+
const requirements = [];
|
|
79
|
+
const controls = [];
|
|
80
|
+
const roles = [];
|
|
81
|
+
const threats = [];
|
|
82
|
+
const assignments = [];
|
|
83
|
+
const userStories = [];
|
|
84
|
+
for (const item of allItems) {
|
|
85
|
+
if (!isRecord(item))
|
|
86
|
+
continue;
|
|
87
|
+
const rt = strOf(item, "record_type");
|
|
88
|
+
if (rt === "requirement") {
|
|
89
|
+
const levels = item["applicable_levels"];
|
|
90
|
+
const rSrcFile = strOf(item, "source_file");
|
|
91
|
+
requirements.push({
|
|
92
|
+
requirement_id: strOf(item, "requirement_id"),
|
|
93
|
+
type: strOf(item, "type"),
|
|
94
|
+
category: strOf(item, "category"),
|
|
95
|
+
name: strOf(item, "name"),
|
|
96
|
+
applicable_levels: isRecord(levels)
|
|
97
|
+
? { L1: levels["L1"] === true, L2: levels["L2"] === true, L3: levels["L3"] === true }
|
|
98
|
+
: { L1: false, L2: false, L3: false },
|
|
99
|
+
source_chapter: numOf(item, "source_chapter"),
|
|
100
|
+
...(rSrcFile ? { source_file: rSrcFile } : {}),
|
|
101
|
+
domain: typeof item["domain"] === "string" ? item["domain"] : null,
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (rt === "control") {
|
|
106
|
+
const cNameEn = strOf(item, "name_en");
|
|
107
|
+
const cDesc = strOf(item, "description");
|
|
108
|
+
controls.push({
|
|
109
|
+
control_id: strOf(item, "control_id"),
|
|
110
|
+
name: strOf(item, "name"),
|
|
111
|
+
...(cNameEn ? { name_en: cNameEn } : {}),
|
|
112
|
+
domain: strOf(item, "domain"),
|
|
113
|
+
control_type: strOf(item, "control_type"),
|
|
114
|
+
abstraction_level: strOf(item, "abstraction_level"),
|
|
115
|
+
applicable_lifecycle_phases: arrStr(item, "applicable_lifecycle_phases"),
|
|
116
|
+
source_practice_ids: arrStr(item, "source_practice_ids"),
|
|
117
|
+
chapter_ids: arrStr(item, "chapter_ids"),
|
|
118
|
+
...(cDesc ? { description: cDesc } : {}),
|
|
119
|
+
aliases: arrStr(item, "aliases"),
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (rt === "role") {
|
|
124
|
+
// entity_id is the canonical role identifier in the enriched index
|
|
125
|
+
const entityId = strOf(item, "entity_id");
|
|
126
|
+
if (!entityId)
|
|
127
|
+
continue;
|
|
128
|
+
roles.push({
|
|
129
|
+
role_id: entityId,
|
|
130
|
+
aliases: arrStr(item, "aliases"),
|
|
131
|
+
canonical: true,
|
|
132
|
+
source: strOf(item, "source_document_id"),
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (rt === "threat") {
|
|
137
|
+
const tMtId = strOf(item, "mitigated_threat_id");
|
|
138
|
+
const tObjId = strOf(item, "object_id");
|
|
139
|
+
const tLabel = strOf(item, "threat_label_raw");
|
|
140
|
+
const tEss = strOf(item, "essence");
|
|
141
|
+
const tChId = strOf(item, "chapter_id");
|
|
142
|
+
const tMitSum = strOf(item, "mitigation_summary");
|
|
143
|
+
threats.push({
|
|
144
|
+
...(tMtId ? { mitigated_threat_id: tMtId } : {}),
|
|
145
|
+
...(tObjId ? { object_id: tObjId } : {}),
|
|
146
|
+
...(tLabel ? { threat_label_raw: tLabel } : {}),
|
|
147
|
+
...(tEss ? { essence: tEss } : {}),
|
|
148
|
+
...(tChId ? { chapter_id: tChId } : {}),
|
|
149
|
+
category: typeof item["category"] === "string" ? item["category"] : null,
|
|
150
|
+
cwe: typeof item["cwe"] === "string" ? item["cwe"] : null,
|
|
151
|
+
cvss_score: typeof item["cvss_score"] === "number" ? item["cvss_score"] : null,
|
|
152
|
+
associated_controls: arrStr(item, "associated_controls"),
|
|
153
|
+
...(tMitSum ? { mitigation_summary: tMitSum } : {}),
|
|
154
|
+
...(typeof item["confidence"] === "number" ? { confidence: item["confidence"] } : {}),
|
|
155
|
+
});
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (rt === "assignment") {
|
|
159
|
+
assignments.push({
|
|
160
|
+
id: strOf(item, "id"),
|
|
161
|
+
chapter_id: strOf(item, "chapter_id"),
|
|
162
|
+
practice_id: strOf(item, "practice_id"),
|
|
163
|
+
role: strOf(item, "role"),
|
|
164
|
+
phase: strOf(item, "phase"),
|
|
165
|
+
risk_level: strOf(item, "risk_level"),
|
|
166
|
+
action: strOf(item, "action"),
|
|
167
|
+
artifacts: arrStr(item, "artifacts"),
|
|
168
|
+
...(strOf(item, "user_story_id") ? { user_story_id: strOf(item, "user_story_id") } : {}),
|
|
169
|
+
});
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (rt === "user_story") {
|
|
173
|
+
const usId = strOf(item, "id");
|
|
174
|
+
const usUsId = strOf(item, "us_id");
|
|
175
|
+
const usChId = strOf(item, "chapter_id");
|
|
176
|
+
const usPrId = strOf(item, "practice_id");
|
|
177
|
+
const usAc = strOf(item, "acceptance_criteria");
|
|
178
|
+
const usGoal = strOf(item, "goal");
|
|
179
|
+
const usSumm = strOf(item, "summary");
|
|
180
|
+
userStories.push({
|
|
181
|
+
...(usId ? { id: usId } : {}),
|
|
182
|
+
...(usUsId ? { us_id: usUsId } : {}),
|
|
183
|
+
title: strOf(item, "title"),
|
|
184
|
+
...(usChId ? { chapter_id: usChId } : {}),
|
|
185
|
+
...(usPrId ? { practice_id: usPrId } : {}),
|
|
186
|
+
roles_normalized: arrStr(item, "roles_normalized"),
|
|
187
|
+
risk_levels: arrStr(item, "risk_levels"),
|
|
188
|
+
...(usAc ? { acceptance_criteria: usAc } : {}),
|
|
189
|
+
bdd: arrStr(item, "bdd"),
|
|
190
|
+
...(usGoal ? { goal: usGoal } : {}),
|
|
191
|
+
...(usSumm ? { summary: usSumm } : {}),
|
|
192
|
+
});
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
_cache = { domainMapping, concernsMap, requirements, controls, roles, threats, assignments, userStories };
|
|
197
|
+
return _cache;
|
|
198
|
+
}
|
|
199
|
+
/** Resolve a role input string to a canonical role_id, using aliases. */
|
|
200
|
+
export function resolveRoleId(input, roles) {
|
|
201
|
+
const normalized = input.toLowerCase().replace(/[\s/]+/g, "-");
|
|
202
|
+
return roles.find((r) => r.role_id === normalized ||
|
|
203
|
+
r.role_id.replace(/_/g, "-") === normalized ||
|
|
204
|
+
r.aliases.some((a) => a.toLowerCase().replace(/[\s/]+/g, "-") === normalized))?.role_id;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=ontology-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ontology-loader.js","sourceRoot":"","sources":["../../src/tools/ontology-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve_entities
|
|
3
|
+
*
|
|
4
|
+
* Low-level entity resolver over the SbD-ToE enriched entities index.
|
|
5
|
+
* Allows agents to formulate arbitrary queries not covered by the high-level
|
|
6
|
+
* pipeline tools (consult_security_requirements, get_threat_landscape,
|
|
7
|
+
* get_guide_by_role).
|
|
8
|
+
*
|
|
9
|
+
* Source: data/publish/algolia_entities_records_enriched.json (kg v1.4.0+)
|
|
10
|
+
* Filter syntax: dot-notation for nested fields, comparison operators for
|
|
11
|
+
* numeric ranges, array membership checks for array fields.
|
|
12
|
+
*
|
|
13
|
+
* All data is read from the published artefacts — nothing is invented.
|
|
14
|
+
*/
|
|
15
|
+
export interface ResolveEntitiesResult {
|
|
16
|
+
record_type: string;
|
|
17
|
+
entities: unknown[];
|
|
18
|
+
total: number;
|
|
19
|
+
limit: number;
|
|
20
|
+
meta: {
|
|
21
|
+
filtersApplied: Record<string, unknown>;
|
|
22
|
+
note: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare function _resolveEntities(args: Record<string, unknown>, items: unknown[]): ResolveEntitiesResult;
|
|
26
|
+
export declare function handleResolveEntities(args: Record<string, unknown>): ResolveEntitiesResult;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve_entities
|
|
3
|
+
*
|
|
4
|
+
* Low-level entity resolver over the SbD-ToE enriched entities index.
|
|
5
|
+
* Allows agents to formulate arbitrary queries not covered by the high-level
|
|
6
|
+
* pipeline tools (consult_security_requirements, get_threat_landscape,
|
|
7
|
+
* get_guide_by_role).
|
|
8
|
+
*
|
|
9
|
+
* Source: data/publish/algolia_entities_records_enriched.json (kg v1.4.0+)
|
|
10
|
+
* Filter syntax: dot-notation for nested fields, comparison operators for
|
|
11
|
+
* numeric ranges, array membership checks for array fields.
|
|
12
|
+
*
|
|
13
|
+
* All data is read from the published artefacts — nothing is invented.
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
import { resolveAppPath } from "../config.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Types
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const DEFAULT_LIMIT = 50;
|
|
21
|
+
const MAX_LIMIT = 200;
|
|
22
|
+
function isComparisonOp(v) {
|
|
23
|
+
if (typeof v !== "object" || v === null || Array.isArray(v))
|
|
24
|
+
return false;
|
|
25
|
+
const keys = Object.keys(v);
|
|
26
|
+
return keys.some((k) => k === "gte" || k === "lte" || k === "in");
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Enriched index cache (independent of getOntologyData — raw records)
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
let _enrichedCache;
|
|
32
|
+
function loadEnrichedItems() {
|
|
33
|
+
if (_enrichedCache)
|
|
34
|
+
return _enrichedCache;
|
|
35
|
+
const path = resolveAppPath("data/publish/algolia_entities_records_enriched.json");
|
|
36
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
37
|
+
_enrichedCache = Array.isArray(raw.items) ? raw.items : [];
|
|
38
|
+
return _enrichedCache;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Filter engine
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a dot-notation path against an object.
|
|
45
|
+
* E.g. "applicable_levels.L2" → obj.applicable_levels.L2
|
|
46
|
+
*/
|
|
47
|
+
function resolvePath(obj, path) {
|
|
48
|
+
const parts = path.split(".");
|
|
49
|
+
let cur = obj;
|
|
50
|
+
for (const part of parts) {
|
|
51
|
+
if (cur === null || cur === undefined || typeof cur !== "object")
|
|
52
|
+
return undefined;
|
|
53
|
+
cur = cur[part];
|
|
54
|
+
}
|
|
55
|
+
return cur;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Match a single filter entry against a field value.
|
|
59
|
+
* Supports:
|
|
60
|
+
* - Comparison ops: { gte, lte } for numbers; { in: [...] } for set membership
|
|
61
|
+
* - Array fields: checks if value is IN the array
|
|
62
|
+
* - Direct equality
|
|
63
|
+
*/
|
|
64
|
+
function matchesFilter(item, key, filterValue) {
|
|
65
|
+
const fieldVal = resolvePath(item, key);
|
|
66
|
+
if (isComparisonOp(filterValue)) {
|
|
67
|
+
if ("gte" in filterValue && filterValue.gte !== undefined) {
|
|
68
|
+
const n = typeof fieldVal === "number" ? fieldVal : NaN;
|
|
69
|
+
if (isNaN(n) || n < filterValue.gte)
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if ("lte" in filterValue && filterValue.lte !== undefined) {
|
|
73
|
+
const n = typeof fieldVal === "number" ? fieldVal : NaN;
|
|
74
|
+
if (isNaN(n) || n > filterValue.lte)
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if ("in" in filterValue && Array.isArray(filterValue.in)) {
|
|
78
|
+
if (!filterValue.in.includes(fieldVal))
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
// Array field: check if filterValue is a member of the array
|
|
84
|
+
if (Array.isArray(fieldVal)) {
|
|
85
|
+
return fieldVal.includes(filterValue);
|
|
86
|
+
}
|
|
87
|
+
// Direct equality
|
|
88
|
+
return fieldVal === filterValue;
|
|
89
|
+
}
|
|
90
|
+
function matchesAllFilters(item, filters) {
|
|
91
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
92
|
+
if (!matchesFilter(item, key, value))
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Internal (exported for testability)
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
export function _resolveEntities(args, items) {
|
|
101
|
+
const recordType = args["record_type"];
|
|
102
|
+
if (typeof recordType !== "string" || recordType.trim().length === 0) {
|
|
103
|
+
throw Object.assign(new Error('Missing required parameter: "record_type".'), { rpcError: { code: -32602, message: 'Missing required parameter: "record_type".' } });
|
|
104
|
+
}
|
|
105
|
+
const rawLimit = args["limit"];
|
|
106
|
+
const limit = typeof rawLimit === "number" && rawLimit > 0
|
|
107
|
+
? Math.min(Math.round(rawLimit), MAX_LIMIT)
|
|
108
|
+
: DEFAULT_LIMIT;
|
|
109
|
+
const rawFilters = args["filters"];
|
|
110
|
+
const filters = typeof rawFilters === "object" && rawFilters !== null && !Array.isArray(rawFilters)
|
|
111
|
+
? rawFilters
|
|
112
|
+
: {};
|
|
113
|
+
// Filter by record_type first, then apply additional filters
|
|
114
|
+
const matched = items.filter((item) => {
|
|
115
|
+
if (typeof item !== "object" || item === null)
|
|
116
|
+
return false;
|
|
117
|
+
const rt = item["record_type"];
|
|
118
|
+
if (rt !== recordType)
|
|
119
|
+
return false;
|
|
120
|
+
return matchesAllFilters(item, filters);
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
record_type: recordType,
|
|
124
|
+
entities: matched.slice(0, limit),
|
|
125
|
+
total: matched.length,
|
|
126
|
+
limit,
|
|
127
|
+
meta: {
|
|
128
|
+
filtersApplied: filters,
|
|
129
|
+
note: "Entities resolved from algolia_entities_records_enriched.json (kg v1.4.0+). " +
|
|
130
|
+
"Filters: dot-notation for nested fields (e.g. applicable_levels.L2), " +
|
|
131
|
+
"comparison ops: {gte, lte} for numbers, {in: [...]} for set membership, " +
|
|
132
|
+
"array fields: checks if value is a member of the array. " +
|
|
133
|
+
"Excluded record_types: ImplementationRule, EvidencePattern (source_file: null — §10 constraint)."
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Public handler
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
export function handleResolveEntities(args) {
|
|
141
|
+
return _resolveEntities(args, loadEnrichedItems());
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=resolve-entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-entities.js","sourceRoot":"","sources":["../../src/tools/resolve-entities.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shiftleftpt/sbd-toe-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "MCP server for the SbD-ToE (Security by Design — Theory of Everything) security manual — structured tools for Claude, GitHub Copilot and other MCP clients",
|
|
6
6
|
"keywords": [
|
|
@@ -73,5 +73,8 @@
|
|
|
73
73
|
"@vitest/ui": "^1.6.0",
|
|
74
74
|
"typescript": "^5.9.3",
|
|
75
75
|
"vitest": "^1.6.0"
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"yaml": "^2.8.3"
|
|
76
79
|
}
|
|
77
80
|
}
|