webmcp-cli 1.0.0 → 1.2.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.
- package/dist/agent/features/agent-simulator.d.ts +67 -0
- package/dist/agent/features/agent-simulator.js +368 -0
- package/dist/agent/features/agent-simulator.js.map +1 -0
- package/dist/agent/features/index.d.ts +8 -0
- package/dist/agent/features/index.js +9 -0
- package/dist/agent/features/index.js.map +1 -0
- package/dist/agent/features/simulation-judge.d.ts +78 -0
- package/dist/agent/features/simulation-judge.js +276 -0
- package/dist/agent/features/simulation-judge.js.map +1 -0
- package/dist/agent/features/test-case-generator.d.ts +35 -0
- package/dist/agent/features/test-case-generator.js +257 -0
- package/dist/agent/features/test-case-generator.js.map +1 -0
- package/dist/agent/index.d.ts +7 -0
- package/dist/agent/index.js +10 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/llm-client.d.ts +76 -0
- package/dist/agent/llm-client.js +198 -0
- package/dist/agent/llm-client.js.map +1 -0
- package/dist/audit/run-single-page-audit.d.ts +41 -0
- package/dist/audit/run-single-page-audit.js +103 -0
- package/dist/audit/run-single-page-audit.js.map +1 -0
- package/dist/bin/webmcp.d.ts +5 -0
- package/dist/bin/webmcp.js +14 -0
- package/dist/bin/webmcp.js.map +1 -0
- package/dist/browser/audit-runner.d.ts +30 -0
- package/dist/browser/audit-runner.js +77 -0
- package/dist/browser/audit-runner.js.map +1 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.js +7 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/interceptor.d.ts +68 -0
- package/dist/browser/interceptor.js +257 -0
- package/dist/browser/interceptor.js.map +1 -0
- package/dist/browser/playwright.d.ts +98 -0
- package/dist/browser/playwright.js +158 -0
- package/dist/browser/playwright.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +12 -0
- package/dist/cli/commands/audit.js +349 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +10 -0
- package/dist/cli/commands/interactive.js +34 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/options/parse-audit-options.d.ts +12 -0
- package/dist/cli/options/parse-audit-options.js +64 -0
- package/dist/cli/options/parse-audit-options.js.map +1 -0
- package/dist/core/constants.d.ts +102 -0
- package/dist/core/constants.js +214 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/types/audit.d.ts +260 -0
- package/dist/core/types/audit.js +5 -0
- package/dist/core/types/audit.js.map +1 -0
- package/dist/core/types/index.d.ts +6 -0
- package/dist/core/types/index.js +7 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/rule.d.ts +190 -0
- package/dist/core/types/rule.js +26 -0
- package/dist/core/types/rule.js.map +1 -0
- package/dist/core/types/tool.d.ts +312 -0
- package/dist/core/types/tool.js +6 -0
- package/dist/core/types/tool.js.map +1 -0
- package/dist/detection/declarative.d.ts +27 -0
- package/dist/detection/declarative.js +343 -0
- package/dist/detection/declarative.js.map +1 -0
- package/dist/detection/imperative.d.ts +38 -0
- package/dist/detection/imperative.js +99 -0
- package/dist/detection/imperative.js.map +1 -0
- package/dist/detection/index.d.ts +5 -0
- package/dist/detection/index.js +6 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/advice-service.d.ts +38 -0
- package/dist/llm/advice-service.js +243 -0
- package/dist/llm/advice-service.js.map +1 -0
- package/dist/llm/evaluator.d.ts +89 -0
- package/dist/llm/evaluator.js +274 -0
- package/dist/llm/evaluator.js.map +1 -0
- package/dist/llm/index.d.ts +11 -0
- package/dist/llm/index.js +15 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/json-response.d.ts +12 -0
- package/dist/llm/json-response.js +67 -0
- package/dist/llm/json-response.js.map +1 -0
- package/dist/llm/providers/mock.d.ts +29 -0
- package/dist/llm/providers/mock.js +324 -0
- package/dist/llm/providers/mock.js.map +1 -0
- package/dist/llm/providers/openrouter.d.ts +53 -0
- package/dist/llm/providers/openrouter.js +321 -0
- package/dist/llm/providers/openrouter.js.map +1 -0
- package/dist/llm/request-cache.d.ts +28 -0
- package/dist/llm/request-cache.js +99 -0
- package/dist/llm/request-cache.js.map +1 -0
- package/dist/llm/types.d.ts +233 -0
- package/dist/llm/types.js +7 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/rules/best-practices/BP-001.d.ts +11 -0
- package/dist/rules/best-practices/BP-001.js +56 -0
- package/dist/rules/best-practices/BP-001.js.map +1 -0
- package/dist/rules/best-practices/BP-002.d.ts +11 -0
- package/dist/rules/best-practices/BP-002.js +63 -0
- package/dist/rules/best-practices/BP-002.js.map +1 -0
- package/dist/rules/best-practices/BP-003.d.ts +11 -0
- package/dist/rules/best-practices/BP-003.js +68 -0
- package/dist/rules/best-practices/BP-003.js.map +1 -0
- package/dist/rules/coverage/COV-001.d.ts +8 -0
- package/dist/rules/coverage/COV-001.js +51 -0
- package/dist/rules/coverage/COV-001.js.map +1 -0
- package/dist/rules/description/DESC-003.d.ts +13 -0
- package/dist/rules/description/DESC-003.js +96 -0
- package/dist/rules/description/DESC-003.js.map +1 -0
- package/dist/rules/description/DESC-004.d.ts +8 -0
- package/dist/rules/description/DESC-004.js +61 -0
- package/dist/rules/description/DESC-004.js.map +1 -0
- package/dist/rules/description/DESC-005.d.ts +12 -0
- package/dist/rules/description/DESC-005.js +70 -0
- package/dist/rules/description/DESC-005.js.map +1 -0
- package/dist/rules/description/index.d.ts +4 -0
- package/dist/rules/description/index.js +5 -0
- package/dist/rules/description/index.js.map +1 -0
- package/dist/rules/implementation/IMP-001.d.ts +10 -0
- package/dist/rules/implementation/IMP-001.js +36 -0
- package/dist/rules/implementation/IMP-001.js.map +1 -0
- package/dist/rules/implementation/IMP-003.d.ts +9 -0
- package/dist/rules/implementation/IMP-003.js +45 -0
- package/dist/rules/implementation/IMP-003.js.map +1 -0
- package/dist/rules/implementation/IMP-004.d.ts +9 -0
- package/dist/rules/implementation/IMP-004.js +48 -0
- package/dist/rules/implementation/IMP-004.js.map +1 -0
- package/dist/rules/implementation/IMP-005.d.ts +9 -0
- package/dist/rules/implementation/IMP-005.js +54 -0
- package/dist/rules/implementation/IMP-005.js.map +1 -0
- package/dist/rules/implementation/IMP-007.d.ts +8 -0
- package/dist/rules/implementation/IMP-007.js +79 -0
- package/dist/rules/implementation/IMP-007.js.map +1 -0
- package/dist/rules/implementation/IMP-013.d.ts +9 -0
- package/dist/rules/implementation/IMP-013.js +55 -0
- package/dist/rules/implementation/IMP-013.js.map +1 -0
- package/dist/rules/implementation/index.d.ts +9 -0
- package/dist/rules/implementation/index.js +10 -0
- package/dist/rules/implementation/index.js.map +1 -0
- package/dist/rules/index.d.ts +51 -0
- package/dist/rules/index.js +100 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/llm/LLM-001.d.ts +14 -0
- package/dist/rules/llm/LLM-001.js +78 -0
- package/dist/rules/llm/LLM-001.js.map +1 -0
- package/dist/rules/llm/LLM-002.d.ts +14 -0
- package/dist/rules/llm/LLM-002.js +77 -0
- package/dist/rules/llm/LLM-002.js.map +1 -0
- package/dist/rules/llm/LLM-003.d.ts +16 -0
- package/dist/rules/llm/LLM-003.js +82 -0
- package/dist/rules/llm/LLM-003.js.map +1 -0
- package/dist/rules/llm/LLM-004.d.ts +14 -0
- package/dist/rules/llm/LLM-004.js +87 -0
- package/dist/rules/llm/LLM-004.js.map +1 -0
- package/dist/rules/llm/LLM-005.d.ts +16 -0
- package/dist/rules/llm/LLM-005.js +105 -0
- package/dist/rules/llm/LLM-005.js.map +1 -0
- package/dist/rules/llm/index.d.ts +10 -0
- package/dist/rules/llm/index.js +11 -0
- package/dist/rules/llm/index.js.map +1 -0
- package/dist/rules/runner.d.ts +54 -0
- package/dist/rules/runner.js +138 -0
- package/dist/rules/runner.js.map +1 -0
- package/dist/rules/schema/SCHEMA-001.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-001.js +57 -0
- package/dist/rules/schema/SCHEMA-001.js.map +1 -0
- package/dist/rules/schema/SCHEMA-002.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-002.js +59 -0
- package/dist/rules/schema/SCHEMA-002.js.map +1 -0
- package/dist/rules/schema/SCHEMA-003.d.ts +10 -0
- package/dist/rules/schema/SCHEMA-003.js +66 -0
- package/dist/rules/schema/SCHEMA-003.js.map +1 -0
- package/dist/rules/schema/SCHEMA-011.d.ts +10 -0
- package/dist/rules/schema/SCHEMA-011.js +62 -0
- package/dist/rules/schema/SCHEMA-011.js.map +1 -0
- package/dist/rules/security/SEC-001.d.ts +12 -0
- package/dist/rules/security/SEC-001.js +66 -0
- package/dist/rules/security/SEC-001.js.map +1 -0
- package/dist/rules/utils/keywords.d.ts +35 -0
- package/dist/rules/utils/keywords.js +100 -0
- package/dist/rules/utils/keywords.js.map +1 -0
- package/dist/scoring/calculator.d.ts +27 -0
- package/dist/scoring/calculator.js +194 -0
- package/dist/scoring/calculator.js.map +1 -0
- package/dist/scoring/grades.d.ts +34 -0
- package/dist/scoring/grades.js +167 -0
- package/dist/scoring/grades.js.map +1 -0
- package/dist/scoring/index.d.ts +5 -0
- package/dist/scoring/index.js +6 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/ui/banner.d.ts +21 -0
- package/dist/ui/banner.js +60 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/design-tokens.d.ts +23 -0
- package/dist/ui/design-tokens.js +58 -0
- package/dist/ui/design-tokens.js.map +1 -0
- package/dist/ui/findings.d.ts +23 -0
- package/dist/ui/findings.js +190 -0
- package/dist/ui/findings.js.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.js +10 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/ink/App.d.ts +14 -0
- package/dist/ui/ink/App.js +113 -0
- package/dist/ui/ink/App.js.map +1 -0
- package/dist/ui/ink/FullScreenLayout.d.ts +16 -0
- package/dist/ui/ink/FullScreenLayout.js +29 -0
- package/dist/ui/ink/FullScreenLayout.js.map +1 -0
- package/dist/ui/ink/InteractiveApp.d.ts +28 -0
- package/dist/ui/ink/InteractiveApp.js +229 -0
- package/dist/ui/ink/InteractiveApp.js.map +1 -0
- package/dist/ui/ink/RealAuditApp.d.ts +19 -0
- package/dist/ui/ink/RealAuditApp.js +170 -0
- package/dist/ui/ink/RealAuditApp.js.map +1 -0
- package/dist/ui/ink/components/AnimatedProgressBar.d.ts +20 -0
- package/dist/ui/ink/components/AnimatedProgressBar.js +46 -0
- package/dist/ui/ink/components/AnimatedProgressBar.js.map +1 -0
- package/dist/ui/ink/components/AsciiLogo.d.ts +12 -0
- package/dist/ui/ink/components/AsciiLogo.js +35 -0
- package/dist/ui/ink/components/AsciiLogo.js.map +1 -0
- package/dist/ui/ink/components/CategoryBars.d.ts +18 -0
- package/dist/ui/ink/components/CategoryBars.js +18 -0
- package/dist/ui/ink/components/CategoryBars.js.map +1 -0
- package/dist/ui/ink/components/FindingsTable.d.ts +18 -0
- package/dist/ui/ink/components/FindingsTable.js +19 -0
- package/dist/ui/ink/components/FindingsTable.js.map +1 -0
- package/dist/ui/ink/components/Footer.d.ts +15 -0
- package/dist/ui/ink/components/Footer.js +20 -0
- package/dist/ui/ink/components/Footer.js.map +1 -0
- package/dist/ui/ink/components/Header.d.ts +11 -0
- package/dist/ui/ink/components/Header.js +12 -0
- package/dist/ui/ink/components/Header.js.map +1 -0
- package/dist/ui/ink/components/LinkList.d.ts +17 -0
- package/dist/ui/ink/components/LinkList.js +44 -0
- package/dist/ui/ink/components/LinkList.js.map +1 -0
- package/dist/ui/ink/components/Navigation.d.ts +26 -0
- package/dist/ui/ink/components/Navigation.js +62 -0
- package/dist/ui/ink/components/Navigation.js.map +1 -0
- package/dist/ui/ink/components/ProgressBar.d.ts +15 -0
- package/dist/ui/ink/components/ProgressBar.js +14 -0
- package/dist/ui/ink/components/ProgressBar.js.map +1 -0
- package/dist/ui/ink/components/ScoreCard.d.ts +30 -0
- package/dist/ui/ink/components/ScoreCard.js +26 -0
- package/dist/ui/ink/components/ScoreCard.js.map +1 -0
- package/dist/ui/ink/components/SimulationResults.d.ts +33 -0
- package/dist/ui/ink/components/SimulationResults.js +23 -0
- package/dist/ui/ink/components/SimulationResults.js.map +1 -0
- package/dist/ui/ink/components/Spinner.d.ts +11 -0
- package/dist/ui/ink/components/Spinner.js +12 -0
- package/dist/ui/ink/components/Spinner.js.map +1 -0
- package/dist/ui/ink/components/ToolCard.d.ts +23 -0
- package/dist/ui/ink/components/ToolCard.js +20 -0
- package/dist/ui/ink/components/ToolCard.js.map +1 -0
- package/dist/ui/ink/components/shared/Badge.d.ts +21 -0
- package/dist/ui/ink/components/shared/Badge.js +39 -0
- package/dist/ui/ink/components/shared/Badge.js.map +1 -0
- package/dist/ui/ink/components/shared/Card.d.ts +18 -0
- package/dist/ui/ink/components/shared/Card.js +11 -0
- package/dist/ui/ink/components/shared/Card.js.map +1 -0
- package/dist/ui/ink/components/shared/HelpOverlay.d.ts +10 -0
- package/dist/ui/ink/components/shared/HelpOverlay.js +28 -0
- package/dist/ui/ink/components/shared/HelpOverlay.js.map +1 -0
- package/dist/ui/ink/components/shared/LoadingWithTimeout.d.ts +11 -0
- package/dist/ui/ink/components/shared/LoadingWithTimeout.js +21 -0
- package/dist/ui/ink/components/shared/LoadingWithTimeout.js.map +1 -0
- package/dist/ui/ink/components/shared/Menu.d.ts +23 -0
- package/dist/ui/ink/components/shared/Menu.js +43 -0
- package/dist/ui/ink/components/shared/Menu.js.map +1 -0
- package/dist/ui/ink/components/shared/Table.d.ts +23 -0
- package/dist/ui/ink/components/shared/Table.js +40 -0
- package/dist/ui/ink/components/shared/Table.js.map +1 -0
- package/dist/ui/ink/components/views/CrawlingView.d.ts +12 -0
- package/dist/ui/ink/components/views/CrawlingView.js +34 -0
- package/dist/ui/ink/components/views/CrawlingView.js.map +1 -0
- package/dist/ui/ink/components/views/DashboardView.d.ts +21 -0
- package/dist/ui/ink/components/views/DashboardView.js +51 -0
- package/dist/ui/ink/components/views/DashboardView.js.map +1 -0
- package/dist/ui/ink/components/views/FindingDetailView.d.ts +16 -0
- package/dist/ui/ink/components/views/FindingDetailView.js +34 -0
- package/dist/ui/ink/components/views/FindingDetailView.js.map +1 -0
- package/dist/ui/ink/components/views/FindingsView.d.ts +16 -0
- package/dist/ui/ink/components/views/FindingsView.js +79 -0
- package/dist/ui/ink/components/views/FindingsView.js.map +1 -0
- package/dist/ui/ink/components/views/OnboardingView.d.ts +12 -0
- package/dist/ui/ink/components/views/OnboardingView.js +40 -0
- package/dist/ui/ink/components/views/OnboardingView.js.map +1 -0
- package/dist/ui/ink/components/views/SimulationView.d.ts +17 -0
- package/dist/ui/ink/components/views/SimulationView.js +53 -0
- package/dist/ui/ink/components/views/SimulationView.js.map +1 -0
- package/dist/ui/ink/components/views/TestCaseDetailView.d.ts +11 -0
- package/dist/ui/ink/components/views/TestCaseDetailView.js +53 -0
- package/dist/ui/ink/components/views/TestCaseDetailView.js.map +1 -0
- package/dist/ui/ink/components/views/ToolDetailView.d.ts +15 -0
- package/dist/ui/ink/components/views/ToolDetailView.js +25 -0
- package/dist/ui/ink/components/views/ToolDetailView.js.map +1 -0
- package/dist/ui/ink/components/views/ToolsView.d.ts +15 -0
- package/dist/ui/ink/components/views/ToolsView.js +43 -0
- package/dist/ui/ink/components/views/ToolsView.js.map +1 -0
- package/dist/ui/ink/demo.d.ts +6 -0
- package/dist/ui/ink/demo.js +254 -0
- package/dist/ui/ink/demo.js.map +1 -0
- package/dist/ui/ink/hooks/useAnimation.d.ts +29 -0
- package/dist/ui/ink/hooks/useAnimation.js +89 -0
- package/dist/ui/ink/hooks/useAnimation.js.map +1 -0
- package/dist/ui/ink/hooks/useAudit.d.ts +69 -0
- package/dist/ui/ink/hooks/useAudit.js +99 -0
- package/dist/ui/ink/hooks/useAudit.js.map +1 -0
- package/dist/ui/ink/hooks/useCrawlAnimation.d.ts +19 -0
- package/dist/ui/ink/hooks/useCrawlAnimation.js +204 -0
- package/dist/ui/ink/hooks/useCrawlAnimation.js.map +1 -0
- package/dist/ui/ink/hooks/useKeyboardNav.d.ts +23 -0
- package/dist/ui/ink/hooks/useKeyboardNav.js +81 -0
- package/dist/ui/ink/hooks/useKeyboardNav.js.map +1 -0
- package/dist/ui/ink/hooks/useNavigation.d.ts +16 -0
- package/dist/ui/ink/hooks/useNavigation.js +42 -0
- package/dist/ui/ink/hooks/useNavigation.js.map +1 -0
- package/dist/ui/ink/hooks/useTerminalSize.d.ts +10 -0
- package/dist/ui/ink/hooks/useTerminalSize.js +29 -0
- package/dist/ui/ink/hooks/useTerminalSize.js.map +1 -0
- package/dist/ui/ink/index.d.ts +43 -0
- package/dist/ui/ink/index.js +50 -0
- package/dist/ui/ink/index.js.map +1 -0
- package/dist/ui/ink/render.d.ts +24 -0
- package/dist/ui/ink/render.js +14 -0
- package/dist/ui/ink/render.js.map +1 -0
- package/dist/ui/ink/theme.d.ts +37 -0
- package/dist/ui/ink/theme.js +38 -0
- package/dist/ui/ink/theme.js.map +1 -0
- package/dist/ui/ink/types.d.ts +77 -0
- package/dist/ui/ink/types.js +5 -0
- package/dist/ui/ink/types.js.map +1 -0
- package/dist/ui/score-display.d.ts +16 -0
- package/dist/ui/score-display.js +201 -0
- package/dist/ui/score-display.js.map +1 -0
- package/dist/ui/spinner.d.ts +45 -0
- package/dist/ui/spinner.js +112 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/utils.d.ts +13 -0
- package/dist/ui/utils.js +25 -0
- package/dist/ui/utils.js.map +1 -0
- package/package.json +61 -9
- package/index.js +0 -105
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-005: Full Quality Analysis
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive LLM-based quality analysis of tool descriptions.
|
|
5
|
+
* This is the "premium" LLM rule that provides:
|
|
6
|
+
* - Overall quality score
|
|
7
|
+
* - Aspect-by-aspect breakdown
|
|
8
|
+
* - Suggested improved descriptions
|
|
9
|
+
* - Priority improvements
|
|
10
|
+
*
|
|
11
|
+
* This rule has a higher weight as it represents the most
|
|
12
|
+
* thorough AI-powered analysis.
|
|
13
|
+
*/
|
|
14
|
+
import { createRuleResult } from '../runner.js';
|
|
15
|
+
import { getDefaultEvaluator } from '../../llm/evaluator.js';
|
|
16
|
+
export const LLM_005 = {
|
|
17
|
+
id: 'LLM-005',
|
|
18
|
+
category: 'description',
|
|
19
|
+
name: 'Full Quality Analysis',
|
|
20
|
+
description: 'Comprehensive LLM evaluation of tool description quality',
|
|
21
|
+
severity: 'warning',
|
|
22
|
+
maxScore: 20,
|
|
23
|
+
async check(context) {
|
|
24
|
+
const tools = context.tools;
|
|
25
|
+
if (tools.length === 0) {
|
|
26
|
+
return createRuleResult('LLM-005', 20, {
|
|
27
|
+
passed: true,
|
|
28
|
+
score: 20,
|
|
29
|
+
message: 'No tools detected (rule not applicable)',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const evaluator = getDefaultEvaluator();
|
|
33
|
+
if (!evaluator.isLLMAvailable()) {
|
|
34
|
+
return createRuleResult('LLM-005', 20, {
|
|
35
|
+
passed: true,
|
|
36
|
+
score: 20,
|
|
37
|
+
message: 'LLM full analysis skipped (no API key configured)',
|
|
38
|
+
details: [
|
|
39
|
+
'Set OPENROUTER_API_KEY for comprehensive AI-powered analysis',
|
|
40
|
+
'This includes: clarity, specificity, steering performance, atomicity',
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const reports = [];
|
|
45
|
+
let totalScore = 0;
|
|
46
|
+
for (const tool of tools) {
|
|
47
|
+
const report = await evaluator.getQualityReport(tool);
|
|
48
|
+
reports.push({ tool: tool.name, report });
|
|
49
|
+
totalScore += report.overallScore;
|
|
50
|
+
}
|
|
51
|
+
const avgScore = totalScore / tools.length;
|
|
52
|
+
const normalizedScore = Math.round((avgScore / 100) * 20);
|
|
53
|
+
// Collect all issues and suggestions
|
|
54
|
+
const allDetails = [];
|
|
55
|
+
const allSuggestions = [];
|
|
56
|
+
const affectedTools = [];
|
|
57
|
+
for (const { tool, report } of reports) {
|
|
58
|
+
if (report.overallScore < 70) {
|
|
59
|
+
affectedTools.push(tool);
|
|
60
|
+
allDetails.push(`Tool "${tool}" (score: ${report.overallScore}/100):`);
|
|
61
|
+
allDetails.push(` Summary: ${report.summary}`);
|
|
62
|
+
// Add aspect breakdowns for low scores
|
|
63
|
+
const aspects = report.aspects;
|
|
64
|
+
if (aspects.clarity.score < 7) {
|
|
65
|
+
allDetails.push(` - Clarity: ${aspects.clarity.score}/10 - ${aspects.clarity.reasoning}`);
|
|
66
|
+
}
|
|
67
|
+
if (aspects.specificity.score < 7) {
|
|
68
|
+
allDetails.push(` - Specificity: ${aspects.specificity.score}/10 - ${aspects.specificity.reasoning}`);
|
|
69
|
+
}
|
|
70
|
+
if (aspects.steeringPerformance.score < 7) {
|
|
71
|
+
allDetails.push(` - Steering: ${aspects.steeringPerformance.score}/10 - ${aspects.steeringPerformance.reasoning}`);
|
|
72
|
+
}
|
|
73
|
+
if (aspects.atomicity.score < 7) {
|
|
74
|
+
allDetails.push(` - Atomicity: ${aspects.atomicity.score}/10 - ${aspects.atomicity.reasoning}`);
|
|
75
|
+
}
|
|
76
|
+
// Collect suggestions
|
|
77
|
+
allSuggestions.push(...report.priorityImprovements);
|
|
78
|
+
// Add suggested description if available
|
|
79
|
+
if (report.suggestedDescription) {
|
|
80
|
+
allSuggestions.push(`Suggested description for "${tool}": "${report.suggestedDescription}"`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (affectedTools.length === 0) {
|
|
85
|
+
return createRuleResult('LLM-005', 20, {
|
|
86
|
+
passed: true,
|
|
87
|
+
score: normalizedScore,
|
|
88
|
+
message: `All ${tools.length} tool(s) have good quality descriptions (avg: ${avgScore.toFixed(0)}/100)`,
|
|
89
|
+
details: reports.map((r) => `${r.tool}: ${r.report.overallScore}/100 - ${r.report.summary}`),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return createRuleResult('LLM-005', 20, {
|
|
93
|
+
passed: false,
|
|
94
|
+
score: normalizedScore,
|
|
95
|
+
message: `${affectedTools.length}/${tools.length} tool(s) need description improvements (avg: ${avgScore.toFixed(0)}/100)`,
|
|
96
|
+
details: allDetails,
|
|
97
|
+
suggestions: allSuggestions
|
|
98
|
+
.filter((s, i, arr) => arr.indexOf(s) === i)
|
|
99
|
+
.slice(0, 10),
|
|
100
|
+
affectedTools,
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
export default LLM_005;
|
|
105
|
+
//# sourceMappingURL=LLM-005.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLM-005.js","sourceRoot":"","sources":["../../../src/rules/llm/LLM-005.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Rules Module
|
|
3
|
+
*
|
|
4
|
+
* LLM-powered audit rules for deep tool description analysis.
|
|
5
|
+
*/
|
|
6
|
+
export { LLM_001 } from './LLM-001.js';
|
|
7
|
+
export { LLM_002 } from './LLM-002.js';
|
|
8
|
+
export { LLM_003 } from './LLM-003.js';
|
|
9
|
+
export { LLM_004 } from './LLM-004.js';
|
|
10
|
+
export { LLM_005 } from './LLM-005.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Rules Module
|
|
3
|
+
*
|
|
4
|
+
* LLM-powered audit rules for deep tool description analysis.
|
|
5
|
+
*/
|
|
6
|
+
export { LLM_001 } from './LLM-001.js';
|
|
7
|
+
export { LLM_002 } from './LLM-002.js';
|
|
8
|
+
export { LLM_003 } from './LLM-003.js';
|
|
9
|
+
export { LLM_004 } from './LLM-004.js';
|
|
10
|
+
export { LLM_005 } from './LLM-005.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes audit rules and collects results.
|
|
5
|
+
*/
|
|
6
|
+
import type { Rule, RuleContext, RuleResult, RuleCategory } from '../core/types/rule.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register a rule
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerRule(rule: Rule): void;
|
|
11
|
+
/**
|
|
12
|
+
* Get a rule by ID
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRule(id: string): Rule | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get all registered rules
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAllRules(): Rule[];
|
|
19
|
+
/**
|
|
20
|
+
* Get rules by category
|
|
21
|
+
*/
|
|
22
|
+
export declare function getRulesByCategory(category: RuleCategory): Rule[];
|
|
23
|
+
/**
|
|
24
|
+
* Get rule categories for all rules
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRuleCategories(): Map<string, RuleCategory>;
|
|
27
|
+
/**
|
|
28
|
+
* Get rule severities for all rules
|
|
29
|
+
*/
|
|
30
|
+
export declare function getRuleSeverities(): Map<string, 'critical' | 'warning' | 'info'>;
|
|
31
|
+
/**
|
|
32
|
+
* Run all rules against the given context
|
|
33
|
+
*/
|
|
34
|
+
export declare function runAllRules(context: RuleContext): Promise<Map<string, RuleResult>>;
|
|
35
|
+
/**
|
|
36
|
+
* Run specific rules against the given context
|
|
37
|
+
*/
|
|
38
|
+
export declare function runRules(ruleIds: string[], context: RuleContext): Promise<Map<string, RuleResult>>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a helper to build rule results
|
|
41
|
+
*/
|
|
42
|
+
export declare function createRuleResult(ruleId: string, maxScore: number, options: {
|
|
43
|
+
passed?: boolean;
|
|
44
|
+
score?: number;
|
|
45
|
+
message: string;
|
|
46
|
+
details?: string[];
|
|
47
|
+
suggestions?: string[];
|
|
48
|
+
affectedTools?: string[];
|
|
49
|
+
affectedPages?: string[];
|
|
50
|
+
}): RuleResult;
|
|
51
|
+
/**
|
|
52
|
+
* Clear all registered rules (for testing)
|
|
53
|
+
*/
|
|
54
|
+
export declare function clearRules(): void;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes audit rules and collects results.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Rule registry
|
|
8
|
+
*/
|
|
9
|
+
const rules = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Register a rule
|
|
12
|
+
*/
|
|
13
|
+
export function registerRule(rule) {
|
|
14
|
+
if (rules.has(rule.id)) {
|
|
15
|
+
throw new Error(`Rule ${rule.id} is already registered`);
|
|
16
|
+
}
|
|
17
|
+
rules.set(rule.id, rule);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get a rule by ID
|
|
21
|
+
*/
|
|
22
|
+
export function getRule(id) {
|
|
23
|
+
return rules.get(id);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered rules
|
|
27
|
+
*/
|
|
28
|
+
export function getAllRules() {
|
|
29
|
+
return Array.from(rules.values());
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get rules by category
|
|
33
|
+
*/
|
|
34
|
+
export function getRulesByCategory(category) {
|
|
35
|
+
return Array.from(rules.values()).filter((r) => r.category === category);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get rule categories for all rules
|
|
39
|
+
*/
|
|
40
|
+
export function getRuleCategories() {
|
|
41
|
+
const categories = new Map();
|
|
42
|
+
for (const rule of rules.values()) {
|
|
43
|
+
categories.set(rule.id, rule.category);
|
|
44
|
+
}
|
|
45
|
+
return categories;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get rule severities for all rules
|
|
49
|
+
*/
|
|
50
|
+
export function getRuleSeverities() {
|
|
51
|
+
const severities = new Map();
|
|
52
|
+
for (const rule of rules.values()) {
|
|
53
|
+
severities.set(rule.id, rule.severity);
|
|
54
|
+
}
|
|
55
|
+
return severities;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Run all rules against the given context
|
|
59
|
+
*/
|
|
60
|
+
export async function runAllRules(context) {
|
|
61
|
+
const results = new Map();
|
|
62
|
+
for (const rule of rules.values()) {
|
|
63
|
+
try {
|
|
64
|
+
const result = await rule.check(context);
|
|
65
|
+
results.set(rule.id, result);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// If a rule throws, record it as failed with an error message
|
|
69
|
+
results.set(rule.id, {
|
|
70
|
+
ruleId: rule.id,
|
|
71
|
+
passed: false,
|
|
72
|
+
score: 0,
|
|
73
|
+
maxScore: rule.maxScore,
|
|
74
|
+
message: `Rule execution error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
75
|
+
details: [
|
|
76
|
+
error instanceof Error ? error.stack ?? '' : String(error),
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Run specific rules against the given context
|
|
85
|
+
*/
|
|
86
|
+
export async function runRules(ruleIds, context) {
|
|
87
|
+
const results = new Map();
|
|
88
|
+
for (const id of ruleIds) {
|
|
89
|
+
const rule = rules.get(id);
|
|
90
|
+
if (!rule) {
|
|
91
|
+
results.set(id, {
|
|
92
|
+
ruleId: id,
|
|
93
|
+
passed: false,
|
|
94
|
+
score: 0,
|
|
95
|
+
maxScore: 0,
|
|
96
|
+
message: `Rule ${id} not found`,
|
|
97
|
+
});
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const result = await rule.check(context);
|
|
102
|
+
results.set(id, result);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
results.set(id, {
|
|
106
|
+
ruleId: rule.id,
|
|
107
|
+
passed: false,
|
|
108
|
+
score: 0,
|
|
109
|
+
maxScore: rule.maxScore,
|
|
110
|
+
message: `Rule execution error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create a helper to build rule results
|
|
118
|
+
*/
|
|
119
|
+
export function createRuleResult(ruleId, maxScore, options) {
|
|
120
|
+
return {
|
|
121
|
+
ruleId,
|
|
122
|
+
passed: options.passed ?? (options.score === maxScore),
|
|
123
|
+
score: options.score ?? (options.passed ? maxScore : 0),
|
|
124
|
+
maxScore,
|
|
125
|
+
message: options.message,
|
|
126
|
+
details: options.details,
|
|
127
|
+
suggestions: options.suggestions,
|
|
128
|
+
affectedTools: options.affectedTools,
|
|
129
|
+
affectedPages: options.affectedPages,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Clear all registered rules (for testing)
|
|
134
|
+
*/
|
|
135
|
+
export function clearRules() {
|
|
136
|
+
rules.clear();
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/rules/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-001: Schema Is Object Type
|
|
3
|
+
*
|
|
4
|
+
* Checks that the root inputSchema type is "object".
|
|
5
|
+
* This is required by the WebMCP specification.
|
|
6
|
+
*/
|
|
7
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
8
|
+
export declare const SCHEMA_001: Rule;
|
|
9
|
+
export default SCHEMA_001;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-001: Schema Is Object Type
|
|
3
|
+
*
|
|
4
|
+
* Checks that the root inputSchema type is "object".
|
|
5
|
+
* This is required by the WebMCP specification.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
export const SCHEMA_001 = {
|
|
9
|
+
id: 'SCHEMA-001',
|
|
10
|
+
category: 'schema',
|
|
11
|
+
name: 'Schema Is Object Type',
|
|
12
|
+
description: 'Root inputSchema type must be "object"',
|
|
13
|
+
severity: 'critical',
|
|
14
|
+
maxScore: 10,
|
|
15
|
+
async check(context) {
|
|
16
|
+
const tools = context.tools;
|
|
17
|
+
if (tools.length === 0) {
|
|
18
|
+
return createRuleResult('SCHEMA-001', 10, {
|
|
19
|
+
passed: true,
|
|
20
|
+
score: 10,
|
|
21
|
+
message: 'No tools detected (rule not applicable)',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const violations = [];
|
|
25
|
+
for (const tool of tools) {
|
|
26
|
+
if (!tool.inputSchema) {
|
|
27
|
+
// Skip tools without inputSchema (handled by IMP-005)
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (tool.inputSchema.type !== 'object') {
|
|
31
|
+
violations.push(`Tool "${tool.name}" has inputSchema.type="${tool.inputSchema.type}" instead of "object"`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (violations.length === 0) {
|
|
35
|
+
return createRuleResult('SCHEMA-001', 10, {
|
|
36
|
+
passed: true,
|
|
37
|
+
score: 10,
|
|
38
|
+
message: 'All tool schemas have type "object"',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Deduct 3 points per violation
|
|
42
|
+
const penalty = violations.length * 3;
|
|
43
|
+
const score = Math.max(0, 10 - penalty);
|
|
44
|
+
return createRuleResult('SCHEMA-001', 10, {
|
|
45
|
+
passed: false,
|
|
46
|
+
score,
|
|
47
|
+
message: `${violations.length} tool(s) have invalid schema type`,
|
|
48
|
+
details: violations,
|
|
49
|
+
suggestions: [
|
|
50
|
+
'Set inputSchema.type to "object"',
|
|
51
|
+
'Example: { type: "object", properties: { ... } }',
|
|
52
|
+
],
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
export default SCHEMA_001;
|
|
57
|
+
//# sourceMappingURL=SCHEMA-001.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SCHEMA-001.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-001.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,wCAAwC;IACrD,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,EAAE;IAEZ,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;gBACxC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CACb,SAAS,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,WAAW,CAAC,IAAI,uBAAuB,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;gBACxC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;QAExC,OAAO,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,mCAAmC;YAChE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,kCAAkC;gBAClC,kDAAkD;aACnD;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-002: Properties Defined
|
|
3
|
+
*
|
|
4
|
+
* Checks that the inputSchema has at least one property defined.
|
|
5
|
+
* Tools should have parameters for agents to invoke them properly.
|
|
6
|
+
*/
|
|
7
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
8
|
+
export declare const SCHEMA_002: Rule;
|
|
9
|
+
export default SCHEMA_002;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-002: Properties Defined
|
|
3
|
+
*
|
|
4
|
+
* Checks that the inputSchema has at least one property defined.
|
|
5
|
+
* Tools should have parameters for agents to invoke them properly.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
export const SCHEMA_002 = {
|
|
9
|
+
id: 'SCHEMA-002',
|
|
10
|
+
category: 'schema',
|
|
11
|
+
name: 'Properties Defined',
|
|
12
|
+
description: 'Schema should have at least one property defined',
|
|
13
|
+
severity: 'warning',
|
|
14
|
+
maxScore: 8,
|
|
15
|
+
async check(context) {
|
|
16
|
+
const tools = context.tools;
|
|
17
|
+
if (tools.length === 0) {
|
|
18
|
+
return createRuleResult('SCHEMA-002', 8, {
|
|
19
|
+
passed: true,
|
|
20
|
+
score: 8,
|
|
21
|
+
message: 'No tools detected (rule not applicable)',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const violations = [];
|
|
25
|
+
for (const tool of tools) {
|
|
26
|
+
if (!tool.inputSchema) {
|
|
27
|
+
// Skip tools without inputSchema (handled by IMP-005)
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const properties = tool.inputSchema.properties;
|
|
31
|
+
if (!properties || Object.keys(properties).length === 0) {
|
|
32
|
+
violations.push(`Tool "${tool.name}" has no properties defined`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (violations.length === 0) {
|
|
36
|
+
return createRuleResult('SCHEMA-002', 8, {
|
|
37
|
+
passed: true,
|
|
38
|
+
score: 8,
|
|
39
|
+
message: 'All tool schemas have properties defined',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Deduct 2 points per violation
|
|
43
|
+
const penalty = violations.length * 2;
|
|
44
|
+
const score = Math.max(0, 8 - penalty);
|
|
45
|
+
return createRuleResult('SCHEMA-002', 8, {
|
|
46
|
+
passed: false,
|
|
47
|
+
score,
|
|
48
|
+
message: `${violations.length} tool(s) have no properties in schema`,
|
|
49
|
+
details: violations,
|
|
50
|
+
suggestions: [
|
|
51
|
+
'Define properties in the inputSchema for tool parameters',
|
|
52
|
+
'Example: { type: "object", properties: { query: { type: "string" } } }',
|
|
53
|
+
],
|
|
54
|
+
affectedTools: violations.map((v) => v.match(/"([^"]+)"/)?.[1] || ''),
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export default SCHEMA_002;
|
|
59
|
+
//# sourceMappingURL=SCHEMA-002.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SCHEMA-002.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-002.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,UAAU,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,uCAAuC;YACpE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,0DAA0D;gBAC1D,wEAAwE;aACzE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-003: Required Array Exists
|
|
3
|
+
*
|
|
4
|
+
* Checks that the inputSchema has a 'required' array defined
|
|
5
|
+
* when properties exist. This helps agents understand which
|
|
6
|
+
* parameters are mandatory vs optional.
|
|
7
|
+
*/
|
|
8
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
9
|
+
export declare const SCHEMA_003: Rule;
|
|
10
|
+
export default SCHEMA_003;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-003: Required Array Exists
|
|
3
|
+
*
|
|
4
|
+
* Checks that the inputSchema has a 'required' array defined
|
|
5
|
+
* when properties exist. This helps agents understand which
|
|
6
|
+
* parameters are mandatory vs optional.
|
|
7
|
+
*/
|
|
8
|
+
import { createRuleResult } from '../runner.js';
|
|
9
|
+
export const SCHEMA_003 = {
|
|
10
|
+
id: 'SCHEMA-003',
|
|
11
|
+
category: 'schema',
|
|
12
|
+
name: 'Required Array Exists',
|
|
13
|
+
description: 'Schema should have a required array when properties are defined',
|
|
14
|
+
severity: 'info',
|
|
15
|
+
maxScore: 5,
|
|
16
|
+
async check(context) {
|
|
17
|
+
const tools = context.tools;
|
|
18
|
+
if (tools.length === 0) {
|
|
19
|
+
return createRuleResult('SCHEMA-003', 5, {
|
|
20
|
+
passed: true,
|
|
21
|
+
score: 5,
|
|
22
|
+
message: 'No tools detected (rule not applicable)',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const violations = [];
|
|
26
|
+
for (const tool of tools) {
|
|
27
|
+
if (!tool.inputSchema) {
|
|
28
|
+
// Skip tools without inputSchema (handled by IMP-005)
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const properties = tool.inputSchema.properties;
|
|
32
|
+
if (!properties || Object.keys(properties).length === 0) {
|
|
33
|
+
// Skip tools with no properties (handled by SCHEMA-002)
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// Check if required array exists
|
|
37
|
+
if (!tool.inputSchema.required) {
|
|
38
|
+
violations.push(`Tool "${tool.name}" has properties but no required array`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (violations.length === 0) {
|
|
42
|
+
return createRuleResult('SCHEMA-003', 5, {
|
|
43
|
+
passed: true,
|
|
44
|
+
score: 5,
|
|
45
|
+
message: 'All tool schemas with properties have required arrays',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Deduct 1 point per violation
|
|
49
|
+
const penalty = Math.min(violations.length, 5);
|
|
50
|
+
const score = Math.max(0, 5 - penalty);
|
|
51
|
+
return createRuleResult('SCHEMA-003', 5, {
|
|
52
|
+
passed: false,
|
|
53
|
+
score,
|
|
54
|
+
message: `${violations.length} tool(s) missing required array in schema`,
|
|
55
|
+
details: violations,
|
|
56
|
+
suggestions: [
|
|
57
|
+
'Add a required array to specify which properties are mandatory',
|
|
58
|
+
'Even if all properties are optional, use an empty array: required: []',
|
|
59
|
+
'Example: { type: "object", properties: { ... }, required: ["query"] }',
|
|
60
|
+
],
|
|
61
|
+
affectedTools: violations.map((v) => v.match(/"([^"]+)"/)?.[1] || ''),
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export default SCHEMA_003;
|
|
66
|
+
//# sourceMappingURL=SCHEMA-003.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SCHEMA-003.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-003.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,iEAAiE;IAC9E,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,wDAAwD;gBACxD,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC/B,UAAU,CAAC,IAAI,CACb,SAAS,IAAI,CAAC,IAAI,wCAAwC,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,uDAAuD;aACjE,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,2CAA2C;YACxE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,gEAAgE;gBAChE,uEAAuE;gBACvE,uEAAuE;aACxE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-011: Param Count Reasonable
|
|
3
|
+
*
|
|
4
|
+
* Checks that tools don't have too many parameters (>10).
|
|
5
|
+
* Tools with many parameters may be doing too much and
|
|
6
|
+
* should be broken down into smaller, more atomic tools.
|
|
7
|
+
*/
|
|
8
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
9
|
+
export declare const SCHEMA_011: Rule;
|
|
10
|
+
export default SCHEMA_011;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCHEMA-011: Param Count Reasonable
|
|
3
|
+
*
|
|
4
|
+
* Checks that tools don't have too many parameters (>10).
|
|
5
|
+
* Tools with many parameters may be doing too much and
|
|
6
|
+
* should be broken down into smaller, more atomic tools.
|
|
7
|
+
*/
|
|
8
|
+
import { createRuleResult } from '../runner.js';
|
|
9
|
+
const MAX_REASONABLE_PARAMS = 10;
|
|
10
|
+
export const SCHEMA_011 = {
|
|
11
|
+
id: 'SCHEMA-011',
|
|
12
|
+
category: 'schema',
|
|
13
|
+
name: 'Param Count Reasonable',
|
|
14
|
+
description: `Tools should have ${MAX_REASONABLE_PARAMS} or fewer parameters`,
|
|
15
|
+
severity: 'warning',
|
|
16
|
+
maxScore: 5,
|
|
17
|
+
async check(context) {
|
|
18
|
+
const tools = context.tools;
|
|
19
|
+
if (tools.length === 0) {
|
|
20
|
+
return createRuleResult('SCHEMA-011', 5, {
|
|
21
|
+
passed: true,
|
|
22
|
+
score: 5,
|
|
23
|
+
message: 'No tools detected (rule not applicable)',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const violations = [];
|
|
27
|
+
for (const tool of tools) {
|
|
28
|
+
if (!tool.inputSchema?.properties) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const paramCount = Object.keys(tool.inputSchema.properties).length;
|
|
32
|
+
if (paramCount > MAX_REASONABLE_PARAMS) {
|
|
33
|
+
violations.push({ name: tool.name, count: paramCount });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (violations.length === 0) {
|
|
37
|
+
return createRuleResult('SCHEMA-011', 5, {
|
|
38
|
+
passed: true,
|
|
39
|
+
score: 5,
|
|
40
|
+
message: `All tools have reasonable parameter counts (≤${MAX_REASONABLE_PARAMS})`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// Deduct 2 points per violation
|
|
44
|
+
const penalty = violations.length * 2;
|
|
45
|
+
const score = Math.max(0, 5 - penalty);
|
|
46
|
+
return createRuleResult('SCHEMA-011', 5, {
|
|
47
|
+
passed: false,
|
|
48
|
+
score,
|
|
49
|
+
message: `${violations.length} tool(s) have too many parameters`,
|
|
50
|
+
details: violations.map((v) => `Tool "${v.name}" has ${v.count} parameters (max recommended: ${MAX_REASONABLE_PARAMS})`),
|
|
51
|
+
suggestions: [
|
|
52
|
+
'Consider breaking down tools with many parameters into smaller, focused tools',
|
|
53
|
+
'Group related parameters into nested objects',
|
|
54
|
+
'Review if all parameters are truly necessary',
|
|
55
|
+
'Atomic tools are easier for AI agents to understand and use correctly',
|
|
56
|
+
],
|
|
57
|
+
affectedTools: violations.map((v) => v.name),
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export default SCHEMA_011;
|
|
62
|
+
//# sourceMappingURL=SCHEMA-011.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SCHEMA-011.js","sourceRoot":"","sources":["../../../src/rules/schema/SCHEMA-011.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,EAAE,EAAE,YAAY;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,qBAAqB,qBAAqB,sBAAsB;IAC7E,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAsC,EAAE,CAAC;QAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;YACnE,IAAI,UAAU,GAAG,qBAAqB,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;gBACvC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD,qBAAqB,GAAG;aAClF,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;QAEvC,OAAO,gBAAgB,CAAC,YAAY,EAAE,CAAC,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,mCAAmC;YAChE,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,iCAAiC,qBAAqB,GAAG,CAC3F;YACD,WAAW,EAAE;gBACX,+EAA+E;gBAC/E,8CAA8C;gBAC9C,8CAA8C;gBAC9C,uEAAuE;aACxE;YACD,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|