plum-e2e 2.4.7 → 2.4.9

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/README.md CHANGED
@@ -78,21 +78,23 @@ Full documentation is available at:
78
78
 
79
79
  ## Command Reference
80
80
 
81
- | Command | Description |
82
- | ----------------------------- | ------------------------------------------------------------------ |
83
- | `plum init` | Initialize a new project in the current folder |
84
- | `plum server start` | Start the full UI stack via Docker (alias: `plum start`) |
85
- | `plum server stop` | Stop the server and preserve data (alias: `plum stop`) |
86
- | `plum server reconfig` | Re-enter server settings without starting |
87
- | `plum run-test` | Run all tests locally without Docker |
88
- | `plum run-test @tag` | Run tests matching a tag |
89
- | `plum run-test --parallel N` | Run tests across N parallel workers |
90
- | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
91
- | `plum create-step` | Interactively scaffold a new step definition |
92
- | `plum node start` | Set up connectivity, start a runner node, and open the runner menu |
93
- | `plum node stop` | Stop the runner node started from this folder |
94
- | `plum node reconfig` | Re-enter node settings and re-register |
95
- | `plum manage-runners` | Open the interactive runner management menu |
81
+ | Command | Description |
82
+ | ----------------------------- | ----------------------------------------------------------------------------- |
83
+ | `plum init` | Initialize a new project in the current folder |
84
+ | `plum server start` | Start the full UI stack via Docker (alias: `plum start`) |
85
+ | `plum server stop` | Stop the server and preserve data (alias: `plum stop`) |
86
+ | `plum restart` | Rebuild and restart the server without prompts (alias: `plum server restart`) |
87
+ | `plum update` | Update Plum to the latest version and restart the server |
88
+ | `plum server reconfig` | Re-enter server settings without starting |
89
+ | `plum run-test` | Run all tests locally without Docker |
90
+ | `plum run-test @tag` | Run tests matching a tag |
91
+ | `plum run-test --parallel N` | Run tests across N parallel workers |
92
+ | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
93
+ | `plum create-step` | Interactively scaffold a new step definition |
94
+ | `plum node start` | Set up connectivity, start a runner node, and open the runner menu |
95
+ | `plum node stop` | Stop the runner node started from this folder |
96
+ | `plum node reconfig` | Re-enter node settings and re-register |
97
+ | `plum manage-runners` | Open the interactive runner management menu |
96
98
 
97
99
  ---
98
100
 
package/bin/plum.js CHANGED
@@ -323,6 +323,44 @@ async function serverStart() {
323
323
  clack.outro(pc.green('Plum is running. Use "plum server stop" to shut down.'));
324
324
  }
325
325
 
326
+ async function serverRestart() {
327
+ clack.intro(pc.bgMagenta(pc.white(' 🟣 Plum — Restart ')));
328
+ const { loadServerConfig } = serverConfigLib();
329
+ const cfg = loadServerConfig(process.cwd());
330
+ applyServerConfig(cfg);
331
+ clack.log.info(`UI: ${pc.cyan(`http://localhost:${cfg.frontendPort}`)}`);
332
+
333
+ execSync('docker compose up --build -d', { cwd: plumRoot, stdio: 'inherit' });
334
+
335
+ const apiBase = `http://localhost:${cfg.backendPort}`;
336
+ const s = clack.spinner();
337
+ s.start('Waiting for server to be ready…');
338
+ let ready = false;
339
+ for (let i = 0; i < 40; i++) {
340
+ await new Promise((r) => setTimeout(r, 1500));
341
+ try {
342
+ const res = await fetch(`${apiBase}/auth/needs-setup`);
343
+ if (res.ok) {
344
+ ready = true;
345
+ break;
346
+ }
347
+ } catch {}
348
+ }
349
+ s.stop(ready ? pc.green('✓ Server is ready') : pc.yellow('Server may still be starting'));
350
+ clack.log.info(`UI: ${pc.cyan(`http://localhost:${cfg.frontendPort}`)}`);
351
+ clack.log.info(`API: ${pc.cyan(`http://localhost:${cfg.backendPort}`)}`);
352
+ clack.outro(pc.green('Plum restarted.'));
353
+ }
354
+
355
+ async function serverUpdate() {
356
+ clack.intro(pc.bgMagenta(pc.white(' 🟣 Plum — Update ')));
357
+ clack.log.step('Fetching latest Plum version…');
358
+ execSync('npm install -g plum-e2e@latest', { stdio: 'inherit' });
359
+ clack.log.success('Plum CLI updated.');
360
+ clack.log.step('Rebuilding server with new version…');
361
+ await serverRestart();
362
+ }
363
+
326
364
  async function serverReconfig() {
327
365
  clack.intro(pc.bgMagenta(pc.white(' 🟣 Plum — Reconfigure Server ')));
328
366
  const cfg = await configureServer({ force: true });
@@ -759,6 +797,14 @@ switch (command) {
759
797
  await serverReconfig();
760
798
  break;
761
799
  }
800
+ if (subcommand === 'restart') {
801
+ await serverRestart();
802
+ break;
803
+ }
804
+ if (subcommand === 'update') {
805
+ await serverUpdate();
806
+ break;
807
+ }
762
808
  // fall through to start for 'plum server start' or 'plum server'
763
809
  // intentional fall-through
764
810
 
@@ -766,6 +812,14 @@ switch (command) {
766
812
  await serverStart();
767
813
  break;
768
814
 
815
+ case 'restart':
816
+ await serverRestart();
817
+ break;
818
+
819
+ case 'update':
820
+ await serverUpdate();
821
+ break;
822
+
769
823
  case 'run-test': {
770
824
  console.log('--------------------------------------\n');
771
825
  console.log('🚀 Running tests locally...');
@@ -957,7 +1011,11 @@ switch (command) {
957
1011
  console.log(' --backend-port <n> Host port for the backend/API (default: 3001)');
958
1012
  console.log(' --frontend-port <n> Host port for the UI (default: 5173)');
959
1013
  console.log(' server reconfig Re-enter server settings without starting');
1014
+ console.log(
1015
+ ' server restart Rebuild and restart the server (no prompts; alias: plum restart)'
1016
+ );
960
1017
  console.log(' server stop Stop the server (alias: plum stop)');
1018
+ console.log(' update Update Plum to the latest version and restart the server');
961
1019
  console.log(' node start Start a runner node (interactive), then open runner menu');
962
1020
  console.log(' --primary <url> Primary Plum server to auto-register with');
963
1021
  console.log(' --url <url> Address the primary calls back (default: <lan-ip>:<port>;');
@@ -181,27 +181,14 @@
181
181
  </div>
182
182
 
183
183
  <div>
184
- {#if isScheduled(detail.triggerType)}
185
- <p class="report-task-name">
186
- <svg
187
- width="11"
188
- height="11"
189
- viewBox="0 0 24 24"
190
- fill="none"
191
- stroke="currentColor"
192
- stroke-width="2"
193
- stroke-linecap="round"
194
- stroke-linejoin="round"
195
- >
196
- <rect x="3" y="4" width="18" height="18" rx="2" />
197
- <line x1="16" y1="2" x2="16" y2="6" />
198
- <line x1="8" y1="2" x2="8" y2="6" />
199
- <line x1="3" y1="10" x2="21" y2="10" />
200
- </svg>
201
- {detail.triggerType}
202
- </p>
203
- {/if}
204
- <h1>{overallPass ? 'Passed' : 'Failed'}</h1>
184
+ <div class="h1-row">
185
+ <h1>{overallPass ? 'Passed' : 'Failed'}</h1>
186
+ {#if detail.testRun?.title}
187
+ <span class="run-name-badge">{detail.testRun.title}</span>
188
+ {:else if isScheduled(detail.triggerType)}
189
+ <span class="run-name-badge">{detail.triggerType}</span>
190
+ {/if}
191
+ </div>
205
192
  <div class="header-meta">
206
193
  <span class="mono">{detail.tags}</span>
207
194
  <span class="meta-sep">·</span>
@@ -524,21 +511,32 @@
524
511
  color: var(--fail);
525
512
  }
526
513
 
527
- .report-task-name {
514
+ .h1-row {
515
+ display: flex;
516
+ align-items: center;
517
+ gap: 0.75rem;
518
+ margin-bottom: 0.2rem;
519
+ }
520
+
521
+ .run-name-badge {
528
522
  display: inline-flex;
529
523
  align-items: center;
530
- gap: 0.35rem;
531
- font-size: 0.7rem;
532
- font-weight: 600;
533
- text-transform: uppercase;
534
- letter-spacing: 0.1em;
535
- color: var(--warn);
536
- margin-bottom: 0.35rem;
524
+ font-size: 0.75rem;
525
+ font-weight: 500;
526
+ color: var(--accent);
527
+ background: var(--accent-soft);
528
+ border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
529
+ border-radius: 100px;
530
+ padding: 0.25rem 0.7rem;
531
+ white-space: nowrap;
532
+ max-width: 240px;
533
+ overflow: hidden;
534
+ text-overflow: ellipsis;
537
535
  }
538
536
 
539
537
  h1 {
540
538
  font-size: 2rem;
541
- margin-bottom: 0.2rem;
539
+ margin-bottom: 0;
542
540
  }
543
541
 
544
542
  .header-meta {
@@ -166,6 +166,10 @@
166
166
 
167
167
  {#if state.currentRun}
168
168
  <div class="run-info">
169
+ {#if state.currentRun.runTitle}
170
+ <span class="run-title-label">{state.currentRun.runTitle}</span>
171
+ <span class="run-sep">·</span>
172
+ {/if}
169
173
  <span class="run-tag-label">{state.currentRun.tag || 'all tests'}</span>
170
174
  <span class="run-sep">·</span>
171
175
  <span class="run-detail"
@@ -463,6 +467,17 @@
463
467
  flex-wrap: wrap;
464
468
  }
465
469
 
470
+ .run-title-label {
471
+ font-size: 0.875rem;
472
+ font-weight: 500;
473
+ color: var(--accent);
474
+ background: var(--accent-soft);
475
+ border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
476
+ border-radius: 100px;
477
+ padding: 0.15rem 0.6rem;
478
+ white-space: nowrap;
479
+ }
480
+
466
481
  .run-tag-label {
467
482
  font-family: 'JetBrains Mono', monospace;
468
483
  font-size: 0.8125rem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plum-e2e",
3
- "version": "2.4.7",
3
+ "version": "2.4.9",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/silverlunah/plum.git"