@itmetsam/samurai-framework 0.1.0 → 0.2.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 (328) hide show
  1. package/README.md +129 -0
  2. package/bin/samurai.mjs +31 -0
  3. package/dist/api.js +3 -0
  4. package/dist/assert/assertion-error.d.ts +23 -0
  5. package/dist/assert/assertion-error.js +45 -0
  6. package/dist/assert/expect.d.ts +55 -0
  7. package/dist/assert/expect.js +188 -0
  8. package/dist/browser/browser-context.d.ts +91 -0
  9. package/dist/browser/browser-context.js +146 -0
  10. package/dist/browser/browser-finder.d.ts +2 -0
  11. package/dist/browser/browser-finder.js +95 -0
  12. package/dist/browser/browser.d.ts +95 -0
  13. package/dist/browser/browser.js +372 -0
  14. package/dist/browser/context-tree.d.ts +23 -0
  15. package/dist/browser/context-tree.js +60 -0
  16. package/dist/browser/dialog.d.ts +37 -0
  17. package/dist/browser/dialog.js +61 -0
  18. package/dist/browser/download.d.ts +71 -0
  19. package/dist/browser/download.js +137 -0
  20. package/dist/browser/downloads-dir.d.ts +8 -0
  21. package/dist/browser/downloads-dir.js +38 -0
  22. package/dist/browser/emulation.d.ts +61 -0
  23. package/dist/browser/emulation.js +144 -0
  24. package/dist/browser/file-chooser.d.ts +39 -0
  25. package/dist/browser/file-chooser.js +86 -0
  26. package/dist/browser/file-paths.d.ts +4 -0
  27. package/dist/browser/file-paths.js +18 -0
  28. package/dist/browser/index.d.ts +4 -0
  29. package/dist/browser/index.js +4 -0
  30. package/dist/browser/navigation-error.d.ts +13 -0
  31. package/dist/browser/navigation-error.js +19 -0
  32. package/dist/browser/page-logs.d.ts +86 -0
  33. package/dist/browser/page-logs.js +149 -0
  34. package/dist/browser/page-wait.d.ts +9 -0
  35. package/dist/browser/page-wait.js +17 -0
  36. package/dist/browser/page.d.ts +370 -0
  37. package/dist/browser/page.js +1038 -0
  38. package/dist/browser/pdf.d.ts +72 -0
  39. package/dist/browser/pdf.js +37 -0
  40. package/dist/browser/screenshot.d.ts +29 -0
  41. package/dist/browser/screenshot.js +42 -0
  42. package/dist/cli/args.d.ts +35 -0
  43. package/dist/cli/args.js +69 -0
  44. package/dist/cli/cli.cli-test.d.ts +1 -0
  45. package/dist/cli/cli.cli-test.js +170 -0
  46. package/dist/cli/console-reporter.d.ts +15 -0
  47. package/dist/cli/console-reporter.js +52 -0
  48. package/dist/cli/init.d.ts +7 -0
  49. package/dist/cli/init.js +61 -0
  50. package/dist/cli/main.d.ts +12 -0
  51. package/dist/cli/main.js +156 -0
  52. package/dist/config/config.d.ts +24 -0
  53. package/dist/config/config.js +42 -0
  54. package/dist/config/default.d.ts +2 -0
  55. package/dist/config/default.js +3 -0
  56. package/dist/config/mask.d.ts +11 -0
  57. package/dist/config/mask.js +85 -0
  58. package/dist/config/run-settings.d.ts +28 -0
  59. package/dist/config/run-settings.js +61 -0
  60. package/dist/config/secrets.d.ts +10 -0
  61. package/dist/config/secrets.js +67 -0
  62. package/dist/config/variables.d.ts +11 -0
  63. package/dist/config/variables.js +26 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +15 -0
  66. package/dist/locator/action-timeout-error.d.ts +25 -0
  67. package/dist/locator/action-timeout-error.js +35 -0
  68. package/dist/locator/element-state.d.ts +44 -0
  69. package/dist/locator/element-state.js +109 -0
  70. package/dist/locator/label-locator.d.ts +13 -0
  71. package/dist/locator/label-locator.js +49 -0
  72. package/dist/locator/locator.d.ts +168 -0
  73. package/dist/locator/locator.js +591 -0
  74. package/dist/locator/selector-errors.d.ts +9 -0
  75. package/dist/locator/selector-errors.js +15 -0
  76. package/dist/locator/selector.d.ts +60 -0
  77. package/dist/locator/selector.js +113 -0
  78. package/dist/locator/text-locator.d.ts +13 -0
  79. package/dist/logger/index.d.ts +2 -0
  80. package/dist/logger/index.js +30 -0
  81. package/dist/network/data-collector.d.ts +26 -0
  82. package/dist/network/data-collector.js +77 -0
  83. package/dist/network/network-tracker.d.ts +94 -0
  84. package/dist/network/network-tracker.js +198 -0
  85. package/dist/network/network-wait.d.ts +16 -0
  86. package/dist/network/network-wait.js +24 -0
  87. package/dist/network/response.d.ts +22 -0
  88. package/dist/network/response.js +42 -0
  89. package/dist/network/router.d.ts +120 -0
  90. package/dist/network/router.js +343 -0
  91. package/dist/network/url-match.d.ts +8 -0
  92. package/dist/network/url-match.js +38 -0
  93. package/dist/recorder/apply.d.ts +3 -0
  94. package/dist/recorder/apply.js +10 -0
  95. package/dist/recorder/capture.d.ts +18 -0
  96. package/dist/recorder/capture.js +198 -0
  97. package/dist/recorder/index.d.ts +3 -0
  98. package/dist/recorder/index.js +3 -0
  99. package/dist/recorder/normalise.d.ts +68 -0
  100. package/dist/recorder/normalise.js +104 -0
  101. package/dist/recorder/ranking.d.ts +9 -0
  102. package/dist/recorder/ranking.js +21 -0
  103. package/dist/recorder/recorder.d.ts +52 -0
  104. package/dist/recorder/recorder.js +143 -0
  105. package/dist/recorder/session.d.ts +49 -0
  106. package/dist/recorder/session.js +113 -0
  107. package/dist/runner/module-type.d.ts +6 -0
  108. package/dist/runner/module-type.js +29 -0
  109. package/dist/runner/page-logs-report.d.ts +40 -0
  110. package/dist/runner/page-logs-report.js +44 -0
  111. package/dist/runner/prepare-run.d.ts +14 -0
  112. package/dist/runner/prepare-run.js +20 -0
  113. package/dist/runner/project.d.ts +17 -0
  114. package/dist/runner/project.js +33 -0
  115. package/dist/runner/registry.d.ts +7 -0
  116. package/dist/runner/registry.js +40 -0
  117. package/dist/runner/reporter.d.ts +43 -0
  118. package/dist/runner/reporter.js +83 -0
  119. package/dist/runner/run.d.ts +27 -0
  120. package/dist/runner/run.js +34 -0
  121. package/dist/runner/test-error.d.ts +3 -0
  122. package/dist/runner/test-error.js +18 -0
  123. package/dist/runner/test-runner.d.ts +44 -0
  124. package/dist/runner/test-runner.js +205 -0
  125. package/dist/script/call-function.d.ts +34 -0
  126. package/dist/script/call-function.js +71 -0
  127. package/dist/script/element-handle.d.ts +10 -0
  128. package/{src/script/element-handle.ts → dist/script/element-handle.js} +4 -4
  129. package/dist/script/helpers.d.ts +28 -0
  130. package/dist/script/helpers.js +50 -0
  131. package/dist/script/preload.d.ts +31 -0
  132. package/dist/script/preload.js +71 -0
  133. package/dist/script/serialize.d.ts +29 -0
  134. package/dist/script/serialize.js +207 -0
  135. package/dist/steps/build.d.ts +5 -0
  136. package/dist/steps/build.js +38 -0
  137. package/dist/steps/edit.d.ts +30 -0
  138. package/dist/steps/edit.js +80 -0
  139. package/dist/steps/emit.d.ts +6 -0
  140. package/dist/steps/emit.js +73 -0
  141. package/dist/steps/index.d.ts +5 -0
  142. package/dist/steps/index.js +4 -0
  143. package/dist/steps/model.d.ts +103 -0
  144. package/dist/steps/model.js +1 -0
  145. package/dist/steps/parse.d.ts +3 -0
  146. package/dist/steps/parse.js +272 -0
  147. package/dist/transport/bidi-connection.d.ts +46 -0
  148. package/dist/transport/bidi-connection.js +176 -0
  149. package/dist/transport/bidi-error.d.ts +10 -0
  150. package/dist/transport/bidi-error.js +10 -0
  151. package/dist/transport/subscriptions.d.ts +36 -0
  152. package/dist/transport/subscriptions.js +81 -0
  153. package/{src → dist}/types/test.d.ts +10 -4
  154. package/dist/wait/wait-until.d.ts +20 -0
  155. package/dist/wait/wait-until.js +63 -0
  156. package/package.json +44 -7
  157. package/.claude/settings.local.json +0 -7
  158. package/.env.example +0 -3
  159. package/.github/actions/setup/action.yml +0 -16
  160. package/.github/workflows/ci.yml +0 -71
  161. package/.trunk/configs/.markdownlint.yaml +0 -2
  162. package/.trunk/configs/.yamllint.yaml +0 -7
  163. package/.trunk/configs/svgo.config.mjs +0 -14
  164. package/.trunk/trunk.yaml +0 -34
  165. package/docs/superpowers/bidi-roadmap.md +0 -60
  166. package/docs/superpowers/plans/2026-09-29-auto-wait.md +0 -1827
  167. package/docs/superpowers/plans/2026-09-29-expect.md +0 -1350
  168. package/docs/superpowers/plans/2026-10-01-ci.md +0 -350
  169. package/docs/superpowers/plans/2026-10-01-test-api-alignment.md +0 -1821
  170. package/docs/superpowers/recorder-roadmap.md +0 -52
  171. package/docs/superpowers/specs/2026-09-29-auto-wait-design.md +0 -185
  172. package/docs/superpowers/specs/2026-09-29-bidi-foundation-design.md +0 -130
  173. package/docs/superpowers/specs/2026-09-29-contexts-and-storage-design.md +0 -88
  174. package/docs/superpowers/specs/2026-09-29-downloads-and-file-dialogs-design.md +0 -94
  175. package/docs/superpowers/specs/2026-09-29-emulation-design.md +0 -88
  176. package/docs/superpowers/specs/2026-09-29-expect-design.md +0 -130
  177. package/docs/superpowers/specs/2026-09-29-locate-nodes-design.md +0 -90
  178. package/docs/superpowers/specs/2026-09-29-logs-and-errors-design.md +0 -87
  179. package/docs/superpowers/specs/2026-09-29-navigation-waits-design.md +0 -83
  180. package/docs/superpowers/specs/2026-09-29-network-data-design.md +0 -78
  181. package/docs/superpowers/specs/2026-09-29-network-interception-design.md +0 -91
  182. package/docs/superpowers/specs/2026-09-29-network-tracking-design.md +0 -86
  183. package/docs/superpowers/specs/2026-09-29-page-api-design.md +0 -90
  184. package/docs/superpowers/specs/2026-09-29-preload-scripts-design.md +0 -82
  185. package/docs/superpowers/specs/2026-09-29-script-call-function-design.md +0 -107
  186. package/docs/superpowers/specs/2026-09-29-set-files-design.md +0 -62
  187. package/docs/superpowers/specs/2026-09-29-user-prompts-design.md +0 -75
  188. package/docs/superpowers/specs/2026-10-01-ci-design.md +0 -106
  189. package/docs/superpowers/specs/2026-10-01-test-api-alignment-design.md +0 -241
  190. package/public/logo-dark.svg +0 -236
  191. package/public/logo-light.svg +0 -262
  192. package/samurai.config.ts +0 -7
  193. package/src/assert/assertion-error.test.ts +0 -55
  194. package/src/assert/assertion-error.ts +0 -62
  195. package/src/assert/expect-locator.test.ts +0 -217
  196. package/src/assert/expect.test.ts +0 -73
  197. package/src/assert/expect.ts +0 -299
  198. package/src/browser/browser-context.browser-test.ts +0 -201
  199. package/src/browser/browser-context.test.ts +0 -407
  200. package/src/browser/browser-context.ts +0 -208
  201. package/src/browser/browser-finder.ts +0 -110
  202. package/src/browser/browser.test.ts +0 -88
  203. package/src/browser/browser.ts +0 -515
  204. package/src/browser/context-tree.test.ts +0 -86
  205. package/src/browser/context-tree.ts +0 -70
  206. package/src/browser/dialog.browser-test.ts +0 -144
  207. package/src/browser/dialog.test.ts +0 -322
  208. package/src/browser/dialog.ts +0 -83
  209. package/src/browser/download.test.ts +0 -161
  210. package/src/browser/download.ts +0 -172
  211. package/src/browser/downloads-dir.test.ts +0 -75
  212. package/src/browser/downloads-dir.ts +0 -39
  213. package/src/browser/emulation.browser-test.ts +0 -186
  214. package/src/browser/emulation.test.ts +0 -200
  215. package/src/browser/emulation.ts +0 -204
  216. package/src/browser/file-chooser.test.ts +0 -142
  217. package/src/browser/file-chooser.ts +0 -99
  218. package/src/browser/file-paths.ts +0 -18
  219. package/src/browser/goto.browser-test.ts +0 -44
  220. package/src/browser/navigation-error.ts +0 -26
  221. package/src/browser/navigation.browser-test.ts +0 -172
  222. package/src/browser/page-api.browser-test.ts +0 -228
  223. package/src/browser/page-logs.browser-test.ts +0 -119
  224. package/src/browser/page-logs.test.ts +0 -212
  225. package/src/browser/page-logs.ts +0 -208
  226. package/src/browser/page-wait.ts +0 -19
  227. package/src/browser/page.test.ts +0 -1567
  228. package/src/browser/page.ts +0 -1176
  229. package/src/browser/pdf.ts +0 -62
  230. package/src/browser/screenshot.ts +0 -65
  231. package/src/browser/transfers.browser-test.ts +0 -180
  232. package/src/config/config.ts +0 -33
  233. package/src/config/default.ts +0 -5
  234. package/src/config/fixtures.test.ts +0 -137
  235. package/src/config/mask.test.ts +0 -143
  236. package/src/config/mask.ts +0 -87
  237. package/src/config/run-settings.test.ts +0 -163
  238. package/src/config/run-settings.ts +0 -114
  239. package/src/config/secrets.ts +0 -70
  240. package/src/config/variables.ts +0 -31
  241. package/src/index.ts +0 -10
  242. package/src/locator/action-timeout-error.test.ts +0 -83
  243. package/src/locator/action-timeout-error.ts +0 -72
  244. package/src/locator/element-state.test.ts +0 -181
  245. package/src/locator/element-state.ts +0 -159
  246. package/src/locator/locate-nodes.browser-test.ts +0 -169
  247. package/src/locator/locator-actions.test.ts +0 -355
  248. package/src/locator/locator-chain.test.ts +0 -292
  249. package/src/locator/locator.browser-test.ts +0 -137
  250. package/src/locator/locator.test.ts +0 -179
  251. package/src/locator/locator.ts +0 -656
  252. package/src/locator/selector-errors.ts +0 -18
  253. package/src/locator/selector.test.ts +0 -124
  254. package/src/locator/selector.ts +0 -107
  255. package/src/locator/set-files.browser-test.ts +0 -141
  256. package/src/locator/set-files.test.ts +0 -191
  257. package/src/locator/text-locator.test.ts +0 -118
  258. package/src/logger/index.test.ts +0 -28
  259. package/src/logger/index.ts +0 -40
  260. package/src/network/data-collector.test.ts +0 -111
  261. package/src/network/data-collector.ts +0 -92
  262. package/src/network/network-data.browser-test.ts +0 -192
  263. package/src/network/network-tracker.browser-test.ts +0 -151
  264. package/src/network/network-tracker.test.ts +0 -307
  265. package/src/network/network-tracker.ts +0 -286
  266. package/src/network/network-wait.ts +0 -28
  267. package/src/network/response.test.ts +0 -93
  268. package/src/network/response.ts +0 -58
  269. package/src/network/router.browser-test.ts +0 -260
  270. package/src/network/router.test.ts +0 -528
  271. package/src/network/router.ts +0 -420
  272. package/src/network/url-match.test.ts +0 -69
  273. package/src/network/url-match.ts +0 -41
  274. package/src/runner/page-logs-report.test.ts +0 -144
  275. package/src/runner/page-logs-report.ts +0 -82
  276. package/src/runner/prepare-run.test.ts +0 -33
  277. package/src/runner/prepare-run.ts +0 -36
  278. package/src/runner/registry.test.ts +0 -59
  279. package/src/runner/registry.ts +0 -46
  280. package/src/runner/reporter.test.ts +0 -73
  281. package/src/runner/reporter.ts +0 -109
  282. package/src/runner/test-error.test.ts +0 -39
  283. package/src/runner/test-error.ts +0 -20
  284. package/src/runner/test-runner.ts +0 -184
  285. package/src/script/call-function.browser-test.ts +0 -112
  286. package/src/script/call-function.test.ts +0 -174
  287. package/src/script/call-function.ts +0 -113
  288. package/src/script/helpers.test.ts +0 -116
  289. package/src/script/helpers.ts +0 -68
  290. package/src/script/preload.browser-test.ts +0 -144
  291. package/src/script/preload.test.ts +0 -180
  292. package/src/script/preload.ts +0 -102
  293. package/src/script/serialize.test.ts +0 -182
  294. package/src/script/serialize.ts +0 -203
  295. package/src/testing/browser-fixture.ts +0 -18
  296. package/src/testing/fake-websocket.ts +0 -72
  297. package/src/testing/stub-connector.ts +0 -154
  298. package/src/tests/index.spec.ts +0 -30
  299. package/src/transport/bidi-connection.test.ts +0 -155
  300. package/src/transport/bidi-connection.ts +0 -256
  301. package/src/transport/bidi-error.ts +0 -23
  302. package/src/transport/foundation.browser-test.ts +0 -73
  303. package/src/transport/subscriptions.test.ts +0 -140
  304. package/src/transport/subscriptions.ts +0 -110
  305. package/src/types/bidi-commands.test-d.ts +0 -55
  306. package/src/wait/wait-until.test.ts +0 -117
  307. package/src/wait/wait-until.ts +0 -86
  308. package/tsconfig.json +0 -44
  309. /package/{src/api.ts → dist/api.d.ts} +0 -0
  310. /package/{src/locator/text-locator.ts → dist/locator/text-locator.js} +0 -0
  311. /package/{src → dist}/types/bidi-modules/browser.d.ts +0 -0
  312. /package/{src → dist}/types/bidi-modules/browsing-context.d.ts +0 -0
  313. /package/{src → dist}/types/bidi-modules/emulation.d.ts +0 -0
  314. /package/{src → dist}/types/bidi-modules/input.d.ts +0 -0
  315. /package/{src → dist}/types/bidi-modules/log.d.ts +0 -0
  316. /package/{src → dist}/types/bidi-modules/network.d.ts +0 -0
  317. /package/{src → dist}/types/bidi-modules/permissions.d.ts +0 -0
  318. /package/{src → dist}/types/bidi-modules/script.d.ts +0 -0
  319. /package/{src → dist}/types/bidi-modules/session.d.ts +0 -0
  320. /package/{src → dist}/types/bidi-modules/storage.d.ts +0 -0
  321. /package/{src → dist}/types/bidi-modules/web-extensions.d.ts +0 -0
  322. /package/{src → dist}/types/bidi-protocols/command.d.ts +0 -0
  323. /package/{src → dist}/types/bidi-protocols/error.d.ts +0 -0
  324. /package/{src → dist}/types/bidi-protocols/event.d.ts +0 -0
  325. /package/{src → dist}/types/bidi.d.ts +0 -0
  326. /package/{src → dist}/types/browser.d.ts +0 -0
  327. /package/{src → dist}/types/config.d.ts +0 -0
  328. /package/{src → dist}/types/env.d.ts +0 -0
@@ -0,0 +1,20 @@
1
+ export interface WaitOptions {
2
+ /** Total time (ms) to keep probing; 0 probes exactly once */
3
+ timeout: number;
4
+ /** Time (ms) between probes. @default 100 */
5
+ interval?: number;
6
+ }
7
+ export declare class WaitTimeoutError<T> extends Error {
8
+ readonly timeout: number;
9
+ /** Last completed probe result; undefined when no probe completed */
10
+ readonly last: T | undefined;
11
+ constructor(timeout: number, last: T | undefined);
12
+ }
13
+ /** Per-call timeout, else the active run's expect timeout, else config `expect.timeout`, else 5000 */
14
+ export declare function resolveTimeout(perCall?: number): Promise<number>;
15
+ /**
16
+ * Probes until `isDone(current, previous)` is true and resolves with that result.
17
+ * Always probes at least once; with `timeout > 0` every probe races the time left.
18
+ * Probe errors are rethrown immediately. Throws WaitTimeoutError at the deadline.
19
+ */
20
+ export declare function waitUntil<T>(probe: () => Promise<T>, isDone: (current: T, previous: T | undefined) => boolean, { timeout, interval }: WaitOptions): Promise<T>;
@@ -0,0 +1,63 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
2
+ import { readConfig } from "../config/config.js";
3
+ import { peekRunSettings } from "../config/run-settings.js";
4
+ const DEFAULT_TIMEOUT = 5000;
5
+ const DEFAULT_INTERVAL = 100;
6
+ export class WaitTimeoutError extends Error {
7
+ constructor(timeout, last) {
8
+ super(`Condition not met within ${timeout}ms`);
9
+ this.name = "WaitTimeoutError";
10
+ this.timeout = timeout;
11
+ this.last = last;
12
+ }
13
+ }
14
+ /** Per-call timeout, else the active run's expect timeout, else config `expect.timeout`, else 5000 */
15
+ export async function resolveTimeout(perCall) {
16
+ if (perCall !== undefined)
17
+ return perCall;
18
+ const run = peekRunSettings();
19
+ if (run)
20
+ return run.expectTimeout;
21
+ return (await readConfig("expect"))?.timeout ?? DEFAULT_TIMEOUT;
22
+ }
23
+ const DEADLINE = Symbol("deadline");
24
+ /**
25
+ * Races `probe()` against the time left. Resolves `{ value }` when the probe wins,
26
+ * DEADLINE when the time runs out first; probe errors reject as-is.
27
+ */
28
+ function probeBefore(probe, remaining) {
29
+ const probing = probe();
30
+ let timer;
31
+ const expired = new Promise((resolve) => {
32
+ timer = setTimeout(() => resolve(DEADLINE), remaining);
33
+ });
34
+ // A probe that loses the race may still fail later; nobody is waiting for it any more
35
+ probing.catch(() => { });
36
+ return Promise.race([probing.then((value) => ({ value })), expired]).finally(() => clearTimeout(timer));
37
+ }
38
+ /**
39
+ * Probes until `isDone(current, previous)` is true and resolves with that result.
40
+ * Always probes at least once; with `timeout > 0` every probe races the time left.
41
+ * Probe errors are rethrown immediately. Throws WaitTimeoutError at the deadline.
42
+ */
43
+ export async function waitUntil(probe, isDone, { timeout, interval = DEFAULT_INTERVAL }) {
44
+ const deadline = Date.now() + timeout;
45
+ let previous;
46
+ for (let first = true;; first = false) {
47
+ const remaining = deadline - Date.now();
48
+ // Only start a probe while time remains; a later one could only lose the race
49
+ if (!first && remaining <= 0)
50
+ throw new WaitTimeoutError(timeout, previous);
51
+ // timeout 0 keeps the single probe un-raced so it always completes
52
+ const result = timeout > 0 ? await probeBefore(probe, remaining) : { value: await probe() };
53
+ if (result === DEADLINE)
54
+ throw new WaitTimeoutError(timeout, previous);
55
+ if (isDone(result.value, previous))
56
+ return result.value;
57
+ previous = result.value;
58
+ const left = deadline - Date.now();
59
+ if (left <= 0)
60
+ throw new WaitTimeoutError(timeout, previous);
61
+ await sleep(Math.min(interval, left));
62
+ }
63
+ }
package/package.json CHANGED
@@ -1,16 +1,37 @@
1
1
  {
2
2
  "name": "@itmetsam/samurai-framework",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "",
5
- "main": "index.js",
5
+ "main": "dist/api.js",
6
6
  "exports": {
7
- ".": "./src/api.ts"
7
+ ".": {
8
+ "types": "./dist/api.d.ts",
9
+ "default": "./dist/api.js"
10
+ },
11
+ "./runner": {
12
+ "types": "./dist/runner/run.d.ts",
13
+ "default": "./dist/runner/run.js"
14
+ },
15
+ "./steps": {
16
+ "types": "./dist/steps/index.d.ts",
17
+ "default": "./dist/steps/index.js"
18
+ },
19
+ "./recorder": {
20
+ "types": "./dist/recorder/index.d.ts",
21
+ "default": "./dist/recorder/index.js"
22
+ },
23
+ "./browser": {
24
+ "types": "./dist/browser/index.d.ts",
25
+ "default": "./dist/browser/index.js"
26
+ },
27
+ "./package.json": "./package.json"
8
28
  },
9
29
  "scripts": {
10
30
  "dev": "tsx src/index.ts",
11
- "build": "tsc",
31
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && node scripts/copy-types.mjs",
12
32
  "test": "tsx --test --test-timeout=10000 \"src/**/*.test.ts\"",
13
- "test:browser": "tsx --test --test-concurrency=1 \"src/**/*.browser-test.ts\""
33
+ "test:browser": "tsx --test --test-concurrency=1 \"src/**/*.browser-test.ts\"",
34
+ "test:cli": "tsx --test --test-concurrency=1 \"src/**/*.cli-test.ts\""
14
35
  },
15
36
  "keywords": [],
16
37
  "author": "",
@@ -18,10 +39,26 @@
18
39
  "type": "module",
19
40
  "devDependencies": {
20
41
  "@types/node": "^25.6.0",
21
- "tsx": "^4.21.0",
22
- "typescript": "^6.0.2"
42
+ "tsx": "^4.21.0"
23
43
  },
24
44
  "dependencies": {
45
+ "typescript": "^6.0.2",
25
46
  "winston": "^3.19.0"
47
+ },
48
+ "types": "dist/api.d.ts",
49
+ "files": [
50
+ "dist",
51
+ "bin"
52
+ ],
53
+ "bin": {
54
+ "samurai": "bin/samurai.mjs"
55
+ },
56
+ "peerDependencies": {
57
+ "tsx": "^4.21.0"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "tsx": {
61
+ "optional": true
62
+ }
26
63
  }
27
64
  }
@@ -1,7 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npx tsc *)"
5
- ]
6
- }
7
- }
package/.env.example DELETED
@@ -1,3 +0,0 @@
1
- # Copy to .env.<environment>, e.g. .env.staging. Never commit real values.
2
- # Tests read these as secrets.TEST_CARD; real environment variables win over this file.
3
- SAMURAI_SECRET_TEST_CARD=
@@ -1,16 +0,0 @@
1
- name: Setup
2
- description: Install bun, Node and the locked dependencies
3
-
4
- runs:
5
- using: composite
6
- steps:
7
- - uses: oven-sh/setup-bun@v2
8
- with:
9
- bun-version: 1.3.0
10
- # The test scripts run tsx on Node's test runner, which needs Node 22+ (fs/promises glob)
11
- - uses: actions/setup-node@v4
12
- with:
13
- node-version: 26
14
- - name: Install dependencies
15
- shell: bash
16
- run: bun install --frozen-lockfile
@@ -1,71 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- concurrency:
9
- group: ci-${{ github.ref }}
10
- cancel-in-progress: ${{ github.event_name == 'pull_request' }}
11
-
12
- permissions:
13
- contents: read
14
-
15
- jobs:
16
- typecheck:
17
- name: Typecheck
18
- runs-on: ubuntu-latest
19
- timeout-minutes: 5
20
- steps:
21
- - uses: actions/checkout@v4
22
- - uses: ./.github/actions/setup
23
- - name: Typecheck
24
- run: bunx tsc --noEmit -p .
25
-
26
- unit:
27
- name: Unit tests
28
- runs-on: ubuntu-latest
29
- timeout-minutes: 10
30
- steps:
31
- - uses: actions/checkout@v4
32
- - uses: ./.github/actions/setup
33
- - name: Unit tests
34
- run: bun run test
35
-
36
- browser:
37
- name: Browser tests (Firefox)
38
- runs-on: ubuntu-latest
39
- timeout-minutes: 15
40
- steps:
41
- - uses: actions/checkout@v4
42
- - uses: ./.github/actions/setup
43
- - name: Firefox version
44
- run: firefox --version
45
- - name: Browser tests
46
- timeout-minutes: 12
47
- run: bun run test:browser
48
- - name: Upload logs
49
- if: failure()
50
- uses: actions/upload-artifact@v4
51
- with:
52
- name: browser-test-logs
53
- path: |
54
- logs/
55
- result/
56
- retention-days: 7
57
- if-no-files-found: ignore
58
-
59
- trunk:
60
- name: Code quality (Trunk)
61
- runs-on: ubuntu-latest
62
- timeout-minutes: 15
63
- permissions:
64
- contents: read
65
- checks: write
66
- steps:
67
- - uses: actions/checkout@v4
68
- with:
69
- fetch-depth: 0
70
- # Checks only what the PR or push changed; linters come from .trunk/trunk.yaml
71
- - uses: trunk-io/trunk-action@v1
@@ -1,2 +0,0 @@
1
- # Prettier friendly markdownlint config (all formatting rules disabled)
2
- extends: markdownlint/style/prettier
@@ -1,7 +0,0 @@
1
- rules:
2
- quoted-strings:
3
- required: only-when-needed
4
- extra-allowed: ["{|}"]
5
- key-duplicates: {}
6
- octal-values:
7
- forbid-implicit-octal: true
@@ -1,14 +0,0 @@
1
- export default {
2
- plugins: [
3
- {
4
- name: "preset-default",
5
- params: {
6
- overrides: {
7
- removeViewBox: false, // https://github.com/svg/svgo/issues/1128
8
- sortAttrs: true,
9
- removeOffCanvasPaths: true,
10
- },
11
- },
12
- },
13
- ],
14
- };
package/.trunk/trunk.yaml DELETED
@@ -1,34 +0,0 @@
1
- # This file controls the behavior of Trunk: https://docs.trunk.io/cli
2
- # To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
3
- version: 0.1
4
- cli:
5
- version: 1.25.0
6
- # Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
7
- plugins:
8
- sources:
9
- - id: trunk
10
- ref: v1.11.0
11
- uri: https://github.com/trunk-io/plugins
12
- # Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
13
- runtimes:
14
- enabled:
15
- - node@22.16.0
16
- - python@3.14.4
17
- # This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
18
- lint:
19
- enabled:
20
- - checkov@3.3.22
21
- - git-diff-check
22
- - grype@0.119.0
23
- - markdownlint@0.49.1
24
- - osv-scanner@2.6.0
25
- - prettier@3.9.9
26
- - svgo@4.1.0
27
- - trufflehog@3.97.9
28
- - yamllint@1.38.0
29
- actions:
30
- enabled:
31
- - trunk-announce
32
- - trunk-check-pre-push
33
- - trunk-fmt-pre-commit
34
- - trunk-upgrade-available
@@ -1,60 +0,0 @@
1
- # WebDriver BiDi adoption — roadmap
2
-
3
- Date: 2026-09-29
4
- Source: https://www.w3.org/TR/webdriver-bidi/
5
- Status: all 15 specs (0 to 14) are implemented.
6
-
7
- Each item links to its spec in `docs/superpowers/specs/`. Order respects dependencies (`←`).
8
-
9
- ## Todo
10
-
11
- ### Phase 0 — prerequisite
12
- - [x] **0. Foundation** — connector error replies, command typings, refcounted subscriptions, context tree, `newPage` fix — [spec](specs/2026-09-29-bidi-foundation-design.md)
13
-
14
- ### Phase 1 — locator core
15
- - [x] **1. `script.callFunction` (+ `script.disown`)** ← 0 — [spec](specs/2026-09-29-script-call-function-design.md)
16
- - [x] **2. `script.addPreloadScript`** ← 0, 1 — [spec](specs/2026-09-29-preload-scripts-design.md)
17
- - [x] **3. `browsingContext.locateNodes`** ← 1 (2 optional) — [spec](specs/2026-09-29-locate-nodes-design.md)
18
- - [x] **4. `input.setFiles`** ← 1, 3 — [spec](specs/2026-09-29-set-files-design.md)
19
-
20
- ### Phase 2 — waiting correctness
21
- - [x] **5. Network tracking + real network idle** ← 0 — [spec](specs/2026-09-29-network-tracking-design.md)
22
- - [x] **6. Navigation waits (`navigate` wait, load events, reload)** ← 0, 5 — [spec](specs/2026-09-29-navigation-waits-design.md)
23
- - [x] **7. User prompts (`handleUserPrompt`)** ← 0 — [spec](specs/2026-09-29-user-prompts-design.md)
24
- - [x] **8. Logs and page errors (`log.entryAdded`)** ← 0, 1 — [spec](specs/2026-09-29-logs-and-errors-design.md)
25
-
26
- ### Phase 3 — features
27
- - [x] **9. Network interception (mock / block / modify)** ← 0, 5 — [spec](specs/2026-09-29-network-interception-design.md)
28
- - [x] **10. Network data (cache control, response bodies)** ← 5 — [spec](specs/2026-09-29-network-data-design.md)
29
- - [x] **11. Page API completeness (viewport, reload, history, close, pdf, screenshot)** ← 0, 1 — [spec](specs/2026-09-29-page-api-design.md)
30
- - [x] **12. User contexts + storage** ← 0 — [spec](specs/2026-09-29-contexts-and-storage-design.md)
31
-
32
- ### Phase 4 — nice to have
33
- - [x] **13. Emulation** ← 12 — [spec](specs/2026-09-29-emulation-design.md)
34
- - [x] **14. Downloads + file dialogs** ← 0, 4 — [spec](specs/2026-09-29-downloads-and-file-dialogs-design.md)
35
-
36
- ## Dependency graph
37
-
38
- ```
39
- 0 ─┬─ 1 ─┬─ 2
40
- │ ├─ 3 ── 4 ── 14
41
- │ ├─ 8
42
- │ └─ 11
43
- ├─ 5 ─┬─ 6
44
- │ ├─ 9
45
- │ └─ 10
46
- ├─ 7
47
- └─ 12 ── 13
48
- ```
49
-
50
- ## Deliberately skipped
51
-
52
- `webExtension.*`, `session.end`, `script.getRealms`, `script.removePreloadScript` as public API (used internally only), `network.continueWithAuth` (folded into spec 9 as a follow-up).
53
-
54
- ## Cross-cutting rules for every spec
55
-
56
- - Test-first: each unit test before its implementation, using `src/testing/stub-connector.ts`; browser tests in `*.browser-test.ts` (`npm run test:browser`).
57
- - Any feature that needs an event subscribes through the refcounted API from spec 0, never a bare `session.subscribe`.
58
- - Every command a feature sends must be typed in `BiDiCommands` (spec 0 lists the missing ones).
59
- - Timeouts resolve through `resolveTimeout` (actions/assertions) or the navigation timeout from spec 6 (navigation); no unbounded waits.
60
- - Browser support is verified against Firefox (the only `SupportedBrowser` today). A command Firefox lacks is documented in its spec and surfaced as `UnsupportedOperationError`, not a hang.