webmcp-cli 1.2.2 → 1.2.3
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/analysis/form-to-tool-mapper.d.ts +61 -0
- package/dist/analysis/form-to-tool-mapper.js +360 -0
- package/dist/analysis/form-to-tool-mapper.js.map +1 -0
- package/dist/analysis/index.d.ts +84 -0
- package/dist/analysis/index.js +81 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/missing-tool-analyzer.d.ts +35 -0
- package/dist/analysis/missing-tool-analyzer.js +617 -0
- package/dist/analysis/missing-tool-analyzer.js.map +1 -0
- package/dist/audit/run-multi-page-audit.d.ts +34 -0
- package/dist/audit/run-multi-page-audit.js +233 -0
- package/dist/audit/run-multi-page-audit.js.map +1 -0
- package/dist/cli/commands/potential.d.ts +8 -0
- package/dist/cli/commands/potential.js +323 -0
- package/dist/cli/commands/potential.js.map +1 -0
- package/dist/cli/commands/report.d.ts +12 -0
- package/dist/cli/commands/report.js +89 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts +36 -0
- package/dist/config/defaults.js +33 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.js +91 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +280 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/types/audit.d.ts +1 -1
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.js +1 -0
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/types/recon.d.ts +265 -0
- package/dist/core/types/recon.js +5 -0
- package/dist/core/types/recon.js.map +1 -0
- package/dist/core/types/rule.d.ts +1 -1
- package/dist/core/types/rule.js +7 -5
- package/dist/core/types/rule.js.map +1 -1
- package/dist/crawler/depth-crawler.d.ts +29 -0
- package/dist/crawler/depth-crawler.js +212 -0
- package/dist/crawler/depth-crawler.js.map +1 -0
- package/dist/crawler/index.d.ts +2 -0
- package/dist/crawler/index.js +3 -0
- package/dist/crawler/index.js.map +1 -0
- package/dist/crawler/link-extractor.d.ts +1 -0
- package/dist/crawler/link-extractor.js +49 -0
- package/dist/crawler/link-extractor.js.map +1 -0
- package/dist/generators/index.d.ts +10 -0
- package/dist/generators/index.js +8 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/report-html.d.ts +12 -0
- package/dist/generators/report-html.js +470 -0
- package/dist/generators/report-html.js.map +1 -0
- package/dist/generators/report-json.d.ts +95 -0
- package/dist/generators/report-json.js +144 -0
- package/dist/generators/report-json.js.map +1 -0
- package/dist/generators/report-manager.d.ts +31 -0
- package/dist/generators/report-manager.js +208 -0
- package/dist/generators/report-manager.js.map +1 -0
- package/dist/generators/tool-code-generator.d.ts +31 -0
- package/dist/generators/tool-code-generator.js +201 -0
- package/dist/generators/tool-code-generator.js.map +1 -0
- package/dist/potential/ai-recommender.d.ts +33 -0
- package/dist/potential/ai-recommender.js +414 -0
- package/dist/potential/ai-recommender.js.map +1 -0
- package/dist/potential/analyzer.d.ts +32 -0
- package/dist/potential/analyzer.js +383 -0
- package/dist/potential/analyzer.js.map +1 -0
- package/dist/potential/index.d.ts +3 -0
- package/dist/potential/index.js +4 -0
- package/dist/potential/index.js.map +1 -0
- package/dist/potential/prompts.d.ts +20 -0
- package/dist/potential/prompts.js +42 -0
- package/dist/potential/prompts.js.map +1 -0
- package/dist/potential/types.d.ts +40 -0
- package/dist/potential/types.js +2 -0
- package/dist/potential/types.js.map +1 -0
- package/dist/recon/index.d.ts +20 -0
- package/dist/recon/index.js +143 -0
- package/dist/recon/index.js.map +1 -0
- package/dist/recon/manifest.d.ts +16 -0
- package/dist/recon/manifest.js +108 -0
- package/dist/recon/manifest.js.map +1 -0
- package/dist/recon/meta-extractor.d.ts +11 -0
- package/dist/recon/meta-extractor.js +276 -0
- package/dist/recon/meta-extractor.js.map +1 -0
- package/dist/recon/robots.d.ts +16 -0
- package/dist/recon/robots.js +158 -0
- package/dist/recon/robots.js.map +1 -0
- package/dist/recon/route-discovery.d.ts +25 -0
- package/dist/recon/route-discovery.js +303 -0
- package/dist/recon/route-discovery.js.map +1 -0
- package/dist/recon/sitemap.d.ts +12 -0
- package/dist/recon/sitemap.js +177 -0
- package/dist/recon/sitemap.js.map +1 -0
- package/dist/rules/accessibility/AXE-001.d.ts +9 -0
- package/dist/rules/accessibility/AXE-001.js +109 -0
- package/dist/rules/accessibility/AXE-001.js.map +1 -0
- package/dist/rules/accessibility/AXE-002.d.ts +8 -0
- package/dist/rules/accessibility/AXE-002.js +85 -0
- package/dist/rules/accessibility/AXE-002.js.map +1 -0
- package/dist/rules/accessibility/AXE-003.d.ts +8 -0
- package/dist/rules/accessibility/AXE-003.js +94 -0
- package/dist/rules/accessibility/AXE-003.js.map +1 -0
- package/dist/rules/accessibility/AXE-004.d.ts +8 -0
- package/dist/rules/accessibility/AXE-004.js +101 -0
- package/dist/rules/accessibility/AXE-004.js.map +1 -0
- package/dist/rules/accessibility/AXE-005.d.ts +9 -0
- package/dist/rules/accessibility/AXE-005.js +89 -0
- package/dist/rules/accessibility/AXE-005.js.map +1 -0
- package/dist/rules/best-practices/BP-004.d.ts +9 -0
- package/dist/rules/best-practices/BP-004.js +96 -0
- package/dist/rules/best-practices/BP-004.js.map +1 -0
- package/dist/rules/best-practices/BP-005.d.ts +8 -0
- package/dist/rules/best-practices/BP-005.js +94 -0
- package/dist/rules/best-practices/BP-005.js.map +1 -0
- package/dist/rules/best-practices/BP-006.d.ts +8 -0
- package/dist/rules/best-practices/BP-006.js +80 -0
- package/dist/rules/best-practices/BP-006.js.map +1 -0
- package/dist/rules/best-practices/BP-007.d.ts +8 -0
- package/dist/rules/best-practices/BP-007.js +92 -0
- package/dist/rules/best-practices/BP-007.js.map +1 -0
- package/dist/rules/best-practices/BP-008.d.ts +12 -0
- package/dist/rules/best-practices/BP-008.js +86 -0
- package/dist/rules/best-practices/BP-008.js.map +1 -0
- package/dist/rules/best-practices/BP-009.d.ts +9 -0
- package/dist/rules/best-practices/BP-009.js +77 -0
- package/dist/rules/best-practices/BP-009.js.map +1 -0
- package/dist/rules/best-practices/BP-010.d.ts +8 -0
- package/dist/rules/best-practices/BP-010.js +85 -0
- package/dist/rules/best-practices/BP-010.js.map +1 -0
- package/dist/rules/coverage/COV-002.d.ts +8 -0
- package/dist/rules/coverage/COV-002.js +68 -0
- package/dist/rules/coverage/COV-002.js.map +1 -0
- package/dist/rules/coverage/COV-003.d.ts +8 -0
- package/dist/rules/coverage/COV-003.js +68 -0
- package/dist/rules/coverage/COV-003.js.map +1 -0
- package/dist/rules/coverage/COV-004.d.ts +8 -0
- package/dist/rules/coverage/COV-004.js +89 -0
- package/dist/rules/coverage/COV-004.js.map +1 -0
- package/dist/rules/coverage/COV-005.d.ts +8 -0
- package/dist/rules/coverage/COV-005.js +67 -0
- package/dist/rules/coverage/COV-005.js.map +1 -0
- package/dist/rules/coverage/COV-006.d.ts +9 -0
- package/dist/rules/coverage/COV-006.js +76 -0
- package/dist/rules/coverage/COV-006.js.map +1 -0
- package/dist/rules/coverage/COV-007.d.ts +8 -0
- package/dist/rules/coverage/COV-007.js +67 -0
- package/dist/rules/coverage/COV-007.js.map +1 -0
- package/dist/rules/coverage/COV-008.d.ts +9 -0
- package/dist/rules/coverage/COV-008.js +87 -0
- package/dist/rules/coverage/COV-008.js.map +1 -0
- package/dist/rules/coverage/COV-009.d.ts +8 -0
- package/dist/rules/coverage/COV-009.js +73 -0
- package/dist/rules/coverage/COV-009.js.map +1 -0
- package/dist/rules/coverage/COV-010.d.ts +9 -0
- package/dist/rules/coverage/COV-010.js +82 -0
- package/dist/rules/coverage/COV-010.js.map +1 -0
- package/dist/rules/description/DESC-001.d.ts +9 -0
- package/dist/rules/description/DESC-001.js +88 -0
- package/dist/rules/description/DESC-001.js.map +1 -0
- package/dist/rules/description/DESC-002.d.ts +10 -0
- package/dist/rules/description/DESC-002.js +99 -0
- package/dist/rules/description/DESC-002.js.map +1 -0
- package/dist/rules/description/DESC-006.d.ts +9 -0
- package/dist/rules/description/DESC-006.js +78 -0
- package/dist/rules/description/DESC-006.js.map +1 -0
- package/dist/rules/description/DESC-007.d.ts +9 -0
- package/dist/rules/description/DESC-007.js +70 -0
- package/dist/rules/description/DESC-007.js.map +1 -0
- package/dist/rules/description/DESC-008.d.ts +9 -0
- package/dist/rules/description/DESC-008.js +70 -0
- package/dist/rules/description/DESC-008.js.map +1 -0
- package/dist/rules/description/DESC-009.d.ts +8 -0
- package/dist/rules/description/DESC-009.js +55 -0
- package/dist/rules/description/DESC-009.js.map +1 -0
- package/dist/rules/description/DESC-010.d.ts +9 -0
- package/dist/rules/description/DESC-010.js +92 -0
- package/dist/rules/description/DESC-010.js.map +1 -0
- package/dist/rules/description/DESC-011.d.ts +9 -0
- package/dist/rules/description/DESC-011.js +81 -0
- package/dist/rules/description/DESC-011.js.map +1 -0
- package/dist/rules/description/DESC-012.d.ts +9 -0
- package/dist/rules/description/DESC-012.js +98 -0
- package/dist/rules/description/DESC-012.js.map +1 -0
- package/dist/rules/implementation/IMP-002.d.ts +9 -0
- package/dist/rules/implementation/IMP-002.js +59 -0
- package/dist/rules/implementation/IMP-002.js.map +1 -0
- package/dist/rules/implementation/IMP-006.d.ts +9 -0
- package/dist/rules/implementation/IMP-006.js +48 -0
- package/dist/rules/implementation/IMP-006.js.map +1 -0
- package/dist/rules/implementation/IMP-008.d.ts +9 -0
- package/dist/rules/implementation/IMP-008.js +46 -0
- package/dist/rules/implementation/IMP-008.js.map +1 -0
- package/dist/rules/implementation/IMP-009.d.ts +9 -0
- package/dist/rules/implementation/IMP-009.js +48 -0
- package/dist/rules/implementation/IMP-009.js.map +1 -0
- package/dist/rules/implementation/IMP-010.d.ts +9 -0
- package/dist/rules/implementation/IMP-010.js +66 -0
- package/dist/rules/implementation/IMP-010.js.map +1 -0
- package/dist/rules/implementation/IMP-011.d.ts +9 -0
- package/dist/rules/implementation/IMP-011.js +82 -0
- package/dist/rules/implementation/IMP-011.js.map +1 -0
- package/dist/rules/implementation/IMP-012.d.ts +9 -0
- package/dist/rules/implementation/IMP-012.js +88 -0
- package/dist/rules/implementation/IMP-012.js.map +1 -0
- package/dist/rules/implementation/IMP-014.d.ts +9 -0
- package/dist/rules/implementation/IMP-014.js +58 -0
- package/dist/rules/implementation/IMP-014.js.map +1 -0
- package/dist/rules/implementation/IMP-015.d.ts +9 -0
- package/dist/rules/implementation/IMP-015.js +64 -0
- package/dist/rules/implementation/IMP-015.js.map +1 -0
- package/dist/rules/implementation/IMP-016.d.ts +9 -0
- package/dist/rules/implementation/IMP-016.js +52 -0
- package/dist/rules/implementation/IMP-016.js.map +1 -0
- package/dist/rules/implementation/IMP-017.d.ts +8 -0
- package/dist/rules/implementation/IMP-017.js +51 -0
- package/dist/rules/implementation/IMP-017.js.map +1 -0
- package/dist/rules/implementation/IMP-018.d.ts +8 -0
- package/dist/rules/implementation/IMP-018.js +52 -0
- package/dist/rules/implementation/IMP-018.js.map +1 -0
- package/dist/rules/implementation/IMP-019.d.ts +8 -0
- package/dist/rules/implementation/IMP-019.js +53 -0
- package/dist/rules/implementation/IMP-019.js.map +1 -0
- package/dist/rules/implementation/IMP-020.d.ts +9 -0
- package/dist/rules/implementation/IMP-020.js +62 -0
- package/dist/rules/implementation/IMP-020.js.map +1 -0
- package/dist/rules/implementation/IMP-021.d.ts +8 -0
- package/dist/rules/implementation/IMP-021.js +64 -0
- package/dist/rules/implementation/IMP-021.js.map +1 -0
- package/dist/rules/implementation/IMP-022.d.ts +8 -0
- package/dist/rules/implementation/IMP-022.js +70 -0
- package/dist/rules/implementation/IMP-022.js.map +1 -0
- package/dist/rules/index.d.ts +73 -6
- package/dist/rules/index.js +141 -6
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/schema/SCHEMA-004.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-004.js +57 -0
- package/dist/rules/schema/SCHEMA-004.js.map +1 -0
- package/dist/rules/schema/SCHEMA-005.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-005.js +61 -0
- package/dist/rules/schema/SCHEMA-005.js.map +1 -0
- package/dist/rules/schema/SCHEMA-006.d.ts +10 -0
- package/dist/rules/schema/SCHEMA-006.js +85 -0
- package/dist/rules/schema/SCHEMA-006.js.map +1 -0
- package/dist/rules/schema/SCHEMA-007.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-007.js +73 -0
- package/dist/rules/schema/SCHEMA-007.js.map +1 -0
- package/dist/rules/schema/SCHEMA-008.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-008.js +70 -0
- package/dist/rules/schema/SCHEMA-008.js.map +1 -0
- package/dist/rules/schema/SCHEMA-009.d.ts +10 -0
- package/dist/rules/schema/SCHEMA-009.js +80 -0
- package/dist/rules/schema/SCHEMA-009.js.map +1 -0
- package/dist/rules/schema/SCHEMA-010.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-010.js +96 -0
- package/dist/rules/schema/SCHEMA-010.js.map +1 -0
- package/dist/rules/schema/SCHEMA-012.d.ts +9 -0
- package/dist/rules/schema/SCHEMA-012.js +65 -0
- package/dist/rules/schema/SCHEMA-012.js.map +1 -0
- package/dist/rules/security/SEC-002.d.ts +8 -0
- package/dist/rules/security/SEC-002.js +81 -0
- package/dist/rules/security/SEC-002.js.map +1 -0
- package/dist/rules/security/SEC-003.d.ts +8 -0
- package/dist/rules/security/SEC-003.js +85 -0
- package/dist/rules/security/SEC-003.js.map +1 -0
- package/dist/rules/security/SEC-004.d.ts +9 -0
- package/dist/rules/security/SEC-004.js +87 -0
- package/dist/rules/security/SEC-004.js.map +1 -0
- package/dist/rules/security/SEC-005.d.ts +8 -0
- package/dist/rules/security/SEC-005.js +87 -0
- package/dist/rules/security/SEC-005.js.map +1 -0
- package/dist/rules/security/SEC-006.d.ts +10 -0
- package/dist/rules/security/SEC-006.js +108 -0
- package/dist/rules/security/SEC-006.js.map +1 -0
- package/dist/rules/security/SEC-007.d.ts +9 -0
- package/dist/rules/security/SEC-007.js +108 -0
- package/dist/rules/security/SEC-007.js.map +1 -0
- package/dist/rules/security/SEC-008.d.ts +8 -0
- package/dist/rules/security/SEC-008.js +109 -0
- package/dist/rules/security/SEC-008.js.map +1 -0
- package/dist/rules/security/SEC-009.d.ts +9 -0
- package/dist/rules/security/SEC-009.js +93 -0
- package/dist/rules/security/SEC-009.js.map +1 -0
- package/dist/rules/security/SEC-010.d.ts +8 -0
- package/dist/rules/security/SEC-010.js +78 -0
- package/dist/rules/security/SEC-010.js.map +1 -0
- package/dist/rules/security/SEC-011.d.ts +8 -0
- package/dist/rules/security/SEC-011.js +93 -0
- package/dist/rules/security/SEC-011.js.map +1 -0
- package/dist/rules/security/SEC-012.d.ts +8 -0
- package/dist/rules/security/SEC-012.js +79 -0
- package/dist/rules/security/SEC-012.js.map +1 -0
- package/dist/rules/security/SEC-013.d.ts +9 -0
- package/dist/rules/security/SEC-013.js +107 -0
- package/dist/rules/security/SEC-013.js.map +1 -0
- package/dist/scoring/calculator.js +1 -0
- package/dist/scoring/calculator.js.map +1 -1
- package/dist/ui/ink/components/AIRecommendationCard.d.ts +11 -0
- package/dist/ui/ink/components/AIRecommendationCard.js +23 -0
- package/dist/ui/ink/components/AIRecommendationCard.js.map +1 -0
- package/dist/ui/ink/components/OpportunityList.d.ts +10 -0
- package/dist/ui/ink/components/OpportunityList.js +48 -0
- package/dist/ui/ink/components/OpportunityList.js.map +1 -0
- package/dist/ui/ink/components/PotentialPageCard.d.ts +13 -0
- package/dist/ui/ink/components/PotentialPageCard.js +43 -0
- package/dist/ui/ink/components/PotentialPageCard.js.map +1 -0
- package/dist/ui/ink/components/PotentialProgress.d.ts +16 -0
- package/dist/ui/ink/components/PotentialProgress.js +44 -0
- package/dist/ui/ink/components/PotentialProgress.js.map +1 -0
- package/dist/ui/ink/components/PotentialSummary.d.ts +10 -0
- package/dist/ui/ink/components/PotentialSummary.js +86 -0
- package/dist/ui/ink/components/PotentialSummary.js.map +1 -0
- package/dist/ui/ink/components/SuggestionCard.d.ts +34 -0
- package/dist/ui/ink/components/SuggestionCard.js +36 -0
- package/dist/ui/ink/components/SuggestionCard.js.map +1 -0
- package/dist/ui/ink/components/views/MultiPageCrawlView.d.ts +21 -0
- package/dist/ui/ink/components/views/MultiPageCrawlView.js +55 -0
- package/dist/ui/ink/components/views/MultiPageCrawlView.js.map +1 -0
- package/dist/ui/ink/components/views/PotentialView.d.ts +18 -0
- package/dist/ui/ink/components/views/PotentialView.js +74 -0
- package/dist/ui/ink/components/views/PotentialView.js.map +1 -0
- package/dist/ui/ink/components/views/ReconView.d.ts +22 -0
- package/dist/ui/ink/components/views/ReconView.js +30 -0
- package/dist/ui/ink/components/views/ReconView.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-015: Execute Returns on Error
|
|
3
|
+
*
|
|
4
|
+
* Checks that execute functions handle errors by returning error content
|
|
5
|
+
* rather than just throwing exceptions.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
const ERROR_HANDLING_PATTERNS = [
|
|
9
|
+
/try\s*\{[\s\S]*catch/,
|
|
10
|
+
/\.catch\s*\(/,
|
|
11
|
+
];
|
|
12
|
+
const ERROR_RETURN_PATTERNS = [
|
|
13
|
+
/return\s*\{[\s\S]*isError\s*:\s*true/,
|
|
14
|
+
/return\s*\{[\s\S]*content\s*:[\s\S]*error/i,
|
|
15
|
+
/return\s*\{[\s\S]*["']isError["']\s*:/,
|
|
16
|
+
];
|
|
17
|
+
export const IMP_015 = {
|
|
18
|
+
id: 'IMP-015',
|
|
19
|
+
category: 'implementation',
|
|
20
|
+
name: 'Execute Returns on Error',
|
|
21
|
+
description: 'Execute functions should handle errors, not just throw',
|
|
22
|
+
severity: 'warning',
|
|
23
|
+
maxScore: 5,
|
|
24
|
+
async check(context) {
|
|
25
|
+
const imperativeTools = context.tools.filter((t) => t.source === 'imperative' && t.hasExecute && t.executeSource);
|
|
26
|
+
if (imperativeTools.length === 0) {
|
|
27
|
+
return createRuleResult('IMP-015', 5, {
|
|
28
|
+
passed: true,
|
|
29
|
+
score: 5,
|
|
30
|
+
message: 'No imperative tools with execute source to check',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const violations = [];
|
|
34
|
+
for (const tool of imperativeTools) {
|
|
35
|
+
const source = tool.executeSource ?? '';
|
|
36
|
+
const hasErrorHandling = ERROR_HANDLING_PATTERNS.some((p) => p.test(source));
|
|
37
|
+
const hasErrorReturn = ERROR_RETURN_PATTERNS.some((p) => p.test(source));
|
|
38
|
+
if (!hasErrorHandling && !hasErrorReturn) {
|
|
39
|
+
violations.push(tool.name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (violations.length === 0) {
|
|
43
|
+
return createRuleResult('IMP-015', 5, {
|
|
44
|
+
passed: true,
|
|
45
|
+
score: 5,
|
|
46
|
+
message: `All ${imperativeTools.length} execute function(s) handle errors`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return createRuleResult('IMP-015', 5, {
|
|
50
|
+
passed: false,
|
|
51
|
+
score: Math.max(0, 5 - violations.length * 2),
|
|
52
|
+
message: `${violations.length} execute function(s) may not handle errors properly`,
|
|
53
|
+
details: violations.map((name) => `Tool "${name}" execute function has no visible error handling`),
|
|
54
|
+
suggestions: [
|
|
55
|
+
'Wrap execute logic in try/catch and return error content',
|
|
56
|
+
'Example: catch (e) { return { content: [{ type: "text", text: e.message }], isError: true } }',
|
|
57
|
+
'Returning errors helps agents understand what went wrong',
|
|
58
|
+
],
|
|
59
|
+
affectedTools: violations,
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
export default IMP_015;
|
|
64
|
+
//# sourceMappingURL=IMP-015.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-015.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-015.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,uBAAuB,GAAG;IAC9B,sBAAsB;IACtB,cAAc;CACf,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC5B,sCAAsC;IACtC,4CAA4C;IAC5C,uCAAuC;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,wDAAwD;IACrE,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,aAAa,CACpE,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;YAExC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;YACF,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAC;YAEF,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,OAAO,eAAe,CAAC,MAAM,oCAAoC;aAC3E,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,qDAAqD;YAClF,OAAO,EAAE,UAAU,CAAC,GAAG,CACrB,CAAC,IAAI,EAAE,EAAE,CACP,SAAS,IAAI,kDAAkD,CAClE;YACD,WAAW,EAAE;gBACX,0DAA0D;gBAC1D,+FAA+F;gBAC/F,0DAA0D;aAC3D;YACD,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-016: Agent Invoked Check
|
|
3
|
+
*
|
|
4
|
+
* Checks that form submit handlers check event.agentInvoked
|
|
5
|
+
* to distinguish between user-initiated and agent-initiated submissions.
|
|
6
|
+
*/
|
|
7
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
8
|
+
export declare const IMP_016: Rule;
|
|
9
|
+
export default IMP_016;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-016: Agent Invoked Check
|
|
3
|
+
*
|
|
4
|
+
* Checks that form submit handlers check event.agentInvoked
|
|
5
|
+
* to distinguish between user-initiated and agent-initiated submissions.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
const AGENT_INVOKED_PATTERN = /agentInvoked/;
|
|
9
|
+
export const IMP_016 = {
|
|
10
|
+
id: 'IMP-016',
|
|
11
|
+
category: 'implementation',
|
|
12
|
+
name: 'Agent Invoked Check',
|
|
13
|
+
description: 'Form submit handlers should check event.agentInvoked',
|
|
14
|
+
severity: 'info',
|
|
15
|
+
maxScore: 3,
|
|
16
|
+
async check(context) {
|
|
17
|
+
const declarativeTools = context.tools.filter((t) => t.source === 'declarative');
|
|
18
|
+
if (declarativeTools.length === 0) {
|
|
19
|
+
return createRuleResult('IMP-016', 3, {
|
|
20
|
+
passed: true,
|
|
21
|
+
score: 3,
|
|
22
|
+
message: 'No declarative tools found to check',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const scripts = context.scripts ?? [];
|
|
26
|
+
const html = context.html ?? '';
|
|
27
|
+
const allContent = [
|
|
28
|
+
...scripts.map((s) => s.content),
|
|
29
|
+
html,
|
|
30
|
+
];
|
|
31
|
+
const found = allContent.some((content) => AGENT_INVOKED_PATTERN.test(content));
|
|
32
|
+
if (found) {
|
|
33
|
+
return createRuleResult('IMP-016', 3, {
|
|
34
|
+
passed: true,
|
|
35
|
+
score: 3,
|
|
36
|
+
message: 'Page checks event.agentInvoked in submit handlers',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return createRuleResult('IMP-016', 3, {
|
|
40
|
+
passed: false,
|
|
41
|
+
score: 0,
|
|
42
|
+
message: 'No agentInvoked check found in submit handlers',
|
|
43
|
+
suggestions: [
|
|
44
|
+
'Check event.agentInvoked in form submit handlers to detect agent submissions',
|
|
45
|
+
'Example: form.addEventListener("submit", (e) => { if (e.agentInvoked) { ... } })',
|
|
46
|
+
'This allows customizing behavior for agent vs. user submissions',
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export default IMP_016;
|
|
52
|
+
//# sourceMappingURL=IMP-016.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-016.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-016.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,qBAAqB,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAClC,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAChC,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CACpC,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,mDAAmD;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,gDAAgD;YACzD,WAAW,EAAE;gBACX,8EAA8E;gBAC9E,kFAAkF;gBAClF,iEAAiE;aAClE;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-017: Respond With Usage
|
|
3
|
+
*
|
|
4
|
+
* Checks that declarative forms use respondWith() for async results.
|
|
5
|
+
*/
|
|
6
|
+
import { createRuleResult } from '../runner.js';
|
|
7
|
+
const RESPOND_WITH_PATTERN = /respondWith\s*\(/;
|
|
8
|
+
export const IMP_017 = {
|
|
9
|
+
id: 'IMP-017',
|
|
10
|
+
category: 'implementation',
|
|
11
|
+
name: 'Respond With Usage',
|
|
12
|
+
description: 'Declarative forms should use respondWith() for async results',
|
|
13
|
+
severity: 'info',
|
|
14
|
+
maxScore: 3,
|
|
15
|
+
async check(context) {
|
|
16
|
+
const declarativeTools = context.tools.filter((t) => t.source === 'declarative');
|
|
17
|
+
if (declarativeTools.length === 0) {
|
|
18
|
+
return createRuleResult('IMP-017', 3, {
|
|
19
|
+
passed: true,
|
|
20
|
+
score: 3,
|
|
21
|
+
message: 'No declarative tools found to check',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const scripts = context.scripts ?? [];
|
|
25
|
+
const html = context.html ?? '';
|
|
26
|
+
const allContent = [
|
|
27
|
+
...scripts.map((s) => s.content),
|
|
28
|
+
html,
|
|
29
|
+
];
|
|
30
|
+
const found = allContent.some((content) => RESPOND_WITH_PATTERN.test(content));
|
|
31
|
+
if (found) {
|
|
32
|
+
return createRuleResult('IMP-017', 3, {
|
|
33
|
+
passed: true,
|
|
34
|
+
score: 3,
|
|
35
|
+
message: 'Page uses respondWith() for async form results',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return createRuleResult('IMP-017', 3, {
|
|
39
|
+
passed: false,
|
|
40
|
+
score: 0,
|
|
41
|
+
message: 'No respondWith() usage found for declarative forms',
|
|
42
|
+
suggestions: [
|
|
43
|
+
'Use event.respondWith(promise) in submit handlers to provide async results',
|
|
44
|
+
'Example: e.respondWith(fetch("/api/search").then(r => r.json()))',
|
|
45
|
+
'This allows agents to receive structured results from form submissions',
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
export default IMP_017;
|
|
51
|
+
//# sourceMappingURL=IMP-017.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-017.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-017.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,8DAA8D;IAC3E,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAClC,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAChC,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CACnC,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,oDAAoD;YAC7D,WAAW,EAAE;gBACX,4EAA4E;gBAC5E,kEAAkE;gBAClE,wEAAwE;aACzE;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-018: Tool Activated Handler
|
|
3
|
+
*
|
|
4
|
+
* Checks that the page listens for the toolactivated event.
|
|
5
|
+
*/
|
|
6
|
+
import { createRuleResult } from '../runner.js';
|
|
7
|
+
const TOOL_ACTIVATED_PATTERNS = [
|
|
8
|
+
/addEventListener\s*\(\s*["']toolactivated["']/,
|
|
9
|
+
/on\s*toolactivated/i,
|
|
10
|
+
];
|
|
11
|
+
export const IMP_018 = {
|
|
12
|
+
id: 'IMP-018',
|
|
13
|
+
category: 'implementation',
|
|
14
|
+
name: 'Tool Activated Handler',
|
|
15
|
+
description: 'Page should listen for toolactivated event',
|
|
16
|
+
severity: 'info',
|
|
17
|
+
maxScore: 3,
|
|
18
|
+
async check(context) {
|
|
19
|
+
if (!context.hasWebMCP && context.tools.length === 0) {
|
|
20
|
+
return createRuleResult('IMP-018', 3, {
|
|
21
|
+
passed: true,
|
|
22
|
+
score: 3,
|
|
23
|
+
message: 'No WebMCP usage detected (rule not applicable)',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const scripts = context.scripts ?? [];
|
|
27
|
+
const html = context.html ?? '';
|
|
28
|
+
const allContent = [
|
|
29
|
+
...scripts.map((s) => s.content),
|
|
30
|
+
html,
|
|
31
|
+
];
|
|
32
|
+
const found = allContent.some((content) => TOOL_ACTIVATED_PATTERNS.some((p) => p.test(content)));
|
|
33
|
+
if (found) {
|
|
34
|
+
return createRuleResult('IMP-018', 3, {
|
|
35
|
+
passed: true,
|
|
36
|
+
score: 3,
|
|
37
|
+
message: 'Page listens for toolactivated event',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return createRuleResult('IMP-018', 3, {
|
|
41
|
+
passed: false,
|
|
42
|
+
score: 0,
|
|
43
|
+
message: 'No toolactivated event listener found',
|
|
44
|
+
suggestions: [
|
|
45
|
+
'Listen for toolactivated to provide UI feedback when a tool is invoked',
|
|
46
|
+
'Example: navigator.modelContext.addEventListener("toolactivated", (e) => { ... })',
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export default IMP_018;
|
|
52
|
+
//# sourceMappingURL=IMP-018.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-018.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-018.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,uBAAuB,GAAG;IAC9B,+CAA+C;IAC/C,qBAAqB;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAChC,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CACrD,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,sCAAsC;aAChD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,uCAAuC;YAChD,WAAW,EAAE;gBACX,wEAAwE;gBACxE,mFAAmF;aACpF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-019: Tool Cancel Handler
|
|
3
|
+
*
|
|
4
|
+
* Checks that the page listens for the toolcancel event.
|
|
5
|
+
*/
|
|
6
|
+
import { createRuleResult } from '../runner.js';
|
|
7
|
+
const TOOL_CANCEL_PATTERNS = [
|
|
8
|
+
/addEventListener\s*\(\s*["']toolcancel["']/,
|
|
9
|
+
/on\s*toolcancel/i,
|
|
10
|
+
];
|
|
11
|
+
export const IMP_019 = {
|
|
12
|
+
id: 'IMP-019',
|
|
13
|
+
category: 'implementation',
|
|
14
|
+
name: 'Tool Cancel Handler',
|
|
15
|
+
description: 'Page should listen for toolcancel event',
|
|
16
|
+
severity: 'info',
|
|
17
|
+
maxScore: 3,
|
|
18
|
+
async check(context) {
|
|
19
|
+
if (!context.hasWebMCP && context.tools.length === 0) {
|
|
20
|
+
return createRuleResult('IMP-019', 3, {
|
|
21
|
+
passed: true,
|
|
22
|
+
score: 3,
|
|
23
|
+
message: 'No WebMCP usage detected (rule not applicable)',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const scripts = context.scripts ?? [];
|
|
27
|
+
const html = context.html ?? '';
|
|
28
|
+
const allContent = [
|
|
29
|
+
...scripts.map((s) => s.content),
|
|
30
|
+
html,
|
|
31
|
+
];
|
|
32
|
+
const found = allContent.some((content) => TOOL_CANCEL_PATTERNS.some((p) => p.test(content)));
|
|
33
|
+
if (found) {
|
|
34
|
+
return createRuleResult('IMP-019', 3, {
|
|
35
|
+
passed: true,
|
|
36
|
+
score: 3,
|
|
37
|
+
message: 'Page listens for toolcancel event',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return createRuleResult('IMP-019', 3, {
|
|
41
|
+
passed: false,
|
|
42
|
+
score: 0,
|
|
43
|
+
message: 'No toolcancel event listener found',
|
|
44
|
+
suggestions: [
|
|
45
|
+
'Listen for toolcancel to handle agent cancellation gracefully',
|
|
46
|
+
'Example: navigator.modelContext.addEventListener("toolcancel", (e) => { ... })',
|
|
47
|
+
'This allows cleanup when an agent cancels a tool invocation',
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export default IMP_019;
|
|
53
|
+
//# sourceMappingURL=IMP-019.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-019.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-019.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,oBAAoB,GAAG;IAC3B,4CAA4C;IAC5C,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,yCAAyC;IACtD,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAChC,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAClD,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,mCAAmC;aAC7C,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,oCAAoC;YAC7C,WAAW,EAAE;gBACX,+DAA+D;gBAC/D,gFAAgF;gBAChF,6DAA6D;aAC9D;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-020: CSS Pseudo Classes
|
|
3
|
+
*
|
|
4
|
+
* Checks that the page defines styles for :tool-form-active
|
|
5
|
+
* and :tool-submit-active pseudo-classes.
|
|
6
|
+
*/
|
|
7
|
+
import type { Rule } from '../../core/types/rule.js';
|
|
8
|
+
export declare const IMP_020: Rule;
|
|
9
|
+
export default IMP_020;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-020: CSS Pseudo Classes
|
|
3
|
+
*
|
|
4
|
+
* Checks that the page defines styles for :tool-form-active
|
|
5
|
+
* and :tool-submit-active pseudo-classes.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
const CSS_PSEUDO_PATTERNS = [
|
|
9
|
+
/:tool-form-active/,
|
|
10
|
+
/:tool-submit-active/,
|
|
11
|
+
];
|
|
12
|
+
export const IMP_020 = {
|
|
13
|
+
id: 'IMP-020',
|
|
14
|
+
category: 'implementation',
|
|
15
|
+
name: 'CSS Pseudo Classes',
|
|
16
|
+
description: 'Page should define :tool-form-active and :tool-submit-active styles',
|
|
17
|
+
severity: 'info',
|
|
18
|
+
maxScore: 3,
|
|
19
|
+
async check(context) {
|
|
20
|
+
const declarativeTools = context.tools.filter((t) => t.source === 'declarative');
|
|
21
|
+
if (declarativeTools.length === 0) {
|
|
22
|
+
return createRuleResult('IMP-020', 3, {
|
|
23
|
+
passed: true,
|
|
24
|
+
score: 3,
|
|
25
|
+
message: 'No declarative tools found to check',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const html = context.html ?? '';
|
|
29
|
+
const scripts = context.scripts ?? [];
|
|
30
|
+
// Check in inline styles and external stylesheets
|
|
31
|
+
const allContent = [html, ...scripts.map((s) => s.content)];
|
|
32
|
+
const foundPseudos = [];
|
|
33
|
+
for (const pattern of CSS_PSEUDO_PATTERNS) {
|
|
34
|
+
if (allContent.some((content) => pattern.test(content))) {
|
|
35
|
+
foundPseudos.push(pattern.source);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (foundPseudos.length === CSS_PSEUDO_PATTERNS.length) {
|
|
39
|
+
return createRuleResult('IMP-020', 3, {
|
|
40
|
+
passed: true,
|
|
41
|
+
score: 3,
|
|
42
|
+
message: 'Page defines both :tool-form-active and :tool-submit-active styles',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const missing = CSS_PSEUDO_PATTERNS
|
|
46
|
+
.filter((p) => !allContent.some((c) => p.test(c)))
|
|
47
|
+
.map((p) => p.source);
|
|
48
|
+
return createRuleResult('IMP-020', 3, {
|
|
49
|
+
passed: false,
|
|
50
|
+
score: foundPseudos.length > 0 ? 1 : 0,
|
|
51
|
+
message: `Missing CSS pseudo-class styles: ${missing.join(', ')}`,
|
|
52
|
+
details: missing.map((m) => `No styles found for ${m}`),
|
|
53
|
+
suggestions: [
|
|
54
|
+
'Define :tool-form-active styles to indicate when a form is being used by an agent',
|
|
55
|
+
'Define :tool-submit-active styles for the submit button during agent interaction',
|
|
56
|
+
'Example: form:tool-form-active { outline: 2px solid blue; }',
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export default IMP_020;
|
|
62
|
+
//# sourceMappingURL=IMP-020.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-020.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-020.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,mBAAmB,GAAG;IAC1B,mBAAmB;IACnB,qBAAqB;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,qEAAqE;IAClF,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAClC,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,qCAAqC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAEtC,kDAAkD;QAClD,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5D,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACxD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,mBAAmB,CAAC,MAAM,EAAE,CAAC;YACvD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,oEAAoE;aAC9E,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB;aAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAExB,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,oCAAoC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACvD,WAAW,EAAE;gBACX,mFAAmF;gBACnF,kFAAkF;gBAClF,6DAA6D;aAC9D;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-021: Service Worker Tools
|
|
3
|
+
*
|
|
4
|
+
* Checks if a service worker registers WebMCP tools.
|
|
5
|
+
*/
|
|
6
|
+
import { createRuleResult } from '../runner.js';
|
|
7
|
+
const SW_TOOL_PATTERNS = [
|
|
8
|
+
/self\.agent\.provideContext/,
|
|
9
|
+
/self\.agent\.registerTool/,
|
|
10
|
+
/modelContext/,
|
|
11
|
+
];
|
|
12
|
+
export const IMP_021 = {
|
|
13
|
+
id: 'IMP-021',
|
|
14
|
+
category: 'implementation',
|
|
15
|
+
name: 'Service Worker Tools',
|
|
16
|
+
description: 'Service worker may register WebMCP tools',
|
|
17
|
+
severity: 'info',
|
|
18
|
+
maxScore: 3,
|
|
19
|
+
async check(context) {
|
|
20
|
+
if (!context.hasWebMCP && context.tools.length === 0) {
|
|
21
|
+
return createRuleResult('IMP-021', 3, {
|
|
22
|
+
passed: true,
|
|
23
|
+
score: 3,
|
|
24
|
+
message: 'No WebMCP usage detected (rule not applicable)',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const scripts = context.scripts ?? [];
|
|
28
|
+
// Look for service worker scripts
|
|
29
|
+
const swScripts = scripts.filter((s) => s.src.includes('sw.js') ||
|
|
30
|
+
s.src.includes('service-worker') ||
|
|
31
|
+
s.src.includes('serviceworker') ||
|
|
32
|
+
s.src.includes('sw-') ||
|
|
33
|
+
s.content.includes('self.addEventListener(\'install\'') ||
|
|
34
|
+
s.content.includes('self.addEventListener("install"') ||
|
|
35
|
+
s.content.includes('self.addEventListener(\'fetch\'') ||
|
|
36
|
+
s.content.includes('self.addEventListener("fetch"'));
|
|
37
|
+
if (swScripts.length === 0) {
|
|
38
|
+
return createRuleResult('IMP-021', 3, {
|
|
39
|
+
passed: true,
|
|
40
|
+
score: 3,
|
|
41
|
+
message: 'No service worker detected (rule not applicable)',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const hasSWTools = swScripts.some((sw) => SW_TOOL_PATTERNS.some((p) => p.test(sw.content)));
|
|
45
|
+
if (hasSWTools) {
|
|
46
|
+
return createRuleResult('IMP-021', 3, {
|
|
47
|
+
passed: true,
|
|
48
|
+
score: 3,
|
|
49
|
+
message: 'Service worker registers WebMCP tools',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return createRuleResult('IMP-021', 3, {
|
|
53
|
+
passed: false,
|
|
54
|
+
score: 0,
|
|
55
|
+
message: 'Service worker does not register WebMCP tools',
|
|
56
|
+
suggestions: [
|
|
57
|
+
'Consider registering tools in the service worker for offline agent access',
|
|
58
|
+
'Use self.agent.provideContext() in the service worker',
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
export default IMP_021;
|
|
64
|
+
//# sourceMappingURL=IMP-021.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-021.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-021.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,gBAAgB,GAAG;IACvB,6BAA6B;IAC7B,2BAA2B;IAC3B,cAAc;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,0CAA0C;IACvD,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAEtC,kCAAkC;QAClC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAChC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC/B,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACvD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACrD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACrD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CACtD,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CACvC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CACjD,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,+CAA+C;YACxD,WAAW,EAAE;gBACX,2EAA2E;gBAC3E,uDAAuD;aACxD;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMP-022: Manifest Tools Hint
|
|
3
|
+
*
|
|
4
|
+
* Checks if the web app manifest includes tools metadata.
|
|
5
|
+
*/
|
|
6
|
+
import * as cheerio from 'cheerio';
|
|
7
|
+
import { createRuleResult } from '../runner.js';
|
|
8
|
+
export const IMP_022 = {
|
|
9
|
+
id: 'IMP-022',
|
|
10
|
+
category: 'implementation',
|
|
11
|
+
name: 'Manifest Tools Hint',
|
|
12
|
+
description: 'Web app manifest should include tools metadata',
|
|
13
|
+
severity: 'info',
|
|
14
|
+
maxScore: 3,
|
|
15
|
+
async check(context) {
|
|
16
|
+
if (!context.hasWebMCP && context.tools.length === 0) {
|
|
17
|
+
return createRuleResult('IMP-022', 3, {
|
|
18
|
+
passed: true,
|
|
19
|
+
score: 3,
|
|
20
|
+
message: 'No WebMCP usage detected (rule not applicable)',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const html = context.html ?? '';
|
|
24
|
+
if (!html) {
|
|
25
|
+
return createRuleResult('IMP-022', 3, {
|
|
26
|
+
passed: true,
|
|
27
|
+
score: 3,
|
|
28
|
+
message: 'No HTML content available for analysis',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const $ = cheerio.load(html);
|
|
32
|
+
const manifestLink = $('link[rel="manifest"]').attr('href');
|
|
33
|
+
if (!manifestLink) {
|
|
34
|
+
return createRuleResult('IMP-022', 3, {
|
|
35
|
+
passed: false,
|
|
36
|
+
score: 0,
|
|
37
|
+
message: 'No web app manifest found',
|
|
38
|
+
suggestions: [
|
|
39
|
+
'Add a web app manifest with tools metadata',
|
|
40
|
+
'Example: <link rel="manifest" href="/manifest.json">',
|
|
41
|
+
'Include tool hints in the manifest for discoverability',
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// We found a manifest link; check if scripts/HTML reference tools in manifest
|
|
46
|
+
const scripts = context.scripts ?? [];
|
|
47
|
+
const allContent = [html, ...scripts.map((s) => s.content)];
|
|
48
|
+
const hasToolsInManifest = allContent.some((content) => /["']tools["']\s*:/.test(content) &&
|
|
49
|
+
(content.includes('manifest') || content.includes('.webmanifest')));
|
|
50
|
+
if (hasToolsInManifest) {
|
|
51
|
+
return createRuleResult('IMP-022', 3, {
|
|
52
|
+
passed: true,
|
|
53
|
+
score: 3,
|
|
54
|
+
message: 'Manifest appears to include tools metadata',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Manifest exists but we can't confirm tools metadata
|
|
58
|
+
return createRuleResult('IMP-022', 3, {
|
|
59
|
+
passed: false,
|
|
60
|
+
score: 1,
|
|
61
|
+
message: 'Manifest exists but no tools metadata detected',
|
|
62
|
+
suggestions: [
|
|
63
|
+
'Add a "tools" field to your manifest.json to advertise WebMCP capabilities',
|
|
64
|
+
'This helps agents discover your tools before loading the page',
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
export default IMP_022;
|
|
70
|
+
//# sourceMappingURL=IMP-022.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMP-022.js","sourceRoot":"","sources":["../../../src/rules/implementation/IMP-022.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAS;IAC3B,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,gDAAgD;IAC7D,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,CAAC;IAEX,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,wCAAwC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,YAAY,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,2BAA2B;gBACpC,WAAW,EAAE;oBACX,4CAA4C;oBAC5C,sDAAsD;oBACtD,wDAAwD;iBACzD;aACF,CAAC,CAAC;QACL,CAAC;QAED,8EAA8E;QAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5D,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CACxC,CAAC,OAAO,EAAE,EAAE,CACV,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CACrE,CAAC;QAEF,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,4CAA4C;aACtD,CAAC,CAAC;QACL,CAAC;QAED,sDAAsD;QACtD,OAAO,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,gDAAgD;YACzD,WAAW,EAAE;gBACX,4EAA4E;gBAC5E,+DAA+D;aAChE;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|