@bryan-thompson/inspector-assessment-client 1.31.0 → 1.32.1

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.
Files changed (35) hide show
  1. package/dist/assets/{OAuthCallback-CXcl26vR.js → OAuthCallback-DQqdKmh-.js} +1 -1
  2. package/dist/assets/{OAuthDebugCallback-J9s4SF_c.js → OAuthDebugCallback-CZ79tNPn.js} +1 -1
  3. package/dist/assets/{index-_HAw2b2G.js → index-7dGKjpGX.js} +4 -4
  4. package/dist/index.html +1 -1
  5. package/lib/lib/assessment/extendedTypes.d.ts +21 -0
  6. package/lib/lib/assessment/extendedTypes.d.ts.map +1 -1
  7. package/lib/lib/assessment/resultTypes.d.ts +12 -2
  8. package/lib/lib/assessment/resultTypes.d.ts.map +1 -1
  9. package/lib/lib/moduleScoring.d.ts.map +1 -1
  10. package/lib/lib/moduleScoring.js +5 -0
  11. package/lib/services/assessment/AssessmentOrchestrator.d.ts +1 -28
  12. package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
  13. package/lib/services/assessment/AssessmentOrchestrator.js +66 -576
  14. package/lib/services/assessment/modules/ConformanceAssessor.d.ts +4 -0
  15. package/lib/services/assessment/modules/ConformanceAssessor.d.ts.map +1 -1
  16. package/lib/services/assessment/modules/ConformanceAssessor.js +21 -0
  17. package/lib/services/assessment/modules/ResourceAssessor.d.ts.map +1 -1
  18. package/lib/services/assessment/modules/ResourceAssessor.js +6 -1
  19. package/lib/services/assessment/registry/AssessorDefinitions.d.ts +38 -0
  20. package/lib/services/assessment/registry/AssessorDefinitions.d.ts.map +1 -0
  21. package/lib/services/assessment/registry/AssessorDefinitions.js +370 -0
  22. package/lib/services/assessment/registry/AssessorRegistry.d.ts +157 -0
  23. package/lib/services/assessment/registry/AssessorRegistry.d.ts.map +1 -0
  24. package/lib/services/assessment/registry/AssessorRegistry.js +364 -0
  25. package/lib/services/assessment/registry/estimators.d.ts +93 -0
  26. package/lib/services/assessment/registry/estimators.d.ts.map +1 -0
  27. package/lib/services/assessment/registry/estimators.js +176 -0
  28. package/lib/services/assessment/registry/index.d.ts +13 -0
  29. package/lib/services/assessment/registry/index.d.ts.map +1 -0
  30. package/lib/services/assessment/registry/index.js +16 -0
  31. package/lib/services/assessment/registry/types.d.ts +180 -0
  32. package/lib/services/assessment/registry/types.d.ts.map +1 -0
  33. package/lib/services/assessment/registry/types.js +35 -0
  34. package/lib/services/assessment/responseValidatorSchemas.d.ts +4 -4
  35. package/package.json +1 -1
@@ -36,6 +36,10 @@ export declare class ConformanceAssessor extends BaseAssessor<ConformanceAssessm
36
36
  * Parse checks.json file from conformance results
37
37
  */
38
38
  private parseChecksFile;
39
+ /**
40
+ * Check if the MCP conformance package is available
41
+ */
42
+ private isConformancePackageAvailable;
39
43
  /**
40
44
  * Cleanup temporary directory
41
45
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ConformanceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ConformanceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,gCAAgC,CAAC;AAgCxC;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAC1E;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwFxE;;OAEG;YACW,WAAW;IAwEzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+BlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+C/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAmB5B"}
1
+ {"version":3,"file":"ConformanceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ConformanceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,gCAAgC,CAAC;AAgCxC;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAC1E;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkGxE;;OAEG;YACW,WAAW;IAwEzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAarC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+BlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+C/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAmB5B"}
@@ -49,6 +49,11 @@ export class ConformanceAssessor extends BaseAssessor {
49
49
  this.logger.info("Conformance tests skipped: serverUrl not available (requires HTTP/SSE transport)");
50
50
  return this.createSkippedResult("Server URL not available. Conformance tests require HTTP or SSE transport.");
51
51
  }
52
+ // Check if conformance package is available
53
+ if (!this.isConformancePackageAvailable()) {
54
+ this.logger.warn("MCP conformance package not available. Install with: npm install -g @modelcontextprotocol/conformance");
55
+ return this.createSkippedResult("MCP conformance package not installed. Run: npm install -g @modelcontextprotocol/conformance");
56
+ }
52
57
  this.logger.info(`Running conformance tests against: ${serverUrl}`);
53
58
  const scenarios = [];
54
59
  const allChecks = [];
@@ -199,6 +204,22 @@ export class ConformanceAssessor extends BaseAssessor {
199
204
  return [];
200
205
  }
201
206
  }
207
+ /**
208
+ * Check if the MCP conformance package is available
209
+ */
210
+ isConformancePackageAvailable() {
211
+ try {
212
+ execFileSync("npx", ["@modelcontextprotocol/conformance", "--version"], {
213
+ timeout: 30000,
214
+ stdio: "pipe",
215
+ encoding: "utf-8",
216
+ });
217
+ return true;
218
+ }
219
+ catch {
220
+ return false;
221
+ }
222
+ }
202
223
  /**
203
224
  * Cleanup temporary directory
204
225
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ResourceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAuQ9D,qBAAa,gBAAiB,SAAQ,YAAY;IAC1C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8FrE,OAAO,CAAC,yBAAyB;YAiBnB,YAAY;IAoG1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;YAsBjB,oBAAoB;IAkGlC;;;OAGG;YACW,6BAA6B;IA4F3C;;;OAGG;YACW,2BAA2B;IA0DzC;;OAEG;YACW,mBAAmB;IAmEjC,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,wBAAwB;IAIhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,mBAAmB;IAoC3B,OAAO,CAAC,uBAAuB;CA+DhC"}
1
+ {"version":3,"file":"ResourceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ResourceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAuQ9D,qBAAa,gBAAiB,SAAQ,YAAY;IAC1C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8FrE,OAAO,CAAC,yBAAyB;YAiBnB,YAAY;IAoG1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;YAsBjB,oBAAoB;IAkGlC;;;OAGG;YACW,6BAA6B;IA4F3C;;;OAGG;YACW,2BAA2B;IAgEzC;;OAEG;YACW,mBAAmB;IAmEjC,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,wBAAwB;IAIhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,mBAAmB;IAoC3B,OAAO,CAAC,uBAAuB;CA+DhC"}
@@ -605,7 +605,8 @@ export class ResourceAssessor extends BaseAssessor {
605
605
  baseSchemes.add("file");
606
606
  baseSchemes.add("resource");
607
607
  }
608
- // Test hidden resource patterns
608
+ // Test hidden resource patterns with rate limiting to avoid overwhelming target
609
+ const PROBE_DELAY_MS = 50; // 50ms delay between probes
609
610
  for (const pattern of HIDDEN_RESOURCE_PATTERNS) {
610
611
  // For patterns with their own scheme, test directly
611
612
  if (pattern.includes("://")) {
@@ -614,6 +615,8 @@ export class ResourceAssessor extends BaseAssessor {
614
615
  if (probeResult) {
615
616
  results.push(probeResult);
616
617
  }
618
+ // Rate limit between probes
619
+ await new Promise((resolve) => setTimeout(resolve, PROBE_DELAY_MS));
617
620
  }
618
621
  else {
619
622
  // For file paths, combine with discovered schemes
@@ -624,6 +627,8 @@ export class ResourceAssessor extends BaseAssessor {
624
627
  if (probeResult) {
625
628
  results.push(probeResult);
626
629
  }
630
+ // Rate limit between probes
631
+ await new Promise((resolve) => setTimeout(resolve, PROBE_DELAY_MS));
627
632
  }
628
633
  }
629
634
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Assessor Definitions
3
+ *
4
+ * Declarative configuration for all 19 assessors.
5
+ * Single source of truth for assessor registration, phase ordering,
6
+ * config flags, and Claude bridge support.
7
+ *
8
+ * @module assessment/registry/AssessorDefinitions
9
+ * @see GitHub Issue #91
10
+ */
11
+ import type { AssessorDefinition } from "./types.js";
12
+ import { AssessmentPhase } from "./types.js";
13
+ /**
14
+ * All assessor definitions in phase order.
15
+ * This is the single source of truth for assessor registration.
16
+ *
17
+ * Order within phases:
18
+ * - Phase 0 (PRE): Temporal only
19
+ * - Phase 1 (CORE): Functionality, Security, Documentation, ErrorHandling, Usability
20
+ * - Phase 2 (PROTOCOL): ProtocolCompliance
21
+ * - Phase 3 (COMPLIANCE): AUP, Annotations, Libraries, Manifest, Portability, APIs, Auth
22
+ * - Phase 4 (CAPABILITY): Resources, Prompts, CrossCapability
23
+ * - Phase 5 (QUALITY): FileModularization, Conformance
24
+ */
25
+ export declare const ASSESSOR_DEFINITIONS: AssessorDefinition[];
26
+ /**
27
+ * Map of assessor ID to definition for fast lookup.
28
+ */
29
+ export declare const ASSESSOR_DEFINITION_MAP: Map<string, AssessorDefinition>;
30
+ /**
31
+ * Get assessor definitions by phase.
32
+ */
33
+ export declare function getDefinitionsByPhase(phase: AssessmentPhase): AssessorDefinition[];
34
+ /**
35
+ * Get all phases in execution order.
36
+ */
37
+ export declare function getOrderedPhases(): AssessmentPhase[];
38
+ //# sourceMappingURL=AssessorDefinitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssessorDefinitions.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/registry/AssessorDefinitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA4D1C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EA+SpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAEnE,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GACrB,kBAAkB,EAAE,CAEtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CASpD"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Assessor Definitions
3
+ *
4
+ * Declarative configuration for all 19 assessors.
5
+ * Single source of truth for assessor registration, phase ordering,
6
+ * config flags, and Claude bridge support.
7
+ *
8
+ * @module assessment/registry/AssessorDefinitions
9
+ * @see GitHub Issue #91
10
+ */
11
+ import { AssessmentPhase } from "./types.js";
12
+ // Core assessor imports
13
+ import { FunctionalityAssessor } from "../modules/FunctionalityAssessor.js";
14
+ import { SecurityAssessor } from "../modules/SecurityAssessor.js";
15
+ import { DocumentationAssessor } from "../modules/DocumentationAssessor.js";
16
+ import { ErrorHandlingAssessor } from "../modules/ErrorHandlingAssessor.js";
17
+ import { UsabilityAssessor } from "../modules/UsabilityAssessor.js";
18
+ // Protocol compliance
19
+ import { ProtocolComplianceAssessor } from "../modules/ProtocolComplianceAssessor.js";
20
+ // MCP Directory compliance gap assessors
21
+ import { AUPComplianceAssessor } from "../modules/AUPComplianceAssessor.js";
22
+ import { ToolAnnotationAssessor } from "../modules/ToolAnnotationAssessor.js";
23
+ import { ProhibitedLibrariesAssessor } from "../modules/ProhibitedLibrariesAssessor.js";
24
+ import { ManifestValidationAssessor } from "../modules/ManifestValidationAssessor.js";
25
+ import { PortabilityAssessor } from "../modules/PortabilityAssessor.js";
26
+ import { ExternalAPIScannerAssessor } from "../modules/ExternalAPIScannerAssessor.js";
27
+ import { TemporalAssessor } from "../modules/TemporalAssessor.js";
28
+ import { AuthenticationAssessor } from "../modules/AuthenticationAssessor.js";
29
+ // Capability assessors
30
+ import { ResourceAssessor } from "../modules/ResourceAssessor.js";
31
+ import { PromptAssessor } from "../modules/PromptAssessor.js";
32
+ import { CrossCapabilitySecurityAssessor } from "../modules/CrossCapabilitySecurityAssessor.js";
33
+ // Code quality assessors
34
+ import { FileModularizationAssessor } from "../modules/FileModularizationAssessor.js";
35
+ import { ConformanceAssessor } from "../modules/ConformanceAssessor.js";
36
+ // Pattern configuration for ToolAnnotationAssessor
37
+ import { loadPatternConfig, compilePatterns, } from "../config/annotationPatterns.js";
38
+ // Test estimators
39
+ import { estimateTemporalTests, estimateFunctionalityTests, estimateSecurityTests, estimateDocumentationTests, estimateErrorHandlingTests, estimateUsabilityTests, estimateProtocolComplianceTests, estimateAUPComplianceTests, estimateToolAnnotationTests, estimateProhibitedLibrariesTests, estimateManifestValidationTests, estimatePortabilityTests, estimateExternalAPIScannerTests, estimateAuthenticationTests, estimateResourceTests, estimatePromptTests, estimateCrossCapabilityTests, estimateFileModularizationTests, estimateConformanceTests, } from "./estimators.js";
40
+ /**
41
+ * All assessor definitions in phase order.
42
+ * This is the single source of truth for assessor registration.
43
+ *
44
+ * Order within phases:
45
+ * - Phase 0 (PRE): Temporal only
46
+ * - Phase 1 (CORE): Functionality, Security, Documentation, ErrorHandling, Usability
47
+ * - Phase 2 (PROTOCOL): ProtocolCompliance
48
+ * - Phase 3 (COMPLIANCE): AUP, Annotations, Libraries, Manifest, Portability, APIs, Auth
49
+ * - Phase 4 (CAPABILITY): Resources, Prompts, CrossCapability
50
+ * - Phase 5 (QUALITY): FileModularization, Conformance
51
+ */
52
+ export const ASSESSOR_DEFINITIONS = [
53
+ // ============================================================================
54
+ // Phase 0: PRE - Temporal (must run first for clean baseline)
55
+ // ============================================================================
56
+ {
57
+ id: "temporal",
58
+ displayName: "Temporal",
59
+ assessorClass: TemporalAssessor,
60
+ resultField: "temporal",
61
+ phase: AssessmentPhase.PRE,
62
+ configFlags: {
63
+ primary: "temporal",
64
+ defaultEnabled: false, // Opt-in
65
+ },
66
+ requiresExtended: true,
67
+ supportsClaudeBridge: false,
68
+ estimateTests: estimateTemporalTests,
69
+ },
70
+ // ============================================================================
71
+ // Phase 1: CORE - The original 5 assessors
72
+ // ============================================================================
73
+ {
74
+ id: "functionality",
75
+ displayName: "Functionality",
76
+ assessorClass: FunctionalityAssessor,
77
+ resultField: "functionality",
78
+ phase: AssessmentPhase.CORE,
79
+ configFlags: {
80
+ primary: "functionality",
81
+ defaultEnabled: true, // Enabled unless explicitly disabled
82
+ },
83
+ requiresExtended: false,
84
+ supportsClaudeBridge: false,
85
+ estimateTests: estimateFunctionalityTests,
86
+ },
87
+ {
88
+ id: "security",
89
+ displayName: "Security",
90
+ assessorClass: SecurityAssessor,
91
+ resultField: "security",
92
+ phase: AssessmentPhase.CORE,
93
+ configFlags: {
94
+ primary: "security",
95
+ defaultEnabled: true,
96
+ },
97
+ requiresExtended: false,
98
+ supportsClaudeBridge: true, // Supports Claude semantic analysis
99
+ estimateTests: estimateSecurityTests,
100
+ },
101
+ {
102
+ id: "documentation",
103
+ displayName: "Documentation",
104
+ assessorClass: DocumentationAssessor,
105
+ resultField: "documentation",
106
+ phase: AssessmentPhase.CORE,
107
+ configFlags: {
108
+ primary: "documentation",
109
+ defaultEnabled: true,
110
+ },
111
+ requiresExtended: false,
112
+ supportsClaudeBridge: false,
113
+ estimateTests: estimateDocumentationTests,
114
+ },
115
+ {
116
+ id: "errorHandling",
117
+ displayName: "Error Handling",
118
+ assessorClass: ErrorHandlingAssessor,
119
+ resultField: "errorHandling",
120
+ phase: AssessmentPhase.CORE,
121
+ configFlags: {
122
+ primary: "errorHandling",
123
+ defaultEnabled: true,
124
+ },
125
+ requiresExtended: false,
126
+ supportsClaudeBridge: false,
127
+ estimateTests: estimateErrorHandlingTests,
128
+ },
129
+ {
130
+ id: "usability",
131
+ displayName: "Usability",
132
+ assessorClass: UsabilityAssessor,
133
+ resultField: "usability",
134
+ phase: AssessmentPhase.CORE,
135
+ configFlags: {
136
+ primary: "usability",
137
+ defaultEnabled: true,
138
+ },
139
+ requiresExtended: false,
140
+ supportsClaudeBridge: false,
141
+ estimateTests: estimateUsabilityTests,
142
+ },
143
+ // ============================================================================
144
+ // Phase 2: PROTOCOL - Unified protocol compliance
145
+ // ============================================================================
146
+ {
147
+ id: "protocolCompliance",
148
+ displayName: "Protocol Compliance",
149
+ assessorClass: ProtocolComplianceAssessor,
150
+ resultField: "mcpSpecCompliance", // Legacy field name for BC
151
+ phase: AssessmentPhase.PROTOCOL,
152
+ configFlags: {
153
+ primary: "protocolCompliance",
154
+ // BC: Enable if ANY of these deprecated flags is true
155
+ deprecated: ["mcpSpecCompliance", "protocolConformance"],
156
+ defaultEnabled: false, // Opt-in
157
+ },
158
+ requiresExtended: true,
159
+ supportsClaudeBridge: false,
160
+ estimateTests: estimateProtocolComplianceTests,
161
+ },
162
+ // ============================================================================
163
+ // Phase 3: COMPLIANCE - MCP Directory compliance gap assessors
164
+ // ============================================================================
165
+ {
166
+ id: "aupCompliance",
167
+ displayName: "AUP",
168
+ assessorClass: AUPComplianceAssessor,
169
+ resultField: "aupCompliance",
170
+ phase: AssessmentPhase.COMPLIANCE,
171
+ configFlags: {
172
+ primary: "aupCompliance",
173
+ defaultEnabled: false,
174
+ },
175
+ requiresExtended: true,
176
+ supportsClaudeBridge: true, // Supports Claude semantic analysis
177
+ estimateTests: estimateAUPComplianceTests,
178
+ },
179
+ {
180
+ id: "toolAnnotations",
181
+ displayName: "Annotations",
182
+ assessorClass: ToolAnnotationAssessor,
183
+ resultField: "toolAnnotations",
184
+ phase: AssessmentPhase.COMPLIANCE,
185
+ configFlags: {
186
+ primary: "toolAnnotations",
187
+ defaultEnabled: false,
188
+ },
189
+ requiresExtended: true,
190
+ supportsClaudeBridge: true, // Supports Claude behavior inference
191
+ estimateTests: estimateToolAnnotationTests,
192
+ // Custom setup for pattern configuration
193
+ customSetup: (assessor, config, logger) => {
194
+ if (config.patternConfigPath) {
195
+ const patternConfig = loadPatternConfig(config.patternConfigPath, logger);
196
+ const compiledPatterns = compilePatterns(patternConfig);
197
+ assessor.setPatterns(compiledPatterns);
198
+ }
199
+ },
200
+ },
201
+ {
202
+ id: "prohibitedLibraries",
203
+ displayName: "Libraries",
204
+ assessorClass: ProhibitedLibrariesAssessor,
205
+ resultField: "prohibitedLibraries",
206
+ phase: AssessmentPhase.COMPLIANCE,
207
+ configFlags: {
208
+ primary: "prohibitedLibraries",
209
+ defaultEnabled: false,
210
+ },
211
+ requiresExtended: true,
212
+ supportsClaudeBridge: false,
213
+ estimateTests: estimateProhibitedLibrariesTests,
214
+ },
215
+ {
216
+ id: "manifestValidation",
217
+ displayName: "Manifest",
218
+ assessorClass: ManifestValidationAssessor,
219
+ resultField: "manifestValidation",
220
+ phase: AssessmentPhase.COMPLIANCE,
221
+ configFlags: {
222
+ primary: "manifestValidation",
223
+ defaultEnabled: false,
224
+ },
225
+ requiresExtended: true,
226
+ supportsClaudeBridge: false,
227
+ estimateTests: estimateManifestValidationTests,
228
+ },
229
+ {
230
+ id: "portability",
231
+ displayName: "Portability",
232
+ assessorClass: PortabilityAssessor,
233
+ resultField: "portability",
234
+ phase: AssessmentPhase.COMPLIANCE,
235
+ configFlags: {
236
+ primary: "portability",
237
+ defaultEnabled: false,
238
+ },
239
+ requiresExtended: true,
240
+ supportsClaudeBridge: false,
241
+ estimateTests: estimatePortabilityTests,
242
+ },
243
+ {
244
+ id: "externalAPIScanner",
245
+ displayName: "External APIs",
246
+ assessorClass: ExternalAPIScannerAssessor,
247
+ resultField: "externalAPIScanner",
248
+ phase: AssessmentPhase.COMPLIANCE,
249
+ configFlags: {
250
+ primary: "externalAPIScanner",
251
+ defaultEnabled: false,
252
+ },
253
+ requiresExtended: true,
254
+ supportsClaudeBridge: false,
255
+ estimateTests: estimateExternalAPIScannerTests,
256
+ },
257
+ {
258
+ id: "authentication",
259
+ displayName: "Authentication",
260
+ assessorClass: AuthenticationAssessor,
261
+ resultField: "authentication",
262
+ phase: AssessmentPhase.COMPLIANCE,
263
+ configFlags: {
264
+ primary: "authentication",
265
+ defaultEnabled: false,
266
+ },
267
+ requiresExtended: true,
268
+ supportsClaudeBridge: false,
269
+ estimateTests: estimateAuthenticationTests,
270
+ },
271
+ // ============================================================================
272
+ // Phase 4: CAPABILITY - Resources, Prompts, Cross-capability
273
+ // ============================================================================
274
+ {
275
+ id: "resources",
276
+ displayName: "Resources",
277
+ assessorClass: ResourceAssessor,
278
+ resultField: "resources",
279
+ phase: AssessmentPhase.CAPABILITY,
280
+ configFlags: {
281
+ primary: "resources",
282
+ defaultEnabled: false,
283
+ },
284
+ requiresExtended: true,
285
+ supportsClaudeBridge: false,
286
+ estimateTests: estimateResourceTests,
287
+ },
288
+ {
289
+ id: "prompts",
290
+ displayName: "Prompts",
291
+ assessorClass: PromptAssessor,
292
+ resultField: "prompts",
293
+ phase: AssessmentPhase.CAPABILITY,
294
+ configFlags: {
295
+ primary: "prompts",
296
+ defaultEnabled: false,
297
+ },
298
+ requiresExtended: true,
299
+ supportsClaudeBridge: false,
300
+ estimateTests: estimatePromptTests,
301
+ },
302
+ {
303
+ id: "crossCapability",
304
+ displayName: "Cross-Capability",
305
+ assessorClass: CrossCapabilitySecurityAssessor,
306
+ resultField: "crossCapability",
307
+ phase: AssessmentPhase.CAPABILITY,
308
+ configFlags: {
309
+ primary: "crossCapability",
310
+ defaultEnabled: false,
311
+ },
312
+ requiresExtended: true,
313
+ supportsClaudeBridge: false,
314
+ estimateTests: estimateCrossCapabilityTests,
315
+ },
316
+ // ============================================================================
317
+ // Phase 5: QUALITY - Code quality and conformance
318
+ // ============================================================================
319
+ {
320
+ id: "fileModularization",
321
+ displayName: "File Modularization",
322
+ assessorClass: FileModularizationAssessor,
323
+ resultField: "fileModularization",
324
+ phase: AssessmentPhase.QUALITY,
325
+ configFlags: {
326
+ primary: "fileModularization",
327
+ defaultEnabled: false,
328
+ },
329
+ requiresExtended: true,
330
+ supportsClaudeBridge: false,
331
+ estimateTests: estimateFileModularizationTests,
332
+ },
333
+ {
334
+ id: "conformance",
335
+ displayName: "Conformance",
336
+ assessorClass: ConformanceAssessor,
337
+ resultField: "conformance",
338
+ phase: AssessmentPhase.QUALITY,
339
+ configFlags: {
340
+ primary: "conformance",
341
+ defaultEnabled: false,
342
+ },
343
+ requiresExtended: true,
344
+ supportsClaudeBridge: false,
345
+ estimateTests: estimateConformanceTests,
346
+ },
347
+ ];
348
+ /**
349
+ * Map of assessor ID to definition for fast lookup.
350
+ */
351
+ export const ASSESSOR_DEFINITION_MAP = new Map(ASSESSOR_DEFINITIONS.map((def) => [def.id, def]));
352
+ /**
353
+ * Get assessor definitions by phase.
354
+ */
355
+ export function getDefinitionsByPhase(phase) {
356
+ return ASSESSOR_DEFINITIONS.filter((def) => def.phase === phase);
357
+ }
358
+ /**
359
+ * Get all phases in execution order.
360
+ */
361
+ export function getOrderedPhases() {
362
+ return [
363
+ AssessmentPhase.PRE,
364
+ AssessmentPhase.CORE,
365
+ AssessmentPhase.PROTOCOL,
366
+ AssessmentPhase.COMPLIANCE,
367
+ AssessmentPhase.CAPABILITY,
368
+ AssessmentPhase.QUALITY,
369
+ ];
370
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Assessor Registry
3
+ *
4
+ * Central registry for managing assessor instances with metadata.
5
+ * Provides phase-ordered execution, Claude bridge wiring, and test count aggregation.
6
+ *
7
+ * @module assessment/registry/AssessorRegistry
8
+ * @see GitHub Issue #91
9
+ */
10
+ import type { AssessmentConfiguration } from "../../../lib/assessment/configTypes.js";
11
+ import type { MCPDirectoryAssessment } from "../../../lib/assessment/resultTypes.js";
12
+ import type { BaseAssessor } from "../modules/BaseAssessor.js";
13
+ import type { AssessmentContext } from "../AssessmentOrchestrator.js";
14
+ import type { ClaudeCodeBridge } from "../lib/claudeCodeBridge.js";
15
+ import { type AssessorDefinition, type RegisteredAssessor, AssessmentPhase } from "./types.js";
16
+ /**
17
+ * AssessorRegistry manages assessor instances and their execution.
18
+ *
19
+ * Key responsibilities:
20
+ * 1. Lazy instantiation based on configuration flags
21
+ * 2. Phase-ordered execution with Phase 0 always first and sequential
22
+ * 3. Claude bridge wiring to supporting assessors
23
+ * 4. Test count aggregation from all assessors
24
+ * 5. Backward-compatible property access via getAssessor()
25
+ */
26
+ /**
27
+ * Information about a failed assessor registration.
28
+ */
29
+ export interface FailedRegistration {
30
+ id: string;
31
+ error: string;
32
+ }
33
+ export declare class AssessorRegistry {
34
+ private config;
35
+ private logger;
36
+ private assessors;
37
+ private claudeBridge?;
38
+ private failedRegistrations;
39
+ constructor(config: AssessmentConfiguration);
40
+ /**
41
+ * Register all enabled assessors based on configuration.
42
+ * Called during orchestrator initialization.
43
+ */
44
+ registerAll(definitions?: AssessorDefinition[]): void;
45
+ /**
46
+ * Register a single assessor.
47
+ */
48
+ private register;
49
+ /**
50
+ * Check if an assessor should be enabled based on configuration.
51
+ * Implements OR logic for backward-compatible deprecated flags.
52
+ */
53
+ isEnabled(definition: AssessorDefinition): boolean;
54
+ /**
55
+ * Check a single config flag value.
56
+ * If defaultEnabled is true, returns true unless flag is explicitly false.
57
+ * If defaultEnabled is false, returns true only if flag is explicitly true.
58
+ */
59
+ private checkFlag;
60
+ /**
61
+ * Get a registered assessor by ID.
62
+ * Returns undefined if not registered or disabled.
63
+ */
64
+ getAssessor<T extends BaseAssessor = BaseAssessor>(id: string): T | undefined;
65
+ /**
66
+ * Get all registered assessors for a specific phase.
67
+ */
68
+ getByPhase(phase: AssessmentPhase): RegisteredAssessor[];
69
+ /**
70
+ * Set Claude bridge for all supporting assessors.
71
+ * Called when Claude Code is enabled.
72
+ */
73
+ setClaudeBridge(bridge: ClaudeCodeBridge): void;
74
+ /**
75
+ * Wire Claude bridge to a single assessor.
76
+ */
77
+ private wireClaudeBridge;
78
+ /**
79
+ * Execute all assessors in phase order.
80
+ * Phase 0 (PRE) always runs first and sequentially.
81
+ * Other phases run based on parallelTesting config.
82
+ *
83
+ * @returns Partial MCPDirectoryAssessment with results from all assessors
84
+ */
85
+ executeAll(context: AssessmentContext): Promise<Partial<MCPDirectoryAssessment>>;
86
+ /**
87
+ * Execute all assessors in a single phase.
88
+ */
89
+ private executePhase;
90
+ /**
91
+ * Execute assessors in parallel with graceful degradation.
92
+ * Uses Promise.allSettled to continue execution even if some assessors fail.
93
+ */
94
+ private executeParallel;
95
+ /**
96
+ * Execute assessors sequentially.
97
+ */
98
+ private executeSequential;
99
+ /**
100
+ * Extract status string from assessment result.
101
+ * Most results have a 'status' property.
102
+ */
103
+ private extractStatus;
104
+ /**
105
+ * Get tool count from context (respects selectedToolsForTesting config).
106
+ */
107
+ private getToolCountForContext;
108
+ /**
109
+ * Get total test count from all registered assessors.
110
+ */
111
+ getTotalTestCount(): number;
112
+ /**
113
+ * Get test count for a specific assessor.
114
+ */
115
+ getTestCount(id: string): number;
116
+ /**
117
+ * Get all registered assessor IDs.
118
+ */
119
+ getRegisteredIds(): string[];
120
+ /**
121
+ * Check if a specific assessor is registered.
122
+ */
123
+ isRegistered(id: string): boolean;
124
+ /**
125
+ * Get the count of registered assessors.
126
+ */
127
+ get size(): number;
128
+ /**
129
+ * Update configuration for future operations.
130
+ *
131
+ * **Important**: This does NOT re-register assessors. Assessors are registered
132
+ * once during construction based on the initial config. To change which
133
+ * assessors are enabled, create a new AssessorRegistry instance.
134
+ *
135
+ * @param config - New configuration to use
136
+ */
137
+ updateConfig(config: AssessmentConfiguration): void;
138
+ /**
139
+ * Reset test counts for all registered assessors.
140
+ * Called at the start of each assessment run.
141
+ */
142
+ resetAllTestCounts(): void;
143
+ /**
144
+ * Get list of assessors that failed to register.
145
+ * Useful for reporting partial assessment results.
146
+ *
147
+ * @returns Array of failed registration info (id and error message)
148
+ */
149
+ getFailedRegistrations(): FailedRegistration[];
150
+ /**
151
+ * Check if any assessors failed to register.
152
+ *
153
+ * @returns true if at least one assessor failed registration
154
+ */
155
+ hasFailedRegistrations(): boolean;
156
+ }
157
+ //# sourceMappingURL=AssessorRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssessorRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/registry/AssessorRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAEvB,eAAe,EAEhB,MAAM,SAAS,CAAC;AAOjB;;;;;;;;;GASG;AACH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,mBAAmB,CAA4B;gBAE3C,MAAM,EAAE,uBAAuB;IAQ3C;;;OAGG;IACH,WAAW,CAAC,WAAW,GAAE,kBAAkB,EAAyB,GAAG,IAAI;IAc3E;;OAEG;IACH,OAAO,CAAC,QAAQ;IAmChB;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAmClD;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAajB;;;OAGG;IACH,WAAW,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC/C,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,SAAS;IAKhB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,kBAAkB,EAAE;IAMxD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAU/C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;OAMG;IACG,UAAU,CACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IA+B3C;;OAEG;YACW,YAAY;IAoB1B;;;OAGG;YACW,eAAe;IA6D7B;;OAEG;YACW,iBAAiB;IA6C/B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAKhC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAInD;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAM1B;;;;;OAKG;IACH,sBAAsB,IAAI,kBAAkB,EAAE;IAI9C;;;;OAIG;IACH,sBAAsB,IAAI,OAAO;CAGlC"}