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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Page Audit Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Takes a ReconResult and crawl config, iterates through discovered
|
|
5
|
+
* routes in priority order, runs the single-page audit for each,
|
|
6
|
+
* and aggregates results.
|
|
7
|
+
*/
|
|
8
|
+
import type { BrowserContext } from 'playwright';
|
|
9
|
+
import type { ReconResult, CrawlConfig, MultiPageCrawlProgress, MultiPageAuditResult } from '../core/types/recon.js';
|
|
10
|
+
/**
|
|
11
|
+
* Default crawl configuration
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_CRAWL_CONFIG: CrawlConfig;
|
|
14
|
+
/**
|
|
15
|
+
* Options for the multi-page audit
|
|
16
|
+
*/
|
|
17
|
+
export interface MultiPageAuditOptions {
|
|
18
|
+
/** Playwright browser context (with WebMCP interception already set up) */
|
|
19
|
+
context: BrowserContext;
|
|
20
|
+
/** Reconnaissance result with discovered routes */
|
|
21
|
+
recon: ReconResult;
|
|
22
|
+
/** Crawl configuration (merged with defaults) */
|
|
23
|
+
config?: Partial<CrawlConfig>;
|
|
24
|
+
/** Progress callback */
|
|
25
|
+
onProgress?: (progress: MultiPageCrawlProgress) => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run a multi-page audit across all discovered routes.
|
|
29
|
+
*
|
|
30
|
+
* Routes are visited in priority order (highest first), limited by
|
|
31
|
+
* maxPages and maxDepth. Each page runs through the full single-page
|
|
32
|
+
* audit pipeline.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runMultiPageAudit(options: MultiPageAuditOptions): Promise<MultiPageAuditResult>;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Page Audit Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Takes a ReconResult and crawl config, iterates through discovered
|
|
5
|
+
* routes in priority order, runs the single-page audit for each,
|
|
6
|
+
* and aggregates results.
|
|
7
|
+
*/
|
|
8
|
+
import { runSinglePageAudit } from './run-single-page-audit.js';
|
|
9
|
+
import { ensureRulesRegistered, getRuleCategories, getRuleSeverities, } from '../rules/index.js';
|
|
10
|
+
import { calculateScore, extractFindings } from '../scoring/calculator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Default crawl configuration
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_CRAWL_CONFIG = {
|
|
15
|
+
maxPages: 20,
|
|
16
|
+
maxDepth: 4,
|
|
17
|
+
timeout: 30_000,
|
|
18
|
+
extraWaitMs: 2_000,
|
|
19
|
+
respectRobotsTxt: true,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Merge per-page rule results into an aggregate score.
|
|
23
|
+
* We collect all findings and recalculate a unified score.
|
|
24
|
+
*/
|
|
25
|
+
function aggregateScores(allFindings, allRuleResults) {
|
|
26
|
+
ensureRulesRegistered();
|
|
27
|
+
return calculateScore(allRuleResults, getRuleCategories());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run a multi-page audit across all discovered routes.
|
|
31
|
+
*
|
|
32
|
+
* Routes are visited in priority order (highest first), limited by
|
|
33
|
+
* maxPages and maxDepth. Each page runs through the full single-page
|
|
34
|
+
* audit pipeline.
|
|
35
|
+
*/
|
|
36
|
+
export async function runMultiPageAudit(options) {
|
|
37
|
+
const { context, recon, onProgress } = options;
|
|
38
|
+
const config = { ...DEFAULT_CRAWL_CONFIG, ...options.config };
|
|
39
|
+
// Filter routes by depth and skip priority
|
|
40
|
+
const eligibleRoutes = recon.discoveredRoutes
|
|
41
|
+
.filter((r) => r.depth <= config.maxDepth && r.priority !== 'skip')
|
|
42
|
+
.slice(0, config.maxPages);
|
|
43
|
+
const totalPages = eligibleRoutes.length;
|
|
44
|
+
onProgress?.({
|
|
45
|
+
phase: 'crawling',
|
|
46
|
+
progress: 0,
|
|
47
|
+
currentUrl: eligibleRoutes[0]?.url ?? recon.url,
|
|
48
|
+
pagesCompleted: 0,
|
|
49
|
+
pagesTotal: totalPages,
|
|
50
|
+
toolsFound: 0,
|
|
51
|
+
message: `Starting crawl of ${totalPages} pages`,
|
|
52
|
+
});
|
|
53
|
+
const pageSummaries = [];
|
|
54
|
+
const allTools = [];
|
|
55
|
+
const allOpportunities = [];
|
|
56
|
+
const allFindings = [];
|
|
57
|
+
const allRuleResults = new Map();
|
|
58
|
+
const webmcpPages = [];
|
|
59
|
+
let pagesSucceeded = 0;
|
|
60
|
+
for (let i = 0; i < eligibleRoutes.length; i++) {
|
|
61
|
+
const route = eligibleRoutes[i];
|
|
62
|
+
const pageNum = i + 1;
|
|
63
|
+
onProgress?.({
|
|
64
|
+
phase: 'crawling',
|
|
65
|
+
progress: Math.round((i / totalPages) * 100),
|
|
66
|
+
currentUrl: route.url,
|
|
67
|
+
pagesCompleted: i,
|
|
68
|
+
pagesTotal: totalPages,
|
|
69
|
+
toolsFound: allTools.length,
|
|
70
|
+
message: `Auditing page ${pageNum}/${totalPages}: ${route.url}`,
|
|
71
|
+
});
|
|
72
|
+
try {
|
|
73
|
+
const result = await runSinglePageAudit({
|
|
74
|
+
context,
|
|
75
|
+
url: route.url,
|
|
76
|
+
timeout: config.timeout,
|
|
77
|
+
extraWaitMs: config.extraWaitMs,
|
|
78
|
+
});
|
|
79
|
+
pagesSucceeded++;
|
|
80
|
+
// Collect page summary
|
|
81
|
+
pageSummaries.push({
|
|
82
|
+
url: route.url,
|
|
83
|
+
title: result.title,
|
|
84
|
+
success: true,
|
|
85
|
+
hasWebMCP: result.hasWebMCP,
|
|
86
|
+
toolCount: result.tools.length,
|
|
87
|
+
opportunityCount: result.opportunities.length,
|
|
88
|
+
score: result.score.total,
|
|
89
|
+
route,
|
|
90
|
+
});
|
|
91
|
+
// Aggregate tools (deduplicate by name + pageUrl)
|
|
92
|
+
for (const tool of result.tools) {
|
|
93
|
+
const isDuplicate = allTools.some((t) => t.name === tool.name && t.pageUrl === tool.pageUrl);
|
|
94
|
+
if (!isDuplicate) {
|
|
95
|
+
allTools.push(tool);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Aggregate opportunities
|
|
99
|
+
for (const opp of result.opportunities) {
|
|
100
|
+
allOpportunities.push({ ...opp, pageUrl: route.url });
|
|
101
|
+
}
|
|
102
|
+
// Aggregate findings (prefix page URL for context)
|
|
103
|
+
for (const finding of result.findings) {
|
|
104
|
+
allFindings.push({
|
|
105
|
+
...finding,
|
|
106
|
+
page: finding.page ?? route.url,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Merge rule results (prefix with page index for uniqueness)
|
|
110
|
+
for (const [ruleId, ruleResult] of result.ruleResults) {
|
|
111
|
+
const key = totalPages > 1 ? `${ruleId}@${route.url}` : ruleId;
|
|
112
|
+
allRuleResults.set(key, ruleResult);
|
|
113
|
+
}
|
|
114
|
+
if (result.hasWebMCP) {
|
|
115
|
+
webmcpPages.push(route.url);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const errMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
120
|
+
pageSummaries.push({
|
|
121
|
+
url: route.url,
|
|
122
|
+
title: '',
|
|
123
|
+
success: false,
|
|
124
|
+
hasWebMCP: false,
|
|
125
|
+
toolCount: 0,
|
|
126
|
+
opportunityCount: 0,
|
|
127
|
+
error: errMsg,
|
|
128
|
+
route,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Calculate aggregate score
|
|
133
|
+
// For the aggregate, use the per-page rule results directly if only 1 page,
|
|
134
|
+
// otherwise build a combined score from findings
|
|
135
|
+
let aggregateScore;
|
|
136
|
+
if (pageSummaries.length === 1 && pageSummaries[0]?.score != null) {
|
|
137
|
+
// Single page — use its score directly
|
|
138
|
+
const singleResult = pageSummaries[0];
|
|
139
|
+
aggregateScore = {
|
|
140
|
+
total: singleResult.score,
|
|
141
|
+
grade: scoreToGrade(singleResult.score),
|
|
142
|
+
categories: [],
|
|
143
|
+
issueCount: countIssues(allFindings),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
else if (allRuleResults.size > 0) {
|
|
147
|
+
// Multi-page — recalculate from combined rule results
|
|
148
|
+
// We need to de-key the results back to base rule IDs for scoring
|
|
149
|
+
const baseRuleResults = new Map();
|
|
150
|
+
for (const [compositeKey, result] of allRuleResults) {
|
|
151
|
+
const baseId = compositeKey.includes('@')
|
|
152
|
+
? compositeKey.split('@')[0]
|
|
153
|
+
: compositeKey;
|
|
154
|
+
const existing = baseRuleResults.get(baseId);
|
|
155
|
+
if (!existing || result.score < existing.score) {
|
|
156
|
+
// Keep worst score per rule (conservative)
|
|
157
|
+
baseRuleResults.set(baseId, result);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
aggregateScore = aggregateScores(allFindings, baseRuleResults);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
aggregateScore = {
|
|
164
|
+
total: 0,
|
|
165
|
+
grade: 'F',
|
|
166
|
+
categories: [],
|
|
167
|
+
issueCount: countIssues(allFindings),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
onProgress?.({
|
|
171
|
+
phase: 'complete',
|
|
172
|
+
progress: 100,
|
|
173
|
+
currentUrl: recon.url,
|
|
174
|
+
pagesCompleted: totalPages,
|
|
175
|
+
pagesTotal: totalPages,
|
|
176
|
+
toolsFound: allTools.length,
|
|
177
|
+
message: `Crawl complete: ${pagesSucceeded}/${totalPages} pages audited`,
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
recon,
|
|
181
|
+
pageSummaries,
|
|
182
|
+
allTools,
|
|
183
|
+
allOpportunities,
|
|
184
|
+
allFindings,
|
|
185
|
+
aggregateScore,
|
|
186
|
+
webmcpPages,
|
|
187
|
+
pagesAttempted: totalPages,
|
|
188
|
+
pagesSucceeded,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Convert numeric score to letter grade
|
|
193
|
+
*/
|
|
194
|
+
function scoreToGrade(score) {
|
|
195
|
+
if (score >= 95)
|
|
196
|
+
return 'A+';
|
|
197
|
+
if (score >= 85)
|
|
198
|
+
return 'A';
|
|
199
|
+
if (score >= 80)
|
|
200
|
+
return 'B+';
|
|
201
|
+
if (score >= 70)
|
|
202
|
+
return 'B';
|
|
203
|
+
if (score >= 65)
|
|
204
|
+
return 'C+';
|
|
205
|
+
if (score >= 55)
|
|
206
|
+
return 'C';
|
|
207
|
+
if (score >= 40)
|
|
208
|
+
return 'D';
|
|
209
|
+
return 'F';
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Count findings by severity
|
|
213
|
+
*/
|
|
214
|
+
function countIssues(findings) {
|
|
215
|
+
let critical = 0;
|
|
216
|
+
let warning = 0;
|
|
217
|
+
let info = 0;
|
|
218
|
+
for (const f of findings) {
|
|
219
|
+
switch (f.severity) {
|
|
220
|
+
case 'critical':
|
|
221
|
+
critical++;
|
|
222
|
+
break;
|
|
223
|
+
case 'warning':
|
|
224
|
+
warning++;
|
|
225
|
+
break;
|
|
226
|
+
case 'info':
|
|
227
|
+
info++;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return { critical, warning, info };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=run-multi-page-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-multi-page-audit.js","sourceRoot":"","sources":["../../src/audit/run-multi-page-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
3
|
+
import { dirname, resolve } from 'path';
|
|
4
|
+
import { render } from 'ink';
|
|
5
|
+
import { createElement } from 'react';
|
|
6
|
+
import { runPotentialAnalysis, } from '../../potential/index.js';
|
|
7
|
+
import { PotentialProgress, } from '../../ui/ink/components/PotentialProgress.js';
|
|
8
|
+
import { PotentialView } from '../../ui/ink/components/views/PotentialView.js';
|
|
9
|
+
const DEFAULT_MAX_PAGES = 30;
|
|
10
|
+
const DEFAULT_TIMEOUT = 15_000;
|
|
11
|
+
const DEPTH_LIMIT = 2;
|
|
12
|
+
const DEFAULT_MODEL = 'anthropic/claude-sonnet-4.5';
|
|
13
|
+
export async function runPotential(urlString, options) {
|
|
14
|
+
const startTime = Date.now();
|
|
15
|
+
let targetUrl;
|
|
16
|
+
try {
|
|
17
|
+
targetUrl = validateUrl(urlString);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
let maxPages;
|
|
24
|
+
let timeout;
|
|
25
|
+
try {
|
|
26
|
+
maxPages = parsePositiveInteger(options.maxPages, DEFAULT_MAX_PAGES, 'max-pages');
|
|
27
|
+
timeout = parsePositiveInteger(options.timeout, DEFAULT_TIMEOUT, 'timeout');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
const aiRequested = options.ai !== false;
|
|
34
|
+
const apiKey = process.env['OPENROUTER_API_KEY'];
|
|
35
|
+
const model = process.env['OPENROUTER_MODEL'] ?? DEFAULT_MODEL;
|
|
36
|
+
const useAI = aiRequested && Boolean(apiKey);
|
|
37
|
+
const modeLabel = useAI ? `AI-powered (${model})` : 'Heuristic-only';
|
|
38
|
+
if (!options.json) {
|
|
39
|
+
printStartupBanner(targetUrl, modeLabel, maxPages);
|
|
40
|
+
if (aiRequested && !useAI) {
|
|
41
|
+
console.log(chalk.yellow(' ⚠ OPENROUTER_API_KEY not found; falling back to heuristic recommendations.'));
|
|
42
|
+
console.log('');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (aiRequested && !useAI) {
|
|
46
|
+
console.error(chalk.yellow('Warning: OPENROUTER_API_KEY not found; falling back to heuristic mode.'));
|
|
47
|
+
}
|
|
48
|
+
if (options.json) {
|
|
49
|
+
try {
|
|
50
|
+
const report = await runPotentialAnalysis({
|
|
51
|
+
url: targetUrl,
|
|
52
|
+
maxPages,
|
|
53
|
+
timeout,
|
|
54
|
+
useAI,
|
|
55
|
+
apiKey,
|
|
56
|
+
model,
|
|
57
|
+
});
|
|
58
|
+
const saveResult = options.output
|
|
59
|
+
? await writeReportToDisk(report, options.output)
|
|
60
|
+
: { path: undefined };
|
|
61
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
62
|
+
if (saveResult.error) {
|
|
63
|
+
console.error(chalk.red(`Failed to write report: ${saveResult.error}`));
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(chalk.red(`Potential analysis failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
let progressState = createInitialProgress(targetUrl, maxPages);
|
|
74
|
+
const inkApp = render(createElement(PotentialProgress, progressState), {
|
|
75
|
+
exitOnCtrlC: false,
|
|
76
|
+
});
|
|
77
|
+
const exitPromise = inkApp.waitUntilExit();
|
|
78
|
+
let analysisComplete = false;
|
|
79
|
+
let shuttingDown = false;
|
|
80
|
+
let savedReportPath;
|
|
81
|
+
let saveError;
|
|
82
|
+
const handleCtrlC = () => {
|
|
83
|
+
if (shuttingDown)
|
|
84
|
+
return;
|
|
85
|
+
shuttingDown = true;
|
|
86
|
+
inkApp.unmount();
|
|
87
|
+
if (!analysisComplete) {
|
|
88
|
+
console.log(chalk.yellow('\nPotential analysis cancelled (Ctrl+C).'));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log('');
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
process.once('SIGINT', handleCtrlC);
|
|
97
|
+
let report;
|
|
98
|
+
try {
|
|
99
|
+
report = await runPotentialAnalysis({
|
|
100
|
+
url: targetUrl,
|
|
101
|
+
maxPages,
|
|
102
|
+
timeout,
|
|
103
|
+
useAI,
|
|
104
|
+
apiKey,
|
|
105
|
+
model,
|
|
106
|
+
onProgress: (event) => {
|
|
107
|
+
progressState = updateProgress(progressState, event, maxPages);
|
|
108
|
+
inkApp.rerender(createElement(PotentialProgress, progressState));
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
analysisComplete = true;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
process.off('SIGINT', handleCtrlC);
|
|
115
|
+
inkApp.unmount();
|
|
116
|
+
console.error(chalk.red(`Potential analysis failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
117
|
+
return 1;
|
|
118
|
+
}
|
|
119
|
+
if (options.output) {
|
|
120
|
+
const result = await writeReportToDisk(report, options.output);
|
|
121
|
+
savedReportPath = result.path;
|
|
122
|
+
saveError = result.error;
|
|
123
|
+
}
|
|
124
|
+
const isInteractive = Boolean(process.stdin.isTTY) && typeof process.stdin.setRawMode === 'function';
|
|
125
|
+
if (isInteractive) {
|
|
126
|
+
inkApp.rerender(createElement(PotentialView, {
|
|
127
|
+
report,
|
|
128
|
+
}));
|
|
129
|
+
await exitPromise;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
inkApp.unmount();
|
|
133
|
+
printPlainReport(report);
|
|
134
|
+
}
|
|
135
|
+
process.off('SIGINT', handleCtrlC);
|
|
136
|
+
console.log('');
|
|
137
|
+
console.log(chalk.dim(` Potential analysis completed in ${((Date.now() - startTime) / 1000).toFixed(1)}s`));
|
|
138
|
+
if (savedReportPath) {
|
|
139
|
+
console.log(chalk.dim(` Report saved to ${savedReportPath}`));
|
|
140
|
+
}
|
|
141
|
+
if (saveError) {
|
|
142
|
+
console.error(chalk.red(` Failed to write report: ${saveError}`));
|
|
143
|
+
}
|
|
144
|
+
return saveError ? 1 : 0;
|
|
145
|
+
}
|
|
146
|
+
function parsePositiveInteger(rawValue, fallback, label) {
|
|
147
|
+
if (!rawValue) {
|
|
148
|
+
return fallback;
|
|
149
|
+
}
|
|
150
|
+
const parsed = Number(rawValue);
|
|
151
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
152
|
+
throw new Error(`Invalid --${label}: "${rawValue}" (must be a positive integer)`);
|
|
153
|
+
}
|
|
154
|
+
return Math.floor(parsed);
|
|
155
|
+
}
|
|
156
|
+
function validateUrl(url) {
|
|
157
|
+
try {
|
|
158
|
+
const parsed = new URL(url);
|
|
159
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
160
|
+
throw new Error('URL must use http or https scheme');
|
|
161
|
+
}
|
|
162
|
+
return parsed.href;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
throw new Error(`Invalid URL: ${url}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function printStartupBanner(targetUrl, modeLabel, maxPages) {
|
|
169
|
+
console.log('');
|
|
170
|
+
console.log(chalk.bold.cyan(' WebMCP Potential Finder'));
|
|
171
|
+
console.log(` Target: ${chalk.cyan(targetUrl)}`);
|
|
172
|
+
console.log(` Mode: ${modeLabel}`);
|
|
173
|
+
console.log(` Depth: ${DEPTH_LIMIT} levels | Max pages: ${maxPages}`);
|
|
174
|
+
console.log('');
|
|
175
|
+
}
|
|
176
|
+
function createInitialProgress(targetUrl, maxPages) {
|
|
177
|
+
return {
|
|
178
|
+
targetUrl,
|
|
179
|
+
depthLimit: DEPTH_LIMIT,
|
|
180
|
+
pagesFound: 0,
|
|
181
|
+
crawledPages: 0,
|
|
182
|
+
totalPages: maxPages,
|
|
183
|
+
currentPath: targetUrl,
|
|
184
|
+
phase: 'crawling',
|
|
185
|
+
statusMessage: 'Initializing crawler',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function updateProgress(previous, event, maxPages) {
|
|
189
|
+
switch (event.phase) {
|
|
190
|
+
case 'crawling':
|
|
191
|
+
return {
|
|
192
|
+
...previous,
|
|
193
|
+
phase: 'crawling',
|
|
194
|
+
pagesFound: event.pagesFound,
|
|
195
|
+
crawledPages: event.pagesCrawled,
|
|
196
|
+
totalPages: maxPages,
|
|
197
|
+
currentPath: event.currentUrl,
|
|
198
|
+
statusMessage: `Discovering routes (${event.pagesCrawled}/${maxPages})`,
|
|
199
|
+
};
|
|
200
|
+
case 'analyzing':
|
|
201
|
+
return {
|
|
202
|
+
...previous,
|
|
203
|
+
phase: 'analyzing',
|
|
204
|
+
crawledPages: event.pagesAnalyzed,
|
|
205
|
+
totalPages: event.totalPages,
|
|
206
|
+
currentPath: event.currentUrl,
|
|
207
|
+
statusMessage: `Scanning page ${event.pagesAnalyzed}/${event.totalPages}`,
|
|
208
|
+
};
|
|
209
|
+
case 'ai-analyzing':
|
|
210
|
+
return {
|
|
211
|
+
...previous,
|
|
212
|
+
phase: 'ai analysis',
|
|
213
|
+
crawledPages: event.pagesAnalyzed,
|
|
214
|
+
totalPages: event.totalPages,
|
|
215
|
+
currentPath: event.currentUrl,
|
|
216
|
+
statusMessage: `Generating AI recommendations (${event.pagesAnalyzed}/${event.totalPages})`,
|
|
217
|
+
};
|
|
218
|
+
case 'summarizing':
|
|
219
|
+
return {
|
|
220
|
+
...previous,
|
|
221
|
+
phase: 'summarizing',
|
|
222
|
+
statusMessage: 'Summarizing findings',
|
|
223
|
+
};
|
|
224
|
+
case 'complete':
|
|
225
|
+
return {
|
|
226
|
+
...previous,
|
|
227
|
+
phase: 'complete',
|
|
228
|
+
statusMessage: 'Analysis complete',
|
|
229
|
+
};
|
|
230
|
+
default:
|
|
231
|
+
return previous;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async function writeReportToDisk(report, filePath) {
|
|
235
|
+
try {
|
|
236
|
+
const resolvedPath = resolve(filePath);
|
|
237
|
+
await mkdir(dirname(resolvedPath), { recursive: true });
|
|
238
|
+
await writeFile(resolvedPath, JSON.stringify(report, null, 2), 'utf-8');
|
|
239
|
+
return { path: resolvedPath };
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
return {
|
|
243
|
+
error: error instanceof Error ? error.message : String(error),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const PRIORITY_COLORS_MAP = {
|
|
248
|
+
critical: chalk.red,
|
|
249
|
+
high: chalk.yellow,
|
|
250
|
+
medium: chalk.cyan,
|
|
251
|
+
low: chalk.gray,
|
|
252
|
+
};
|
|
253
|
+
function printPlainReport(report) {
|
|
254
|
+
const hr = chalk.cyan('═'.repeat(60));
|
|
255
|
+
console.log('');
|
|
256
|
+
console.log(hr);
|
|
257
|
+
console.log(chalk.bold.cyan(' WEBMCP POTENTIAL ANALYSIS'));
|
|
258
|
+
console.log(hr);
|
|
259
|
+
console.log(` Target: ${chalk.cyan(report.targetUrl)}`);
|
|
260
|
+
console.log(` Pages Crawled: ${report.crawledPages}`);
|
|
261
|
+
const score = report.overallReadinessScore;
|
|
262
|
+
const scoreColor = score >= 70 ? chalk.green : score >= 40 ? chalk.yellow : chalk.red;
|
|
263
|
+
console.log(` Readiness: ${scoreColor(`${score}/100`)}`);
|
|
264
|
+
console.log(` Opportunities: ${report.totalOpportunities}`);
|
|
265
|
+
console.log('');
|
|
266
|
+
if (report.summary) {
|
|
267
|
+
console.log(chalk.dim(' ' + report.summary));
|
|
268
|
+
console.log('');
|
|
269
|
+
}
|
|
270
|
+
if (report.topRecommendations.length > 0) {
|
|
271
|
+
console.log(chalk.bold.cyan(' Top Recommendations'));
|
|
272
|
+
console.log('');
|
|
273
|
+
for (let i = 0; i < report.topRecommendations.length; i++) {
|
|
274
|
+
const rec = report.topRecommendations[i];
|
|
275
|
+
printRecommendation(rec, i);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (report.pages.length > 0) {
|
|
279
|
+
console.log(chalk.bold.cyan(` Pages (${report.pages.length})`));
|
|
280
|
+
console.log('');
|
|
281
|
+
for (const page of report.pages) {
|
|
282
|
+
printPageSummary(page);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
console.log(hr);
|
|
286
|
+
}
|
|
287
|
+
function printRecommendation(rec, index) {
|
|
288
|
+
const colorFn = PRIORITY_COLORS_MAP[rec.priority] ?? chalk.gray;
|
|
289
|
+
console.log(` ${chalk.bold(`#${index + 1}`)} ${chalk.bold(rec.title)} ${colorFn(`[${rec.priority.toUpperCase()}]`)}`);
|
|
290
|
+
console.log(` ${rec.description}`);
|
|
291
|
+
if (rec.toolDefinition) {
|
|
292
|
+
console.log(` Tool: ${chalk.cyan(rec.toolDefinition.name)}`);
|
|
293
|
+
}
|
|
294
|
+
console.log(` Impact: ${rec.estimatedImpact}`);
|
|
295
|
+
console.log('');
|
|
296
|
+
}
|
|
297
|
+
function printPageSummary(page) {
|
|
298
|
+
const path = formatUrlPath(page.url);
|
|
299
|
+
const scoreColor = page.potentialScore >= 70 ? chalk.red : page.potentialScore >= 40 ? chalk.yellow : chalk.green;
|
|
300
|
+
console.log(` ${chalk.bold(path)} ${chalk.dim(`(depth ${page.depth})`)} ${scoreColor(`${page.potentialScore}/100`)}`);
|
|
301
|
+
console.log(` Existing tools: ${page.existingTools} | Opportunities: ${page.opportunities.length}`);
|
|
302
|
+
for (const opp of page.opportunities.slice(0, 5)) {
|
|
303
|
+
printOpportunity(opp);
|
|
304
|
+
}
|
|
305
|
+
if (page.opportunities.length > 5) {
|
|
306
|
+
console.log(chalk.dim(` …and ${page.opportunities.length - 5} more`));
|
|
307
|
+
}
|
|
308
|
+
console.log('');
|
|
309
|
+
}
|
|
310
|
+
function printOpportunity(opp) {
|
|
311
|
+
const colorFn = PRIORITY_COLORS_MAP[opp.agenticValue] ?? chalk.gray;
|
|
312
|
+
console.log(` ${colorFn('●')} ${chalk.bold(opp.suggestedToolName)} ${chalk.dim(`(${opp.agenticValue})`)}`);
|
|
313
|
+
}
|
|
314
|
+
function formatUrlPath(url) {
|
|
315
|
+
try {
|
|
316
|
+
const parsed = new URL(url);
|
|
317
|
+
return parsed.pathname === '/' ? '/' : parsed.pathname;
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return url;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=potential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"potential.js","sourceRoot":"","sources":["../../../src/cli/commands/potential.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Command
|
|
3
|
+
*
|
|
4
|
+
* Open or manage generated audit reports.
|
|
5
|
+
*/
|
|
6
|
+
export interface ReportOpenOptions {
|
|
7
|
+
dir?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Open the latest HTML report in the default browser.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runReportOpen(options: ReportOpenOptions): Promise<number>;
|