everyscreen 0.0.0-stage → 0.1.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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -2
  3. package/dist/cli.d.mts +1 -0
  4. package/dist/cli.mjs +2958 -0
  5. package/dist/commands-logic-DVWfSe3O.mjs +217 -0
  6. package/dist/dashboard/assets/button-N-Nucq_K.js +1 -0
  7. package/dist/dashboard/assets/cn-DMYzmXtt.js +1 -0
  8. package/dist/dashboard/assets/device-status-logic-Silf3YXA.js +1 -0
  9. package/dist/dashboard/assets/devices-5pEUg6rA.js +1 -0
  10. package/dist/dashboard/assets/dist-CnPFbxes.js +1 -0
  11. package/dist/dashboard/assets/focus._deviceId-DGel-kWw.js +1 -0
  12. package/dist/dashboard/assets/frame-layout-logic-H_x71NvW.js +1 -0
  13. package/dist/dashboard/assets/index-DNHZ-i1B.css +2 -0
  14. package/dist/dashboard/assets/index-DwPQ0eY_.js +10 -0
  15. package/dist/dashboard/assets/modal-dialog-BaO9xkRr.js +1 -0
  16. package/dist/dashboard/assets/rolldown-runtime-WkwZ5CU-.js +1 -0
  17. package/dist/dashboard/assets/routes-CUFa9tL0.js +1 -0
  18. package/dist/dashboard/assets/run-origin-badge-BeFqg0AC.js +1 -0
  19. package/dist/dashboard/assets/runs-queries-BYBE7R9S.js +2 -0
  20. package/dist/dashboard/assets/runs._runId-CokpJ1Rr.js +1 -0
  21. package/dist/dashboard/assets/runs.index-ZsynzkKU.js +1 -0
  22. package/dist/dashboard/assets/schemas-BPFqmBjG.js +55 -0
  23. package/dist/dashboard/assets/screen-boundary-BauyD9pu.js +1 -0
  24. package/dist/dashboard/assets/status-chip-yqTTTuyZ.js +1 -0
  25. package/dist/dashboard/assets/tile-status-chip-DisgbNnH.js +1 -0
  26. package/dist/dashboard/assets/toggle-nciug_di.js +1 -0
  27. package/dist/dashboard/assets/use-run-totals-B3G4yamQ.js +1 -0
  28. package/dist/dashboard/assets/useNavigate-8mkM-ffY.js +1 -0
  29. package/dist/dashboard/assets/useParams-D2lK5BEg.js +1 -0
  30. package/dist/dashboard/index.html +29 -0
  31. package/dist/devices-store-edScJDie.mjs +1228 -0
  32. package/dist/playwright-logic-QFlBFspE.d.mts +138 -0
  33. package/dist/playwright.d.mts +2 -0
  34. package/dist/playwright.mjs +18 -0
  35. package/dist/read-hub-file-N4rZ-6Wr.mjs +180 -0
  36. package/dist/report-hub-trouble-BjbcuK21.d.mts +2 -0
  37. package/dist/report-hub-trouble-CaUiyteI.mjs +41 -0
  38. package/dist/reporter.d.mts +47 -0
  39. package/dist/reporter.mjs +250 -0
  40. package/dist/run-one-at-a-time-BeV_a3Fm.mjs +48 -0
  41. package/dist/runs-store-Bd_ITPFj.mjs +283 -0
  42. package/dist/test.d.mts +11 -0
  43. package/dist/test.mjs +69 -0
  44. package/package.json +106 -4
  45. package/src/dashboard/ui/theme.css +28 -0
  46. package/src/skill/SKILL.md +15 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yosef Hayim Sabag
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,242 @@
1
- # Temporary Holding Version
1
+ # Everyscreen
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ See every screen while your agent tests it.
4
+
5
+ Everyscreen runs your web app in one browser per device, on a grid of phones, tablets and laptops. Your coding agent opens, taps, types, scrolls, checks and takes screenshots on all of them at once, and gets one line back for each command.
6
+
7
+ ![The dashboard grid during a live test run on 12 devices](.github/dashboard-grid.png)
8
+
9
+ ## Install
10
+
11
+ You need Node 22.17 or newer. Add the package to your app:
12
+
13
+ ```sh
14
+ pnpm add -D everyscreen
15
+ ```
16
+
17
+ Install the Playwright browsers once. Everyscreen uses Chromium and WebKit:
18
+
19
+ ```sh
20
+ npx playwright install chromium webkit
21
+ ```
22
+
23
+ ## Quick start
24
+
25
+ Start your app on its own port, then run these in your app folder:
26
+
27
+ ```sh
28
+ npx everyscreen start
29
+ npx everyscreen open --url http://localhost:3000
30
+ npx everyscreen shot
31
+ npx everyscreen stop
32
+ ```
33
+
34
+ `start` opens the hub on `127.0.0.1` (port 4100 by default, change it with `--port`) and one browser per device in the grid. Every command after it acts on all devices.
35
+
36
+ In a terminal, each command prints one line:
37
+
38
+ ```text
39
+ 12 devices · 12 ok · report run-0001
40
+ ```
41
+
42
+ A `warn` finding is counted in its own column and does not fail the device. A device that has a `failed` finding, or a step that times out, is counted as failed and its line names the device:
43
+
44
+ ```text
45
+ 12 devices · 3 ok · 9 warn · report run-0001
46
+ 1 device · 0 ok · 1 failed · report run-0003
47
+ iphone-17 failed locator.waitFor: Timeout 10000ms exceeded. 10006 ms
48
+ ```
49
+
50
+ A wrong or missing flag prints one `bad usage` line that names what to pass, and exits with code 2:
51
+
52
+ ```text
53
+ bad usage · open needs --url <web address, like https://example.com>
54
+ ```
55
+
56
+ When you pipe the output or pass `--json`, the command prints one JSON object with `status`, `line`, `runId` and `failures`, and never asks a question. Exit codes: `0` ok, `1` failed, `2` bad usage.
57
+
58
+ ## Use it with your agent
59
+
60
+ Install the Everyscreen skill once, so your agent knows the commands:
61
+
62
+ ```sh
63
+ npx everyscreen skill install
64
+ ```
65
+
66
+ The default agent is Claude, which writes `.claude/skills/everyscreen/SKILL.md`. Use `--agent codex` for `.agents/skills/everyscreen/SKILL.md` or `--agent cursor` for `.cursor/skills/everyscreen/SKILL.md`. Running it again asks before it overwrites the file; pass `--yes` to overwrite without asking.
67
+
68
+ ## Commands
69
+
70
+ Every command takes `--json` and `--help`. `--device <id>` runs a command on one device instead of all of them.
71
+
72
+ | Command | What it does |
73
+ | ------------------------------------------------------------------ | ------------------------------------------------------------ |
74
+ | `everyscreen start [--port <number>] [--foreground]` | Start the hub and one browser per device, in the background |
75
+ | `everyscreen stop` | Stop the hub and close every device browser |
76
+ | `everyscreen status` | Show whether the hub is running and how many devices it has |
77
+ | `everyscreen open --url <url>` | Open a url on every device |
78
+ | `everyscreen tap --role <role> --name <name>` | Tap an element by its ARIA role and accessible name |
79
+ | `everyscreen fill --role <role> --name <name> --with <text>` | Type into a field |
80
+ | `everyscreen scroll --to top\|bottom` | Scroll to the top or the bottom of the page |
81
+ | `everyscreen check` | Run the six checks on the current page |
82
+ | `everyscreen shot` | Save a screenshot of every device |
83
+ | `everyscreen expect --text <text>` | Check that some text shows on every device |
84
+ | `everyscreen sweep --url <url>` | Visit the routes of your app and save a shot on every device |
85
+ | `everyscreen devices list` | List the devices in the grid |
86
+ | `everyscreen devices add --name <name> --width <px> --height <px>` | Add a custom device to `everyscreen.yaml` |
87
+ | `everyscreen devices remove --device <id>` | Remove a custom device from `everyscreen.yaml` |
88
+ | `everyscreen run [--flows <glob>]` | Run YAML flows on the devices they name |
89
+ | `everyscreen skill install [--agent claude\|codex\|cursor]` | Install the agent skill |
90
+
91
+ Role values for `tap` and `fill` are ARIA roles, for example `button`, `link`, `textbox`, `checkbox` or `tab`.
92
+
93
+ Each command measures the page after it acts. A `failed` finding fails that command, so a page with horizontal overflow fails `open`, `tap`, `expect` and `shot` as well as `check`. A `warn` finding is counted in the reply and does not fail it.
94
+
95
+ ## Flows
96
+
97
+ A flow is a YAML file in `flows/` that lists the steps and the devices to run them on. This is `flows/coupon.yaml`:
98
+
99
+ ```yaml
100
+ name: Checkout with a coupon
101
+ devices: [iphone-17, pixel-10]
102
+ steps:
103
+ - open: http://localhost:3000/checkout
104
+ - fill: { role: textbox, name: Coupon, with: SPRING }
105
+ - tap: { role: button, name: Apply }
106
+ - expect: { text: "Total $66" }
107
+ ```
108
+
109
+ Run every flow in `flows/`:
110
+
111
+ ```sh
112
+ npx everyscreen run
113
+ ```
114
+
115
+ ```text
116
+ 1 flow · 1 ok · report run-0001
117
+ ```
118
+
119
+ Each device a flow names must be running in the hub. Leave `devices` out, or set it to `null`, to run the flow on every grid device. Use `--flows <glob>` to pick other files and `--parallel <number>` to run flows at the same time.
120
+
121
+ ## Sweep your app
122
+
123
+ `sweep` starts at one url, follows the links it finds, and saves a screenshot on every device for each route, up to `--max-routes` (default 50, up to 500):
124
+
125
+ ```sh
126
+ npx everyscreen sweep --url http://localhost:3000 --devices iphone-17,pixel-10 --max-routes 10
127
+ ```
128
+
129
+ ```text
130
+ 2 routes · 2 devices · 4 shots · 0 findings · 2 ok · report run-0002
131
+ ```
132
+
133
+ The line adds `warn` and `failed` counts when a route has findings of that kind. Use `--devices all` to sweep all 60 catalog devices. Use `--before <flow.yaml>` to run a flow first on each device, for example a login. Routes you list in `routes` in `everyscreen.yaml` are visited too. Screenshots go to `.everyscreen/shots/`.
134
+
135
+ ## Checks
136
+
137
+ Every command runs these checks on the page after it acts:
138
+
139
+ - `overflow` (failed): an element runs past the edge of the screen
140
+ - `clipped-text` (warn): text is cut off by its box
141
+ - `safe-area` (warn): an element sits under the notch or the home bar
142
+ - `tap-target` (warn): a tap target is smaller than the minimum tap size
143
+ - `console-error` (failed): the page writes an error to the browser console
144
+ - `failed-request` (failed): a network request fails
145
+
146
+ Each finding names the device and the element. A device with a failed finding is listed in `failures` with its shot path.
147
+
148
+ ## Devices
149
+
150
+ The grid shows 12 devices by default: `iphone-se`, `iphone-17`, `iphone-17-pro-max`, `galaxy-s25`, `pixel-10`, `xiaomi-15`, `ipad-mini`, `ipad-pro-11`, `galaxy-tab-s9`, `macbook-air-13`, `windows-laptop-1366` and `linux-1920`. The catalog has 60 devices in all. Run `npx everyscreen devices list` to see the grid.
151
+
152
+ Add your own device to `everyscreen.yaml`:
153
+
154
+ ```sh
155
+ npx everyscreen devices add --name "Lobby kiosk" --width 900 --height 1200
156
+ ```
157
+
158
+ ```text
159
+ device added · lobby-kiosk
160
+ ```
161
+
162
+ The new device joins the running grid at once, so `open --device lobby-kiosk` works right away. Remove it the same way:
163
+
164
+ ```sh
165
+ npx everyscreen devices remove --device lobby-kiosk --yes
166
+ ```
167
+
168
+ ```text
169
+ device removed · lobby-kiosk
170
+ ```
171
+
172
+ `devices remove` asks before it changes the file, and needs `--yes` when no terminal is attached.
173
+
174
+ The built-in catalog has Chromium and WebKit devices only. A custom device can set `browserName: firefox` in `everyscreen.yaml`, but Firefox is not tested here.
175
+
176
+ ## Config file
177
+
178
+ `everyscreen.yaml` in your app folder holds custom devices, routes and the grid:
179
+
180
+ ```yaml
181
+ devices:
182
+ - name: Lobby kiosk
183
+ width: 900
184
+ height: 1200
185
+ routes:
186
+ - /checkout
187
+ grid:
188
+ - iphone-17
189
+ - pixel-10
190
+ ```
191
+
192
+ Each route starts with a single `/`. A custom device name must contain a letter or digit and be 40 characters or fewer. Width and height are 240 to 3840 pixels, and the pixel ratio is 1 to 4.
193
+
194
+ ## Playwright
195
+
196
+ Everyscreen also exports the device list and a reporter for your own Playwright tests. Install Playwright in your app, since `everyscreen/test` needs `@playwright/test` as a peer:
197
+
198
+ ```sh
199
+ pnpm add -D @playwright/test
200
+ ```
201
+
202
+ Then use the same device grid in `playwright.config.ts`:
203
+
204
+ ```ts
205
+ import { defineConfig } from "@playwright/test";
206
+ import { listDevices } from "everyscreen/playwright";
207
+
208
+ export default defineConfig({
209
+ testMatch: "**/*.suite.ts",
210
+ projects: listDevices(null),
211
+ });
212
+ ```
213
+
214
+ Import `test` and `expect` from `everyscreen/test` in your suites. Add the default export of `everyscreen/reporter` to the `reporter` list to send each run to the hub, so it shows on the dashboard.
215
+
216
+ ## Dashboard
217
+
218
+ With the hub running, open its address in a browser (for example `http://127.0.0.1:4100`). The dashboard has three pages:
219
+
220
+ - `/`: the grid of every device, live
221
+ - `/runs`: every run, and `/runs/<runId>` for one run
222
+ - `/devices`: the device list
223
+
224
+ Open `/focus/<deviceId>` for a zoomed view of one device.
225
+
226
+ ![The zoom view of Pixel 10 during a live test run](.github/dashboard-zoom.png)
227
+
228
+ ## How it works
229
+
230
+ The hub is one local process bound to `127.0.0.1`. It keeps its state in `.everyscreen/` in the folder you start it from: `hub.json` (the running hub), `hub.log`, `runs/` (one file per run) and `shots/` (screenshots). Each command sends a request to the hub and prints the one-line reply.
231
+
232
+ ## More
233
+
234
+ - [PROJECT.md](PROJECT.md): the problem, the goals and what is out of scope
235
+ - [CONTEXT.md](CONTEXT.md): the parts of the tool and how they fit
236
+ - [LANGUAGE.md](LANGUAGE.md): the words the code uses, and the words to avoid
237
+ - [AGENTS.md](AGENTS.md): how to build, test and change the repo
238
+ - [everyscreen.jtslabs.dev](https://everyscreen.jtslabs.dev): the project site
239
+
240
+ ## License
241
+
242
+ MIT
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export {}