@ethlete/cli 2.1.0-next.8 → 3.0.0-next.16

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 (128) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +22 -7
  3. package/design/define-call.ts +92 -0
  4. package/design/web/env.d.ts +11 -0
  5. package/design/web/frame.html +17 -0
  6. package/design/web/frame.ts +44 -0
  7. package/design/web/host.css +494 -0
  8. package/design/web/host.ts +445 -0
  9. package/design/web/index.html +11 -0
  10. package/package.json +13 -2
  11. package/src/index.d.ts +1 -0
  12. package/src/index.js +32 -4
  13. package/src/index.js.map +1 -1
  14. package/src/lib/api/clear.js +13 -3
  15. package/src/lib/api/clear.js.map +1 -1
  16. package/src/lib/api/compose.js +5 -1
  17. package/src/lib/api/compose.js.map +1 -1
  18. package/src/lib/api/git.d.ts +11 -4
  19. package/src/lib/api/git.js +35 -8
  20. package/src/lib/api/git.js.map +1 -1
  21. package/src/lib/api/load-definitions.js +10 -1
  22. package/src/lib/api/load-definitions.js.map +1 -1
  23. package/src/lib/api/ports.js +12 -3
  24. package/src/lib/api/ports.js.map +1 -1
  25. package/src/lib/api/run.js +8 -3
  26. package/src/lib/api/run.js.map +1 -1
  27. package/src/lib/api/setup.js +1 -1
  28. package/src/lib/api/setup.js.map +1 -1
  29. package/src/lib/api/state.js +7 -5
  30. package/src/lib/api/state.js.map +1 -1
  31. package/src/lib/auth/composer-auth.js +3 -2
  32. package/src/lib/auth/composer-auth.js.map +1 -1
  33. package/src/lib/auth/gitlab-token.js +1 -1
  34. package/src/lib/auth/gitlab-token.js.map +1 -1
  35. package/src/lib/config/diagnose.js +15 -9
  36. package/src/lib/config/diagnose.js.map +1 -1
  37. package/src/lib/config/local-config.d.ts +1 -1
  38. package/src/lib/design/calls-tsconfig.d.ts +6 -0
  39. package/src/lib/design/calls-tsconfig.js +37 -0
  40. package/src/lib/design/calls-tsconfig.js.map +1 -0
  41. package/src/lib/design/check.d.ts +11 -0
  42. package/src/lib/design/check.js +203 -0
  43. package/src/lib/design/check.js.map +1 -0
  44. package/src/lib/design/design-command.d.ts +10 -0
  45. package/src/lib/design/design-command.js +32 -0
  46. package/src/lib/design/design-command.js.map +1 -0
  47. package/src/lib/design/index.d.ts +5 -0
  48. package/src/lib/design/index.js +9 -0
  49. package/src/lib/design/index.js.map +1 -0
  50. package/src/lib/design/paths.d.ts +24 -0
  51. package/src/lib/design/paths.js +31 -0
  52. package/src/lib/design/paths.js.map +1 -0
  53. package/src/lib/design/serve.d.ts +7 -0
  54. package/src/lib/design/serve.js +144 -0
  55. package/src/lib/design/serve.js.map +1 -0
  56. package/src/lib/design/vite-paths.d.ts +7 -0
  57. package/src/lib/design/vite-paths.js +15 -0
  58. package/src/lib/design/vite-paths.js.map +1 -0
  59. package/src/lib/doctor/doctor-command.js +18 -4
  60. package/src/lib/doctor/doctor-command.js.map +1 -1
  61. package/src/lib/index.d.ts +1 -0
  62. package/src/lib/index.js +1 -0
  63. package/src/lib/index.js.map +1 -1
  64. package/src/lib/release.d.ts +38 -1
  65. package/src/lib/release.js +153 -28
  66. package/src/lib/release.js.map +1 -1
  67. package/src/lib/update/agent-rules-sync.d.ts +37 -0
  68. package/src/lib/update/agent-rules-sync.js +40 -0
  69. package/src/lib/update/agent-rules-sync.js.map +1 -0
  70. package/src/lib/update/agent-setup.d.ts +33 -0
  71. package/src/lib/update/agent-setup.js +124 -0
  72. package/src/lib/update/agent-setup.js.map +1 -0
  73. package/src/lib/update/ai.d.ts +37 -8
  74. package/src/lib/update/ai.js +193 -24
  75. package/src/lib/update/ai.js.map +1 -1
  76. package/src/lib/update/args.d.ts +2 -0
  77. package/src/lib/update/args.js +22 -2
  78. package/src/lib/update/args.js.map +1 -1
  79. package/src/lib/update/available-migrations.d.ts +10 -0
  80. package/src/lib/update/available-migrations.js +23 -0
  81. package/src/lib/update/available-migrations.js.map +1 -0
  82. package/src/lib/update/commits.d.ts +63 -0
  83. package/src/lib/update/commits.js +146 -0
  84. package/src/lib/update/commits.js.map +1 -0
  85. package/src/lib/update/gitignore.d.ts +8 -0
  86. package/src/lib/update/gitignore.js +22 -0
  87. package/src/lib/update/gitignore.js.map +1 -0
  88. package/src/lib/update/index.d.ts +6 -0
  89. package/src/lib/update/index.js +6 -0
  90. package/src/lib/update/index.js.map +1 -1
  91. package/src/lib/update/migration-manifest.d.ts +10 -0
  92. package/src/lib/update/migration-manifest.js +15 -3
  93. package/src/lib/update/migration-manifest.js.map +1 -1
  94. package/src/lib/update/migration-record.d.ts +24 -0
  95. package/src/lib/update/migration-record.js +48 -0
  96. package/src/lib/update/migration-record.js.map +1 -0
  97. package/src/lib/update/migrations-command.d.ts +14 -0
  98. package/src/lib/update/migrations-command.js +212 -0
  99. package/src/lib/update/migrations-command.js.map +1 -0
  100. package/src/lib/update/package-manager.d.ts +20 -1
  101. package/src/lib/update/package-manager.js +34 -15
  102. package/src/lib/update/package-manager.js.map +1 -1
  103. package/src/lib/update/packages.d.ts +28 -8
  104. package/src/lib/update/packages.js +117 -36
  105. package/src/lib/update/packages.js.map +1 -1
  106. package/src/lib/update/pending.d.ts +16 -0
  107. package/src/lib/update/pending.js +21 -5
  108. package/src/lib/update/pending.js.map +1 -1
  109. package/src/lib/update/plan.d.ts +33 -8
  110. package/src/lib/update/plan.js +76 -7
  111. package/src/lib/update/plan.js.map +1 -1
  112. package/src/lib/update/registry.d.ts +32 -4
  113. package/src/lib/update/registry.js +145 -8
  114. package/src/lib/update/registry.js.map +1 -1
  115. package/src/lib/update/run-migrations.d.ts +2 -0
  116. package/src/lib/update/run-migrations.js +20 -15
  117. package/src/lib/update/run-migrations.js.map +1 -1
  118. package/src/lib/update/scan.d.ts +14 -0
  119. package/src/lib/update/scan.js +57 -0
  120. package/src/lib/update/scan.js.map +1 -0
  121. package/src/lib/update/semver.js +2 -1
  122. package/src/lib/update/semver.js.map +1 -1
  123. package/src/lib/update/tasks.d.ts +18 -1
  124. package/src/lib/update/tasks.js +114 -43
  125. package/src/lib/update/tasks.js.map +1 -1
  126. package/src/lib/update/update-command.d.ts +7 -0
  127. package/src/lib/update/update-command.js +300 -73
  128. package/src/lib/update/update-command.js.map +1 -1
@@ -0,0 +1,494 @@
1
+ :root {
2
+ --h-ground: #131313;
3
+ --h-panel: #1b1b1b;
4
+ --h-ink: #e6e2da;
5
+ --h-ink-3: #8b8578;
6
+ --h-line: #2c2c2c;
7
+ --h-prose: 21rem;
8
+ }
9
+
10
+ body {
11
+ display: grid;
12
+ margin: 0;
13
+ grid-template-columns: 18rem 1fr;
14
+ min-height: 100vh;
15
+ background: var(--h-ground);
16
+ color: var(--h-ink);
17
+ font:
18
+ 300 14px/1.5 system-ui,
19
+ sans-serif;
20
+ }
21
+
22
+ /* The tree stands still while the calls scroll, and scrolls on its own when it is longer than the window. */
23
+ nav {
24
+ position: sticky;
25
+ top: 0;
26
+ display: flex;
27
+ height: 100vh;
28
+ box-sizing: border-box;
29
+ flex-direction: column;
30
+ align-self: start;
31
+ gap: 20px;
32
+ padding: 24px 12px;
33
+ border-right: 1px solid var(--h-line);
34
+ overflow-y: auto;
35
+ overscroll-behavior: contain;
36
+ }
37
+
38
+ nav section {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 2px;
42
+ }
43
+
44
+ nav > section > h3 {
45
+ margin: 0 0 4px 12px;
46
+ color: var(--h-ink-3);
47
+ font-family: ui-monospace, monospace;
48
+ font-size: 10px;
49
+ font-weight: 400;
50
+ letter-spacing: 0.2em;
51
+ text-transform: uppercase;
52
+ }
53
+
54
+ nav a {
55
+ padding: 8px 12px;
56
+ border-radius: 6px;
57
+ color: var(--h-ink-3);
58
+ text-decoration: none;
59
+ font-family: ui-monospace, monospace;
60
+ font-size: 12px;
61
+ }
62
+
63
+ nav a:hover {
64
+ background: var(--h-panel);
65
+ }
66
+
67
+ nav a[aria-current] {
68
+ background: var(--h-panel);
69
+ color: var(--h-ink);
70
+ }
71
+
72
+ .nav-rounds {
73
+ display: flex;
74
+ flex-direction: column;
75
+ margin: 2px 0 6px 12px;
76
+ border-left: 1px solid var(--h-line);
77
+ }
78
+
79
+ .nav-rounds a {
80
+ padding: 5px 10px;
81
+ border-radius: 0 6px 6px 0;
82
+ font-size: 11px;
83
+ }
84
+
85
+ main {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 56px;
89
+ padding: 48px 56px;
90
+ overflow-x: auto;
91
+ }
92
+
93
+ .round {
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: 32px;
97
+ scroll-margin-top: 24px;
98
+ }
99
+
100
+ .round-head {
101
+ display: flex;
102
+ max-width: 68ch;
103
+ flex-direction: column;
104
+ gap: 8px;
105
+ padding-top: 24px;
106
+ border-top: 1px solid var(--h-line);
107
+ }
108
+
109
+ .round-head h2 {
110
+ margin: 0;
111
+ font-size: 19px;
112
+ font-weight: 300;
113
+ }
114
+
115
+ .round-head p {
116
+ margin: 0;
117
+ color: var(--h-ink-3);
118
+ text-wrap: pretty;
119
+ }
120
+
121
+ .views {
122
+ display: flex;
123
+ margin-top: 4px;
124
+ gap: 2px;
125
+ }
126
+
127
+ .views a {
128
+ padding: 5px 12px;
129
+ border: 1px solid var(--h-line);
130
+ color: var(--h-ink-3);
131
+ text-decoration: none;
132
+ font-family: ui-monospace, monospace;
133
+ font-size: 11px;
134
+ letter-spacing: 0.12em;
135
+ }
136
+
137
+ .views a:first-child {
138
+ border-radius: 6px 0 0 6px;
139
+ }
140
+
141
+ .views a:last-child {
142
+ border-radius: 0 6px 6px 0;
143
+ }
144
+
145
+ .views a[aria-current] {
146
+ background: var(--h-panel);
147
+ color: var(--h-ink);
148
+ }
149
+
150
+ /* The result is the end of the chain, so the chain itself sits under it as a line of keys. */
151
+ .trail {
152
+ display: flex;
153
+ align-items: center;
154
+ margin-top: 4px;
155
+ gap: 8px;
156
+ }
157
+
158
+ .trail a {
159
+ padding: 4px 9px;
160
+ border: 1px solid var(--h-line);
161
+ border-radius: 5px;
162
+ color: var(--h-ink-3);
163
+ text-decoration: none;
164
+ font-family: ui-monospace, monospace;
165
+ font-size: 11px;
166
+ letter-spacing: 0.1em;
167
+ }
168
+
169
+ .trail a:hover {
170
+ color: var(--h-ink);
171
+ }
172
+
173
+ .trail a[aria-current] {
174
+ border-color: #7fd4bf;
175
+ color: #7fd4bf;
176
+ }
177
+
178
+ .arrow {
179
+ color: var(--h-line);
180
+ font-size: 12px;
181
+ }
182
+
183
+ .result .round-head,
184
+ .tray .round-head {
185
+ border-top-color: var(--h-ink-3);
186
+ }
187
+
188
+ .fold {
189
+ align-self: start;
190
+ margin-top: 4px;
191
+ color: var(--h-ink-3);
192
+ text-decoration: none;
193
+ font-family: ui-monospace, monospace;
194
+ font-size: 11px;
195
+ letter-spacing: 0.1em;
196
+ }
197
+
198
+ .fold::before {
199
+ content: '\203A\00a0';
200
+ }
201
+
202
+ .fold:hover {
203
+ color: var(--h-ink);
204
+ }
205
+
206
+ /* A folded variant keeps its name on the page, so the thread of the round is still readable. */
207
+ .folded {
208
+ display: flex;
209
+ max-width: 68ch;
210
+ flex-direction: column;
211
+ gap: 2px;
212
+ margin: 0;
213
+ padding: 0;
214
+ list-style: none;
215
+ }
216
+
217
+ .folded li {
218
+ display: flex;
219
+ align-items: baseline;
220
+ justify-content: space-between;
221
+ gap: 16px;
222
+ padding: 7px 10px;
223
+ border-radius: 6px;
224
+ opacity: 0.55;
225
+ }
226
+
227
+ .folded li[data-verdict='chosen'] .tag {
228
+ color: #7fd4bf;
229
+ }
230
+
231
+ .folded li:hover {
232
+ background: var(--h-panel);
233
+ opacity: 1;
234
+ }
235
+
236
+ .folded a {
237
+ color: var(--h-ink);
238
+ text-decoration: none;
239
+ font-family: ui-monospace, monospace;
240
+ font-size: 11px;
241
+ letter-spacing: 0.12em;
242
+ text-transform: uppercase;
243
+ }
244
+
245
+ header {
246
+ display: flex;
247
+ max-width: 68ch;
248
+ flex-direction: column;
249
+ gap: 12px;
250
+ }
251
+
252
+ .eyebrow {
253
+ color: var(--h-ink-3);
254
+ font-family: ui-monospace, monospace;
255
+ font-size: 11px;
256
+ letter-spacing: 0.24em;
257
+ text-transform: uppercase;
258
+ }
259
+
260
+ h1 {
261
+ margin: 0;
262
+ font-size: 28px;
263
+ font-weight: 300;
264
+ }
265
+
266
+ header p {
267
+ margin: 0;
268
+ color: var(--h-ink-3);
269
+ text-wrap: pretty;
270
+ }
271
+
272
+ /*
273
+ * A track is as wide as the frame it holds, so the variants wrap to the next band when the window
274
+ * runs out of room. Row flow is what lets them wrap: each column takes four rows, so the next one
275
+ * starts beside it and only a full band pushes to a new line.
276
+ */
277
+ .grid {
278
+ display: grid;
279
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--frame-width, 0px)), 1fr));
280
+ grid-auto-flow: row;
281
+ gap: 72px 40px;
282
+ }
283
+
284
+ .column {
285
+ display: grid;
286
+ grid-row: span 4;
287
+ grid-template-rows: subgrid;
288
+ gap: 12px;
289
+ }
290
+
291
+ /* A view is one picture, so it gets the whole width and no subgrid. */
292
+ .grid[data-view] .column {
293
+ grid-row: auto;
294
+ grid-template-rows: none;
295
+ }
296
+
297
+ /* A column can be wider than a line of text should be, so the text keeps its own measure. */
298
+ .column h3,
299
+ .claim,
300
+ .cost {
301
+ max-width: var(--h-prose);
302
+ }
303
+
304
+ .stage {
305
+ display: flex;
306
+ padding: 24px 0;
307
+ justify-content: flex-start;
308
+ }
309
+
310
+ .column h3 {
311
+ display: flex;
312
+ align-items: baseline;
313
+ justify-content: space-between;
314
+ gap: 16px;
315
+ margin: 0;
316
+ font-family: ui-monospace, monospace;
317
+ font-size: 11px;
318
+ font-weight: 500;
319
+ letter-spacing: 0.18em;
320
+ text-transform: uppercase;
321
+ }
322
+
323
+ .column h3 a {
324
+ color: var(--h-ink);
325
+ text-decoration: none;
326
+ }
327
+
328
+ /*
329
+ * Two 1100px frames never fit a screen side by side, and shrinking them hides the pixels the
330
+ * comparison is about. The picks are stacked in one box at full size instead.
331
+ */
332
+ .overlay {
333
+ position: relative;
334
+ overflow: hidden;
335
+ cursor: crosshair;
336
+ }
337
+
338
+ .overlay iframe {
339
+ position: absolute;
340
+ top: 0;
341
+ left: 0;
342
+ pointer-events: none;
343
+ }
344
+
345
+ .seam {
346
+ position: absolute;
347
+ top: 0;
348
+ bottom: 0;
349
+ width: 1px;
350
+ background: #7fd4bf;
351
+ }
352
+
353
+ .switch {
354
+ display: flex;
355
+ align-items: center;
356
+ margin-top: 4px;
357
+ gap: 6px;
358
+ }
359
+
360
+ .switch button {
361
+ padding: 5px 11px;
362
+ border: 1px solid var(--h-line);
363
+ border-radius: 5px;
364
+ background: none;
365
+ color: var(--h-ink-3);
366
+ font-family: ui-monospace, monospace;
367
+ font-size: 11px;
368
+ letter-spacing: 0.1em;
369
+ cursor: pointer;
370
+ }
371
+
372
+ .switch button[aria-current] {
373
+ border-color: #7fd4bf;
374
+ color: #7fd4bf;
375
+ }
376
+
377
+ .hint {
378
+ margin-left: 8px;
379
+ color: var(--h-ink-3);
380
+ font-size: 11px;
381
+ }
382
+
383
+ .grid.sheet iframe {
384
+ display: block;
385
+ transform: scale(var(--de-scale, 1));
386
+ transform-origin: top left;
387
+ }
388
+
389
+ /* The contact sheet draws every variant at once, so one screen holds the whole call. */
390
+ .grid.sheet {
391
+ --thumb-width: calc(var(--frame-width) * var(--de-scale));
392
+
393
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumb-width), max-content));
394
+ gap: 28px 20px;
395
+ }
396
+
397
+ .thumb {
398
+ display: flex;
399
+ width: var(--thumb-width);
400
+ flex-direction: column;
401
+ gap: 8px;
402
+ color: inherit;
403
+ text-decoration: none;
404
+ }
405
+
406
+ .thumb-frame {
407
+ overflow: hidden;
408
+ width: 100%;
409
+ border: 1px solid var(--h-line);
410
+ border-radius: 4px;
411
+ }
412
+
413
+ /* A thumbnail is read, never driven, and a click on it belongs to the link around it. */
414
+ .thumb-frame iframe {
415
+ pointer-events: none;
416
+ }
417
+
418
+ .thumb-name {
419
+ font-family: ui-monospace, monospace;
420
+ font-size: 10px;
421
+ letter-spacing: 0.12em;
422
+ text-transform: uppercase;
423
+ }
424
+
425
+ .thumb[data-verdict='rejected'] {
426
+ opacity: 0.45;
427
+ transition: opacity 0.15s;
428
+ }
429
+
430
+ .thumb:hover {
431
+ opacity: 1;
432
+ }
433
+
434
+ .thumb[data-verdict='chosen'] .thumb-name {
435
+ color: #7fd4bf;
436
+ }
437
+
438
+ .thumb[data-picked] .thumb-frame,
439
+ .column[data-picked] .stage {
440
+ outline: 1px solid #7fd4bf;
441
+ outline-offset: 4px;
442
+ }
443
+
444
+ /* A rejected variant stays readable, and comes back to full strength under the pointer. */
445
+ .column[data-verdict='rejected'] {
446
+ opacity: 0.45;
447
+ transition: opacity 0.15s;
448
+ }
449
+
450
+ .column[data-verdict='rejected']:hover {
451
+ opacity: 1;
452
+ }
453
+
454
+ [data-verdict='chosen'] .tag {
455
+ color: #7fd4bf;
456
+ }
457
+
458
+ .tag {
459
+ color: var(--h-ink-3);
460
+ font-size: 10px;
461
+ letter-spacing: 0.16em;
462
+ }
463
+
464
+ iframe {
465
+ border: 0;
466
+ background: transparent;
467
+ }
468
+
469
+ .claim,
470
+ .cost {
471
+ margin: 0;
472
+ font-size: 12px;
473
+ line-height: 1.5;
474
+ text-wrap: pretty;
475
+ }
476
+
477
+ .cost {
478
+ color: var(--h-ink-3);
479
+ }
480
+
481
+ .problem {
482
+ margin: 0;
483
+ padding: 12px 16px;
484
+ border-radius: 6px;
485
+ background: #1a1414;
486
+ color: #f0a0a0;
487
+ font-family: ui-monospace, monospace;
488
+ font-size: 12px;
489
+ }
490
+
491
+ .empty {
492
+ padding: 40px;
493
+ color: var(--h-ink-3);
494
+ }