@unotest/viewer 0.26.0 → 0.27.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,135 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.27.0] - 2026-08-31
4
+
5
+ ### Minor Changes
6
+
7
+ - The server boots quietly: Nest's per-module / per-route boot log is
8
+ gone from normal runs — the launcher's one useful line is the URL.
9
+ `UNOTEST_DEBUG` brings the full boot map back.
10
+
11
+ - The LOCAL schedule registry now shows the EFFECTIVE merged set too:
12
+ both store flavours read through one `EffectiveSchedulesReader`
13
+ (`schedules --json` across a process boundary), so config-declared
14
+ entries appear locally, stamped `source: "config"` and opened as a
15
+ read-only card ("declared in `unotest.config` — edit it there");
16
+ yaml entries stay editable. A PUT carries only the file half and
17
+ answers with the re-merged whole (`SchedulesView` for both verbs);
18
+ the envelope gains `driftedFromPush` — on a box, true when the set
19
+ read there hashes differently from the fingerprint recorded at push,
20
+ shown as a warning line in Home schedule mode. The local schedule
21
+ mode gets its own caption: "declared here — a box runs what you
22
+ push". Runners without a schedules command fall back to the yaml
23
+ half, unchanged.
24
+
25
+ - The schedule registry on a deployed tree (a box environment) is now
26
+ the EFFECTIVE merged set, read-only. `GET /api/schedules` returns
27
+ `{ schedules, readOnly }`; on a box the entries come from the
28
+ project's own CLI (`schedules --json` via the runner adapter's new
29
+ `schedulesArgs()`), so config-declared schedules are no longer
30
+ invisible in the UI. The Schedule popup becomes a read-only card with
31
+ a provenance note ("declared in the repo — edit there and push"), the
32
+ Home schedule mode shows a matching badge, and `PUT /api/schedules`
33
+ is refused with 403: on a box that write used to land in a disposable
34
+ bundle copy nothing ever re-read. Local viewers are unchanged —
35
+ editing the file is still the workflow there.
36
+
37
+ - c843d21: Schedules from the viewer — for collections and single tests.
38
+
39
+ Right-click a test or a collection in the viewer → **Schedule…**: a
40
+ human schedule builder (frequency select — every 5/15 min, hourly,
41
+ every 2/4/6/12 h, daily, weekly — plus toggle badges for minutes,
42
+ hours and weekdays; multi-select, so `04` + `16` × `00` + `30` runs
43
+ four times a day). Saved to `unotest/schedules.yaml`, versioned next
44
+ to the tests; a box applies it after commit & sync. The Home screen
45
+ gains a `last run | schedule` toggle: in schedule mode tiles are
46
+ tinted by how often a test runs (grey = not scheduled), with an
47
+ upcoming list and per-tile next-run times in your browser's clock.
48
+
49
+ Under the hood:
50
+
51
+ - `unotest/schedules.yaml` is a new schedule registry; `unotest-web
52
+ schedules [--json]` prints it merged with the config's `schedules`
53
+ (the file wins on a duplicate target), so boxes pick both up
54
+ unchanged.
55
+ - A schedule entry may now target a single test: `scenario:
56
+ <ref>` instead of `collection: <name>`.
57
+ - `unotest-web e2e <name> --scheduled[=index]` runs a test the way its
58
+ entry says (env + prepare, exit 94 when prepare fails) — the
59
+ per-test mirror of `collection --scheduled`.
60
+ - Viewer server: `GET/PUT /api/schedules` (validated by the same
61
+ parser the CLI reads the file with).
62
+
63
+ ### Patch Changes
64
+
65
+ - Updated dependencies [c843d21]
66
+ - @unotest/protocol@0.27.0
67
+ - @unotest/core@0.27.0
68
+ - @unotest/dsl@0.27.0
69
+
70
+ ## [0.26.1] - 2026-08-30
71
+
72
+ ### Patch Changes
73
+
74
+ - Fix: a run started from a box's viewer stayed pending and never reached
75
+ the history
76
+
77
+ The viewer watched the run directories of environments it could see on
78
+ disk — overlay files `unotest/.env.<name>` and existing `.runs.<name>`
79
+ directories. A box has neither at start: environment values come from the
80
+ daemon, not from a file, and the runs directory appears with the first
81
+ run. So the viewer watched only the base root while every run was filed
82
+ under `.runs.<environment>`: the tab stayed PENDING, the history stayed
83
+ empty and the run 404-ed by its own id, until a restart happened to find
84
+ the directory already there. The environment a viewer was started for is
85
+ now known to it by definition, whatever the disk says.
86
+
87
+ - Fix: a run's captured output landed outside the run's directory
88
+
89
+ `stdout.log` / `stderr.log` were written to `<runs-root>/<runId>/` while
90
+ the run itself lives under its date shard — two orphan directories next to
91
+ the shard, holding the only copy of what the child said.
92
+
93
+ - Fix: a viewer started for an environment listed no runs at all
94
+
95
+ The standalone launcher read the project root, the port, the host and the
96
+ target from its environment — but not `UNOTEST_ENV`. A box starts one
97
+ viewer per environment and names it exactly that way, so every one of them
98
+ came up on the BASE runs directory while its runs were being filed under
99
+ `.runs.<environment>`: an empty history on a box that had just finished a
100
+ suite. Found on the first end-to-end run of the local box stand.
101
+
102
+ - 9424f6b: Fix: screenshots stayed blank in the viewer when runs write to a separate
103
+ artifact root
104
+
105
+ A run whose artifacts do not live under the working directory — every run on
106
+ a box, where the sources are a disposable copy of a test bundle — emitted
107
+ `screenshot` events whose path was relativised against the working directory.
108
+ That came out as `../../../…`, which the viewer's asset route refuses to
109
+ serve, so every step preview rendered as a broken image. Artifact paths are
110
+ now relative to the artifact root, which is still the project root on every
111
+ local run.
112
+
113
+ The failure bundle had the mirror-image problem: it was written to
114
+ `.unotest/failures/` under the working directory, so on a box it landed
115
+ inside the bundle copy — outside the tree the viewer serves, and discarded on
116
+ the next bundle push. It now hangs off the artifact root too, which leaves
117
+ local runs byte-for-byte unchanged.
118
+
119
+ The inspector's Semantic DOM, Console, Network and Snapshot panes were dark
120
+ for a third reason, and this one bit local runs as well: they composed the
121
+ run's directory in the browser and left out the date shard runs have been
122
+ filed under since M-10, plus the environment suffix on a box. The viewer's
123
+ asset route now takes `?file=<name-relative-to-the-run-dir>` and resolves the
124
+ directory itself — runs root, target suffix, environment suffix and shard are
125
+ all things only the server knows. `?path=` stays for the whole paths the
126
+ server ships on run events.
127
+
128
+ - Updated dependencies [9424f6b]
129
+ - @unotest/protocol@0.26.1
130
+ - @unotest/core@0.26.1
131
+ - @unotest/dsl@0.26.1
132
+
3
133
  ## [0.26.0] - 2026-08-30
4
134
 
5
135
  ### Minor Changes
@@ -73,6 +73,14 @@ declare function startViewerServer(opts: StartViewerOptions): Promise<ViewerHand
73
73
  * the installed `@unotest/*` runner packages (by name — DIP boundary
74
74
  * intact). `UNOTEST_RUNNER_PKG` (legacy single-runner var) and
75
75
  * `UNOTEST_TARGET` just pick which detected target is active at boot. */
76
+ /** Everything the standalone launcher reads from its environment, in one
77
+ * pure place so the plumbing is testable without starting a server.
78
+ *
79
+ * `activeEnv` is the one that has bitten: a box starts one viewer per
80
+ * environment and says which through `UNOTEST_ENV`. Dropping it left every
81
+ * viewer reading the BASE runs directory while its runs were filed under
82
+ * `.runs.<env>` — an empty history on a box that had just run a suite. */
83
+ declare function viewerCliOptions(env: NodeJS.ProcessEnv, cwd: string): Omit<StartViewerOptions, "runners">;
76
84
  declare function runViewerCli(): Promise<void>;
77
85
 
78
- export { type RunnerEntry, type StartViewerOptions, type ViewerHandle, runViewerCli, startViewerServer };
86
+ export { type RunnerEntry, type StartViewerOptions, type ViewerHandle, runViewerCli, startViewerServer, viewerCliOptions };