framework-mcp 1.5.3 → 2.3.2
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/.claude/commands/speckit.analyze.md +184 -0
- package/.claude/commands/speckit.checklist.md +294 -0
- package/.claude/commands/speckit.clarify.md +181 -0
- package/.claude/commands/speckit.constitution.md +82 -0
- package/.claude/commands/speckit.implement.md +135 -0
- package/.claude/commands/speckit.plan.md +89 -0
- package/.claude/commands/speckit.specify.md +258 -0
- package/.claude/commands/speckit.tasks.md +137 -0
- package/.claude/commands/speckit.taskstoissues.md +30 -0
- package/.do/app.yaml +1 -1
- package/.github/dependabot.yml +15 -0
- package/.github/workflows/ci.yml +31 -2
- package/.specify/memory/constitution.md +50 -0
- package/.specify/scripts/bash/check-prerequisites.sh +166 -0
- package/.specify/scripts/bash/common.sh +156 -0
- package/.specify/scripts/bash/create-new-feature.sh +297 -0
- package/.specify/scripts/bash/setup-plan.sh +61 -0
- package/.specify/scripts/bash/update-agent-context.sh +799 -0
- package/.specify/templates/agent-file-template.md +28 -0
- package/.specify/templates/checklist-template.md +40 -0
- package/.specify/templates/plan-template.md +104 -0
- package/.specify/templates/spec-template.md +115 -0
- package/.specify/templates/tasks-template.md +251 -0
- package/README.md +84 -435
- package/dist/core/safeguard-manager.d.ts.map +1 -1
- package/dist/core/safeguard-manager.js +7105 -2543
- package/dist/core/safeguard-manager.js.map +1 -1
- package/dist/interfaces/http/http-server.d.ts +2 -0
- package/dist/interfaces/http/http-server.d.ts.map +1 -1
- package/dist/interfaces/http/http-server.js +95 -3
- package/dist/interfaces/http/http-server.js.map +1 -1
- package/dist/interfaces/mcp/mcp-server.js +3 -3
- package/dist/shared/types.d.ts +85 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +132 -1
- package/dist/shared/types.js.map +1 -1
- package/package.json +7 -4
- package/scripts/standardize-prompts.js +325 -0
- package/scripts/validate-capability-prompts.js +110 -0
- package/src/core/safeguard-manager.ts +12387 -2630
- package/src/interfaces/http/http-server.ts +109 -4
- package/src/interfaces/mcp/mcp-server.ts +3 -3
- package/src/shared/types.ts +268 -2
- package/swagger.json +56 -36
- package/CAPABILITY_TRANSFORMATION_SUMMARY.md +0 -158
- package/CIS_CONTROLS_IMPLEMENTATION_PLAN.md +0 -220
- package/COPILOT_INTEGRATION.md +0 -322
- package/DAYS_5_6_COMPLETION_SUMMARY.md +0 -178
- package/DEPLOYMENT_GUIDE.md +0 -334
- package/DEPLOYMENT_SUMMARY_v1.1.3.md +0 -211
- package/MCP_INTEGRATION_GUIDE.md +0 -285
- package/MIGRATION_GUIDE_v1.4.0.md +0 -190
- package/RELEASE_NOTES_v1.1.3.md +0 -321
- package/RELEASE_NOTES_v1.2.0.md +0 -396
- package/RELEASE_NOTES_v1.3.7.md +0 -275
- package/RELEASE_NOTES_v1.4.0.md +0 -178
- package/SAFEGUARDS_VERIFICATION_LOG.md +0 -157
- package/coordinator-bot-compact.txt +0 -33
- package/coordinator-bot-system-prompt.md +0 -192
- package/docs/installation.md +0 -71
- package/scripts/analyze-data-structure.cjs +0 -74
- package/scripts/clean-safeguards-data.cjs +0 -60
- package/scripts/comprehensive-validation.cjs +0 -176
- package/scripts/count-safeguards.cjs +0 -89
- package/scripts/format-safeguards-proper.cjs +0 -44
- package/scripts/validate-formatted-data.cjs +0 -88
- package/test_capability_integration.js +0 -73
- package/test_comprehensive_scenarios.js +0 -192
- package/test_enhanced_detection.js +0 -74
- package/test_integrated_validation.js +0 -112
- package/test_language_update.js +0 -101
- package/test_live_validation.json +0 -12
- package/test_performance_monitoring.js +0 -124
- package/test_runner_automated.js +0 -156
- package/test_suite_comprehensive.js +0 -218
|
@@ -3,7 +3,9 @@ export declare class FrameworkHttpServer {
|
|
|
3
3
|
private app;
|
|
4
4
|
private safeguardManager;
|
|
5
5
|
private port;
|
|
6
|
+
private rateLimitConfig;
|
|
6
7
|
constructor(port?: number);
|
|
8
|
+
private parseRateLimitConfig;
|
|
7
9
|
private setupMiddleware;
|
|
8
10
|
private setupRoutes;
|
|
9
11
|
private setupErrorHandling;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../src/interfaces/http/http-server.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../src/interfaces/http/http-server.ts"],"names":[],"mappings":";AAgBA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,eAAe,CAAkB;gBAE7B,IAAI,GAAE,MAAa;IAW/B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe;IA4DvB,OAAO,CAAC,WAAW;IA6InB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,mBAAmB;IAQpB,KAAK,IAAI,IAAI;CAoBrB"}
|
|
@@ -3,17 +3,50 @@ import express from 'express';
|
|
|
3
3
|
import cors from 'cors';
|
|
4
4
|
import helmet from 'helmet';
|
|
5
5
|
import compression from 'compression';
|
|
6
|
+
import rateLimit from 'express-rate-limit';
|
|
6
7
|
import { SafeguardManager } from '../../core/safeguard-manager.js';
|
|
7
8
|
export class FrameworkHttpServer {
|
|
8
9
|
constructor(port = 8080) {
|
|
9
10
|
this.app = express();
|
|
10
11
|
this.safeguardManager = new SafeguardManager();
|
|
11
12
|
this.port = port;
|
|
13
|
+
this.rateLimitConfig = this.parseRateLimitConfig();
|
|
12
14
|
this.setupMiddleware();
|
|
13
15
|
this.setupRoutes();
|
|
14
16
|
this.setupErrorHandling();
|
|
15
17
|
}
|
|
18
|
+
parseRateLimitConfig() {
|
|
19
|
+
const skipIpsEnv = process.env.RATE_LIMIT_SKIP_IPS;
|
|
20
|
+
return {
|
|
21
|
+
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000', 10),
|
|
22
|
+
max: parseInt(process.env.RATE_LIMIT_MAX || '100', 10),
|
|
23
|
+
skipIps: skipIpsEnv ? skipIpsEnv.split(',').map(ip => ip.trim()) : undefined
|
|
24
|
+
};
|
|
25
|
+
}
|
|
16
26
|
setupMiddleware() {
|
|
27
|
+
// Rate limiting middleware - must be before other middleware
|
|
28
|
+
const limiter = rateLimit({
|
|
29
|
+
windowMs: this.rateLimitConfig.windowMs,
|
|
30
|
+
max: this.rateLimitConfig.max,
|
|
31
|
+
standardHeaders: true,
|
|
32
|
+
legacyHeaders: false,
|
|
33
|
+
skip: (req) => {
|
|
34
|
+
if (this.rateLimitConfig.skipIps && req.ip) {
|
|
35
|
+
return this.rateLimitConfig.skipIps.includes(req.ip);
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
},
|
|
39
|
+
message: {
|
|
40
|
+
error: 'Too many requests',
|
|
41
|
+
retryAfter: 'See Retry-After header',
|
|
42
|
+
timestamp: new Date().toISOString()
|
|
43
|
+
},
|
|
44
|
+
handler: (req, res, _next, options) => {
|
|
45
|
+
console.log(`[Rate Limit] IP ${req.ip} exceeded limit`);
|
|
46
|
+
res.status(429).json(options.message);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.app.use(limiter);
|
|
17
50
|
// Security middleware
|
|
18
51
|
this.app.use(helmet({
|
|
19
52
|
contentSecurityPolicy: {
|
|
@@ -50,10 +83,69 @@ export class FrameworkHttpServer {
|
|
|
50
83
|
res.json({
|
|
51
84
|
status: 'healthy',
|
|
52
85
|
uptime: Math.round(process.uptime()),
|
|
53
|
-
version: '
|
|
86
|
+
version: '2.3.2',
|
|
54
87
|
timestamp: new Date().toISOString()
|
|
55
88
|
});
|
|
56
89
|
});
|
|
90
|
+
// Safeguards health check endpoint - validates data completeness
|
|
91
|
+
this.app.get('/api/health/safeguards', (req, res) => {
|
|
92
|
+
try {
|
|
93
|
+
const allSafeguards = this.safeguardManager.getAllSafeguards();
|
|
94
|
+
const safeguardIds = Object.keys(allSafeguards);
|
|
95
|
+
let totalValidated = 0;
|
|
96
|
+
let errors = [];
|
|
97
|
+
const expectedFields = [
|
|
98
|
+
'systemPromptFull',
|
|
99
|
+
'systemPromptPartial',
|
|
100
|
+
'systemPromptFacilitates',
|
|
101
|
+
'systemPromptGovernance',
|
|
102
|
+
'systemPromptValidates'
|
|
103
|
+
];
|
|
104
|
+
for (const safeguardId of safeguardIds) {
|
|
105
|
+
const safeguard = allSafeguards[safeguardId];
|
|
106
|
+
// Check all five capability prompts exist and are complete
|
|
107
|
+
for (const field of expectedFields) {
|
|
108
|
+
const prompt = safeguard[field];
|
|
109
|
+
if (!prompt) {
|
|
110
|
+
errors.push(`${safeguardId}: Missing ${field}`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!prompt.role || !prompt.context || !prompt.objective ||
|
|
114
|
+
!prompt.guidelines || !prompt.outputFormat) {
|
|
115
|
+
errors.push(`${safeguardId}.${field}: Incomplete structure`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Check deprecated field is gone
|
|
119
|
+
if ('systemPrompt' in safeguard) {
|
|
120
|
+
errors.push(`${safeguardId}: Deprecated systemPrompt field exists`);
|
|
121
|
+
}
|
|
122
|
+
totalValidated++;
|
|
123
|
+
}
|
|
124
|
+
res.json({
|
|
125
|
+
status: errors.length === 0 ? 'healthy' : 'unhealthy',
|
|
126
|
+
safeguards: {
|
|
127
|
+
total: totalValidated,
|
|
128
|
+
expected: 153,
|
|
129
|
+
complete: totalValidated === 153 && errors.length === 0
|
|
130
|
+
},
|
|
131
|
+
capabilityPrompts: {
|
|
132
|
+
expectedFields: expectedFields.length,
|
|
133
|
+
validatedFields: expectedFields.length
|
|
134
|
+
},
|
|
135
|
+
errors: errors.length,
|
|
136
|
+
errorDetails: errors.slice(0, 10), // Show first 10 errors only
|
|
137
|
+
timestamp: new Date().toISOString()
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
res.status(500).json({
|
|
142
|
+
status: 'error',
|
|
143
|
+
message: 'Failed to validate safeguards data',
|
|
144
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
145
|
+
timestamp: new Date().toISOString()
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
57
149
|
// Get safeguard details endpoint
|
|
58
150
|
this.app.get('/api/safeguards/:safeguardId', (req, res) => {
|
|
59
151
|
try {
|
|
@@ -91,7 +183,7 @@ export class FrameworkHttpServer {
|
|
|
91
183
|
this.app.get('/api', (req, res) => {
|
|
92
184
|
res.json({
|
|
93
185
|
name: 'Framework MCP HTTP API',
|
|
94
|
-
version: '
|
|
186
|
+
version: '2.3.2',
|
|
95
187
|
description: 'Pure Data Provider serving authentic CIS Controls Framework data',
|
|
96
188
|
endpoints: {
|
|
97
189
|
'GET /api/safeguards': 'List all available CIS safeguards',
|
|
@@ -130,7 +222,7 @@ export class FrameworkHttpServer {
|
|
|
130
222
|
}
|
|
131
223
|
start() {
|
|
132
224
|
this.app.listen(this.port, '0.0.0.0', () => {
|
|
133
|
-
console.log(`🚀 Framework MCP HTTP Server
|
|
225
|
+
console.log(`🚀 Framework MCP HTTP Server v2.2.0 running on port ${this.port}`);
|
|
134
226
|
console.log(`📊 Health check: http://localhost:${this.port}/health`);
|
|
135
227
|
console.log(`📖 API docs: http://localhost:${this.port}/api`);
|
|
136
228
|
console.log(`🔧 Environment: ${process.env.NODE_ENV || 'development'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../../src/interfaces/http/http-server.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../../src/interfaces/http/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export class FrameworkMcpServer {
|
|
|
7
7
|
constructor() {
|
|
8
8
|
this.server = new Server({
|
|
9
9
|
name: 'framework-analyzer',
|
|
10
|
-
version: '
|
|
10
|
+
version: '2.3.2',
|
|
11
11
|
});
|
|
12
12
|
this.safeguardManager = new SafeguardManager();
|
|
13
13
|
this.setupHandlers();
|
|
@@ -103,7 +103,7 @@ export class FrameworkMcpServer {
|
|
|
103
103
|
safeguards,
|
|
104
104
|
total: safeguards.length,
|
|
105
105
|
framework: 'CIS Controls v8.1',
|
|
106
|
-
version: '
|
|
106
|
+
version: '2.3.2'
|
|
107
107
|
}, null, 2),
|
|
108
108
|
},
|
|
109
109
|
],
|
|
@@ -122,7 +122,7 @@ export class FrameworkMcpServer {
|
|
|
122
122
|
async run() {
|
|
123
123
|
const transport = new StdioServerTransport();
|
|
124
124
|
await this.server.connect(transport);
|
|
125
|
-
console.error('🤖 Framework MCP Server
|
|
125
|
+
console.error('🤖 Framework MCP Server v2.2.0 running via stdio');
|
|
126
126
|
console.error('📊 Pure Data Provider for CIS Controls v8.1');
|
|
127
127
|
}
|
|
128
128
|
}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
export type RelationshipType = 'dependency' | 'prerequisite' | 'complement' | 'supports' | 'validates' | 'governance' | 'sequence';
|
|
2
|
+
export type RelationshipStrength = 'critical' | 'strong' | 'moderate' | 'weak';
|
|
3
|
+
export interface SafeguardRelationship {
|
|
4
|
+
id: string;
|
|
5
|
+
type: RelationshipType;
|
|
6
|
+
strength: RelationshipStrength;
|
|
7
|
+
context: string;
|
|
8
|
+
bidirectional: boolean;
|
|
9
|
+
controlGroup?: string;
|
|
10
|
+
}
|
|
1
11
|
export interface SafeguardElement {
|
|
2
12
|
id: string;
|
|
3
13
|
title: string;
|
|
@@ -10,8 +20,36 @@ export interface SafeguardElement {
|
|
|
10
20
|
subTaxonomicalElements: string[];
|
|
11
21
|
implementationSuggestions: string[];
|
|
12
22
|
relatedSafeguards: string[];
|
|
13
|
-
|
|
14
|
-
|
|
23
|
+
enhancedRelationships?: SafeguardRelationship[];
|
|
24
|
+
systemPromptFull?: {
|
|
25
|
+
role: string;
|
|
26
|
+
context: string;
|
|
27
|
+
objective: string;
|
|
28
|
+
guidelines: string[];
|
|
29
|
+
outputFormat: string;
|
|
30
|
+
};
|
|
31
|
+
systemPromptPartial?: {
|
|
32
|
+
role: string;
|
|
33
|
+
context: string;
|
|
34
|
+
objective: string;
|
|
35
|
+
guidelines: string[];
|
|
36
|
+
outputFormat: string;
|
|
37
|
+
};
|
|
38
|
+
systemPromptFacilitates?: {
|
|
39
|
+
role: string;
|
|
40
|
+
context: string;
|
|
41
|
+
objective: string;
|
|
42
|
+
guidelines: string[];
|
|
43
|
+
outputFormat: string;
|
|
44
|
+
};
|
|
45
|
+
systemPromptGovernance?: {
|
|
46
|
+
role: string;
|
|
47
|
+
context: string;
|
|
48
|
+
objective: string;
|
|
49
|
+
guidelines: string[];
|
|
50
|
+
outputFormat: string;
|
|
51
|
+
};
|
|
52
|
+
systemPromptValidates?: {
|
|
15
53
|
role: string;
|
|
16
54
|
context: string;
|
|
17
55
|
objective: string;
|
|
@@ -56,4 +94,49 @@ export interface QualityAssessment {
|
|
|
56
94
|
gaps: string[];
|
|
57
95
|
}
|
|
58
96
|
export type CapabilityType = 'full' | 'partial' | 'facilitates' | 'governance' | 'validates';
|
|
97
|
+
/**
|
|
98
|
+
* Converts SafeguardRelationship[] to string[] for backward compatibility
|
|
99
|
+
*/
|
|
100
|
+
export declare function relationshipsToStringArray(relationships: SafeguardRelationship[]): string[];
|
|
101
|
+
/**
|
|
102
|
+
* Converts string[] to basic SafeguardRelationship[] (when migrating legacy data)
|
|
103
|
+
*/
|
|
104
|
+
export declare function stringArrayToRelationships(ids: string[], defaultType?: RelationshipType, defaultStrength?: RelationshipStrength): SafeguardRelationship[];
|
|
105
|
+
/**
|
|
106
|
+
* Validates that all referenced safeguard IDs exist in the provided set
|
|
107
|
+
*/
|
|
108
|
+
export declare function validateSafeguardReferences(relationships: SafeguardRelationship[], validSafeguardIds: Set<string>): ValidationResult;
|
|
109
|
+
/**
|
|
110
|
+
* Validates bidirectional relationship consistency
|
|
111
|
+
* Returns relationships that claim to be bidirectional but lack reverse relationships
|
|
112
|
+
*/
|
|
113
|
+
export declare function validateBidirectionalConsistency(safeguardId: string, relationships: SafeguardRelationship[], allSafeguards: Map<string, SafeguardElement>): ValidationResult;
|
|
114
|
+
/**
|
|
115
|
+
* Validates relationship data integrity for a single safeguard
|
|
116
|
+
*/
|
|
117
|
+
export declare function validateSafeguardRelationships(safeguard: SafeguardElement, allSafeguards: Map<string, SafeguardElement>): ValidationResult;
|
|
118
|
+
/**
|
|
119
|
+
* Finds potential circular dependencies in relationships
|
|
120
|
+
*/
|
|
121
|
+
export declare function detectCircularDependencies(allSafeguards: Map<string, SafeguardElement>): ValidationResult;
|
|
122
|
+
export interface ValidationResult {
|
|
123
|
+
isValid: boolean;
|
|
124
|
+
errors: string[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Configuration for rate limiting middleware
|
|
128
|
+
*/
|
|
129
|
+
export interface RateLimitConfig {
|
|
130
|
+
windowMs: number;
|
|
131
|
+
max: number;
|
|
132
|
+
skipIps?: string[];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Error response returned when rate limit is exceeded
|
|
136
|
+
*/
|
|
137
|
+
export interface RateLimitErrorResponse {
|
|
138
|
+
error: string;
|
|
139
|
+
retryAfter?: number;
|
|
140
|
+
timestamp: string;
|
|
141
|
+
}
|
|
59
142
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.js
CHANGED
|
@@ -1,3 +1,134 @@
|
|
|
1
1
|
// Shared TypeScript types for dual architecture
|
|
2
|
-
|
|
2
|
+
// Utility functions for enhanced relationship system
|
|
3
|
+
/**
|
|
4
|
+
* Converts SafeguardRelationship[] to string[] for backward compatibility
|
|
5
|
+
*/
|
|
6
|
+
export function relationshipsToStringArray(relationships) {
|
|
7
|
+
return relationships.map(rel => rel.id);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Converts string[] to basic SafeguardRelationship[] (when migrating legacy data)
|
|
11
|
+
*/
|
|
12
|
+
export function stringArrayToRelationships(ids, defaultType = 'supports', defaultStrength = 'moderate') {
|
|
13
|
+
return ids.map(id => ({
|
|
14
|
+
id,
|
|
15
|
+
type: defaultType,
|
|
16
|
+
strength: defaultStrength,
|
|
17
|
+
context: `Legacy relationship to ${id}`,
|
|
18
|
+
bidirectional: false
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validates that all referenced safeguard IDs exist in the provided set
|
|
23
|
+
*/
|
|
24
|
+
export function validateSafeguardReferences(relationships, validSafeguardIds) {
|
|
25
|
+
const invalidIds = [];
|
|
26
|
+
for (const rel of relationships) {
|
|
27
|
+
if (!validSafeguardIds.has(rel.id)) {
|
|
28
|
+
invalidIds.push(rel.id);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
isValid: invalidIds.length === 0,
|
|
33
|
+
errors: invalidIds.map(id => `Invalid safeguard ID reference: ${id}`)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validates bidirectional relationship consistency
|
|
38
|
+
* Returns relationships that claim to be bidirectional but lack reverse relationships
|
|
39
|
+
*/
|
|
40
|
+
export function validateBidirectionalConsistency(safeguardId, relationships, allSafeguards) {
|
|
41
|
+
const errors = [];
|
|
42
|
+
for (const rel of relationships) {
|
|
43
|
+
if (rel.bidirectional) {
|
|
44
|
+
const targetSafeguard = allSafeguards.get(rel.id);
|
|
45
|
+
if (!targetSafeguard?.enhancedRelationships) {
|
|
46
|
+
errors.push(`Bidirectional relationship with ${rel.id} but target has no enhanced relationships`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const reverseRelExists = targetSafeguard.enhancedRelationships.some(reverseRel => reverseRel.id === safeguardId && reverseRel.bidirectional);
|
|
50
|
+
if (!reverseRelExists) {
|
|
51
|
+
errors.push(`Bidirectional relationship with ${rel.id} but no reverse relationship found`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
isValid: errors.length === 0,
|
|
57
|
+
errors
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validates relationship data integrity for a single safeguard
|
|
62
|
+
*/
|
|
63
|
+
export function validateSafeguardRelationships(safeguard, allSafeguards) {
|
|
64
|
+
const errors = [];
|
|
65
|
+
if (!safeguard.enhancedRelationships) {
|
|
66
|
+
// Only validate basic string array consistency
|
|
67
|
+
if (safeguard.relatedSafeguards.length === 0) {
|
|
68
|
+
return { isValid: true, errors: [] };
|
|
69
|
+
}
|
|
70
|
+
const validIds = new Set(allSafeguards.keys());
|
|
71
|
+
const invalidBasicRefs = safeguard.relatedSafeguards.filter(id => !validIds.has(id));
|
|
72
|
+
if (invalidBasicRefs.length > 0) {
|
|
73
|
+
errors.push(...invalidBasicRefs.map(id => `Invalid basic reference: ${id}`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Validate enhanced relationships
|
|
78
|
+
const validIds = new Set(allSafeguards.keys());
|
|
79
|
+
const refValidation = validateSafeguardReferences(safeguard.enhancedRelationships, validIds);
|
|
80
|
+
errors.push(...refValidation.errors);
|
|
81
|
+
const bidirValidation = validateBidirectionalConsistency(safeguard.id, safeguard.enhancedRelationships, allSafeguards);
|
|
82
|
+
errors.push(...bidirValidation.errors);
|
|
83
|
+
// Validate consistency between legacy and enhanced relationships
|
|
84
|
+
const enhancedIds = new Set(relationshipsToStringArray(safeguard.enhancedRelationships));
|
|
85
|
+
const legacyIds = new Set(safeguard.relatedSafeguards);
|
|
86
|
+
// Check if legacy array matches enhanced relationships
|
|
87
|
+
if (enhancedIds.size !== legacyIds.size ||
|
|
88
|
+
!Array.from(enhancedIds).every(id => legacyIds.has(id))) {
|
|
89
|
+
errors.push('Mismatch between relatedSafeguards and enhancedRelationships arrays');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
isValid: errors.length === 0,
|
|
94
|
+
errors
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Finds potential circular dependencies in relationships
|
|
99
|
+
*/
|
|
100
|
+
export function detectCircularDependencies(allSafeguards) {
|
|
101
|
+
const errors = [];
|
|
102
|
+
const visited = new Set();
|
|
103
|
+
const recursionStack = new Set();
|
|
104
|
+
function dfs(safeguardId, path) {
|
|
105
|
+
if (recursionStack.has(safeguardId)) {
|
|
106
|
+
errors.push(`Circular dependency detected: ${[...path, safeguardId].join(' -> ')}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (visited.has(safeguardId)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
visited.add(safeguardId);
|
|
113
|
+
recursionStack.add(safeguardId);
|
|
114
|
+
const safeguard = allSafeguards.get(safeguardId);
|
|
115
|
+
if (safeguard?.enhancedRelationships) {
|
|
116
|
+
const dependencies = safeguard.enhancedRelationships.filter(rel => rel.type === 'dependency' || rel.type === 'prerequisite');
|
|
117
|
+
for (const dep of dependencies) {
|
|
118
|
+
dfs(dep.id, [...path, safeguardId]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
recursionStack.delete(safeguardId);
|
|
122
|
+
}
|
|
123
|
+
// Check all safeguards for circular dependencies
|
|
124
|
+
for (const safeguardId of allSafeguards.keys()) {
|
|
125
|
+
if (!visited.has(safeguardId)) {
|
|
126
|
+
dfs(safeguardId, []);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
isValid: errors.length === 0,
|
|
131
|
+
errors
|
|
132
|
+
};
|
|
133
|
+
}
|
|
3
134
|
//# sourceMappingURL=types.js.map
|
package/dist/shared/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,gDAAgD"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "framework-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Pure Data Provider architecture serving authentic CIS Controls Framework data via MCP and HTTP API. Empowers LLMs with authoritative safeguards data for analysis. Supports Microsoft Copilot custom connectors and DigitalOcean App Services deployment.",
|
|
5
5
|
"main": "dist/interfaces/http/http-server.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,16 +11,18 @@
|
|
|
11
11
|
"start:http": "node dist/interfaces/http/http-server.js",
|
|
12
12
|
"dev": "tsc && npm run start:mcp",
|
|
13
13
|
"dev:http": "tsc && npm run start:http",
|
|
14
|
-
"prepare": "npm run build"
|
|
14
|
+
"prepare": "npm run build",
|
|
15
|
+
"standardize-prompts": "node scripts/standardize-prompts.js"
|
|
15
16
|
},
|
|
16
17
|
"bin": {
|
|
17
18
|
"framework-mcp": "./dist/index.js"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@modelcontextprotocol/sdk": "^
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
21
22
|
"compression": "^1.8.1",
|
|
22
23
|
"cors": "^2.8.5",
|
|
23
|
-
"express": "^4.
|
|
24
|
+
"express": "^4.21.2",
|
|
25
|
+
"express-rate-limit": "^8.3.2",
|
|
24
26
|
"helmet": "^8.1.0"
|
|
25
27
|
},
|
|
26
28
|
"devDependencies": {
|
|
@@ -28,6 +30,7 @@
|
|
|
28
30
|
"@types/cors": "^2.8.19",
|
|
29
31
|
"@types/express": "^4.17.17",
|
|
30
32
|
"@types/node": "^20.0.0",
|
|
33
|
+
"ts-node": "^10.9.2",
|
|
31
34
|
"typescript": "^5.0.0"
|
|
32
35
|
},
|
|
33
36
|
"keywords": [
|