afterburn-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/dist/ai/gemini-client.d.ts +21 -0
  4. package/dist/ai/gemini-client.js +105 -0
  5. package/dist/ai/gemini-client.js.map +1 -0
  6. package/dist/ai/index.d.ts +1 -0
  7. package/dist/ai/index.js +3 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/analysis/diagnosis-schema.d.ts +106 -0
  10. package/dist/analysis/diagnosis-schema.js +54 -0
  11. package/dist/analysis/diagnosis-schema.js.map +1 -0
  12. package/dist/analysis/error-analyzer.d.ts +9 -0
  13. package/dist/analysis/error-analyzer.js +573 -0
  14. package/dist/analysis/error-analyzer.js.map +1 -0
  15. package/dist/analysis/index.d.ts +4 -0
  16. package/dist/analysis/index.js +6 -0
  17. package/dist/analysis/index.js.map +1 -0
  18. package/dist/analysis/source-mapper.d.ts +19 -0
  19. package/dist/analysis/source-mapper.js +329 -0
  20. package/dist/analysis/source-mapper.js.map +1 -0
  21. package/dist/analysis/ui-auditor.d.ts +9 -0
  22. package/dist/analysis/ui-auditor.js +104 -0
  23. package/dist/analysis/ui-auditor.js.map +1 -0
  24. package/dist/artifacts/artifact-storage.d.ts +44 -0
  25. package/dist/artifacts/artifact-storage.js +99 -0
  26. package/dist/artifacts/artifact-storage.js.map +1 -0
  27. package/dist/artifacts/index.d.ts +1 -0
  28. package/dist/artifacts/index.js +3 -0
  29. package/dist/artifacts/index.js.map +1 -0
  30. package/dist/browser/browser-manager.d.ts +45 -0
  31. package/dist/browser/browser-manager.js +88 -0
  32. package/dist/browser/browser-manager.js.map +1 -0
  33. package/dist/browser/challenge-detector.d.ts +10 -0
  34. package/dist/browser/challenge-detector.js +58 -0
  35. package/dist/browser/challenge-detector.js.map +1 -0
  36. package/dist/browser/cookie-dismisser.d.ts +18 -0
  37. package/dist/browser/cookie-dismisser.js +76 -0
  38. package/dist/browser/cookie-dismisser.js.map +1 -0
  39. package/dist/browser/index.d.ts +4 -0
  40. package/dist/browser/index.js +6 -0
  41. package/dist/browser/index.js.map +1 -0
  42. package/dist/browser/stealth-browser.d.ts +13 -0
  43. package/dist/browser/stealth-browser.js +59 -0
  44. package/dist/browser/stealth-browser.js.map +1 -0
  45. package/dist/cli/commander-cli.d.ts +2 -0
  46. package/dist/cli/commander-cli.js +150 -0
  47. package/dist/cli/commander-cli.js.map +1 -0
  48. package/dist/cli/doctor.d.ts +34 -0
  49. package/dist/cli/doctor.js +124 -0
  50. package/dist/cli/doctor.js.map +1 -0
  51. package/dist/cli/first-run.d.ts +6 -0
  52. package/dist/cli/first-run.js +58 -0
  53. package/dist/cli/first-run.js.map +1 -0
  54. package/dist/cli/index.d.ts +3 -0
  55. package/dist/cli/index.js +5 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/progress.d.ts +11 -0
  58. package/dist/cli/progress.js +30 -0
  59. package/dist/cli/progress.js.map +1 -0
  60. package/dist/core/engine.d.ts +33 -0
  61. package/dist/core/engine.js +269 -0
  62. package/dist/core/engine.js.map +1 -0
  63. package/dist/core/index.d.ts +3 -0
  64. package/dist/core/index.js +4 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/validation.d.ts +52 -0
  67. package/dist/core/validation.js +228 -0
  68. package/dist/core/validation.js.map +1 -0
  69. package/dist/discovery/crawler.d.ts +58 -0
  70. package/dist/discovery/crawler.js +240 -0
  71. package/dist/discovery/crawler.js.map +1 -0
  72. package/dist/discovery/discovery-pipeline.d.ts +22 -0
  73. package/dist/discovery/discovery-pipeline.js +256 -0
  74. package/dist/discovery/discovery-pipeline.js.map +1 -0
  75. package/dist/discovery/element-mapper.d.ts +21 -0
  76. package/dist/discovery/element-mapper.js +422 -0
  77. package/dist/discovery/element-mapper.js.map +1 -0
  78. package/dist/discovery/index.d.ts +8 -0
  79. package/dist/discovery/index.js +8 -0
  80. package/dist/discovery/index.js.map +1 -0
  81. package/dist/discovery/link-validator.d.ts +15 -0
  82. package/dist/discovery/link-validator.js +137 -0
  83. package/dist/discovery/link-validator.js.map +1 -0
  84. package/dist/discovery/sitemap-builder.d.ts +19 -0
  85. package/dist/discovery/sitemap-builder.js +166 -0
  86. package/dist/discovery/sitemap-builder.js.map +1 -0
  87. package/dist/discovery/spa-detector.d.ts +12 -0
  88. package/dist/discovery/spa-detector.js +271 -0
  89. package/dist/discovery/spa-detector.js.map +1 -0
  90. package/dist/execution/error-detector.d.ts +10 -0
  91. package/dist/execution/error-detector.js +87 -0
  92. package/dist/execution/error-detector.js.map +1 -0
  93. package/dist/execution/evidence-capture.d.ts +8 -0
  94. package/dist/execution/evidence-capture.js +37 -0
  95. package/dist/execution/evidence-capture.js.map +1 -0
  96. package/dist/execution/index.d.ts +5 -0
  97. package/dist/execution/index.js +7 -0
  98. package/dist/execution/index.js.map +1 -0
  99. package/dist/execution/step-handlers.d.ts +48 -0
  100. package/dist/execution/step-handlers.js +349 -0
  101. package/dist/execution/step-handlers.js.map +1 -0
  102. package/dist/execution/test-data.d.ts +50 -0
  103. package/dist/execution/test-data.js +160 -0
  104. package/dist/execution/test-data.js.map +1 -0
  105. package/dist/execution/workflow-executor.d.ts +56 -0
  106. package/dist/execution/workflow-executor.js +331 -0
  107. package/dist/execution/workflow-executor.js.map +1 -0
  108. package/dist/index.d.ts +2 -0
  109. package/dist/index.js +5 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/mcp/entry.d.ts +2 -0
  112. package/dist/mcp/entry.js +5 -0
  113. package/dist/mcp/entry.js.map +1 -0
  114. package/dist/mcp/index.d.ts +2 -0
  115. package/dist/mcp/index.js +4 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/server.d.ts +3 -0
  118. package/dist/mcp/server.js +19 -0
  119. package/dist/mcp/server.js.map +1 -0
  120. package/dist/mcp/tools.d.ts +2 -0
  121. package/dist/mcp/tools.js +162 -0
  122. package/dist/mcp/tools.js.map +1 -0
  123. package/dist/planning/heuristic-planner.d.ts +7 -0
  124. package/dist/planning/heuristic-planner.js +238 -0
  125. package/dist/planning/heuristic-planner.js.map +1 -0
  126. package/dist/planning/index.d.ts +3 -0
  127. package/dist/planning/index.js +5 -0
  128. package/dist/planning/index.js.map +1 -0
  129. package/dist/planning/plan-schema.d.ts +74 -0
  130. package/dist/planning/plan-schema.js +39 -0
  131. package/dist/planning/plan-schema.js.map +1 -0
  132. package/dist/planning/workflow-planner.d.ts +39 -0
  133. package/dist/planning/workflow-planner.js +211 -0
  134. package/dist/planning/workflow-planner.js.map +1 -0
  135. package/dist/reports/health-scorer.d.ts +14 -0
  136. package/dist/reports/health-scorer.js +88 -0
  137. package/dist/reports/health-scorer.js.map +1 -0
  138. package/dist/reports/html-generator.d.ts +10 -0
  139. package/dist/reports/html-generator.js +155 -0
  140. package/dist/reports/html-generator.js.map +1 -0
  141. package/dist/reports/index.d.ts +4 -0
  142. package/dist/reports/index.js +6 -0
  143. package/dist/reports/index.js.map +1 -0
  144. package/dist/reports/markdown-generator.d.ts +10 -0
  145. package/dist/reports/markdown-generator.js +334 -0
  146. package/dist/reports/markdown-generator.js.map +1 -0
  147. package/dist/reports/priority-ranker.d.ts +22 -0
  148. package/dist/reports/priority-ranker.js +608 -0
  149. package/dist/reports/priority-ranker.js.map +1 -0
  150. package/dist/screenshots/dual-format.d.ts +14 -0
  151. package/dist/screenshots/dual-format.js +59 -0
  152. package/dist/screenshots/dual-format.js.map +1 -0
  153. package/dist/screenshots/index.d.ts +2 -0
  154. package/dist/screenshots/index.js +4 -0
  155. package/dist/screenshots/index.js.map +1 -0
  156. package/dist/screenshots/screenshot-manager.d.ts +33 -0
  157. package/dist/screenshots/screenshot-manager.js +86 -0
  158. package/dist/screenshots/screenshot-manager.js.map +1 -0
  159. package/dist/testing/accessibility-auditor.d.ts +23 -0
  160. package/dist/testing/accessibility-auditor.js +44 -0
  161. package/dist/testing/accessibility-auditor.js.map +1 -0
  162. package/dist/testing/index.d.ts +4 -0
  163. package/dist/testing/index.js +5 -0
  164. package/dist/testing/index.js.map +1 -0
  165. package/dist/testing/meta-auditor.d.ts +16 -0
  166. package/dist/testing/meta-auditor.js +268 -0
  167. package/dist/testing/meta-auditor.js.map +1 -0
  168. package/dist/testing/performance-monitor.d.ts +15 -0
  169. package/dist/testing/performance-monitor.js +64 -0
  170. package/dist/testing/performance-monitor.js.map +1 -0
  171. package/dist/types/artifacts.d.ts +58 -0
  172. package/dist/types/artifacts.js +3 -0
  173. package/dist/types/artifacts.js.map +1 -0
  174. package/dist/types/discovery.d.ts +124 -0
  175. package/dist/types/discovery.js +3 -0
  176. package/dist/types/discovery.js.map +1 -0
  177. package/dist/types/execution.d.ts +154 -0
  178. package/dist/types/execution.js +3 -0
  179. package/dist/types/execution.js.map +1 -0
  180. package/dist/types/index.d.ts +2 -0
  181. package/dist/types/index.js +4 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/dist/utils/sanitizer.d.ts +25 -0
  184. package/dist/utils/sanitizer.js +98 -0
  185. package/dist/utils/sanitizer.js.map +1 -0
  186. package/package.json +86 -0
  187. package/templates/report.hbs +202 -0
  188. package/templates/styles/report.css +607 -0
@@ -0,0 +1,256 @@
1
+ // Discovery pipeline orchestrator: crawl + elements + SPA + links + sitemap + workflows
2
+ import { SiteCrawler } from './crawler.js';
3
+ import { detectSPAFramework, interceptRouteChanges } from './spa-detector.js';
4
+ import { discoverElements, discoverHiddenElements } from './element-mapper.js';
5
+ import { validateLinks, createLinkValidationState } from './link-validator.js';
6
+ import { buildSitemap, printSitemapTree } from './sitemap-builder.js';
7
+ import { WorkflowPlanner } from '../planning/index.js';
8
+ import { generateHeuristicPlans } from '../planning/heuristic-planner.js';
9
+ import { GeminiClient } from '../ai/index.js';
10
+ import { BrowserManager } from '../browser/index.js';
11
+ import { ScreenshotManager } from '../screenshots/index.js';
12
+ import { ArtifactStorage } from '../artifacts/index.js';
13
+ export async function resolveWorkflowPlans(planPromise, sitemap) {
14
+ if (!planPromise) {
15
+ return {
16
+ workflowPlans: generateHeuristicPlans(sitemap),
17
+ usedHeuristicFallback: true,
18
+ };
19
+ }
20
+ try {
21
+ const workflowPlans = await planPromise;
22
+ return {
23
+ workflowPlans,
24
+ usedHeuristicFallback: false,
25
+ };
26
+ }
27
+ catch {
28
+ return {
29
+ workflowPlans: generateHeuristicPlans(sitemap),
30
+ usedHeuristicFallback: true,
31
+ };
32
+ }
33
+ }
34
+ /**
35
+ * Runs complete Phase 2 discovery pipeline: crawl, discover elements, detect SPA,
36
+ * validate links, build sitemap, generate workflow plans.
37
+ *
38
+ * @param options Discovery configuration
39
+ * @returns Complete discovery artifact with sitemap and workflow plans
40
+ */
41
+ export async function runDiscovery(options) {
42
+ const { targetUrl, sessionId, userHints = [], maxPages = 10, headless = true, onProgress = (msg) => console.log(msg) } = options;
43
+ // Step 1: Initialize managers
44
+ const browserManager = new BrowserManager({ headless });
45
+ const screenshotManager = new ScreenshotManager();
46
+ const artifactStorage = new ArtifactStorage();
47
+ let spaFramework = { framework: 'none' };
48
+ let spaRoutes = [];
49
+ const allBrokenLinks = [];
50
+ const linkValidationState = createLinkValidationState();
51
+ try {
52
+ // Step 2: Launch browser
53
+ onProgress('Launching browser...');
54
+ await browserManager.launch();
55
+ // Block heavy resources during discovery (images, fonts, video, analytics)
56
+ // Keep SVG — icon-only buttons need them for element discovery
57
+ const ctx = browserManager.getContext();
58
+ if (ctx) {
59
+ await ctx.route('**/*.{png,jpg,jpeg,gif,webp,woff,woff2,ttf,mp4,mp3}', r => r.abort());
60
+ await ctx.route('**/analytics**', r => r.abort());
61
+ await ctx.route('**/gtag**', r => r.abort());
62
+ }
63
+ // Step 3: SPA Detection (first page only)
64
+ onProgress(`Detecting SPA framework on ${targetUrl}...`);
65
+ const spaDetectionPage = await browserManager.newPage(targetUrl, { networkIdleTimeout: 5000 });
66
+ try {
67
+ // Detect framework
68
+ spaFramework = await detectSPAFramework(spaDetectionPage);
69
+ if (spaFramework.framework !== 'none') {
70
+ onProgress(`Detected ${spaFramework.framework} app${spaFramework.version ? ' v' + spaFramework.version : ''}`);
71
+ // Intercept routes if SPA detected
72
+ onProgress('Discovering client-side routes...');
73
+ spaRoutes = await interceptRouteChanges(spaDetectionPage);
74
+ if (spaRoutes.length > 0) {
75
+ onProgress(`Found ${spaRoutes.length} client-side routes`);
76
+ }
77
+ }
78
+ else {
79
+ onProgress('No SPA framework detected');
80
+ }
81
+ }
82
+ finally {
83
+ await spaDetectionPage.close();
84
+ }
85
+ // Step 4: Define pageProcessor callback
86
+ // This is called by the crawler for each page BEFORE it closes the page
87
+ let pageIndex = 0;
88
+ const pageProcessor = async (page, url) => {
89
+ pageIndex++;
90
+ try {
91
+ // Discover visible elements
92
+ const visibleElements = await discoverElements(page, url);
93
+ // Discover hidden elements (modals, dropdowns)
94
+ const hiddenElements = await discoverHiddenElements(page, url);
95
+ // Merge visible + hidden (deduplicate by selector/href)
96
+ const mergedElements = {
97
+ forms: [...visibleElements.forms],
98
+ buttons: [...visibleElements.buttons],
99
+ links: [...visibleElements.links],
100
+ menus: [...visibleElements.menus],
101
+ otherInteractive: [...visibleElements.otherInteractive],
102
+ };
103
+ // Merge hidden forms
104
+ for (const form of hiddenElements.forms) {
105
+ if (!mergedElements.forms.some(f => f.selector === form.selector)) {
106
+ mergedElements.forms.push(form);
107
+ }
108
+ }
109
+ // Merge hidden buttons
110
+ for (const button of hiddenElements.buttons) {
111
+ if (!mergedElements.buttons.some(b => b.selector === button.selector)) {
112
+ mergedElements.buttons.push(button);
113
+ }
114
+ }
115
+ // Merge hidden links
116
+ for (const link of hiddenElements.links) {
117
+ if (!mergedElements.links.some(l => l.href === link.href)) {
118
+ mergedElements.links.push(link);
119
+ }
120
+ }
121
+ // Merge hidden menus
122
+ for (const menu of hiddenElements.menus) {
123
+ if (!mergedElements.menus.some(m => m.selector === menu.selector)) {
124
+ mergedElements.menus.push(menu);
125
+ }
126
+ }
127
+ // Merge other interactive
128
+ for (const other of hiddenElements.otherInteractive) {
129
+ if (!mergedElements.otherInteractive.some(o => o.selector === other.selector)) {
130
+ mergedElements.otherInteractive.push(other);
131
+ }
132
+ }
133
+ // Capture screenshot
134
+ const screenshotRef = await screenshotManager.capture(page, `page-${pageIndex}`);
135
+ // Validate links
136
+ const brokenLinksOnPage = await validateLinks(mergedElements.links, page, linkValidationState);
137
+ allBrokenLinks.push(...brokenLinksOnPage);
138
+ // Report progress
139
+ onProgress(` Crawled: ${url} (${pageIndex} pages found)`);
140
+ // Return partial PageData to merge with crawler's base data
141
+ return {
142
+ forms: mergedElements.forms,
143
+ buttons: mergedElements.buttons,
144
+ menus: mergedElements.menus,
145
+ otherInteractive: mergedElements.otherInteractive,
146
+ screenshotRef,
147
+ spaFramework,
148
+ };
149
+ }
150
+ catch (error) {
151
+ // Log warning but continue crawl
152
+ console.warn(`Warning: Failed to process page ${url}:`, error instanceof Error ? error.message : String(error));
153
+ return {
154
+ forms: [],
155
+ buttons: [],
156
+ menus: [],
157
+ otherInteractive: [],
158
+ };
159
+ }
160
+ };
161
+ // Step 5: Construct SiteCrawler with pageProcessor and additionalUrls
162
+ const crawlerOptions = {
163
+ maxPages,
164
+ onPageCrawled: (url, count) => {
165
+ // Progress already handled in pageProcessor
166
+ },
167
+ pageProcessor,
168
+ additionalUrls: spaRoutes,
169
+ };
170
+ const crawler = new SiteCrawler(browserManager, crawlerOptions);
171
+ // Step 6: Run crawler
172
+ onProgress('Starting site crawl...');
173
+ const crawlResult = await crawler.crawl(targetUrl, spaRoutes);
174
+ // Update crawl result with our collected data
175
+ crawlResult.brokenLinks = allBrokenLinks;
176
+ crawlResult.totalLinksChecked = linkValidationState.checkedCount;
177
+ crawlResult.spaDetected = spaFramework;
178
+ onProgress(`Crawl complete: ${crawlResult.totalPagesDiscovered} pages discovered`);
179
+ // Step 7: Build sitemap
180
+ onProgress('Building sitemap...');
181
+ const sitemap = buildSitemap(crawlResult.pages, targetUrl);
182
+ console.log('\nSite Map:');
183
+ console.log(printSitemapTree(sitemap));
184
+ // Step 8: Generate workflow plans (overlapped with browser cleanup)
185
+ let workflowPlans = [];
186
+ // Check if GEMINI_API_KEY is set
187
+ const geminiApiKey = process.env.GEMINI_API_KEY;
188
+ // Fire off planning as a non-blocking promise (doesn't need browser)
189
+ let planPromise = null;
190
+ if (geminiApiKey) {
191
+ onProgress('Generating workflow plans with AI...');
192
+ const geminiClient = new GeminiClient(geminiApiKey);
193
+ const workflowPlanner = new WorkflowPlanner(geminiClient);
194
+ planPromise = workflowPlanner.generatePlans(sitemap, userHints);
195
+ }
196
+ // Meanwhile, close browser (planning doesn't need it)
197
+ onProgress('Closing browser...');
198
+ await browserManager.close();
199
+ // Now await planning result (or generate heuristic plans)
200
+ const { workflowPlans: resolvedPlans, usedHeuristicFallback } = await resolveWorkflowPlans(planPromise, sitemap);
201
+ workflowPlans = resolvedPlans;
202
+ if (usedHeuristicFallback) {
203
+ if (planPromise) {
204
+ console.warn('\nAI planning failed - using heuristic test plans');
205
+ }
206
+ else {
207
+ console.warn('\nUsing heuristic test plans (set GEMINI_API_KEY for smarter AI-driven testing)');
208
+ }
209
+ if (workflowPlans.length > 0) {
210
+ console.log('\nDiscovered Workflows (heuristic):');
211
+ workflowPlans.forEach((plan, index) => {
212
+ console.log(` ${index + 1}. ${plan.workflowName} (${plan.priority}) - ${plan.steps.length} steps`);
213
+ });
214
+ }
215
+ }
216
+ else if (workflowPlans.length > 0) {
217
+ console.log('\nDiscovered Workflows:');
218
+ workflowPlans.forEach((plan, index) => {
219
+ console.log(` ${index + 1}. ${plan.workflowName} (${plan.priority}) - ${plan.steps.length} steps`);
220
+ });
221
+ }
222
+ else {
223
+ console.log('\nNo workflows generated');
224
+ }
225
+ // Step 9: Save discovery artifact (after plans are ready)
226
+ const artifact = {
227
+ version: '1.0',
228
+ stage: 'discovery',
229
+ timestamp: new Date().toISOString(),
230
+ sessionId,
231
+ targetUrl,
232
+ sitemap,
233
+ crawlResult,
234
+ workflowPlans,
235
+ userHints,
236
+ };
237
+ onProgress('Saving discovery artifact...');
238
+ await artifactStorage.save(artifact);
239
+ // Step 10: Return artifact
240
+ return artifact;
241
+ }
242
+ catch (error) {
243
+ console.error('Discovery pipeline failed:', error instanceof Error ? error.message : String(error));
244
+ throw error;
245
+ }
246
+ finally {
247
+ // Always close browser even on error
248
+ try {
249
+ await browserManager.close();
250
+ }
251
+ catch {
252
+ // Ignore cleanup errors
253
+ }
254
+ }
255
+ }
256
+ //# sourceMappingURL=discovery-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-pipeline.js","sourceRoot":"","sources":["../../src/discovery/discovery-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Page } from 'playwright';
2
+ import type { FormInfo, InteractiveElement, LinkInfo } from '../types/discovery.js';
3
+ /**
4
+ * Container for all discovered interactive elements on a page
5
+ */
6
+ export interface DiscoveredElements {
7
+ forms: FormInfo[];
8
+ buttons: InteractiveElement[];
9
+ links: LinkInfo[];
10
+ menus: InteractiveElement[];
11
+ otherInteractive: InteractiveElement[];
12
+ }
13
+ /**
14
+ * Discover all visible interactive elements on a page
15
+ */
16
+ export declare function discoverElements(page: Page, pageUrl: string): Promise<DiscoveredElements>;
17
+ /**
18
+ * Discover hidden elements by triggering interactions (buttons, menus, modals)
19
+ * Returns only NEWLY discovered elements (not present in initial page load)
20
+ */
21
+ export declare function discoverHiddenElements(page: Page, pageUrl: string): Promise<DiscoveredElements>;