rvlib-shipkit 1.3.0 → 1.5.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 (203) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +17 -17
  3. package/package.json +3 -2
  4. package/src/asks/asks-queue.ts +4 -2
  5. package/src/assets/kits/identity-kit.ts +15 -13
  6. package/src/assets/run-assets.ts +12 -2
  7. package/src/check.ts +73 -98
  8. package/src/checks/SK001-package-json-shape.check.ts +26 -4
  9. package/src/checks/SK002-contracts-fulfillness.check.ts +4 -0
  10. package/src/checks/SK003-claude-md-shape.check.ts +5 -1
  11. package/src/checks/SK004-gitignore-policy.check.ts +7 -4
  12. package/src/checks/SK005-rvlib-versions.check.ts +53 -21
  13. package/src/checks/SK006-npm-publish-safety.check.ts +4 -0
  14. package/src/checks/SK007-github-visibility.check.ts +4 -2
  15. package/src/checks/SK008-reviewer-agent.check.ts +6 -4
  16. package/src/checks/SK009-commit-ai-tells.check.ts +94 -74
  17. package/src/checks/SK010-undeclared-unit.check.ts +4 -0
  18. package/src/checks/SK011-sibling-unit-ranges.check.ts +4 -0
  19. package/src/checks/SK012-config-barrel-import.check.ts +5 -1
  20. package/src/checks/SK013-one-way-in-policy.check.ts +7 -3
  21. package/src/checks/SK014-prose-ste.check.ts +20 -6
  22. package/src/checks/SK015-nested-repo.check.ts +4 -2
  23. package/src/checks/SK016-legacy-check-shapes.check.ts +23 -16
  24. package/src/checks/SK017-vscode-hub-task.check.ts +22 -7
  25. package/src/checks/SK018-test-files-run.check.ts +6 -2
  26. package/src/checks/SK019-tests-run-in-units.check.ts +8 -4
  27. package/src/checks/SK020-self-spawning-check.check.ts +4 -0
  28. package/src/checks/SK022-machine-runs-the-pin.check.ts +6 -4
  29. package/src/checks/SK024-identity-colors.check.ts +5 -3
  30. package/src/checks/SK025-release-drift.check.ts +4 -5
  31. package/src/checks/SK026-asks-autoclose.check.ts +4 -4
  32. package/src/checks/SK027-agent-wiki-links.check.ts +34 -9
  33. package/src/checks/SK028-readme.check.ts +10 -2
  34. package/src/checks/SK029-explicit-check-files.check.ts +95 -0
  35. package/src/cli/cmd_Asks.ts +5 -5
  36. package/src/cli/cmd_Assets.ts +7 -7
  37. package/src/cli/cmd_Bump.ts +12 -11
  38. package/src/cli/cmd_Check.ts +8 -7
  39. package/src/cli/cmd_Checks.ts +7 -6
  40. package/src/cli/cmd_Ci.ts +12 -11
  41. package/src/cli/cmd_Commands.ts +16 -13
  42. package/src/cli/cmd_ConfigKeys.ts +7 -6
  43. package/src/cli/cmd_Contracts.ts +3 -3
  44. package/src/cli/cmd_CrossRepoActivity.ts +10 -6
  45. package/src/cli/cmd_Fleet.ts +9 -7
  46. package/src/cli/cmd_GlobalProcesses.ts +116 -4
  47. package/src/cli/cmd_Home.ts +23 -17
  48. package/src/cli/cmd_Hooks.ts +6 -5
  49. package/src/cli/cmd_Init.ts +5 -4
  50. package/src/cli/cmd_Keys.ts +8 -7
  51. package/src/cli/cmd_Mv.ts +7 -6
  52. package/src/cli/cmd_Needs.ts +4 -3
  53. package/src/cli/cmd_Overview.ts +4 -3
  54. package/src/cli/cmd_Pb.ts +2 -2
  55. package/src/cli/cmd_Planned.ts +6 -5
  56. package/src/cli/cmd_Prose.ts +5 -5
  57. package/src/cli/cmd_Reflect.ts +7 -7
  58. package/src/cli/cmd_Release.ts +6 -5
  59. package/src/cli/cmd_Releases.ts +5 -4
  60. package/src/cli/cmd_Serve.ts +4 -3
  61. package/src/cli/cmd_Smoke.ts +5 -4
  62. package/src/cli/cmd_Start.ts +7 -6
  63. package/src/cli/cmd_Status.ts +4 -3
  64. package/src/cli/cmd_Tui.ts +3 -2
  65. package/src/cli/cmd_When.ts +71 -0
  66. package/src/cli/cmd_Wiki.ts +4 -4
  67. package/src/cli.ts +7 -2
  68. package/src/collections/checks.ts +2 -0
  69. package/src/collections/collection-types.ts +24 -4
  70. package/src/collections/providers.ts +6 -2
  71. package/src/contracts/apply-contracts.ts +9 -8
  72. package/src/contracts/contract-types.ts +8 -2
  73. package/src/contracts/contracts-engine.ts +34 -13
  74. package/src/contracts/manifests/identity.contract.ts +6 -5
  75. package/src/contracts/manifests/social.contract.ts +4 -2
  76. package/src/contracts/manifests/steam.contract.ts +7 -3
  77. package/src/contracts/web-surface.ts +59 -0
  78. package/src/core/budget.ts +19 -9
  79. package/src/core/canonical-scripts.ts +1 -1
  80. package/src/core/check-runner.ts +63 -25
  81. package/src/core/config-rewrite.ts +37 -24
  82. package/src/core/discover-checks.ts +31 -7
  83. package/src/core/layout.ts +2 -0
  84. package/src/core/legacy-shapes.ts +39 -10
  85. package/src/core/motherhome.ts +88 -66
  86. package/src/core/one-way-in-policy.ts +2 -2
  87. package/src/core/outcome-words.ts +18 -2
  88. package/src/core/port-check-cli.ts +52 -0
  89. package/src/core/port-check-file.ts +295 -0
  90. package/src/core/port-check-files.ts +31 -0
  91. package/src/core/retention.ts +0 -14
  92. package/src/core/run-check.ts +14 -14
  93. package/src/core/run-ci.ts +11 -7
  94. package/src/core/run-fix.ts +30 -23
  95. package/src/core/run-fixers.ts +42 -5
  96. package/src/core/runs-matrix.ts +179 -0
  97. package/src/core/runs.ts +242 -0
  98. package/src/core/update-policy.ts +20 -0
  99. package/src/core/when-block.ts +29 -30
  100. package/src/core/when.ts +41 -103
  101. package/src/core/wire.ts +34 -9
  102. package/src/fleet/scan-fleet.ts +20 -4
  103. package/src/fleet/update-fleet.ts +6 -6
  104. package/src/home/activity-shape.ts +4 -1
  105. package/src/home/activity.ts +22 -15
  106. package/src/home/gui-app/ShipkitGui.swift +144 -25
  107. package/src/home/gui-app.ts +93 -30
  108. package/src/home/home-launchd.ts +30 -6
  109. package/src/home/home-routes.ts +14 -2
  110. package/src/home/home-start.ts +33 -5
  111. package/src/home/hubs.ts +5 -5
  112. package/src/home/machine-stores.ts +4 -2
  113. package/src/home/open-app.ts +23 -10
  114. package/src/home/pm-config.ts +15 -11
  115. package/src/home/pm-inputs.ts +76 -0
  116. package/src/home/pm.ts +11 -3
  117. package/src/home/process-rows.ts +23 -6
  118. package/src/home/resources.ts +67 -15
  119. package/src/home/run-daemon.ts +6 -1
  120. package/src/home/run-pm.ts +30 -5
  121. package/src/home/serve-web.ts +2 -2
  122. package/src/home/supervise.ts +24 -1
  123. package/src/home/widgets.ts +32 -3
  124. package/src/hooks/commit-message.ts +2 -3
  125. package/src/hooks/run-hooks.ts +60 -6
  126. package/src/init-repo.ts +6 -6
  127. package/src/ledger/gate-checks.ts +115 -61
  128. package/src/ledger/git-key.ts +5 -1
  129. package/src/ledger/ledger.ts +5 -5
  130. package/src/ledger/store.ts +11 -0
  131. package/src/ledger/toolchain-identity.ts +45 -27
  132. package/src/ledger/world-cache.ts +17 -15
  133. package/src/plan/repo-source.ts +18 -39
  134. package/src/release/run-release.ts +5 -0
  135. package/src/repo-config.ts +36 -56
  136. package/src/rules/rule.ts +2 -2
  137. package/src/scaffold/files/agent-coding.md +1 -1
  138. package/src/scaffold/files/agent-index.md +1 -1
  139. package/src/scaffold/files/verify-skill.md +2 -2
  140. package/src/serve/hub-app/activity-st.ts +5 -4
  141. package/src/serve/hub-app/activity-view.tsx +4 -4
  142. package/src/serve/hub-app/admin-view.tsx +13 -11
  143. package/src/serve/hub-app/check-view.tsx +66 -46
  144. package/src/serve/hub-app/check-words.ts +1 -11
  145. package/src/serve/hub-app/checks-svc.ts +16 -36
  146. package/src/serve/hub-app/col-tables-view.tsx +131 -0
  147. package/src/serve/hub-app/col-tables.ts +115 -0
  148. package/src/serve/hub-app/cols-svc.ts +33 -4
  149. package/src/serve/hub-app/dock-st.ts +3 -2
  150. package/src/serve/hub-app/dock-view.tsx +36 -0
  151. package/src/serve/hub-app/dock.css +7 -1
  152. package/src/serve/hub-app/float-cards.tsx +30 -0
  153. package/src/serve/hub-app/floating.tsx +41 -4
  154. package/src/serve/hub-app/git-st.ts +42 -0
  155. package/src/serve/hub-app/git-view.tsx +61 -0
  156. package/src/serve/hub-app/hash-route.ts +45 -1
  157. package/src/serve/hub-app/header-bar.tsx +62 -72
  158. package/src/serve/hub-app/health-svc.ts +3 -2
  159. package/src/serve/hub-app/home-st.ts +15 -3
  160. package/src/serve/hub-app/home-strip.css +69 -19
  161. package/src/serve/hub-app/home-strip.tsx +192 -118
  162. package/src/serve/hub-app/home.html +1 -0
  163. package/src/serve/hub-app/hub-app.tsx +21 -5
  164. package/src/serve/hub-app/hub-types.ts +11 -5
  165. package/src/serve/hub-app/hub.css +88 -44
  166. package/src/serve/hub-app/icons.tsx +15 -0
  167. package/src/serve/hub-app/index.html +1 -0
  168. package/src/serve/hub-app/keys.ts +11 -8
  169. package/src/serve/hub-app/live-svc.ts +3 -2
  170. package/src/serve/hub-app/machine-st.ts +34 -49
  171. package/src/serve/hub-app/palette-st.ts +5 -5
  172. package/src/serve/hub-app/palette-view.tsx +1 -1
  173. package/src/serve/hub-app/plan-view.tsx +51 -0
  174. package/src/serve/hub-app/planned-st.ts +9 -4
  175. package/src/serve/hub-app/processes-view.tsx +38 -0
  176. package/src/serve/hub-app/project-list.tsx +3 -3
  177. package/src/serve/hub-app/projects-svc.ts +15 -10
  178. package/src/serve/hub-app/prose-hits-st.ts +3 -2
  179. package/src/serve/hub-app/reach.ts +36 -0
  180. package/src/serve/hub-app/readme-svc.ts +3 -2
  181. package/src/serve/hub-app/repo-sections.ts +117 -0
  182. package/src/serve/hub-app/repo-st.ts +47 -10
  183. package/src/serve/hub-app/runs-tabs.ts +1 -1
  184. package/src/serve/hub-app/sidebar.tsx +12 -37
  185. package/src/serve/hub-app/timeline-svc.ts +3 -2
  186. package/src/serve/hub-app/timeline-view.tsx +14 -11
  187. package/src/serve/hub-app/tree-build.ts +149 -155
  188. package/src/serve/hub-app/tree-row.tsx +39 -9
  189. package/src/serve/hub-app/tree-svc.ts +70 -49
  190. package/src/serve/hub-app/when-view.tsx +89 -0
  191. package/src/serve/hub-app/when.css +17 -0
  192. package/src/serve/hub-runtime.ts +3 -16
  193. package/src/serve/project-gutter.ts +1 -2
  194. package/src/serve/run-serve.ts +1 -1
  195. package/src/serve/serve-hub.ts +4 -14
  196. package/src/serve/warm-cell.ts +49 -16
  197. package/src/suite/judge-suites.ts +42 -17
  198. package/src/suite/suite-cli.ts +5 -8
  199. package/src/wiki/lint-md.ts +2 -0
  200. package/src/wiki/scan-md.ts +37 -10
  201. package/src/serve/hub-app/processes-svc.ts +0 -63
  202. package/src/serve/hub-app/repo-sections.tsx +0 -61
  203. package/src/serve/repo-processes.ts +0 -89
@@ -20,6 +20,7 @@ import { PlannedSt } from './planned-st.ts'
20
20
  import { ActivitySt } from './activity-st.ts'
21
21
  import { ProjectsSvc } from './projects-svc.ts'
22
22
  import { parseFilter, RepoSt } from './repo-st.ts'
23
+ import { openSection, repoSections, sectionOfRepo } from './repo-sections.ts'
23
24
 
24
25
  /** the longest one repo's read ahead holds the next one back */
25
26
  export const PREFETCH_WAIT_MS = 10_000
@@ -68,7 +69,7 @@ export class HomeSt {
68
69
  planned: PlannedSt
69
70
  /** what every repo committed and holds, polled while it is the page */
70
71
  activity: ActivitySt
71
- /** the one picker, cmd+k */
72
+ /** the one picker, cmd+j */
72
73
  palette: PaletteSt
73
74
  /** the widths of the project list and a repo's sidebar */
74
75
  layout: LayoutSt
@@ -169,8 +170,19 @@ export class HomeSt {
169
170
  for (const r of this.repos.values()) r.dispose()
170
171
  }
171
172
 
172
- /** a list click, a repo row: that repo, in place, as a history entry */
173
+ /** a list click, a repo row: that repo, in place, as a history entry,
174
+ * on the section the repo left showed. One already inside that section
175
+ * keeps its own page there, and one that has no such section opens its
176
+ * README. Written before the repo shows, so the one history entry
177
+ * already names it */
173
178
  select(name: string): void {
179
+ const from = this.page === 'repo' ? this.shown : null
180
+ const to = this.repo(name)
181
+ const want = from == null || from === to ? null : sectionOfRepo(from)
182
+ if (want != null && sectionOfRepo(to) !== want) {
183
+ const known = to.cols.loaded || to.cols.cached
184
+ openSection(to, known && !repoSections(to).some((s) => s.id === want) ? 'readme' : want)
185
+ }
174
186
  this.show('repo', name, 'push')
175
187
  }
176
188
 
@@ -178,7 +190,7 @@ export class HomeSt {
178
190
  * before the repo is shown, so the one history entry already names it */
179
191
  openCheck(repo: string, check: string): void {
180
192
  this.repo(repo).cols.select('checks', `check:${check}`)
181
- this.select(repo)
193
+ this.show('repo', repo, 'push')
182
194
  }
183
195
 
184
196
  /** a link to a page of the home: the same page, in place */
@@ -10,14 +10,42 @@
10
10
  .hswatch input{width:16px;height:16px;padding:0;border:1px solid var(--line);border-radius:3px;background:none;cursor:pointer}
11
11
  .hswatch input::-webkit-color-swatch-wrapper{padding:0}
12
12
  .hswatch input::-webkit-color-swatch{border:none;border-radius:2px}
13
- .halert{display:inline-flex;align-items:center;font-size:12px;color:var(--errink)}
14
- .herr{font-size:12px;color:var(--errink);max-width:40ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
15
- /* the bottom line: its height is reserved whether or not it says anything,
16
- so the daemon or pm going down never moves the page. The strip renders it,
17
- its order puts it last in the page column (hub.css .appcol) */
18
- .hbar{order:1;display:flex;align-items:center;gap:var(--s3);height:22px;flex:none;padding:0 var(--s3);border-top:1px solid var(--line);overflow:hidden;white-space:nowrap;font-size:12px}
19
- .hdown{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--errink)}
20
- .hdown b{color:var(--red);margin-right:var(--s2)}
13
+ /* trouble, as cards (float-cards.tsx), never taking room, so one coming or
14
+ going moves nothing: at the top right, in a zero height box right after
15
+ the bar, so just under it whatever its height. The words wrap, never cut */
16
+ .htoasts{position:absolute;right:var(--s3);top:var(--s2);z-index:25;display:flex;flex-direction:column;align-items:flex-end;gap:var(--s1);max-width:min(60ch,calc(100% - 2 * var(--s3)));pointer-events:none}
17
+ .hanchor{position:relative;height:0;flex:none;z-index:25}
18
+ .htoast{max-width:100%;padding:var(--s1) var(--s2);background:var(--panel);border:1px solid var(--red);border-radius:4px;box-shadow:0 6px 20px var(--shadow);font-size:12px;line-height:1.45;color:var(--errink);white-space:normal;overflow-wrap:anywhere;pointer-events:auto}
19
+ .htoast b{color:var(--red);margin-right:var(--s1)}
20
+ .htoast.warn{border-color:var(--warn);color:var(--warn)}
21
+ .htoast.warn b{color:var(--warn)}
22
+ .htoast .hproc{vertical-align:middle}
23
+ /* the bar's run: one small check… button, then a spinner while a run goes,
24
+ its words in a tooltip (header-bar.tsx) */
25
+ .hcheck{height:22px;padding:0 var(--s2);font-size:11.5px;flex:none}
26
+ .hbusy{display:inline-flex;align-items:center;justify-content:center;width:18px;min-width:18px;height:22px;flex:none;border-radius:3px;cursor:default;outline:none}
27
+ .hbusy:focus-visible{box-shadow:0 0 0 1px var(--accent)}
28
+ /* a popover opened on a click (floating.tsx Pop) */
29
+ .fpop{z-index:40;width:max-content;max-width:min(44ch,90vw);padding:var(--s1);background:var(--panel2);border:1px solid var(--line);border-radius:4px;box-shadow:0 6px 20px var(--shadow);outline:none}
30
+ .hmenu{display:flex;flex-direction:column;gap:var(--s0)}
31
+ .fpopw{max-width:min(96ch,94vw)}
32
+ .hmenu2{display:flex;align-items:stretch}
33
+ .hmacts{flex:none;min-width:24ch;max-width:36ch}
34
+ .hmabout{flex:1 1 auto;min-width:0;max-width:56ch;max-height:60vh;overflow:auto;display:flex;flex-direction:column;gap:var(--s1);margin-left:var(--s1);padding:var(--s1) var(--s2);border-left:1px solid var(--line);user-select:text}
35
+ .hmabout .md{overflow-wrap:anywhere}
36
+ .hmabout .md>:first-child{margin-top:0}
37
+ .hmlog{display:block;font-size:11px;color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere}
38
+ @media (max-width:640px){.hmenu2{flex-direction:column}.hmabout{margin:var(--s1) 0 0;border-left:0;border-top:1px solid var(--line)}}
39
+ .hmitem{display:flex;align-items:flex-start;gap:var(--s2);width:100%;padding:var(--s1) var(--s2);border:0;border-radius:3px;background:none;color:var(--ink);text-align:left;white-space:normal;cursor:pointer}
40
+ .hmitem:hover:not(:disabled),.hmitem:focus-visible{background:var(--panel)}
41
+ .hmitem:disabled{opacity:.45;cursor:default}
42
+ .hmitem .hico{flex:none;width:14px;height:14px;margin-top:2px}
43
+ .hmitem span{display:flex;flex-direction:column;gap:2px}
44
+ .hmitem b{font-size:12.5px;font-weight:600}
45
+ .hmitem small{font-size:11.5px;line-height:1.4;color:var(--dim)}
46
+ .hmhead{display:flex;align-items:center;gap:var(--s1);padding:var(--s1) var(--s2) 0;font-size:12.5px}
47
+ .hmhead span{color:var(--dim)}
48
+ .hmnote{display:block;font-size:11.5px;line-height:1.4;color:var(--dim);overflow-wrap:anywhere}
21
49
  .hdot{display:inline-block;width:8px;height:8px;border-radius:4px;margin-right:var(--s1);background:var(--line)}
22
50
  .hdot.up{background:var(--ok)}.hdot.starting,.hdot.stopping{background:var(--warn)}.hdot.crashed{background:var(--red)}
23
51
  .hres{display:inline-flex;align-items:center;padding:var(--s0) var(--s2);font-size:12px}
@@ -30,7 +58,7 @@
30
58
  /* each widget card exactly as wide as what it holds; a widget's leading
31
59
  <header> joins the title line, dim */
32
60
  .hmon{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--s2)}
33
- .hwidget{flex:0 1 auto;max-width:100%;padding:var(--s1) var(--s2);border:1px solid var(--line);border-radius:3px;font-size:12px;line-height:1.5;overflow:auto}
61
+ .hwidget{flex:0 1 auto;max-width:100%;padding:var(--s0) var(--s2);border:1px solid var(--line);border-radius:3px;font-size:12px;line-height:1.4;overflow:auto}
34
62
  .hwidget h3{margin:0;font-size:12px;font-weight:650;white-space:nowrap}
35
63
  .hwidget h3 .hdim{font-weight:400}
36
64
  /* meters in two columns: <table class="wmeters">, label · bar · value, twice a row */
@@ -38,8 +66,13 @@
38
66
  .wmeters td:nth-child(3n){padding-right:var(--s3)}
39
67
  .wmeters td:last-child{padding-right:0}
40
68
  .wmeters .wbar{margin-right:0}
69
+ /* a meter's value: small, its digits one width so a column never jitters */
70
+ .wmeters .wv{font-size:11px;font-variant-numeric:tabular-nums}
41
71
  .hwidget table{border-collapse:collapse}
42
72
  .hwidget td{padding:0 var(--s3) 0 0;white-space:nowrap;vertical-align:middle}
73
+ /* a widget error: in its card where the html goes, or one mark after the cards */
74
+ .hwerr{font-size:12px;color:var(--warn);white-space:nowrap;cursor:help}
75
+ .hwerr .gpwarn{margin:0 var(--s1) 0 0}
43
76
  .hbad{color:var(--errink)}
44
77
  .hwait{flex:1;min-height:0;padding:var(--s4);color:var(--dim);font-size:13px;overflow:auto}
45
78
  .hwait p{margin:0 0 var(--s2)}
@@ -57,7 +90,7 @@
57
90
  sideways */
58
91
  .gpwrap{container-type:inline-size;font-size:13px}
59
92
  .c-gpname{width:180px}.c-gpver{width:56px}.c-gppid{width:64px}.c-gpstate{width:110px}
60
- .c-gpb.take{width:78px}.c-gpb.restart{width:64px}.c-gpb.stop{width:58px}.c-gpb.open{width:58px}
93
+ .c-gpb.take{width:78px}.c-gpb.stop,.c-gpb.restart{width:24px}
61
94
  .gptable td{vertical-align:middle}
62
95
  .gptable td.acname{vertical-align:top}
63
96
  .gpcore{color:var(--ink)}
@@ -78,20 +111,30 @@
78
111
  .gpstate{color:var(--dim);font-size:12px;font-variant-numeric:tabular-nums}
79
112
  .gpstate.up{color:var(--ok)}.gpstate.crashed{color:var(--red)}.gpstate.starting{color:var(--warn)}
80
113
  .gptable td.gpb{padding-left:0;padding-right:var(--s1);text-align:right;overflow:visible}
81
- .gpb button{padding:0 var(--s2);font-size:12px}
114
+ .gptable td.gpb.stop,.gptable td.gpb.restart{padding:0;text-align:center}
115
+ /* a small icon button: a process's start or stop, its restart, the open before its url */
116
+ .gpi{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:0;border-radius:3px;background:none;color:var(--dim);cursor:pointer;vertical-align:middle}
117
+ .gpi .hico{width:14px;height:14px;color:inherit}
118
+ .gpi:hover:not(:disabled){color:var(--ink);background:var(--panel2)}
119
+ .gpi.go{color:var(--ok)}
120
+ .gpi:disabled{opacity:.35;cursor:default}
121
+ .gphost .gpi{margin-right:var(--s1)}
122
+ /* the app button while its app builds: a spinner, never faded */
123
+ .gpi[aria-busy]:disabled{opacity:1;cursor:progress}
82
124
  .gpb button.hsm{padding:0 var(--s1);font-size:11px}
83
125
  .gpb.act{white-space:nowrap}
84
126
  .gpb.act button + button{margin-left:var(--s1)}
85
- .gphead div{display:flex;justify-content:flex-end;align-items:center;gap:var(--s1)}
127
+ .gphead div{display:flex;align-items:center;gap:var(--s1)}
128
+ .gphead .sp{flex:1}
86
129
  .gphead button.hsm{padding:0 var(--s1);font-size:11px}
87
- .gpnote{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
130
+ /* what a process has to say (its note, a refused take over): a mark after
131
+ its state words, the words on hover, never a line of its own */
132
+ .gpwarn{display:inline-block;vertical-align:middle;width:6px;height:6px;margin-left:var(--s1);border-radius:1px;background:var(--warn)}
133
+ .gpstate span[title]{cursor:help}
88
134
  @container (max-width:620px){.c-gphost,.gphost,.c-gpver,.gpver,.c-gppid,.gppid{display:none}.gptable .c-name{width:96px}.c-gpname{width:110px}.c-gpstate{width:88px}}
89
135
  /* a phone: the state words go too, the dot and the tint still say it, and
90
- only start (stop) and open stay, the label taking what is left */
91
- @container (max-width:440px){.c-gpstate,.gpstate,.c-gpb.act,.gpb.act,.c-gpb.take,.gpb.take,.c-gpb.restart,.gpb.restart,.gphead button.hsm{display:none}.gptable .c-name{width:64px}.c-gpname{width:auto}.c-gpb.stop,.c-gpb.open{width:50px}}
92
- .hopen{margin-left:var(--s2)}
93
- .hopen button{display:inline-flex;align-items:center;padding:var(--s0) var(--s1)}
94
- .hopen .hico{color:inherit}
136
+ only start (stop) stays, the label taking what is left */
137
+ @container (max-width:440px){.c-gpstate,.gpstate,.c-gpb.act,.gpb.act,.c-gpb.take,.gpb.take,.c-gpb.restart,.gpb.restart{display:none}.gptable .c-name{width:64px}.c-gpname{width:auto}}
95
138
  .hsec{min-width:0}
96
139
  .hsec h2{display:flex;align-items:center;gap:var(--s2);height:28px;margin:0 0 var(--s2);padding-bottom:var(--s1);border-bottom:1px solid var(--line);
97
140
  font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);font-weight:600}
@@ -107,7 +150,14 @@
107
150
  .hnote{font-size:12px;color:var(--warn)}
108
151
  /* a filled bar any widget can draw: <span class="wbar" style="--p:51%"><i></i></span>,
109
152
  green below 70%, `mid` from 70%, `hi` from 90% (the widget picks the class) */
110
- .wbar{display:inline-block;vertical-align:middle;width:56px;height:7px;margin-right:var(--s2);border-radius:4px;background:var(--line);overflow:hidden}
153
+ .wbar{display:inline-block;vertical-align:middle;width:40px;height:7px;margin-right:var(--s2);border-radius:4px;background:var(--line);overflow:hidden}
111
154
  .wbar > i{display:block;height:100%;width:var(--p,0%);background:var(--ok)}
112
155
  .wbar.mid > i{background:var(--warn)}
113
156
  .wbar.hi > i{background:var(--red)}
157
+
158
+ /* a process card on the processes page: the menu's two panels at page width */
159
+ .pcard .hmacts{max-width:none}
160
+ .pcard .hmabout{max-width:none;max-height:none}
161
+ .pcard>.cstitle{margin:var(--s3) 0 var(--s1)}
162
+ .pcard .hlog{margin-top:0}
163
+ .pcard.lit{border-color:var(--accent)}