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,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Command
|
|
3
|
+
*
|
|
4
|
+
* Run a full WebMCP audit on a website.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import figures from 'figures';
|
|
8
|
+
import { truncateText } from '../../ui/design-tokens.js';
|
|
9
|
+
import { createAuditBrowser, closeBrowser, } from '../../browser/playwright.js';
|
|
10
|
+
import { generateRecommendations, } from '../../scoring/calculator.js';
|
|
11
|
+
import { printBanner, printCompactBanner, printPhaseHeader, printSectionHeader, } from '../../ui/banner.js';
|
|
12
|
+
import { runStep, success, warning, error, skip } from '../../ui/spinner.js';
|
|
13
|
+
import { animateScoreReveal, displayScoreStatic } from '../../ui/score-display.js';
|
|
14
|
+
import { renderFindingsTable, renderRecommendations, renderToolsList } from '../../ui/findings.js';
|
|
15
|
+
import { version } from '../index.js';
|
|
16
|
+
// Agent simulation imports
|
|
17
|
+
import { createLLMClient, generateTestCases, runSimulations, judgeSimulations, } from '../../agent/index.js';
|
|
18
|
+
import { runSinglePageAudit, } from '../../audit/run-single-page-audit.js';
|
|
19
|
+
import { parseAuditCommandOptions } from '../options/parse-audit-options.js';
|
|
20
|
+
/**
|
|
21
|
+
* Validate URL
|
|
22
|
+
*/
|
|
23
|
+
function validateUrl(url) {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = new URL(url);
|
|
26
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
27
|
+
throw new Error('URL must use http or https protocol');
|
|
28
|
+
}
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error(`Invalid URL: ${url}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get site context from URL for LLM prompts
|
|
37
|
+
*/
|
|
38
|
+
function getSiteContext(url, title) {
|
|
39
|
+
// Try to infer site type from URL and title
|
|
40
|
+
const domain = url.hostname.toLowerCase();
|
|
41
|
+
const titleLower = title.toLowerCase();
|
|
42
|
+
const pathLower = url.pathname.toLowerCase();
|
|
43
|
+
if (domain.includes('travel') || titleLower.includes('travel') ||
|
|
44
|
+
titleLower.includes('flight') || titleLower.includes('hotel')) {
|
|
45
|
+
return 'travel booking';
|
|
46
|
+
}
|
|
47
|
+
if (domain.includes('shop') || titleLower.includes('shop') ||
|
|
48
|
+
titleLower.includes('store') || titleLower.includes('product')) {
|
|
49
|
+
return 'e-commerce';
|
|
50
|
+
}
|
|
51
|
+
if (domain.includes('bank') || titleLower.includes('bank') ||
|
|
52
|
+
titleLower.includes('finance')) {
|
|
53
|
+
return 'financial services';
|
|
54
|
+
}
|
|
55
|
+
if (pathLower.includes('demo') || domain.includes('demo')) {
|
|
56
|
+
return 'demo';
|
|
57
|
+
}
|
|
58
|
+
return 'website';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run agent simulation phase
|
|
62
|
+
*/
|
|
63
|
+
async function runAgentSimulation(tools, siteContext, config) {
|
|
64
|
+
const llm = createLLMClient({
|
|
65
|
+
model: config.model || process.env['OPENROUTER_MODEL'] || 'anthropic/claude-sonnet-4',
|
|
66
|
+
});
|
|
67
|
+
// Check if LLM is available
|
|
68
|
+
if (!llm.isAvailable()) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
// Generate test cases
|
|
72
|
+
const testCases = await generateTestCases(tools, siteContext, {
|
|
73
|
+
count: Math.min(config.promptsPerTool * tools.length, 50), // Cap at 50 total
|
|
74
|
+
categories: ['happy_path', 'partial_info', 'casual', 'adversarial', 'out_of_scope'],
|
|
75
|
+
model: config.model,
|
|
76
|
+
}, llm);
|
|
77
|
+
if (testCases.length === 0) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Run simulations
|
|
81
|
+
const simResults = await runSimulations(testCases, tools, {
|
|
82
|
+
maxRounds: config.maxRounds,
|
|
83
|
+
mockToolResponses: true,
|
|
84
|
+
model: config.model || 'anthropic/claude-sonnet-4',
|
|
85
|
+
siteContext,
|
|
86
|
+
maxCost: config.maxCost,
|
|
87
|
+
});
|
|
88
|
+
// Judge results
|
|
89
|
+
const judgment = await judgeSimulations(simResults, tools, llm);
|
|
90
|
+
return { simResults, judgment };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Render simulation results
|
|
94
|
+
*/
|
|
95
|
+
function renderSimulationResults(simResults, judgment) {
|
|
96
|
+
printSectionHeader('Agent Simulation Results');
|
|
97
|
+
// Summary stats
|
|
98
|
+
const passed = simResults.filter(r => r.finalSuccess).length;
|
|
99
|
+
const failed = simResults.length - passed;
|
|
100
|
+
const avgScore = Math.round(simResults.reduce((s, r) => s + r.evaluation.overallScore, 0) / simResults.length);
|
|
101
|
+
const totalCost = simResults.reduce((s, r) => s + r.totalCost, 0);
|
|
102
|
+
console.log(` ${chalk.cyan('Tests:')} ${simResults.length} total, ${chalk.green(passed + ' passed')}, ${chalk.red(failed + ' failed')}`);
|
|
103
|
+
console.log(` ${chalk.cyan('Avg Score:')} ${avgScore}/100`);
|
|
104
|
+
console.log(` ${chalk.cyan('Pass Rate:')} ${Math.round(judgment.passRate * 100)}%`);
|
|
105
|
+
console.log(` ${chalk.cyan('LLM Cost:')} $${totalCost.toFixed(4)}`);
|
|
106
|
+
console.log('');
|
|
107
|
+
// Show failure patterns if any
|
|
108
|
+
if (judgment.failurePatterns.length > 0) {
|
|
109
|
+
console.log(chalk.yellow(' Top Issues:'));
|
|
110
|
+
for (const pattern of judgment.failurePatterns.slice(0, 3)) {
|
|
111
|
+
console.log(` ${chalk.dim('•')} ${pattern.pattern} (${pattern.frequency}x)`);
|
|
112
|
+
}
|
|
113
|
+
console.log('');
|
|
114
|
+
}
|
|
115
|
+
// Show top improvements
|
|
116
|
+
if (judgment.topImprovements.length > 0) {
|
|
117
|
+
console.log(chalk.cyan(' Suggested Improvements:'));
|
|
118
|
+
for (const improvement of judgment.topImprovements.slice(0, 3)) {
|
|
119
|
+
console.log(` ${chalk.dim('•')} ${chalk.white(improvement.tool)}: ${improvement.suggestedFix}`);
|
|
120
|
+
}
|
|
121
|
+
console.log('');
|
|
122
|
+
}
|
|
123
|
+
// Show some test results
|
|
124
|
+
const showResults = simResults.slice(0, 5);
|
|
125
|
+
console.log(chalk.dim(' Sample Tests:'));
|
|
126
|
+
for (const result of showResults) {
|
|
127
|
+
const icon = result.finalSuccess ? chalk.green(figures.tick) : chalk.red(figures.cross);
|
|
128
|
+
const score = result.evaluation.overallScore;
|
|
129
|
+
const scoreColor = score >= 70 ? chalk.green : score >= 50 ? chalk.yellow : chalk.red;
|
|
130
|
+
console.log(` ${icon} ${chalk.white(truncateText(result.testCase.prompt, 50))} ${scoreColor(score + '/100')}`);
|
|
131
|
+
}
|
|
132
|
+
if (simResults.length > 5) {
|
|
133
|
+
console.log(chalk.dim(` ... and ${simResults.length - 5} more tests`));
|
|
134
|
+
}
|
|
135
|
+
console.log('');
|
|
136
|
+
}
|
|
137
|
+
async function runBrowserSetup(config) {
|
|
138
|
+
let session = null;
|
|
139
|
+
const result = await runStep('Launching browser with WebMCP', async () => {
|
|
140
|
+
session = await createAuditBrowser({
|
|
141
|
+
headless: !config.visible,
|
|
142
|
+
timeout: config.timeout,
|
|
143
|
+
});
|
|
144
|
+
return success('Chromium ready');
|
|
145
|
+
});
|
|
146
|
+
if (result.status === 'error') {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return session;
|
|
150
|
+
}
|
|
151
|
+
async function runPageAuditPhase(session, url, config) {
|
|
152
|
+
let auditResult = null;
|
|
153
|
+
const result = await runStep(`Auditing ${url.hostname}`, async () => {
|
|
154
|
+
auditResult = await runSinglePageAudit({
|
|
155
|
+
context: session.context,
|
|
156
|
+
url: url.href,
|
|
157
|
+
timeout: config.timeout,
|
|
158
|
+
extraWaitMs: 2000,
|
|
159
|
+
});
|
|
160
|
+
if (!auditResult.hasWebMCP) {
|
|
161
|
+
return warning('WebMCP not available');
|
|
162
|
+
}
|
|
163
|
+
if (auditResult.tools.length === 0) {
|
|
164
|
+
return skip('no tools registered');
|
|
165
|
+
}
|
|
166
|
+
return success(`${auditResult.tools.length} tool(s) found`);
|
|
167
|
+
});
|
|
168
|
+
if (result.status === 'error' || !auditResult) {
|
|
169
|
+
throw new Error('no audit result produced');
|
|
170
|
+
}
|
|
171
|
+
return auditResult;
|
|
172
|
+
}
|
|
173
|
+
async function runFindingsAnalysisPhase(findings) {
|
|
174
|
+
await runStep('Evaluating findings', async () => {
|
|
175
|
+
const critical = findings.filter((f) => f.severity === 'critical').length;
|
|
176
|
+
const warn = findings.filter((f) => f.severity === 'warning').length;
|
|
177
|
+
if (critical > 0) {
|
|
178
|
+
return error(`${critical} critical, ${warn} warnings`);
|
|
179
|
+
}
|
|
180
|
+
if (warn > 0) {
|
|
181
|
+
return warning(`${warn} warnings`);
|
|
182
|
+
}
|
|
183
|
+
return success('all checks passed');
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async function runSimulationPhase(config, tools, url, title, hasApiKey) {
|
|
187
|
+
if (config.noSimulation || tools.length === 0) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
if (!hasApiKey) {
|
|
191
|
+
console.log(chalk.dim(` ${figures.line} Skipping agent simulation (no OPENROUTER_API_KEY)`));
|
|
192
|
+
console.log('');
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
printPhaseHeader(3.5, 'Agent Simulation');
|
|
196
|
+
const siteContext = getSiteContext(url, title);
|
|
197
|
+
let simulationResults = null;
|
|
198
|
+
await runStep(`Testing ${tools.length} tool(s) with AI agent`, async () => {
|
|
199
|
+
try {
|
|
200
|
+
simulationResults = await runAgentSimulation(tools, siteContext, config);
|
|
201
|
+
if (!simulationResults) {
|
|
202
|
+
return skip('LLM not available');
|
|
203
|
+
}
|
|
204
|
+
const passRate = Math.round(simulationResults.judgment.passRate * 100);
|
|
205
|
+
if (passRate >= 80) {
|
|
206
|
+
return success(`${passRate}% pass rate`);
|
|
207
|
+
}
|
|
208
|
+
if (passRate >= 50) {
|
|
209
|
+
return warning(`${passRate}% pass rate`);
|
|
210
|
+
}
|
|
211
|
+
return error(`${passRate}% pass rate`);
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
console.warn(chalk.yellow(`\n Simulation error: ${e instanceof Error ? e.message : e}`));
|
|
215
|
+
return skip('simulation failed');
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
return simulationResults;
|
|
219
|
+
}
|
|
220
|
+
async function renderResultsPhase(auditResult, findings, tools, simulationResults, animate) {
|
|
221
|
+
const score = auditResult.score;
|
|
222
|
+
const recommendations = generateRecommendations(findings);
|
|
223
|
+
console.log('');
|
|
224
|
+
if (animate) {
|
|
225
|
+
await animateScoreReveal(score);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
displayScoreStatic(score);
|
|
229
|
+
}
|
|
230
|
+
if (tools.length > 0) {
|
|
231
|
+
printSectionHeader('Detected Tools');
|
|
232
|
+
renderToolsList(tools);
|
|
233
|
+
console.log('');
|
|
234
|
+
}
|
|
235
|
+
if (simulationResults) {
|
|
236
|
+
renderSimulationResults(simulationResults.simResults, simulationResults.judgment);
|
|
237
|
+
}
|
|
238
|
+
if (findings.length > 0) {
|
|
239
|
+
printSectionHeader('Issues Found');
|
|
240
|
+
renderFindingsTable(findings);
|
|
241
|
+
}
|
|
242
|
+
if (recommendations.length > 0) {
|
|
243
|
+
renderRecommendations(recommendations);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function printCiOutcome(score, minScore) {
|
|
247
|
+
if (score.total >= minScore) {
|
|
248
|
+
console.log(chalk.green(`PASS: Score ${score.total}/100 (${score.grade}) >= ${minScore}`));
|
|
249
|
+
return 0;
|
|
250
|
+
}
|
|
251
|
+
console.log(chalk.red(`FAIL: Score ${score.total}/100 (${score.grade}) < ${minScore}`));
|
|
252
|
+
return 1;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Run the audit command
|
|
256
|
+
*/
|
|
257
|
+
export async function runAudit(urlString, options) {
|
|
258
|
+
const startTime = Date.now();
|
|
259
|
+
let config;
|
|
260
|
+
try {
|
|
261
|
+
config = parseAuditCommandOptions(options);
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid audit options'}`));
|
|
265
|
+
return 2;
|
|
266
|
+
}
|
|
267
|
+
const animate = options.animation !== false && !config.ci;
|
|
268
|
+
// Print banner
|
|
269
|
+
if (config.ci) {
|
|
270
|
+
printCompactBanner(version);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
printBanner(version);
|
|
274
|
+
}
|
|
275
|
+
// Validate URL
|
|
276
|
+
let url;
|
|
277
|
+
try {
|
|
278
|
+
url = validateUrl(urlString);
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid URL'}`));
|
|
282
|
+
return 2;
|
|
283
|
+
}
|
|
284
|
+
console.log(chalk.white(` Auditing: ${chalk.cyan(url.href)}`));
|
|
285
|
+
console.log('');
|
|
286
|
+
// Check for API key
|
|
287
|
+
const hasApiKey = Boolean(process.env['OPENROUTER_API_KEY']);
|
|
288
|
+
if (!hasApiKey && !config.noSimulation) {
|
|
289
|
+
console.log(chalk.dim(` ${figures.info} Set OPENROUTER_API_KEY for AI-powered agent simulation`));
|
|
290
|
+
console.log('');
|
|
291
|
+
}
|
|
292
|
+
// ═══════════════════════════════════════════════════════
|
|
293
|
+
// Phase 1: Browser Setup
|
|
294
|
+
// ═══════════════════════════════════════════════════════
|
|
295
|
+
printPhaseHeader(1, 'Browser Setup');
|
|
296
|
+
let browserSession = null;
|
|
297
|
+
try {
|
|
298
|
+
browserSession = await runBrowserSetup(config);
|
|
299
|
+
if (!browserSession) {
|
|
300
|
+
return 2;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
console.error(chalk.red(`Failed to launch browser: ${e instanceof Error ? e.message : e}`));
|
|
305
|
+
return 2;
|
|
306
|
+
}
|
|
307
|
+
let auditResult;
|
|
308
|
+
let simulationResults = null;
|
|
309
|
+
try {
|
|
310
|
+
// ═══════════════════════════════════════════════════════
|
|
311
|
+
// Phase 2: Page Audit + Detection
|
|
312
|
+
// ═══════════════════════════════════════════════════════
|
|
313
|
+
printPhaseHeader(2, 'Page Audit');
|
|
314
|
+
auditResult = await runPageAuditPhase(browserSession, url, config);
|
|
315
|
+
// ═══════════════════════════════════════════════════════
|
|
316
|
+
// Phase 3: Analysis
|
|
317
|
+
// ═══════════════════════════════════════════════════════
|
|
318
|
+
printPhaseHeader(3, 'Analysis');
|
|
319
|
+
const findings = auditResult.findings;
|
|
320
|
+
const allTools = auditResult.tools;
|
|
321
|
+
await runFindingsAnalysisPhase(findings);
|
|
322
|
+
simulationResults = await runSimulationPhase(config, allTools, url, auditResult.title, hasApiKey);
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
console.error(chalk.red(`Audit failed: ${e instanceof Error ? e.message : e}`));
|
|
326
|
+
return 2;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
if (browserSession) {
|
|
330
|
+
await closeBrowser(browserSession.browser);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// ═══════════════════════════════════════════════════════
|
|
334
|
+
// Phase 4: Results
|
|
335
|
+
// ═══════════════════════════════════════════════════════
|
|
336
|
+
printPhaseHeader(4, 'Results');
|
|
337
|
+
await renderResultsPhase(auditResult, auditResult.findings, auditResult.tools, simulationResults, animate);
|
|
338
|
+
// Final summary
|
|
339
|
+
const duration = Date.now() - startTime;
|
|
340
|
+
console.log('');
|
|
341
|
+
console.log(chalk.dim(` Audit completed in ${(duration / 1000).toFixed(1)}s`));
|
|
342
|
+
console.log('');
|
|
343
|
+
// CI mode exit
|
|
344
|
+
if (config.ci) {
|
|
345
|
+
return printCiOutcome(auditResult.score, config.minScore);
|
|
346
|
+
}
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Command
|
|
3
|
+
*
|
|
4
|
+
* Launches full-screen TUI with smart advice
|
|
5
|
+
*/
|
|
6
|
+
interface InteractiveOptions {
|
|
7
|
+
timeout?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function runInteractive(url: string | undefined, options: InteractiveOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Command
|
|
3
|
+
*
|
|
4
|
+
* Launches full-screen TUI with smart advice
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { render } from 'ink';
|
|
8
|
+
import { createElement } from 'react';
|
|
9
|
+
import { RealAuditApp } from '../../ui/ink/RealAuditApp.js';
|
|
10
|
+
import { AdviceService } from '../../llm/advice-service.js';
|
|
11
|
+
import { version } from '../index.js';
|
|
12
|
+
import { parseInteractiveCommandOptions } from '../options/parse-audit-options.js';
|
|
13
|
+
export async function runInteractive(url, options) {
|
|
14
|
+
let parsedOptions;
|
|
15
|
+
try {
|
|
16
|
+
parsedOptions = parseInteractiveCommandOptions(options);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error(chalk.red(`Error: ${e instanceof Error ? e.message : 'Invalid interactive options'}`));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const adviceService = new AdviceService();
|
|
23
|
+
// Launch interactive TUI
|
|
24
|
+
const { waitUntilExit } = render(createElement(RealAuditApp, {
|
|
25
|
+
initialUrl: url,
|
|
26
|
+
adviceService,
|
|
27
|
+
version,
|
|
28
|
+
config: {
|
|
29
|
+
timeout: parsedOptions.timeout,
|
|
30
|
+
}
|
|
31
|
+
}), { exitOnCtrlC: true });
|
|
32
|
+
await waitUntilExit();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/cli/commands/interactive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAMnF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAuB,EACvB,OAA2B;IAE3B,IAAI,aAAkC,CAAC;IACvC,IAAI,CAAC;QACH,aAAa,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QACrG,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,yBAAyB;IACzB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,aAAa,CAAC,YAAY,EAAE;QAC1B,UAAU,EAAE,GAAG;QACf,aAAa;QACb,OAAO;QACP,MAAM,EAAE;YACN,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B;KACF,CAAC,EACF,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Setup
|
|
3
|
+
*
|
|
4
|
+
* Configures Commander.js with all commands.
|
|
5
|
+
*/
|
|
6
|
+
import 'dotenv/config';
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
declare let version: string;
|
|
9
|
+
/**
|
|
10
|
+
* Create and configure the CLI program
|
|
11
|
+
*/
|
|
12
|
+
export declare function createProgram(): Command;
|
|
13
|
+
/**
|
|
14
|
+
* Run the CLI
|
|
15
|
+
*/
|
|
16
|
+
export declare function run(): Promise<void>;
|
|
17
|
+
export { version };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Setup
|
|
3
|
+
*
|
|
4
|
+
* Configures Commander.js with all commands.
|
|
5
|
+
*/
|
|
6
|
+
// Load environment variables first
|
|
7
|
+
import 'dotenv/config';
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { dirname, join } from 'path';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
// Get package.json for version
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
let version = '0.1.0';
|
|
17
|
+
try {
|
|
18
|
+
const pkgPath = join(__dirname, '..', '..', 'package.json');
|
|
19
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
20
|
+
version = pkg.version;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Ignore errors reading package.json
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create and configure the CLI program
|
|
27
|
+
*/
|
|
28
|
+
export function createProgram() {
|
|
29
|
+
const program = new Command();
|
|
30
|
+
program
|
|
31
|
+
.name('webmcp')
|
|
32
|
+
.description(chalk.cyan('Audit any website for AI agent readiness (WebMCP)'))
|
|
33
|
+
.version(version, '-v, --version')
|
|
34
|
+
.option('--debug', 'Enable debug logging');
|
|
35
|
+
// ═══════════════════════════════════════════════════════
|
|
36
|
+
// COMMAND: audit
|
|
37
|
+
// ═══════════════════════════════════════════════════════
|
|
38
|
+
program
|
|
39
|
+
.command('audit')
|
|
40
|
+
.description('Run a full WebMCP audit on a website')
|
|
41
|
+
.argument('<url>', 'The URL to audit')
|
|
42
|
+
.option('-t, --timeout <ms>', 'Per-page timeout in milliseconds', '30000')
|
|
43
|
+
.option('--visible', 'Run browser in visible mode (for debugging)')
|
|
44
|
+
.option('--no-animation', 'Disable score animation')
|
|
45
|
+
.option('--ci', 'CI mode: exit with code 1 if score below threshold')
|
|
46
|
+
.option('--min-score <number>', 'Minimum score for CI mode', '60')
|
|
47
|
+
// LLM / Simulation options
|
|
48
|
+
.option('--model <model>', 'LLM model to use (e.g., anthropic/claude-sonnet-4)')
|
|
49
|
+
.option('--no-simulation', 'Skip agent simulation tests')
|
|
50
|
+
.option('--prompts-per-tool <number>', 'Test prompts per tool', '10')
|
|
51
|
+
.option('--max-rounds <number>', 'Max conversation rounds', '5')
|
|
52
|
+
.option('--max-cost <dollars>', 'Max cost in USD', '2.00')
|
|
53
|
+
.action(async (url, options) => {
|
|
54
|
+
// Dynamic import to keep startup fast
|
|
55
|
+
const { runAudit } = await import('./commands/audit.js');
|
|
56
|
+
const exitCode = await runAudit(url, options);
|
|
57
|
+
if (exitCode !== 0) {
|
|
58
|
+
process.exitCode = exitCode;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// ═══════════════════════════════════════════════════════
|
|
62
|
+
// COMMAND: interactive (full-screen TUI)
|
|
63
|
+
// ═══════════════════════════════════════════════════════
|
|
64
|
+
program
|
|
65
|
+
.command('interactive')
|
|
66
|
+
.alias('i')
|
|
67
|
+
.description('Launch interactive TUI with smart AI advice')
|
|
68
|
+
.argument('[url]', 'Optional URL to audit immediately')
|
|
69
|
+
.option('-t, --timeout <ms>', 'Per-page timeout in milliseconds', '30000')
|
|
70
|
+
.action(async (url, options) => {
|
|
71
|
+
const { runInteractive } = await import('./commands/interactive.js');
|
|
72
|
+
await runInteractive(url, options);
|
|
73
|
+
});
|
|
74
|
+
return program;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Run the CLI
|
|
78
|
+
*/
|
|
79
|
+
export async function run() {
|
|
80
|
+
const program = createProgram();
|
|
81
|
+
await program.parseAsync(process.argv);
|
|
82
|
+
}
|
|
83
|
+
export { version };
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CLI option parsing and validation for audit flows.
|
|
3
|
+
*/
|
|
4
|
+
import type { AuditConfig, AuditOptions } from '../../core/types/audit.js';
|
|
5
|
+
export interface InteractiveCommandOptions {
|
|
6
|
+
timeout?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface InteractiveCommandConfig {
|
|
9
|
+
timeout: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseAuditCommandOptions(options: AuditOptions): AuditConfig;
|
|
12
|
+
export declare function parseInteractiveCommandOptions(options: InteractiveCommandOptions): InteractiveCommandConfig;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CLI option parsing and validation for audit flows.
|
|
3
|
+
*/
|
|
4
|
+
import { DEFAULT_AUDIT_CONFIG } from '../../core/constants.js';
|
|
5
|
+
function parseIntegerOption(name, value, fallback, minimum) {
|
|
6
|
+
const raw = value ?? String(fallback);
|
|
7
|
+
const parsed = Number.parseInt(raw, 10);
|
|
8
|
+
if (!Number.isFinite(parsed) || parsed < minimum) {
|
|
9
|
+
throw new Error(`Invalid --${name}: "${raw}" (must be an integer >= ${minimum})`);
|
|
10
|
+
}
|
|
11
|
+
return parsed;
|
|
12
|
+
}
|
|
13
|
+
function parseNumberOption(name, value, fallback, minimum) {
|
|
14
|
+
const raw = value ?? String(fallback);
|
|
15
|
+
const parsed = Number.parseFloat(raw);
|
|
16
|
+
if (!Number.isFinite(parsed) || parsed < minimum) {
|
|
17
|
+
throw new Error(`Invalid --${name}: "${raw}" (must be a number >= ${minimum})`);
|
|
18
|
+
}
|
|
19
|
+
return parsed;
|
|
20
|
+
}
|
|
21
|
+
function parseEnvInteger(envName, fallback, minimum) {
|
|
22
|
+
const raw = process.env[envName];
|
|
23
|
+
if (raw == null || raw === '') {
|
|
24
|
+
return fallback;
|
|
25
|
+
}
|
|
26
|
+
const parsed = Number.parseInt(raw, 10);
|
|
27
|
+
if (!Number.isFinite(parsed) || parsed < minimum) {
|
|
28
|
+
throw new Error(`Invalid ${envName}: "${raw}" (must be an integer >= ${minimum})`);
|
|
29
|
+
}
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
function parseEnvNumber(envName, fallback, minimum) {
|
|
33
|
+
const raw = process.env[envName];
|
|
34
|
+
if (raw == null || raw === '') {
|
|
35
|
+
return fallback;
|
|
36
|
+
}
|
|
37
|
+
const parsed = Number.parseFloat(raw);
|
|
38
|
+
if (!Number.isFinite(parsed) || parsed < minimum) {
|
|
39
|
+
throw new Error(`Invalid ${envName}: "${raw}" (must be a number >= ${minimum})`);
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
export function parseAuditCommandOptions(options) {
|
|
44
|
+
const promptsPerToolDefault = parseEnvInteger('WEBMCP_PROMPTS_PER_TOOL', DEFAULT_AUDIT_CONFIG.promptsPerTool, 1);
|
|
45
|
+
const maxRoundsDefault = parseEnvInteger('WEBMCP_MAX_ROUNDS', DEFAULT_AUDIT_CONFIG.maxRounds, 1);
|
|
46
|
+
const maxCostDefault = parseEnvNumber('WEBMCP_MAX_COST', DEFAULT_AUDIT_CONFIG.maxCost, 0);
|
|
47
|
+
return {
|
|
48
|
+
timeout: parseIntegerOption('timeout', options.timeout, DEFAULT_AUDIT_CONFIG.timeout, 1000),
|
|
49
|
+
visible: options.visible ?? DEFAULT_AUDIT_CONFIG.visible,
|
|
50
|
+
noSimulation: options.noSimulation ?? DEFAULT_AUDIT_CONFIG.noSimulation,
|
|
51
|
+
model: options.model,
|
|
52
|
+
ci: options.ci ?? DEFAULT_AUDIT_CONFIG.ci,
|
|
53
|
+
minScore: parseIntegerOption('min-score', options.minScore, DEFAULT_AUDIT_CONFIG.minScore, 0),
|
|
54
|
+
promptsPerTool: parseIntegerOption('prompts-per-tool', options.promptsPerTool, promptsPerToolDefault, 1),
|
|
55
|
+
maxRounds: parseIntegerOption('max-rounds', options.maxRounds, maxRoundsDefault, 1),
|
|
56
|
+
maxCost: parseNumberOption('max-cost', options.maxCost, maxCostDefault, 0),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function parseInteractiveCommandOptions(options) {
|
|
60
|
+
return {
|
|
61
|
+
timeout: parseIntegerOption('timeout', options.timeout, DEFAULT_AUDIT_CONFIG.timeout, 1000),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parse-audit-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-audit-options.js","sourceRoot":"","sources":["../../../src/cli/options/parse-audit-options.ts"],"names":[],"mappings":"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"}
|