explorbot 0.0.1 → 0.0.5

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 (423) hide show
  1. package/README.md +80 -26
  2. package/bin/explorbot-cli.ts +679 -0
  3. package/boat/api-tester/src/ai/chief/styles.ts +15 -0
  4. package/boat/api-tester/src/ai/chief.ts +335 -0
  5. package/boat/api-tester/src/ai/curler-tools.ts +278 -0
  6. package/boat/api-tester/src/ai/curler.ts +306 -0
  7. package/boat/api-tester/src/api-client.ts +28 -0
  8. package/boat/api-tester/src/apibot.ts +203 -0
  9. package/boat/api-tester/src/cli.ts +301 -0
  10. package/boat/api-tester/src/config.ts +190 -0
  11. package/dist/bin/explorbot-cli.js +19 -98
  12. package/dist/boat/api-tester/bin/apibot-cli.js +0 -1
  13. package/dist/boat/api-tester/src/ai/chief/styles.js +0 -1
  14. package/dist/boat/api-tester/src/ai/chief.js +0 -1
  15. package/dist/boat/api-tester/src/ai/curler-tools.js +0 -1
  16. package/dist/boat/api-tester/src/ai/curler.js +0 -1
  17. package/dist/boat/api-tester/src/api-client.js +0 -1
  18. package/dist/boat/api-tester/src/apibot.js +0 -1
  19. package/dist/boat/api-tester/src/cli.js +0 -1
  20. package/dist/boat/api-tester/src/config.js +0 -1
  21. package/dist/src/action-result.js +0 -1
  22. package/dist/src/action.js +0 -1
  23. package/dist/src/activity.js +0 -1
  24. package/dist/src/ai/agent.js +0 -1
  25. package/dist/src/ai/bosun.js +0 -1
  26. package/dist/src/ai/captain/idle-mode.js +0 -1
  27. package/dist/src/ai/captain/mixin.js +0 -1
  28. package/dist/src/ai/captain/test-mode.js +0 -1
  29. package/dist/src/ai/captain/web-mode.js +0 -1
  30. package/dist/src/ai/captain.js +0 -1
  31. package/dist/src/ai/conversation.js +0 -1
  32. package/dist/src/ai/experience-compactor.js +0 -1
  33. package/dist/src/ai/fisherman-tools.js +0 -1
  34. package/dist/src/ai/fisherman.js +0 -1
  35. package/dist/src/ai/historian.js +0 -1
  36. package/dist/src/ai/navigator.js +0 -1
  37. package/dist/src/ai/pilot.js +0 -1
  38. package/dist/src/ai/planner/session-dedup.js +0 -1
  39. package/dist/src/ai/planner/styles.js +0 -1
  40. package/dist/src/ai/planner/subpages.js +0 -1
  41. package/dist/src/ai/planner.js +0 -1
  42. package/dist/src/ai/provider.js +0 -1
  43. package/dist/src/ai/quartermaster.js +0 -1
  44. package/dist/src/ai/researcher/cache.js +0 -1
  45. package/dist/src/ai/researcher/coordinates.js +0 -1
  46. package/dist/src/ai/researcher/deep-analysis.js +0 -1
  47. package/dist/src/ai/researcher/fingerprint-worker.js +0 -1
  48. package/dist/src/ai/researcher/focus.js +0 -1
  49. package/dist/src/ai/researcher/locators.js +0 -1
  50. package/dist/src/ai/researcher/mixin.js +0 -1
  51. package/dist/src/ai/researcher/parser.js +0 -1
  52. package/dist/src/ai/researcher/research-result.js +0 -1
  53. package/dist/src/ai/researcher.js +0 -1
  54. package/dist/src/ai/rules.js +0 -1
  55. package/dist/src/ai/task-agent.js +0 -1
  56. package/dist/src/ai/tester.js +0 -1
  57. package/dist/src/ai/tools.js +0 -1
  58. package/dist/src/api/api-client.js +0 -1
  59. package/dist/src/api/request-result.js +0 -1
  60. package/dist/src/api/request-store.js +0 -1
  61. package/dist/src/api/spec-reader.js +0 -1
  62. package/dist/src/api/xhr-capture.js +0 -1
  63. package/dist/src/browser-server.js +0 -1
  64. package/dist/src/command-handler.js +0 -1
  65. package/dist/src/commands/add-rule-command.js +0 -1
  66. package/dist/src/commands/base-command.js +0 -1
  67. package/dist/src/commands/clean-command.js +0 -1
  68. package/dist/src/commands/context-aria-command.js +0 -1
  69. package/dist/src/commands/context-command.js +0 -1
  70. package/dist/src/commands/context-data-command.js +0 -1
  71. package/dist/src/commands/context-experience-command.js +0 -1
  72. package/dist/src/commands/context-html-command.js +0 -1
  73. package/dist/src/commands/context-knowledge-command.js +0 -1
  74. package/dist/src/commands/debug-command.js +0 -1
  75. package/dist/src/commands/drill-command.js +0 -1
  76. package/dist/src/commands/exit-command.js +0 -1
  77. package/dist/src/commands/explore-command.js +2 -2
  78. package/dist/src/commands/freesail-command.js +0 -1
  79. package/dist/src/commands/help-command.js +0 -1
  80. package/dist/src/commands/index.js +0 -1
  81. package/dist/src/commands/init-command.js +115 -0
  82. package/dist/src/commands/knows-command.js +0 -1
  83. package/dist/src/commands/learn-command.js +0 -1
  84. package/dist/src/commands/navigate-command.js +0 -1
  85. package/dist/src/commands/path-command.js +0 -1
  86. package/dist/src/commands/plan-clear-command.js +0 -1
  87. package/dist/src/commands/plan-command.js +0 -1
  88. package/dist/src/commands/plan-edit-command.js +0 -1
  89. package/dist/src/commands/plan-load-command.js +0 -1
  90. package/dist/src/commands/plan-reload-command.js +0 -1
  91. package/dist/src/commands/plan-save-command.js +0 -1
  92. package/dist/src/commands/research-command.js +0 -1
  93. package/dist/src/commands/start-command.js +0 -1
  94. package/dist/src/commands/status-command.js +0 -1
  95. package/dist/src/commands/test-command.js +0 -1
  96. package/dist/src/components/ActivityPane.js +0 -1
  97. package/dist/src/components/AddKnowledge.js +0 -1
  98. package/dist/src/components/AddRule.js +0 -1
  99. package/dist/src/components/App.js +0 -1
  100. package/dist/src/components/Autocomplete.js +0 -1
  101. package/dist/src/components/InputPane.js +0 -1
  102. package/dist/src/components/InputReadline.js +0 -1
  103. package/dist/src/components/LogPane.js +0 -1
  104. package/dist/src/components/PlanEditor.js +0 -1
  105. package/dist/src/components/PlanPane.js +0 -1
  106. package/dist/src/components/SessionTimer.js +0 -1
  107. package/dist/src/components/StateTransitionPane.js +0 -1
  108. package/dist/src/components/StatusPane.js +0 -1
  109. package/dist/src/components/TaskPane.js +0 -1
  110. package/dist/src/components/Welcome.js +0 -1
  111. package/dist/src/components/WelcomeChecklist.js +0 -1
  112. package/dist/src/components/WelcomeCommands.js +0 -1
  113. package/dist/src/components/autocomplete-store.js +0 -1
  114. package/dist/src/components/parse-keypress.js +0 -1
  115. package/dist/src/config.js +0 -1
  116. package/dist/src/execution-controller.js +0 -1
  117. package/dist/src/experience-tracker.js +0 -1
  118. package/dist/src/explorbot.js +0 -1
  119. package/dist/src/explorer.js +0 -1
  120. package/dist/src/index.js +0 -1
  121. package/dist/src/knowledge-tracker.js +2 -2
  122. package/dist/src/observability.js +0 -1
  123. package/dist/src/reporter.js +0 -1
  124. package/dist/src/state-manager.js +0 -1
  125. package/dist/src/stats.js +0 -1
  126. package/dist/src/test-plan.js +0 -1
  127. package/dist/src/utils/aria.js +0 -1
  128. package/dist/src/utils/cli-name.js +16 -0
  129. package/dist/src/utils/code-extractor.js +0 -1
  130. package/dist/src/utils/context-formatter.js +0 -1
  131. package/dist/src/utils/error-page.js +0 -1
  132. package/dist/src/utils/expandable.js +0 -1
  133. package/dist/src/utils/hooks-runner.js +0 -1
  134. package/dist/src/utils/html-diff.js +0 -1
  135. package/dist/src/utils/html.js +0 -1
  136. package/dist/src/utils/logger.js +0 -1
  137. package/dist/src/utils/loop.js +0 -1
  138. package/dist/src/utils/markdown-parser.js +0 -1
  139. package/dist/src/utils/markdown-query.js +0 -1
  140. package/dist/src/utils/markdown-terminal.js +0 -1
  141. package/dist/src/utils/research-parser.js +0 -1
  142. package/dist/src/utils/retry.js +0 -1
  143. package/dist/src/utils/rules-loader.js +0 -1
  144. package/dist/src/utils/strings.js +0 -1
  145. package/dist/src/utils/test-plan-markdown.js +0 -1
  146. package/dist/src/utils/throttle.js +0 -1
  147. package/dist/src/utils/unique-names.js +0 -1
  148. package/dist/src/utils/url-matcher.js +0 -1
  149. package/dist/src/utils/web-element.js +0 -1
  150. package/dist/src/utils/xpath.js +0 -1
  151. package/package.json +27 -3
  152. package/src/action-result.ts +694 -0
  153. package/src/action.ts +445 -0
  154. package/src/activity.ts +111 -0
  155. package/src/ai/agent.ts +3 -0
  156. package/src/ai/bosun.ts +557 -0
  157. package/src/ai/captain/idle-mode.ts +116 -0
  158. package/src/ai/captain/mixin.ts +22 -0
  159. package/src/ai/captain/test-mode.ts +262 -0
  160. package/src/ai/captain/web-mode.ts +136 -0
  161. package/src/ai/captain.ts +504 -0
  162. package/src/ai/conversation.ts +205 -0
  163. package/src/ai/experience-compactor.ts +284 -0
  164. package/src/ai/fisherman-tools.ts +181 -0
  165. package/src/ai/fisherman.ts +223 -0
  166. package/src/ai/historian.ts +457 -0
  167. package/src/ai/navigator.ts +572 -0
  168. package/src/ai/pilot.ts +776 -0
  169. package/src/ai/planner/session-dedup.ts +35 -0
  170. package/src/ai/planner/styles.ts +17 -0
  171. package/src/ai/planner/subpages.ts +141 -0
  172. package/src/ai/planner.ts +536 -0
  173. package/src/ai/provider.ts +613 -0
  174. package/src/ai/quartermaster.ts +286 -0
  175. package/src/ai/researcher/cache.ts +103 -0
  176. package/src/ai/researcher/coordinates.ts +238 -0
  177. package/src/ai/researcher/deep-analysis.ts +415 -0
  178. package/src/ai/researcher/fingerprint-worker.ts +59 -0
  179. package/src/ai/researcher/focus.ts +42 -0
  180. package/src/ai/researcher/locators.ts +282 -0
  181. package/src/ai/researcher/mixin.ts +4 -0
  182. package/src/ai/researcher/parser.ts +186 -0
  183. package/src/ai/researcher/research-result.ts +115 -0
  184. package/src/ai/researcher.ts +857 -0
  185. package/src/ai/rules.ts +376 -0
  186. package/src/ai/task-agent.ts +141 -0
  187. package/src/ai/tester.ts +939 -0
  188. package/src/ai/tools.ts +1117 -0
  189. package/src/api/api-client.ts +109 -0
  190. package/src/api/request-result.ts +212 -0
  191. package/src/api/request-store.ts +130 -0
  192. package/src/api/spec-reader.ts +174 -0
  193. package/src/api/xhr-capture.ts +100 -0
  194. package/src/browser-server.ts +74 -0
  195. package/src/command-handler.ts +454 -0
  196. package/src/commands/add-rule-command.ts +63 -0
  197. package/src/commands/base-command.ts +27 -0
  198. package/src/commands/clean-command.ts +73 -0
  199. package/src/commands/context-aria-command.ts +22 -0
  200. package/src/commands/context-command.ts +67 -0
  201. package/src/commands/context-data-command.ts +30 -0
  202. package/src/commands/context-experience-command.ts +48 -0
  203. package/src/commands/context-html-command.ts +33 -0
  204. package/src/commands/context-knowledge-command.ts +43 -0
  205. package/src/commands/debug-command.ts +13 -0
  206. package/src/commands/drill-command.ts +34 -0
  207. package/src/commands/exit-command.ts +32 -0
  208. package/src/commands/explore-command.ts +129 -0
  209. package/src/commands/freesail-command.ts +95 -0
  210. package/src/commands/help-command.ts +8 -0
  211. package/src/commands/index.ts +69 -0
  212. package/src/commands/init-command.ts +128 -0
  213. package/src/commands/knows-command.ts +68 -0
  214. package/src/commands/learn-command.ts +44 -0
  215. package/src/commands/navigate-command.ts +18 -0
  216. package/src/commands/path-command.ts +83 -0
  217. package/src/commands/plan-clear-command.ts +14 -0
  218. package/src/commands/plan-command.ts +41 -0
  219. package/src/commands/plan-edit-command.ts +9 -0
  220. package/src/commands/plan-load-command.ts +18 -0
  221. package/src/commands/plan-reload-command.ts +28 -0
  222. package/src/commands/plan-save-command.ts +25 -0
  223. package/src/commands/research-command.ts +45 -0
  224. package/src/commands/start-command.ts +13 -0
  225. package/src/commands/status-command.tsx +23 -0
  226. package/src/commands/test-command.ts +84 -0
  227. package/src/components/ActivityPane.tsx +80 -0
  228. package/src/components/AddKnowledge.tsx +169 -0
  229. package/src/components/AddRule.tsx +174 -0
  230. package/src/components/App.tsx +377 -0
  231. package/src/components/Autocomplete.tsx +63 -0
  232. package/src/components/InputPane.tsx +259 -0
  233. package/src/components/InputReadline.tsx +704 -0
  234. package/src/components/LogPane.tsx +187 -0
  235. package/src/components/PlanEditor.tsx +150 -0
  236. package/src/components/PlanPane.tsx +71 -0
  237. package/src/components/SessionTimer.tsx +35 -0
  238. package/src/components/StateTransitionPane.tsx +149 -0
  239. package/src/components/StatusPane.tsx +62 -0
  240. package/src/components/TaskPane.tsx +119 -0
  241. package/src/components/Welcome.tsx +83 -0
  242. package/src/components/WelcomeChecklist.tsx +118 -0
  243. package/src/components/WelcomeCommands.tsx +102 -0
  244. package/src/components/autocomplete-store.ts +35 -0
  245. package/src/components/parse-keypress.ts +170 -0
  246. package/src/config.ts +490 -0
  247. package/src/execution-controller.ts +109 -0
  248. package/src/experience-tracker.ts +350 -0
  249. package/src/explorbot.ts +405 -0
  250. package/src/explorer.ts +713 -0
  251. package/src/index.tsx +62 -0
  252. package/src/knowledge-tracker.ts +230 -0
  253. package/src/observability.ts +150 -0
  254. package/src/reporter.ts +224 -0
  255. package/src/state-manager.ts +556 -0
  256. package/src/stats.ts +53 -0
  257. package/src/test-plan.ts +432 -0
  258. package/src/utils/aria.ts +629 -0
  259. package/src/utils/cli-name.ts +13 -0
  260. package/src/utils/code-extractor.ts +22 -0
  261. package/src/utils/context-formatter.ts +239 -0
  262. package/src/utils/error-page.ts +23 -0
  263. package/src/utils/expandable.ts +38 -0
  264. package/src/utils/hooks-runner.ts +79 -0
  265. package/src/utils/html-diff.ts +918 -0
  266. package/src/utils/html.ts +1316 -0
  267. package/src/utils/logger.ts +534 -0
  268. package/src/utils/loop.ts +176 -0
  269. package/src/utils/markdown-parser.ts +127 -0
  270. package/src/utils/markdown-query.ts +466 -0
  271. package/src/utils/markdown-terminal.ts +43 -0
  272. package/src/utils/research-parser.ts +11 -0
  273. package/src/utils/retry.ts +73 -0
  274. package/src/utils/rules-loader.ts +118 -0
  275. package/src/utils/strings.ts +13 -0
  276. package/src/utils/test-plan-markdown.ts +332 -0
  277. package/src/utils/throttle.ts +18 -0
  278. package/src/utils/unique-names.ts +14 -0
  279. package/src/utils/url-matcher.ts +45 -0
  280. package/src/utils/web-element.ts +145 -0
  281. package/src/utils/xpath.ts +129 -0
  282. package/dist/bin/explorbot-cli.js.map +0 -1
  283. package/dist/boat/api-tester/bin/apibot-cli.js.map +0 -1
  284. package/dist/boat/api-tester/example/apibot.config.js +0 -31
  285. package/dist/boat/api-tester/example/apibot.config.js.map +0 -1
  286. package/dist/boat/api-tester/src/ai/chief/styles.js.map +0 -1
  287. package/dist/boat/api-tester/src/ai/chief.js.map +0 -1
  288. package/dist/boat/api-tester/src/ai/curler-tools.js.map +0 -1
  289. package/dist/boat/api-tester/src/ai/curler.js.map +0 -1
  290. package/dist/boat/api-tester/src/api-client.js.map +0 -1
  291. package/dist/boat/api-tester/src/apibot.js.map +0 -1
  292. package/dist/boat/api-tester/src/cli.js.map +0 -1
  293. package/dist/boat/api-tester/src/config.js.map +0 -1
  294. package/dist/prompts/audit-rules.md +0 -124
  295. package/dist/src/action-result.js.map +0 -1
  296. package/dist/src/action.js.map +0 -1
  297. package/dist/src/activity.js.map +0 -1
  298. package/dist/src/ai/agent.js.map +0 -1
  299. package/dist/src/ai/bosun.js.map +0 -1
  300. package/dist/src/ai/captain/idle-mode.js.map +0 -1
  301. package/dist/src/ai/captain/mixin.js.map +0 -1
  302. package/dist/src/ai/captain/test-mode.js.map +0 -1
  303. package/dist/src/ai/captain/web-mode.js.map +0 -1
  304. package/dist/src/ai/captain.js.map +0 -1
  305. package/dist/src/ai/conversation.js.map +0 -1
  306. package/dist/src/ai/experience-compactor.js.map +0 -1
  307. package/dist/src/ai/fisherman-tools.js.map +0 -1
  308. package/dist/src/ai/fisherman.js.map +0 -1
  309. package/dist/src/ai/historian.js.map +0 -1
  310. package/dist/src/ai/navigator.js.map +0 -1
  311. package/dist/src/ai/pilot.js.map +0 -1
  312. package/dist/src/ai/planner/session-dedup.js.map +0 -1
  313. package/dist/src/ai/planner/styles.js.map +0 -1
  314. package/dist/src/ai/planner/subpages.js.map +0 -1
  315. package/dist/src/ai/planner.js.map +0 -1
  316. package/dist/src/ai/provider.js.map +0 -1
  317. package/dist/src/ai/quartermaster.js.map +0 -1
  318. package/dist/src/ai/researcher/cache.js.map +0 -1
  319. package/dist/src/ai/researcher/coordinates.js.map +0 -1
  320. package/dist/src/ai/researcher/deep-analysis.js.map +0 -1
  321. package/dist/src/ai/researcher/fingerprint-worker.js.map +0 -1
  322. package/dist/src/ai/researcher/focus.js.map +0 -1
  323. package/dist/src/ai/researcher/locators.js.map +0 -1
  324. package/dist/src/ai/researcher/mixin.js.map +0 -1
  325. package/dist/src/ai/researcher/parser.js.map +0 -1
  326. package/dist/src/ai/researcher/research-result.js.map +0 -1
  327. package/dist/src/ai/researcher.js.map +0 -1
  328. package/dist/src/ai/rules.js.map +0 -1
  329. package/dist/src/ai/task-agent.js.map +0 -1
  330. package/dist/src/ai/tester.js.map +0 -1
  331. package/dist/src/ai/tools.js.map +0 -1
  332. package/dist/src/api/api-client.js.map +0 -1
  333. package/dist/src/api/request-result.js.map +0 -1
  334. package/dist/src/api/request-store.js.map +0 -1
  335. package/dist/src/api/spec-reader.js.map +0 -1
  336. package/dist/src/api/xhr-capture.js.map +0 -1
  337. package/dist/src/browser-server.js.map +0 -1
  338. package/dist/src/command-handler.js.map +0 -1
  339. package/dist/src/commands/add-rule-command.js.map +0 -1
  340. package/dist/src/commands/base-command.js.map +0 -1
  341. package/dist/src/commands/clean-command.js.map +0 -1
  342. package/dist/src/commands/context-aria-command.js.map +0 -1
  343. package/dist/src/commands/context-command.js.map +0 -1
  344. package/dist/src/commands/context-data-command.js.map +0 -1
  345. package/dist/src/commands/context-experience-command.js.map +0 -1
  346. package/dist/src/commands/context-html-command.js.map +0 -1
  347. package/dist/src/commands/context-knowledge-command.js.map +0 -1
  348. package/dist/src/commands/debug-command.js.map +0 -1
  349. package/dist/src/commands/drill-command.js.map +0 -1
  350. package/dist/src/commands/exit-command.js.map +0 -1
  351. package/dist/src/commands/explore-command.js.map +0 -1
  352. package/dist/src/commands/freesail-command.js.map +0 -1
  353. package/dist/src/commands/help-command.js.map +0 -1
  354. package/dist/src/commands/index.js.map +0 -1
  355. package/dist/src/commands/knows-command.js.map +0 -1
  356. package/dist/src/commands/learn-command.js.map +0 -1
  357. package/dist/src/commands/navigate-command.js.map +0 -1
  358. package/dist/src/commands/path-command.js.map +0 -1
  359. package/dist/src/commands/plan-clear-command.js.map +0 -1
  360. package/dist/src/commands/plan-command.js.map +0 -1
  361. package/dist/src/commands/plan-edit-command.js.map +0 -1
  362. package/dist/src/commands/plan-load-command.js.map +0 -1
  363. package/dist/src/commands/plan-reload-command.js.map +0 -1
  364. package/dist/src/commands/plan-save-command.js.map +0 -1
  365. package/dist/src/commands/research-command.js.map +0 -1
  366. package/dist/src/commands/start-command.js.map +0 -1
  367. package/dist/src/commands/status-command.js.map +0 -1
  368. package/dist/src/commands/test-command.js.map +0 -1
  369. package/dist/src/components/ActivityPane.js.map +0 -1
  370. package/dist/src/components/AddKnowledge.js.map +0 -1
  371. package/dist/src/components/AddRule.js.map +0 -1
  372. package/dist/src/components/App.js.map +0 -1
  373. package/dist/src/components/Autocomplete.js.map +0 -1
  374. package/dist/src/components/InputPane.js.map +0 -1
  375. package/dist/src/components/InputReadline.js.map +0 -1
  376. package/dist/src/components/LogPane.js.map +0 -1
  377. package/dist/src/components/PlanEditor.js.map +0 -1
  378. package/dist/src/components/PlanPane.js.map +0 -1
  379. package/dist/src/components/SessionTimer.js.map +0 -1
  380. package/dist/src/components/StateTransitionPane.js.map +0 -1
  381. package/dist/src/components/StatusPane.js.map +0 -1
  382. package/dist/src/components/TaskPane.js.map +0 -1
  383. package/dist/src/components/Welcome.js.map +0 -1
  384. package/dist/src/components/WelcomeChecklist.js.map +0 -1
  385. package/dist/src/components/WelcomeCommands.js.map +0 -1
  386. package/dist/src/components/autocomplete-store.js.map +0 -1
  387. package/dist/src/components/parse-keypress.js.map +0 -1
  388. package/dist/src/config.js.map +0 -1
  389. package/dist/src/execution-controller.js.map +0 -1
  390. package/dist/src/experience-tracker.js.map +0 -1
  391. package/dist/src/explorbot.js.map +0 -1
  392. package/dist/src/explorer.js.map +0 -1
  393. package/dist/src/index.js.map +0 -1
  394. package/dist/src/knowledge-tracker.js.map +0 -1
  395. package/dist/src/observability.js.map +0 -1
  396. package/dist/src/reporter.js.map +0 -1
  397. package/dist/src/state-manager.js.map +0 -1
  398. package/dist/src/stats.js.map +0 -1
  399. package/dist/src/test-plan.js.map +0 -1
  400. package/dist/src/utils/aria.js.map +0 -1
  401. package/dist/src/utils/code-extractor.js.map +0 -1
  402. package/dist/src/utils/context-formatter.js.map +0 -1
  403. package/dist/src/utils/error-page.js.map +0 -1
  404. package/dist/src/utils/expandable.js.map +0 -1
  405. package/dist/src/utils/hooks-runner.js.map +0 -1
  406. package/dist/src/utils/html-diff.js.map +0 -1
  407. package/dist/src/utils/html.js.map +0 -1
  408. package/dist/src/utils/logger.js.map +0 -1
  409. package/dist/src/utils/loop.js.map +0 -1
  410. package/dist/src/utils/markdown-parser.js.map +0 -1
  411. package/dist/src/utils/markdown-query.js.map +0 -1
  412. package/dist/src/utils/markdown-terminal.js.map +0 -1
  413. package/dist/src/utils/research-parser.js.map +0 -1
  414. package/dist/src/utils/retry.js.map +0 -1
  415. package/dist/src/utils/rules-loader.js.map +0 -1
  416. package/dist/src/utils/strings.js.map +0 -1
  417. package/dist/src/utils/test-plan-markdown.js.map +0 -1
  418. package/dist/src/utils/throttle.js.map +0 -1
  419. package/dist/src/utils/unique-names.js.map +0 -1
  420. package/dist/src/utils/url-matcher.js.map +0 -1
  421. package/dist/src/utils/web-element.js.map +0 -1
  422. package/dist/src/utils/xpath.js.map +0 -1
  423. package/prompts/audit-rules.md +0 -124
@@ -0,0 +1,69 @@
1
+ import type { ExplorBot } from '../explorbot.js';
2
+ import type { BaseCommand } from './base-command.js';
3
+ import { CleanCommand } from './clean-command.js';
4
+ import { DebugCommand } from './debug-command.js';
5
+ import { ContextAriaCommand } from './context-aria-command.js';
6
+ import { ContextCommand } from './context-command.js';
7
+ import { ContextDataCommand } from './context-data-command.js';
8
+ import { ContextExperienceCommand } from './context-experience-command.js';
9
+ import { ContextHtmlCommand } from './context-html-command.js';
10
+ import { ContextKnowledgeCommand } from './context-knowledge-command.js';
11
+ import { DrillCommand } from './drill-command.js';
12
+ import { ExitCommand } from './exit-command.js';
13
+ import { ExploreCommand } from './explore-command.js';
14
+ import { FreesailCommand } from './freesail-command.js';
15
+ import { HelpCommand } from './help-command.js';
16
+ import { AddRuleCommand } from './add-rule-command.js';
17
+ import { LearnCommand } from './learn-command.js';
18
+ import { KnowsCommand } from './knows-command.js';
19
+ import { NavigateCommand } from './navigate-command.js';
20
+ import { PathCommand } from './path-command.js';
21
+ import { PlanClearCommand } from './plan-clear-command.js';
22
+ import { PlanCommand } from './plan-command.js';
23
+ import { PlanEditCommand } from './plan-edit-command.js';
24
+ import { PlanLoadCommand } from './plan-load-command.js';
25
+ import { PlanReloadCommand } from './plan-reload-command.js';
26
+ import { PlanSaveCommand } from './plan-save-command.js';
27
+ import { ResearchCommand } from './research-command.js';
28
+ import { StartCommand } from './start-command.js';
29
+ import { StatusCommand } from './status-command.tsx';
30
+ import { TestCommand } from './test-command.js';
31
+
32
+ export { BaseCommand } from './base-command.js';
33
+
34
+ type CommandClass = new (explorBot: ExplorBot) => BaseCommand;
35
+
36
+ const commandClasses: CommandClass[] = [
37
+ HelpCommand,
38
+ StartCommand,
39
+ ExploreCommand,
40
+ FreesailCommand,
41
+ DrillCommand,
42
+ CleanCommand,
43
+ ResearchCommand,
44
+ PlanCommand,
45
+ PlanSaveCommand,
46
+ PlanLoadCommand,
47
+ PlanReloadCommand,
48
+ PlanClearCommand,
49
+ PlanEditCommand,
50
+ NavigateCommand,
51
+ PathCommand,
52
+ LearnCommand,
53
+ KnowsCommand,
54
+ AddRuleCommand,
55
+ ContextCommand,
56
+ ContextAriaCommand,
57
+ ContextHtmlCommand,
58
+ ContextKnowledgeCommand,
59
+ ContextExperienceCommand,
60
+ ContextDataCommand,
61
+ TestCommand,
62
+ StatusCommand,
63
+ DebugCommand,
64
+ ExitCommand,
65
+ ];
66
+
67
+ export function createCommands(explorBot: ExplorBot): BaseCommand[] {
68
+ return commandClasses.map((Cmd) => new Cmd(explorBot));
69
+ }
@@ -0,0 +1,128 @@
1
+ import { existsSync, mkdirSync, statSync, writeFileSync } from 'node:fs';
2
+ import { dirname, extname, join, resolve } from 'node:path';
3
+ import { log, tag } from '../utils/logger.js';
4
+ import dedent from 'dedent';
5
+ import { getCliName } from '../utils/cli-name.ts';
6
+
7
+ const DEFAULT_CONFIG_TEMPLATE = `import { createOpenRouter } from '@openrouter/ai-sdk-provider';
8
+ // import { '<your provider here>' } from '<your provider package here>';
9
+
10
+ // Vercel AI SDK is used to connect to AI providers.
11
+ // Bring your own provider or use OpenRouter (one API key, many providers).
12
+ // https://github.com/testomatio/explorbot/blob/main/docs/providers.md
13
+ const openrouter = createOpenRouter({
14
+ apiKey: process.env.OPENROUTER_API_KEY,
15
+ });
16
+
17
+ const config = {
18
+ web: {
19
+ // use application host without path prefix (e.g., http://localhost:3000)
20
+ url: 'http://<your-app-host-here>',
21
+ },
22
+
23
+ ai: {
24
+ // fast model with tool calling capabilities
25
+ model: openrouter('<your base model here>'),
26
+ // vision model for screenshot analysis
27
+ visionModel: openrouter('<your vision model here>'),
28
+ // agentic model for decision making
29
+ agenticModel: openrouter('<your agentic model here>'),
30
+ },
31
+ };
32
+
33
+ export default config;
34
+ `;
35
+
36
+ const DEFAULT_ENV_TEMPLATE = dedent`
37
+ # AI provider API keys
38
+ OPENROUTER_API_KEY=
39
+
40
+ # OPENAI_API_KEY=
41
+ # ANTHROPIC_API_KEY=
42
+ # GROQ_API_KEY=
43
+
44
+ # Langfuse Tracing
45
+ LANGFUSE_SECRET_KEY=
46
+ LANGFUSE_PUBLIC_KEY=
47
+ LANGFUSE_BASE_URL=
48
+
49
+ # Testomat.io API key to publish run results
50
+ TESTOMATIO=
51
+ `;
52
+
53
+ export function runInitCommand(options: InitCommandOptions): void {
54
+ const configPath = options.configPath ?? './explorbot.config.js';
55
+ const force = options.force ?? false;
56
+ const customPath = options.path;
57
+ const originalCwd = process.cwd();
58
+
59
+ if (customPath) {
60
+ const dir = resolve(customPath);
61
+ if (!existsSync(dir)) {
62
+ mkdirSync(dir, { recursive: true });
63
+ log(`Created directory: ${dir}`);
64
+ }
65
+ process.chdir(dir);
66
+ log(`Working in directory: ${dir}`);
67
+ }
68
+
69
+ try {
70
+ let outPath = resolve(configPath);
71
+ if (existsSync(outPath) && statSync(outPath).isDirectory()) {
72
+ outPath = join(outPath, 'explorbot.config.js');
73
+ } else if (!extname(outPath)) {
74
+ outPath = join(outPath, 'explorbot.config.js');
75
+ }
76
+
77
+ const dir = dirname(outPath);
78
+ if (!existsSync(dir)) {
79
+ mkdirSync(dir, { recursive: true });
80
+ log(`Created directory: ${dir}`);
81
+ }
82
+
83
+ if (existsSync(outPath) && !force) {
84
+ log(`Config file already exists: ${outPath}`);
85
+ log('Use --force to overwrite existing file');
86
+ process.exit(1);
87
+ }
88
+
89
+ writeFileSync(outPath, DEFAULT_CONFIG_TEMPLATE, 'utf8');
90
+ log(`Created config file: ${outPath}`);
91
+
92
+ const envPath = resolve(process.cwd(), '.env');
93
+ if (!existsSync(envPath)) {
94
+ writeFileSync(envPath, `${DEFAULT_ENV_TEMPLATE}\n`, 'utf8');
95
+ log(`Created env file: ${envPath}`);
96
+ } else {
97
+ log(`Env file already exists: ${envPath}`);
98
+ }
99
+
100
+ log('');
101
+ log('Next steps:');
102
+ log('1. Configure AI provider in .env');
103
+ log('2. Set AI models config file');
104
+ log('3. Set web application URL in the config file');
105
+ log('4. Add initial knowledge (how to authorize to the application, etc.)');
106
+ tag('substep').log(`${getCliName()} learn * 'to aurhorize use these credentials: admin@example.com / secret123'`);
107
+ log('5. Launch application on a relative URL');
108
+ tag('substep').log(`${getCliName()} start /dashboard`);
109
+
110
+ if (!existsSync('./output')) {
111
+ mkdirSync('./output', { recursive: true });
112
+ log('Created directory: ./output');
113
+ }
114
+ } catch (error) {
115
+ log('Failed to create config file:', error);
116
+ process.exit(1);
117
+ } finally {
118
+ if (process.cwd() !== originalCwd) {
119
+ process.chdir(originalCwd);
120
+ }
121
+ }
122
+ }
123
+
124
+ type InitCommandOptions = {
125
+ configPath?: string;
126
+ force?: boolean;
127
+ path?: string;
128
+ };
@@ -0,0 +1,68 @@
1
+ import { log, tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export function formatKnowledgeList(knowledge: Array<{ url: string; firstLine: string }>, limit = 0): string {
5
+ const lines: string[] = [];
6
+ const display = limit > 0 ? knowledge.slice(0, limit) : knowledge;
7
+
8
+ for (const entry of display) {
9
+ const preview = entry.firstLine ? ` - ${entry.firstLine}` : '';
10
+ lines.push(`* \`${entry.url}\` ${preview}`);
11
+ }
12
+
13
+ if (limit > 0 && knowledge.length > limit) {
14
+ lines.push(`... and ${knowledge.length - limit} more`);
15
+ }
16
+
17
+ return lines.join('\n');
18
+ }
19
+
20
+ export class KnowsCommand extends BaseCommand {
21
+ name = 'knows';
22
+ description = 'List all knowledge URLs or show matching knowledge for a URL';
23
+
24
+ async execute(args: string, limit = 0): Promise<void> {
25
+ const url = args.trim();
26
+ const tracker = this.explorBot.getKnowledgeTracker();
27
+
28
+ if (!url) {
29
+ const allKnowledge = tracker.listAllKnowledge();
30
+
31
+ if (allKnowledge.length === 0) {
32
+ log('No knowledge files found. Use /learn to add knowledge about your application.');
33
+ return;
34
+ }
35
+
36
+ let output = `Found ${allKnowledge.length} knowledge entries:\n\n${formatKnowledgeList(allKnowledge, limit)}`;
37
+
38
+ const currentState = this.explorBot.getCurrentState();
39
+ if (currentState?.url) {
40
+ const currentMatching = tracker.getMatchingKnowledge(currentState.url);
41
+ if (currentMatching.length > 0) {
42
+ output += `\n\n**Knowledge for current page** (${currentState.url}):`;
43
+ for (const k of currentMatching) {
44
+ output += `\n\n\`${k.url}\`:\n${k.content.trim()}`;
45
+ }
46
+ }
47
+ }
48
+
49
+ output += '\n\nUse /learn to add knowledge';
50
+ tag('multiline').log(output);
51
+ return;
52
+ }
53
+
54
+ const matching = tracker.getMatchingKnowledge(url);
55
+
56
+ if (matching.length === 0) {
57
+ log(`No knowledge found for: ${url}`);
58
+ return;
59
+ }
60
+
61
+ const knowledgeList = matching.map((k) => {
62
+ const firstLine = k.content.trim().split('\n')[0] || '';
63
+ return { url: k.url, firstLine };
64
+ });
65
+
66
+ tag('multiline').log(`Found ${matching.length} matching knowledge entries for: ${url}\n\n${formatKnowledgeList(knowledgeList)}`);
67
+ }
68
+ }
@@ -0,0 +1,44 @@
1
+ import { render } from 'ink';
2
+ import React from 'react';
3
+ import { tag } from '../utils/logger.js';
4
+ import { BaseCommand } from './base-command.js';
5
+
6
+ export class LearnCommand extends BaseCommand {
7
+ name = 'learn';
8
+ description = 'Store knowledge for current page';
9
+ suggestions = ['/knows - to view all knowledge'];
10
+
11
+ async execute(args: string): Promise<void> {
12
+ const note = args.trim();
13
+
14
+ if (!note) {
15
+ const AddKnowledge = (await import('../components/AddKnowledge.js')).default;
16
+ const state = this.explorBot.getExplorer().getStateManager().getCurrentState();
17
+ const initialUrl = state?.url || '';
18
+
19
+ const { unmount } = render(
20
+ React.createElement(AddKnowledge, {
21
+ initialUrl,
22
+ onComplete: () => unmount(),
23
+ onCancel: () => unmount(),
24
+ }),
25
+ {
26
+ exitOnCtrlC: false,
27
+ patchConsole: false,
28
+ }
29
+ );
30
+ return;
31
+ }
32
+
33
+ const explorer = this.explorBot.getExplorer();
34
+ const state = explorer.getStateManager().getCurrentState();
35
+
36
+ if (!state) {
37
+ throw new Error('No active page to attach knowledge');
38
+ }
39
+
40
+ const targetUrl = state.url || state.fullUrl || '/';
41
+ explorer.getKnowledgeTracker().addKnowledge(targetUrl, note);
42
+ tag('success').log('Knowledge saved for current page');
43
+ }
44
+ }
@@ -0,0 +1,18 @@
1
+ import { tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export class NavigateCommand extends BaseCommand {
5
+ name = 'navigate';
6
+ description = 'Navigate to URI or state using AI';
7
+ suggestions = ['/research - to analyze current page', '/plan <feature> - to plan testing'];
8
+
9
+ async execute(args: string): Promise<void> {
10
+ const destination = args.trim();
11
+ if (!destination) {
12
+ throw new Error('Navigate command requires a target URI or state');
13
+ }
14
+
15
+ await this.explorBot.agentNavigator().visit(destination);
16
+ tag('success').log(`Navigation requested: ${destination}`);
17
+ }
18
+ }
@@ -0,0 +1,83 @@
1
+ import type { Link } from '../state-manager.js';
2
+ import { tag } from '../utils/logger.js';
3
+ import { BaseCommand } from './base-command.js';
4
+
5
+ interface VisitedPage {
6
+ title: string;
7
+ url: string;
8
+ links: Link[];
9
+ }
10
+
11
+ export class PathCommand extends BaseCommand {
12
+ name = 'path';
13
+ description = 'Display ASCII graph of navigation paths during the session';
14
+ options = [{ flags: '--links', description: 'Show outgoing links from each page' }];
15
+
16
+ async execute(args: string): Promise<void> {
17
+ const showLinks = args.includes('--links');
18
+ const stateManager = this.explorBot.getExplorer().getStateManager();
19
+ const history = stateManager.getStateHistory();
20
+
21
+ if (history.length === 0) {
22
+ tag('multiline').log('No navigation history yet.');
23
+ return;
24
+ }
25
+
26
+ const visited: VisitedPage[] = [];
27
+ const seenUrls = new Set<string>();
28
+
29
+ const addState = (state: { url?: string; h1?: string; title?: string; links?: Link[] } | null) => {
30
+ if (!state) return;
31
+ const url = state.url || '/';
32
+ if (seenUrls.has(url)) return;
33
+ seenUrls.add(url);
34
+ const title = state.h1 || state.title || 'Untitled';
35
+ visited.push({ title, url, links: state.links || [] });
36
+ };
37
+
38
+ for (const transition of history) {
39
+ addState(transition.fromState);
40
+ addState(transition.toState);
41
+ }
42
+
43
+ if (visited.length === 0) {
44
+ tag('multiline').log('No unique paths visited.');
45
+ return;
46
+ }
47
+
48
+ const lines: string[] = [];
49
+ lines.push(`Navigation Path (${visited.length} unique pages):\n`);
50
+
51
+ for (let i = 0; i < visited.length; i++) {
52
+ const { title, url, links } = visited[i];
53
+ lines.push(title);
54
+ lines.push(url);
55
+
56
+ if (i < visited.length - 1) {
57
+ if (showLinks && links.length > 0) {
58
+ lines.push(' │');
59
+ for (const link of links.slice(0, 10)) {
60
+ lines.push(` │ → ${link.title} ${link.url}`);
61
+ }
62
+ if (links.length > 10) {
63
+ lines.push(` │ ... and ${links.length - 10} more links`);
64
+ }
65
+ lines.push(' │');
66
+ lines.push(' ↓');
67
+ } else {
68
+ lines.push(' ↓');
69
+ }
70
+ } else if (showLinks && links.length > 0) {
71
+ lines.push(' │');
72
+ for (const link of links.slice(0, 10)) {
73
+ lines.push(` │ → ${link.title} ${link.url}`);
74
+ }
75
+ if (links.length > 10) {
76
+ lines.push(` │ ... and ${links.length - 10} more links`);
77
+ }
78
+ }
79
+ }
80
+
81
+ tag('multiline').log(lines.join('\n'));
82
+ }
83
+ }
@@ -0,0 +1,14 @@
1
+ import { tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export class PlanClearCommand extends BaseCommand {
5
+ name = 'plan:clear';
6
+ description = 'Clear current plan and create a new one';
7
+ suggestions = ['/test - to launch first test', '/test * - to launch all tests'];
8
+
9
+ async execute(args: string): Promise<void> {
10
+ this.explorBot.clearPlan();
11
+ tag('success').log('Plan cleared');
12
+ await this.explorBot.plan(args.trim() || undefined, { fresh: true });
13
+ }
14
+ }
@@ -0,0 +1,41 @@
1
+ import { tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export class PlanCommand extends BaseCommand {
5
+ name = 'plan';
6
+ description = 'Plan testing for a feature';
7
+ suggestions = ['/test - to launch first test', '/test * - to launch all tests', 'Edit the plan in file and call /plan:reload to update it'];
8
+ options = [
9
+ { flags: '--fresh', description: 'Regenerate plan from scratch' },
10
+ { flags: '--clear', description: 'Clear plan before regenerating' },
11
+ { flags: '--style <name>', description: 'Planning style (normal, curious, psycho, performer)' },
12
+ ];
13
+
14
+ async execute(args: string): Promise<void> {
15
+ const clear = args.includes('--clear');
16
+ const fresh = args.includes('--fresh') || clear;
17
+ const styleMatch = args.match(/--style\s+(\S+)/);
18
+ const style = styleMatch?.[1];
19
+ const focus = args
20
+ .replace('--clear', '')
21
+ .replace('--fresh', '')
22
+ .replace(/--style\s+\S+/, '')
23
+ .trim();
24
+
25
+ if (clear) {
26
+ this.explorBot.clearPlan();
27
+ tag('success').log('Plan cleared');
28
+ }
29
+
30
+ if (focus) {
31
+ tag('info').log(`Planning focus: ${focus}`);
32
+ }
33
+
34
+ await this.explorBot.plan(focus || undefined, { fresh, style });
35
+
36
+ const plan = this.explorBot.getCurrentPlan();
37
+ if (!plan?.tests.length) {
38
+ throw new Error('No test scenarios in the current plan.');
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,9 @@
1
+ import { BaseCommand } from './base-command.js';
2
+
3
+ export class PlanEditCommand extends BaseCommand {
4
+ name = 'plan:edit';
5
+ description = 'Open test plan editor';
6
+ suggestions = ['/plan:edit - toggle tests on/off'];
7
+
8
+ async execute(_args: string): Promise<void> {}
9
+ }
@@ -0,0 +1,18 @@
1
+ import { tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export class PlanLoadCommand extends BaseCommand {
5
+ name = 'plan:load';
6
+ description = 'Load plan from file';
7
+ suggestions = ['/test - to launch first test', '/test * - to launch all tests'];
8
+
9
+ async execute(args: string): Promise<void> {
10
+ const filename = args.trim();
11
+ if (!filename) {
12
+ throw new Error('Filename required. Usage: /plan:load <filename>');
13
+ }
14
+
15
+ const plan = this.explorBot.loadPlan(filename);
16
+ tag('success').log(`Plan loaded: ${plan.title} with ${plan.tests.length} tests`);
17
+ }
18
+ }
@@ -0,0 +1,28 @@
1
+ import { tag } from '../utils/logger.js';
2
+ import { BaseCommand } from './base-command.js';
3
+
4
+ export class PlanReloadCommand extends BaseCommand {
5
+ name = 'plan:reload';
6
+ description = 'Clear current plan and regenerate';
7
+ suggestions = ['/test - to launch first test', '/test * - to launch all tests'];
8
+
9
+ async execute(args: string): Promise<void> {
10
+ const currentPlan = this.explorBot.getCurrentPlan();
11
+ if (!currentPlan) {
12
+ throw new Error('No plan to reload. Run /plan first.');
13
+ }
14
+
15
+ const feature = args.trim() || this.explorBot.getPlanFeature();
16
+ this.explorBot.clearPlan();
17
+
18
+ tag('info').log('Plan cleared, regenerating...');
19
+ await this.explorBot.plan(feature);
20
+
21
+ const plan = this.explorBot.getCurrentPlan();
22
+ if (!plan?.tests.length) {
23
+ throw new Error('No test scenarios in the regenerated plan.');
24
+ }
25
+
26
+ tag('success').log(`Plan regenerated with ${plan.tests.length} tests`);
27
+ }
28
+ }
@@ -0,0 +1,25 @@
1
+ import path from 'node:path';
2
+ import { tag } from '../utils/logger.js';
3
+ import { BaseCommand } from './base-command.js';
4
+
5
+ export class PlanSaveCommand extends BaseCommand {
6
+ name = 'plan:save';
7
+ description = 'Save current plan to file';
8
+ suggestions = ['/test - to launch first test'];
9
+
10
+ async execute(args: string): Promise<void> {
11
+ const plan = this.explorBot.getCurrentPlan();
12
+ if (!plan) {
13
+ throw new Error('No plan to save. Run /plan first.');
14
+ }
15
+
16
+ const filename = args.trim() || undefined;
17
+ const savedPath = this.explorBot.savePlan(filename);
18
+
19
+ if (savedPath) {
20
+ const relativePath = path.relative(process.cwd(), savedPath);
21
+ tag('success').log(`Plan saved to: ${relativePath}`);
22
+ tag('info').log(`Run /plan:load ${relativePath} to reload it`);
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,45 @@
1
+ import { join } from 'node:path';
2
+ import { ConfigParser } from '../config.ts';
3
+ import { tag } from '../utils/logger.ts';
4
+ import { BaseCommand } from './base-command.js';
5
+
6
+ export class ResearchCommand extends BaseCommand {
7
+ name = 'research';
8
+ description = 'Research current page or navigate to URI and research. Use --deep to explore interactive elements by clicking them. Use --data to include page data.';
9
+ suggestions = ['/navigate <page> - to go to another page', '/plan <feature> - to plan testing'];
10
+
11
+ async execute(args: string): Promise<void> {
12
+ const includeData = args.includes('--data');
13
+ const enableDeep = args.includes('--deep');
14
+ const noFix = args.includes('--no-fix');
15
+ const target = args.replace('--data', '').replace('--deep', '').replace('--no-fix', '').trim();
16
+
17
+ if (target) {
18
+ await this.explorBot.agentNavigator().visit(target);
19
+ }
20
+
21
+ const state = this.explorBot.getExplorer().getStateManager().getCurrentState();
22
+ if (!state) {
23
+ throw new Error('No active page to research');
24
+ }
25
+
26
+ const result = await this.explorBot.agentResearcher().research(state, {
27
+ screenshot: true,
28
+ force: true,
29
+ data: includeData,
30
+ deep: enableDeep,
31
+ fix: !noFix,
32
+ });
33
+
34
+ tag('multiline').log(result);
35
+
36
+ if (state.hash) {
37
+ const outputDir = ConfigParser.getInstance().getOutputDir();
38
+ tag('info').log(`Research file: ${join(outputDir, 'research', `${state.hash}.md`)}`);
39
+ }
40
+
41
+ if (!enableDeep) {
42
+ this.suggestions = ['/research <page> --deep - analyze page for all expandable elements and interactions'];
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from './base-command.js';
2
+ import { ExploreCommand } from './explore-command.js';
3
+
4
+ export class StartCommand extends BaseCommand {
5
+ name = 'start';
6
+ aliases = ['sail'];
7
+ description = 'Start web exploration';
8
+ suggestions = ['/navigate <page> - to go to another page', '/research - to analyze', '/plan <feature> - to plan testing'];
9
+
10
+ async execute(args: string): Promise<void> {
11
+ await new ExploreCommand(this.explorBot).execute(args);
12
+ }
13
+ }
@@ -0,0 +1,23 @@
1
+ import { render } from 'ink';
2
+ import React from 'react';
3
+ import { StatusPane } from '../components/StatusPane.js';
4
+ import { BaseCommand } from './base-command.js';
5
+
6
+ export class StatusCommand extends BaseCommand {
7
+ name = 'status';
8
+ description = 'Show session statistics and token usage';
9
+
10
+ async execute(_args: string): Promise<void> {
11
+ return new Promise((resolve) => {
12
+ const { unmount } = render(
13
+ React.createElement(StatusPane, {
14
+ onComplete: () => {
15
+ unmount();
16
+ resolve();
17
+ },
18
+ }),
19
+ { exitOnCtrlC: false, patchConsole: false }
20
+ );
21
+ });
22
+ }
23
+ }