@ethlete/cli 3.0.0-next.27 → 3.0.0-next.28

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 (582) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/build-info.json +1 -1
  3. package/design/arrow-anchor.ts +55 -0
  4. package/design/define-call.ts +3 -0
  5. package/design/define-part.ts +28 -1
  6. package/design/web/frame.ts +28 -0
  7. package/package.json +1 -1
  8. package/src/lib/api/compose.js +3 -2
  9. package/src/lib/api/compose.js.map +1 -1
  10. package/src/lib/api/git.js +2 -1
  11. package/src/lib/api/git.js.map +1 -1
  12. package/src/lib/api/setup.js +2 -2
  13. package/src/lib/api/setup.js.map +1 -1
  14. package/src/lib/design/asset-shot.js +2 -2
  15. package/src/lib/design/asset-shot.js.map +1 -1
  16. package/src/lib/design/blank-png.d.ts +2 -0
  17. package/src/lib/design/blank-png.js +28 -0
  18. package/src/lib/design/blank-png.js.map +1 -0
  19. package/src/lib/design/cache-entry.d.ts +8 -0
  20. package/src/lib/design/cache-entry.js +30 -0
  21. package/src/lib/design/cache-entry.js.map +1 -0
  22. package/src/lib/design/calls-tsconfig.js +20 -13
  23. package/src/lib/design/calls-tsconfig.js.map +1 -1
  24. package/src/lib/design/calls.js +3 -3
  25. package/src/lib/design/calls.js.map +1 -1
  26. package/src/lib/design/changed-parts.d.ts +1 -1
  27. package/src/lib/design/check.d.ts +2 -0
  28. package/src/lib/design/check.js +91 -24
  29. package/src/lib/design/check.js.map +1 -1
  30. package/src/lib/design/code-hash.d.ts +30 -0
  31. package/src/lib/design/code-hash.js +118 -0
  32. package/src/lib/design/code-hash.js.map +1 -0
  33. package/src/lib/design/commit-hunks.d.ts +2 -2
  34. package/src/lib/design/commit-hunks.js +2 -2
  35. package/src/lib/design/design-command.js +131 -36
  36. package/src/lib/design/design-command.js.map +1 -1
  37. package/src/lib/design/{paths.d.ts → design-config.d.ts} +6 -28
  38. package/src/lib/design/design-config.js +35 -0
  39. package/src/lib/design/design-config.js.map +1 -0
  40. package/src/lib/design/design-lint.d.ts +68 -0
  41. package/src/lib/design/design-lint.js +183 -0
  42. package/src/lib/design/design-lint.js.map +1 -0
  43. package/src/lib/design/draw-ledger.d.ts +6 -0
  44. package/src/lib/design/draw-ledger.js +10 -0
  45. package/src/lib/design/draw-ledger.js.map +1 -1
  46. package/src/lib/design/force-interactions.d.ts +2 -0
  47. package/src/lib/design/force-interactions.js +4 -2
  48. package/src/lib/design/force-interactions.js.map +1 -1
  49. package/src/lib/design/generated-stylesheets.d.ts +1 -1
  50. package/src/lib/design/generated-stylesheets.js +2 -2
  51. package/src/lib/design/generated-stylesheets.js.map +1 -1
  52. package/src/lib/design/git-top.d.ts +5 -0
  53. package/src/lib/design/git-top.js +16 -0
  54. package/src/lib/design/git-top.js.map +1 -0
  55. package/src/lib/design/hooks-problem.d.ts +2 -0
  56. package/src/lib/design/hooks-problem.js +23 -0
  57. package/src/lib/design/hooks-problem.js.map +1 -0
  58. package/src/lib/design/index.d.ts +4 -1
  59. package/src/lib/design/index.js +4 -1
  60. package/src/lib/design/index.js.map +1 -1
  61. package/src/lib/design/is-running.d.ts +1 -0
  62. package/src/lib/design/is-running.js +14 -0
  63. package/src/lib/design/is-running.js.map +1 -0
  64. package/src/lib/design/legacy.js +3 -3
  65. package/src/lib/design/legacy.js.map +1 -1
  66. package/src/lib/design/mcp-command.js +5 -12
  67. package/src/lib/design/mcp-command.js.map +1 -1
  68. package/src/lib/design/merge-compare.js +3 -3
  69. package/src/lib/design/merge-compare.js.map +1 -1
  70. package/src/lib/design/motion-command.js +3 -3
  71. package/src/lib/design/motion-command.js.map +1 -1
  72. package/src/lib/design/new-call.js +3 -3
  73. package/src/lib/design/new-call.js.map +1 -1
  74. package/src/lib/design/old-shot-folders.d.ts +2 -0
  75. package/src/lib/design/old-shot-folders.js +26 -0
  76. package/src/lib/design/old-shot-folders.js.map +1 -0
  77. package/src/lib/design/package-root.d.ts +21 -0
  78. package/src/lib/design/package-root.js +79 -0
  79. package/src/lib/design/package-root.js.map +1 -0
  80. package/src/lib/design/parent-watch.d.ts +7 -0
  81. package/src/lib/design/parent-watch.js +23 -0
  82. package/src/lib/design/parent-watch.js.map +1 -0
  83. package/src/lib/design/part-marks.js +2 -2
  84. package/src/lib/design/part-marks.js.map +1 -1
  85. package/src/lib/design/phase-timing.d.ts +5 -0
  86. package/src/lib/design/phase-timing.js +27 -0
  87. package/src/lib/design/phase-timing.js.map +1 -0
  88. package/src/lib/design/physical-cores.d.ts +12 -0
  89. package/src/lib/design/physical-cores.js +43 -0
  90. package/src/lib/design/physical-cores.js.map +1 -0
  91. package/src/lib/design/product-command.js +4 -4
  92. package/src/lib/design/product-command.js.map +1 -1
  93. package/src/lib/design/push-status.d.ts +30 -0
  94. package/src/lib/design/push-status.js +122 -0
  95. package/src/lib/design/push-status.js.map +1 -0
  96. package/src/lib/design/ready-shots.d.ts +18 -35
  97. package/src/lib/design/ready-shots.js +46 -111
  98. package/src/lib/design/ready-shots.js.map +1 -1
  99. package/src/lib/design/render-packages.d.ts +3 -1
  100. package/src/lib/design/render-packages.js +6 -2
  101. package/src/lib/design/render-packages.js.map +1 -1
  102. package/src/lib/design/render-worker.js +23 -3
  103. package/src/lib/design/render-worker.js.map +1 -1
  104. package/src/lib/design/render.d.ts +24 -3
  105. package/src/lib/design/render.js +23 -9
  106. package/src/lib/design/render.js.map +1 -1
  107. package/src/lib/design/resident/client.d.ts +52 -0
  108. package/src/lib/design/resident/client.js +263 -0
  109. package/src/lib/design/resident/client.js.map +1 -0
  110. package/src/lib/design/resident/discovery.d.ts +21 -0
  111. package/src/lib/design/resident/discovery.js +63 -0
  112. package/src/lib/design/resident/discovery.js.map +1 -0
  113. package/src/lib/design/resident/resident-process.d.ts +19 -0
  114. package/src/lib/design/resident/resident-process.js +189 -0
  115. package/src/lib/design/resident/resident-process.js.map +1 -0
  116. package/src/lib/design/resident/server.d.ts +52 -0
  117. package/src/lib/design/resident/server.js +212 -0
  118. package/src/lib/design/resident/server.js.map +1 -0
  119. package/src/lib/design/run-abort.d.ts +9 -0
  120. package/src/lib/design/run-abort.js +45 -0
  121. package/src/lib/design/run-abort.js.map +1 -0
  122. package/src/lib/design/run-deadline.d.ts +19 -0
  123. package/src/lib/design/run-deadline.js +104 -0
  124. package/src/lib/design/run-deadline.js.map +1 -0
  125. package/src/lib/design/run-yield.d.ts +8 -0
  126. package/src/lib/design/run-yield.js +43 -0
  127. package/src/lib/design/run-yield.js.map +1 -0
  128. package/src/lib/design/serve-state.d.ts +15 -0
  129. package/src/lib/design/serve-state.js +56 -0
  130. package/src/lib/design/serve-state.js.map +1 -0
  131. package/src/lib/design/serve.d.ts +20 -2
  132. package/src/lib/design/serve.js +147 -43
  133. package/src/lib/design/serve.js.map +1 -1
  134. package/src/lib/design/server-identity.d.ts +5 -1
  135. package/src/lib/design/server-identity.js +4 -1
  136. package/src/lib/design/server-identity.js.map +1 -1
  137. package/src/lib/design/shot-board.d.ts +26 -0
  138. package/src/lib/design/shot-board.js +80 -0
  139. package/src/lib/design/shot-board.js.map +1 -0
  140. package/src/lib/design/shot-command.d.ts +1 -1
  141. package/src/lib/design/shot-command.js +12 -5
  142. package/src/lib/design/shot-command.js.map +1 -1
  143. package/src/lib/design/shot-store.d.ts +29 -3
  144. package/src/lib/design/shot-store.js +206 -36
  145. package/src/lib/design/shot-store.js.map +1 -1
  146. package/src/lib/design/shot.d.ts +12 -4
  147. package/src/lib/design/shot.js +98 -14
  148. package/src/lib/design/shot.js.map +1 -1
  149. package/src/lib/design/sketch-at.js +2 -1
  150. package/src/lib/design/sketch-at.js.map +1 -1
  151. package/src/lib/design/sketch-command.d.ts +13 -0
  152. package/src/lib/design/sketch-command.js +346 -73
  153. package/src/lib/design/sketch-command.js.map +1 -1
  154. package/src/lib/design/ssr-shims.d.ts +1 -0
  155. package/src/lib/design/ssr-shims.js +3 -3
  156. package/src/lib/design/ssr-shims.js.map +1 -1
  157. package/src/lib/design/stamp.d.ts +5 -0
  158. package/src/lib/design/stamp.js +6 -5
  159. package/src/lib/design/stamp.js.map +1 -1
  160. package/src/lib/design/status.d.ts +1 -1
  161. package/src/lib/design/status.js +15 -4
  162. package/src/lib/design/status.js.map +1 -1
  163. package/src/lib/design/studio-api.d.ts +7 -15
  164. package/src/lib/design/studio-api.js +39 -140
  165. package/src/lib/design/studio-api.js.map +1 -1
  166. package/src/lib/design/system/accepted-pictures.d.ts +15 -29
  167. package/src/lib/design/system/accepted-pictures.js +156 -134
  168. package/src/lib/design/system/accepted-pictures.js.map +1 -1
  169. package/src/lib/design/system/action-cache.d.ts +45 -0
  170. package/src/lib/design/system/action-cache.js +72 -0
  171. package/src/lib/design/system/action-cache.js.map +1 -0
  172. package/src/lib/design/system/action-lost.d.ts +8 -6
  173. package/src/lib/design/system/action-lost.js +13 -17
  174. package/src/lib/design/system/action-lost.js.map +1 -1
  175. package/src/lib/design/system/action-press.d.ts +7 -1
  176. package/src/lib/design/system/action-press.js +16 -4
  177. package/src/lib/design/system/action-press.js.map +1 -1
  178. package/src/lib/design/system/actions-command.d.ts +12 -5
  179. package/src/lib/design/system/actions-command.js +187 -66
  180. package/src/lib/design/system/actions-command.js.map +1 -1
  181. package/src/lib/design/system/actions.d.ts +27 -4
  182. package/src/lib/design/system/actions.js +59 -21
  183. package/src/lib/design/system/actions.js.map +1 -1
  184. package/src/lib/design/system/anti-alias.d.ts +2 -0
  185. package/src/lib/design/system/anti-alias.js +11 -0
  186. package/src/lib/design/system/anti-alias.js.map +1 -0
  187. package/src/lib/design/system/app-files.js +19 -3
  188. package/src/lib/design/system/app-files.js.map +1 -1
  189. package/src/lib/design/system/arrow-anchor.d.ts +9 -0
  190. package/src/lib/design/system/arrow-anchor.js +40 -0
  191. package/src/lib/design/system/arrow-anchor.js.map +1 -0
  192. package/src/lib/design/system/base-issues.d.ts +28 -0
  193. package/src/lib/design/system/base-issues.js +80 -0
  194. package/src/lib/design/system/base-issues.js.map +1 -0
  195. package/src/lib/design/system/base.d.ts +1 -1
  196. package/src/lib/design/system/base.js +2 -2
  197. package/src/lib/design/system/base.js.map +1 -1
  198. package/src/lib/design/system/baseline-history.d.ts +13 -0
  199. package/src/lib/design/system/baseline-history.js +40 -0
  200. package/src/lib/design/system/baseline-history.js.map +1 -0
  201. package/src/lib/design/system/bespoke-controls.d.ts +4 -1
  202. package/src/lib/design/system/bespoke-controls.js +72 -70
  203. package/src/lib/design/system/bespoke-controls.js.map +1 -1
  204. package/src/lib/design/system/build-ready-contract.d.ts +7 -1
  205. package/src/lib/design/system/build-ready-contract.js +7 -1
  206. package/src/lib/design/system/build-ready-contract.js.map +1 -1
  207. package/src/lib/design/system/build-running.d.ts +13 -0
  208. package/src/lib/design/system/build-running.js +48 -0
  209. package/src/lib/design/system/build-running.js.map +1 -0
  210. package/src/lib/design/system/check-record.d.ts +18 -0
  211. package/src/lib/design/system/check-record.js +47 -0
  212. package/src/lib/design/system/check-record.js.map +1 -0
  213. package/src/lib/design/system/check-rules.d.ts +1 -1
  214. package/src/lib/design/system/check-rules.js +19 -1
  215. package/src/lib/design/system/check-rules.js.map +1 -1
  216. package/src/lib/design/system/check-system.d.ts +25 -4
  217. package/src/lib/design/system/check-system.js +289 -121
  218. package/src/lib/design/system/check-system.js.map +1 -1
  219. package/src/lib/design/system/comments/inbox.d.ts +1 -1
  220. package/src/lib/design/system/compare-cache.d.ts +20 -0
  221. package/src/lib/design/system/compare-cache.js +92 -0
  222. package/src/lib/design/system/compare-cache.js.map +1 -0
  223. package/src/lib/design/system/compare-command.d.ts +82 -51
  224. package/src/lib/design/system/compare-command.js +362 -340
  225. package/src/lib/design/system/compare-command.js.map +1 -1
  226. package/src/lib/design/system/complete.d.ts +31 -1
  227. package/src/lib/design/system/complete.js +141 -27
  228. package/src/lib/design/system/complete.js.map +1 -1
  229. package/src/lib/design/system/decision-refs.d.ts +5 -0
  230. package/src/lib/design/system/decision-refs.js +21 -0
  231. package/src/lib/design/system/decision-refs.js.map +1 -0
  232. package/src/lib/design/system/design-hash.d.ts +22 -1
  233. package/src/lib/design/system/design-hash.js +63 -4
  234. package/src/lib/design/system/design-hash.js.map +1 -1
  235. package/src/lib/design/system/dom-command.d.ts +1 -1
  236. package/src/lib/design/system/dom-command.js +8 -5
  237. package/src/lib/design/system/dom-command.js.map +1 -1
  238. package/src/lib/design/system/drawn-open-points.d.ts +1 -1
  239. package/src/lib/design/system/dropped-props.d.ts +19 -5
  240. package/src/lib/design/system/dropped-props.js +133 -21
  241. package/src/lib/design/system/dropped-props.js.map +1 -1
  242. package/src/lib/design/system/grid-report.d.ts +5 -0
  243. package/src/lib/design/system/grid-report.js +78 -0
  244. package/src/lib/design/system/grid-report.js.map +1 -0
  245. package/src/lib/design/system/harness-build-cache.d.ts +17 -3
  246. package/src/lib/design/system/harness-build-cache.js +23 -10
  247. package/src/lib/design/system/harness-build-cache.js.map +1 -1
  248. package/src/lib/design/system/harness-inputs.d.ts +17 -0
  249. package/src/lib/design/system/harness-inputs.js +160 -0
  250. package/src/lib/design/system/harness-inputs.js.map +1 -0
  251. package/src/lib/design/system/harness-map.d.ts +1 -1
  252. package/src/lib/design/system/harness-server.d.ts +12 -1
  253. package/src/lib/design/system/harness-server.js +29 -19
  254. package/src/lib/design/system/harness-server.js.map +1 -1
  255. package/src/lib/design/system/harness-shot.d.ts +78 -0
  256. package/src/lib/design/system/harness-shot.js +349 -0
  257. package/src/lib/design/system/harness-shot.js.map +1 -0
  258. package/src/lib/design/system/harness-watch.d.ts +79 -0
  259. package/src/lib/design/system/harness-watch.js +334 -0
  260. package/src/lib/design/system/harness-watch.js.map +1 -0
  261. package/src/lib/design/system/implementation-baseline.d.ts +20 -0
  262. package/src/lib/design/system/implementation-baseline.js +44 -0
  263. package/src/lib/design/system/implementation-baseline.js.map +1 -0
  264. package/src/lib/design/system/leftover-gate-files.d.ts +2 -0
  265. package/src/lib/design/system/leftover-gate-files.js +15 -0
  266. package/src/lib/design/system/leftover-gate-files.js.map +1 -0
  267. package/src/lib/design/system/lib-build-lock.d.ts +18 -0
  268. package/src/lib/design/system/lib-build-lock.js +111 -0
  269. package/src/lib/design/system/lib-build-lock.js.map +1 -0
  270. package/src/lib/design/system/link-free.d.ts +12 -0
  271. package/src/lib/design/system/link-free.js +125 -0
  272. package/src/lib/design/system/link-free.js.map +1 -0
  273. package/src/lib/design/system/list-system.d.ts +4 -8
  274. package/src/lib/design/system/list-system.js +8 -78
  275. package/src/lib/design/system/list-system.js.map +1 -1
  276. package/src/lib/design/system/live-actions.d.ts +1 -1
  277. package/src/lib/design/system/live-actions.js +17 -8
  278. package/src/lib/design/system/live-actions.js.map +1 -1
  279. package/src/lib/design/system/live-compare.js +1 -1
  280. package/src/lib/design/system/live-compare.js.map +1 -1
  281. package/src/lib/design/system/live-uncovered.d.ts +7 -2
  282. package/src/lib/design/system/live-uncovered.js +44 -9
  283. package/src/lib/design/system/live-uncovered.js.map +1 -1
  284. package/src/lib/design/system/no-verdict.d.ts +13 -0
  285. package/src/lib/design/system/no-verdict.js +17 -0
  286. package/src/lib/design/system/no-verdict.js.map +1 -0
  287. package/src/lib/design/system/off-centre.d.ts +11 -0
  288. package/src/lib/design/system/off-centre.js +74 -0
  289. package/src/lib/design/system/off-centre.js.map +1 -0
  290. package/src/lib/design/system/open-points-cache.d.ts +11 -0
  291. package/src/lib/design/system/open-points-cache.js +27 -0
  292. package/src/lib/design/system/open-points-cache.js.map +1 -0
  293. package/src/lib/design/system/open-points-runner.d.ts +43 -0
  294. package/src/lib/design/system/open-points-runner.js +119 -0
  295. package/src/lib/design/system/open-points-runner.js.map +1 -0
  296. package/src/lib/design/system/open-points-worker.d.ts +1 -0
  297. package/src/lib/design/system/open-points-worker.js +28 -0
  298. package/src/lib/design/system/open-points-worker.js.map +1 -0
  299. package/src/lib/design/system/open-points.js +1 -1
  300. package/src/lib/design/system/open-points.js.map +1 -1
  301. package/src/lib/design/system/part-build-ready.d.ts +13 -7
  302. package/src/lib/design/system/part-build-ready.js +43 -15
  303. package/src/lib/design/system/part-build-ready.js.map +1 -1
  304. package/src/lib/design/system/part-compare.d.ts +18 -2
  305. package/src/lib/design/system/part-compare.js +147 -42
  306. package/src/lib/design/system/part-compare.js.map +1 -1
  307. package/src/lib/design/system/part-picture-cache.d.ts +23 -0
  308. package/src/lib/design/system/part-picture-cache.js +68 -0
  309. package/src/lib/design/system/part-picture-cache.js.map +1 -0
  310. package/src/lib/design/system/part-ready.d.ts +33 -7
  311. package/src/lib/design/system/part-ready.js +55 -17
  312. package/src/lib/design/system/part-ready.js.map +1 -1
  313. package/src/lib/design/system/part-task.d.ts +20 -0
  314. package/src/lib/design/system/part-task.js +53 -7
  315. package/src/lib/design/system/part-task.js.map +1 -1
  316. package/src/lib/design/system/pixel-cache.d.ts +16 -0
  317. package/src/lib/design/system/pixel-cache.js +79 -0
  318. package/src/lib/design/system/pixel-cache.js.map +1 -0
  319. package/src/lib/design/system/pointer-focus.d.ts +10 -2
  320. package/src/lib/design/system/pointer-focus.js +32 -9
  321. package/src/lib/design/system/pointer-focus.js.map +1 -1
  322. package/src/lib/design/system/prettier.js +4 -3
  323. package/src/lib/design/system/prettier.js.map +1 -1
  324. package/src/lib/design/system/problem.d.ts +6 -0
  325. package/src/lib/design/system/product.js +2 -2
  326. package/src/lib/design/system/product.js.map +1 -1
  327. package/src/lib/design/system/ready-command.d.ts +1 -1
  328. package/src/lib/design/system/ready-command.js +24 -4
  329. package/src/lib/design/system/ready-command.js.map +1 -1
  330. package/src/lib/design/system/record-settled.d.ts +24 -0
  331. package/src/lib/design/system/record-settled.js +50 -0
  332. package/src/lib/design/system/record-settled.js.map +1 -0
  333. package/src/lib/design/system/render-check.d.ts +18 -1
  334. package/src/lib/design/system/render-check.js +164 -104
  335. package/src/lib/design/system/render-check.js.map +1 -1
  336. package/src/lib/design/system/render-issue-key.d.ts +9 -0
  337. package/src/lib/design/system/render-issue-key.js +27 -0
  338. package/src/lib/design/system/render-issue-key.js.map +1 -0
  339. package/src/lib/design/system/resolve-product.d.ts +4 -1
  340. package/src/lib/design/system/resolve-product.js +14 -3
  341. package/src/lib/design/system/resolve-product.js.map +1 -1
  342. package/src/lib/design/system/rule-baseline.d.ts +53 -0
  343. package/src/lib/design/system/rule-baseline.js +124 -0
  344. package/src/lib/design/system/rule-baseline.js.map +1 -0
  345. package/src/lib/design/system/rule-skips.d.ts +20 -0
  346. package/src/lib/design/system/rule-skips.js +36 -0
  347. package/src/lib/design/system/rule-skips.js.map +1 -0
  348. package/src/lib/design/system/rules/canonical-class.d.ts +4 -0
  349. package/src/lib/design/system/rules/canonical-class.js +66 -13
  350. package/src/lib/design/system/rules/canonical-class.js.map +1 -1
  351. package/src/lib/design/system/rules/capability-place.d.ts +4 -2
  352. package/src/lib/design/system/rules/capability-place.js +15 -2
  353. package/src/lib/design/system/rules/capability-place.js.map +1 -1
  354. package/src/lib/design/system/rules/command-text.d.ts +7 -0
  355. package/src/lib/design/system/rules/command-text.js +72 -0
  356. package/src/lib/design/system/rules/command-text.js.map +1 -0
  357. package/src/lib/design/system/rules/design-coverage.d.ts +30 -0
  358. package/src/lib/design/system/rules/design-coverage.js +205 -0
  359. package/src/lib/design/system/rules/design-coverage.js.map +1 -0
  360. package/src/lib/design/system/rules/glued-interpolation.js +17 -1
  361. package/src/lib/design/system/rules/glued-interpolation.js.map +1 -1
  362. package/src/lib/design/system/rules/implements-unrendered.d.ts +13 -0
  363. package/src/lib/design/system/rules/implements-unrendered.js +63 -0
  364. package/src/lib/design/system/rules/implements-unrendered.js.map +1 -0
  365. package/src/lib/design/system/rules/motion.js +6 -0
  366. package/src/lib/design/system/rules/motion.js.map +1 -1
  367. package/src/lib/design/system/rules/native-title.js +13 -3
  368. package/src/lib/design/system/rules/native-title.js.map +1 -1
  369. package/src/lib/design/system/rules/option-values.d.ts +1 -1
  370. package/src/lib/design/system/rules/pending-state.d.ts +39 -0
  371. package/src/lib/design/system/rules/pending-state.js +289 -0
  372. package/src/lib/design/system/rules/pending-state.js.map +1 -0
  373. package/src/lib/design/system/rules/sdk-attribute-value.d.ts +10 -0
  374. package/src/lib/design/system/rules/sdk-attribute-value.js +78 -0
  375. package/src/lib/design/system/rules/sdk-attribute-value.js.map +1 -0
  376. package/src/lib/design/system/rules/sdk-private-var.d.ts +9 -0
  377. package/src/lib/design/system/rules/sdk-private-var.js +54 -0
  378. package/src/lib/design/system/rules/sdk-private-var.js.map +1 -0
  379. package/src/lib/design/system/rules/skips.d.ts +4 -0
  380. package/src/lib/design/system/rules/skips.js +27 -0
  381. package/src/lib/design/system/rules/skips.js.map +1 -0
  382. package/src/lib/design/system/rules/stale-replace.js +1 -0
  383. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  384. package/src/lib/design/system/rules/tailwind-classes.d.ts +1 -0
  385. package/src/lib/design/system/rules/tailwind-classes.js +11 -6
  386. package/src/lib/design/system/rules/tailwind-classes.js.map +1 -1
  387. package/src/lib/design/system/rules/token-selectors.js +10 -3
  388. package/src/lib/design/system/rules/token-selectors.js.map +1 -1
  389. package/src/lib/design/system/rules/unbound-input-known.d.ts +2 -0
  390. package/src/lib/design/system/rules/unbound-input-known.js +3 -6
  391. package/src/lib/design/system/rules/unbound-input-known.js.map +1 -1
  392. package/src/lib/design/system/rules/unbound-input.d.ts +2 -0
  393. package/src/lib/design/system/rules/unbound-input.js +12 -6
  394. package/src/lib/design/system/rules/unbound-input.js.map +1 -1
  395. package/src/lib/design/system/rules/undefined-class.js +11 -2
  396. package/src/lib/design/system/rules/undefined-class.js.map +1 -1
  397. package/src/lib/design/system/rules/utility-css.js +13 -1
  398. package/src/lib/design/system/rules/utility-css.js.map +1 -1
  399. package/src/lib/design/system/rules/visible-change.d.ts +1 -2
  400. package/src/lib/design/system/rules/visible-change.js +3 -3
  401. package/src/lib/design/system/rules/visible-change.js.map +1 -1
  402. package/src/lib/design/system/sdk-declarations.d.ts +10 -0
  403. package/src/lib/design/system/sdk-declarations.js +177 -0
  404. package/src/lib/design/system/sdk-declarations.js.map +1 -0
  405. package/src/lib/design/system/sdk-selectors.d.ts +18 -0
  406. package/src/lib/design/system/sdk-selectors.js +131 -0
  407. package/src/lib/design/system/sdk-selectors.js.map +1 -0
  408. package/src/lib/design/system/served-cache.d.ts +99 -0
  409. package/src/lib/design/system/served-cache.js +202 -0
  410. package/src/lib/design/system/served-cache.js.map +1 -0
  411. package/src/lib/design/system/settled-panes.d.ts +8 -3
  412. package/src/lib/design/system/settled-panes.js +10 -9
  413. package/src/lib/design/system/settled-panes.js.map +1 -1
  414. package/src/lib/design/system/sketch/baseline.d.ts +17 -1
  415. package/src/lib/design/system/sketch/baseline.js +48 -7
  416. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  417. package/src/lib/design/system/sketch/check-format.js +3 -9
  418. package/src/lib/design/system/sketch/check-format.js.map +1 -1
  419. package/src/lib/design/system/sketch/clean-copy.d.ts +18 -0
  420. package/src/lib/design/system/sketch/clean-copy.js +104 -0
  421. package/src/lib/design/system/sketch/clean-copy.js.map +1 -0
  422. package/src/lib/design/system/sketch/cli-args.d.ts +1 -1
  423. package/src/lib/design/system/sketch/cli-args.js +2 -2
  424. package/src/lib/design/system/sketch/cli-args.js.map +1 -1
  425. package/src/lib/design/system/sketch/covered-diffs.d.ts +40 -0
  426. package/src/lib/design/system/sketch/covered-diffs.js +106 -0
  427. package/src/lib/design/system/sketch/covered-diffs.js.map +1 -0
  428. package/src/lib/design/system/sketch/edit-sketch.d.ts +14 -6
  429. package/src/lib/design/system/sketch/edit-sketch.js +87 -35
  430. package/src/lib/design/system/sketch/edit-sketch.js.map +1 -1
  431. package/src/lib/design/system/sketch/identical-renders.js +20 -14
  432. package/src/lib/design/system/sketch/identical-renders.js.map +1 -1
  433. package/src/lib/design/system/sketch/merge-commit.d.ts +20 -0
  434. package/src/lib/design/system/sketch/merge-commit.js +72 -0
  435. package/src/lib/design/system/sketch/merge-commit.js.map +1 -0
  436. package/src/lib/design/system/sketch/merge-runner.d.ts +20 -0
  437. package/src/lib/design/system/sketch/merge-runner.js +73 -0
  438. package/src/lib/design/system/sketch/merge-runner.js.map +1 -0
  439. package/src/lib/design/system/sketch/merge-step.d.ts +14 -2
  440. package/src/lib/design/system/sketch/merge-step.js +24 -12
  441. package/src/lib/design/system/sketch/merge-step.js.map +1 -1
  442. package/src/lib/design/system/sketch/merge-worker.d.ts +1 -0
  443. package/src/lib/design/system/sketch/merge-worker.js +14 -0
  444. package/src/lib/design/system/sketch/merge-worker.js.map +1 -0
  445. package/src/lib/design/system/sketch/merge.d.ts +10 -3
  446. package/src/lib/design/system/sketch/merge.js +180 -90
  447. package/src/lib/design/system/sketch/merge.js.map +1 -1
  448. package/src/lib/design/system/sketch/merged-parts.d.ts +0 -29
  449. package/src/lib/design/system/sketch/merged-parts.js +8 -56
  450. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  451. package/src/lib/design/system/sketch/note-language.d.ts +7 -0
  452. package/src/lib/design/system/sketch/note-language.js +83 -0
  453. package/src/lib/design/system/sketch/note-language.js.map +1 -0
  454. package/src/lib/design/system/sketch/part-definition.d.ts +6 -0
  455. package/src/lib/design/system/sketch/part-definition.js +31 -1
  456. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  457. package/src/lib/design/system/sketch/rebase-port.js +47 -2
  458. package/src/lib/design/system/sketch/rebase-port.js.map +1 -1
  459. package/src/lib/design/system/sketch/sketch-check-cache.d.ts +11 -0
  460. package/src/lib/design/system/sketch/sketch-check-cache.js +22 -0
  461. package/src/lib/design/system/sketch/sketch-check-cache.js.map +1 -0
  462. package/src/lib/design/system/sketch/sketch-check-worker.js +6 -1
  463. package/src/lib/design/system/sketch/sketch-check-worker.js.map +1 -1
  464. package/src/lib/design/system/sketch/sketch-checker.d.ts +14 -1
  465. package/src/lib/design/system/sketch/sketch-checker.js +16 -6
  466. package/src/lib/design/system/sketch/sketch-checker.js.map +1 -1
  467. package/src/lib/design/system/sketch/sketch.d.ts +37 -6
  468. package/src/lib/design/system/sketch/sketch.js +101 -13
  469. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  470. package/src/lib/design/system/sketch/stale-base.js +1 -1
  471. package/src/lib/design/system/sketch/stale-base.js.map +1 -1
  472. package/src/lib/design/system/sketch/unchanged-states.d.ts +7 -3
  473. package/src/lib/design/system/sketch/unchanged-states.js +25 -12
  474. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  475. package/src/lib/design/system/sketch/viewed-shots.d.ts +10 -2
  476. package/src/lib/design/system/sketch/viewed-shots.js +15 -22
  477. package/src/lib/design/system/sketch/viewed-shots.js.map +1 -1
  478. package/src/lib/design/system/skip-classes.d.ts +3 -0
  479. package/src/lib/design/system/skip-classes.js +17 -0
  480. package/src/lib/design/system/skip-classes.js.map +1 -0
  481. package/src/lib/design/system/slot-hosts.d.ts +38 -0
  482. package/src/lib/design/system/slot-hosts.js +93 -0
  483. package/src/lib/design/system/slot-hosts.js.map +1 -0
  484. package/src/lib/design/system/slow-checks.d.ts +4 -0
  485. package/src/lib/design/system/slow-checks.js +77 -24
  486. package/src/lib/design/system/slow-checks.js.map +1 -1
  487. package/src/lib/design/system/slow-run.d.ts +15 -5
  488. package/src/lib/design/system/slow-run.js +143 -84
  489. package/src/lib/design/system/slow-run.js.map +1 -1
  490. package/src/lib/design/system/stale-dist.d.ts +37 -1
  491. package/src/lib/design/system/stale-dist.js +58 -8
  492. package/src/lib/design/system/stale-dist.js.map +1 -1
  493. package/src/lib/design/system/stale-parts.d.ts +15 -0
  494. package/src/lib/design/system/stale-parts.js +67 -5
  495. package/src/lib/design/system/stale-parts.js.map +1 -1
  496. package/src/lib/design/system/system-command.js +3 -3
  497. package/src/lib/design/system/system-command.js.map +1 -1
  498. package/src/lib/design/system/system-modules.d.ts +4 -4
  499. package/src/lib/design/system/system-tsconfig.d.ts +9 -2
  500. package/src/lib/design/system/system-tsconfig.js +73 -13
  501. package/src/lib/design/system/system-tsconfig.js.map +1 -1
  502. package/src/lib/design/system/task-command.d.ts +3 -2
  503. package/src/lib/design/system/task-command.js +111 -73
  504. package/src/lib/design/system/task-command.js.map +1 -1
  505. package/src/lib/design/system/touched-parts.d.ts +1 -1
  506. package/src/lib/design/system/touched-parts.js +4 -5
  507. package/src/lib/design/system/touched-parts.js.map +1 -1
  508. package/src/lib/design/system/tracked-reads.d.ts +27 -0
  509. package/src/lib/design/system/tracked-reads.js +100 -0
  510. package/src/lib/design/system/tracked-reads.js.map +1 -0
  511. package/src/lib/design/system/unchanged-rows.d.ts +17 -8
  512. package/src/lib/design/system/unchanged-rows.js +90 -12
  513. package/src/lib/design/system/unchanged-rows.js.map +1 -1
  514. package/src/lib/design/system/uncommitted-decisions.d.ts +0 -2
  515. package/src/lib/design/system/uncommitted-decisions.js +3 -6
  516. package/src/lib/design/system/uncommitted-decisions.js.map +1 -1
  517. package/src/lib/design/system/visible-change-command.d.ts +13 -1
  518. package/src/lib/design/system/visible-change-command.js +10 -8
  519. package/src/lib/design/system/visible-change-command.js.map +1 -1
  520. package/src/lib/design/system/visible-change-parts.d.ts +1 -1
  521. package/src/lib/design/system/write-origin.d.ts +12 -0
  522. package/src/lib/design/system/write-origin.js +18 -0
  523. package/src/lib/design/system/write-origin.js.map +1 -0
  524. package/src/lib/design/system-use.js +4 -4
  525. package/src/lib/design/system-use.js.map +1 -1
  526. package/src/lib/design/thumb.d.ts +19 -3
  527. package/src/lib/design/thumb.js +71 -9
  528. package/src/lib/design/thumb.js.map +1 -1
  529. package/src/lib/design/timings-command.d.ts +22 -0
  530. package/src/lib/design/timings-command.js +175 -0
  531. package/src/lib/design/timings-command.js.map +1 -0
  532. package/src/lib/design/timings.d.ts +117 -0
  533. package/src/lib/design/timings.js +296 -0
  534. package/src/lib/design/timings.js.map +1 -0
  535. package/src/lib/design/typecheck.js +2 -2
  536. package/src/lib/design/typecheck.js.map +1 -1
  537. package/src/lib/design/vite-cache.d.ts +11 -0
  538. package/src/lib/design/vite-cache.js +61 -0
  539. package/src/lib/design/vite-cache.js.map +1 -0
  540. package/src/lib/design/warm-draw.d.ts +33 -0
  541. package/src/lib/design/warm-draw.js +74 -0
  542. package/src/lib/design/warm-draw.js.map +1 -0
  543. package/src/lib/design/warm-pages.d.ts +10 -2
  544. package/src/lib/design/warm-pages.js +6 -2
  545. package/src/lib/design/warm-pages.js.map +1 -1
  546. package/src/lib/design/work-root.d.ts +2 -0
  547. package/src/lib/design/work-root.js +8 -0
  548. package/src/lib/design/work-root.js.map +1 -0
  549. package/src/lib/plain-output.d.ts +27 -0
  550. package/src/lib/plain-output.js +66 -0
  551. package/src/lib/plain-output.js.map +1 -0
  552. package/src/lib/release.js +11 -3
  553. package/src/lib/release.js.map +1 -1
  554. package/src/lib/update/commits.js +2 -2
  555. package/src/lib/update/commits.js.map +1 -1
  556. package/src/lib/update/packages.js +4 -2
  557. package/src/lib/update/packages.js.map +1 -1
  558. package/src/lib/update/scan.js +8 -2
  559. package/src/lib/update/scan.js.map +1 -1
  560. package/src/lib/design/paths.js +0 -138
  561. package/src/lib/design/paths.js.map +0 -1
  562. package/src/lib/design/system/accept-command.d.ts +0 -41
  563. package/src/lib/design/system/accept-command.js +0 -139
  564. package/src/lib/design/system/accept-command.js.map +0 -1
  565. package/src/lib/design/system/go-batch.d.ts +0 -24
  566. package/src/lib/design/system/go-batch.js +0 -110
  567. package/src/lib/design/system/go-batch.js.map +0 -1
  568. package/src/lib/design/system/go-command.d.ts +0 -4
  569. package/src/lib/design/system/go-command.js +0 -64
  570. package/src/lib/design/system/go-command.js.map +0 -1
  571. package/src/lib/design/system/go-guard.d.ts +0 -26
  572. package/src/lib/design/system/go-guard.js +0 -70
  573. package/src/lib/design/system/go-guard.js.map +0 -1
  574. package/src/lib/design/system/go-step.d.ts +0 -13
  575. package/src/lib/design/system/go-step.js +0 -84
  576. package/src/lib/design/system/go-step.js.map +0 -1
  577. package/src/lib/design/system/part-go.d.ts +0 -70
  578. package/src/lib/design/system/part-go.js +0 -94
  579. package/src/lib/design/system/part-go.js.map +0 -1
  580. package/src/lib/design/system/tom-confirm.d.ts +0 -40
  581. package/src/lib/design/system/tom-confirm.js +0 -55
  582. package/src/lib/design/system/tom-confirm.js.map +0 -1
@@ -20,39 +20,54 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.designSketch = exports.verdictLinesOf = exports.beforeLinesOf = exports.sketchFlagHelpOf = exports.SKETCH_USAGE = void 0;
23
+ exports.designSketch = exports.verdictLinesOf = exports.beforeLinesOf = exports.retriedHeldMerges = exports.sketchFlagHelpOf = exports.SKETCH_USAGE = void 0;
24
24
  const unused_closure_1 = require("./system/sketch/unused-closure");
25
+ const crypto_1 = require("crypto");
25
26
  const fs_1 = require("fs");
27
+ const os_1 = require("os");
26
28
  const path_1 = require("path");
29
+ const phase_timing_1 = require("./phase-timing");
30
+ const write_origin_1 = require("./system/write-origin");
27
31
  const assets_1 = require("./system/assets");
28
32
  const comment_1 = require("./system/comments/comment");
29
33
  const product_1 = require("./system/product");
30
34
  const resolve_product_1 = require("./system/resolve-product");
31
35
  const check_format_1 = require("./system/sketch/check-format");
32
36
  const frame_budget_1 = require("./system/sketch/frame-budget");
37
+ const note_language_1 = require("./system/sketch/note-language");
33
38
  const check_sketches_1 = require("./system/sketch/check-sketches");
34
39
  const cli_args_1 = require("./system/sketch/cli-args");
35
40
  const ready_shots_1 = require("./ready-shots");
36
41
  const no_visible_change_1 = require("./system/sketch/no-visible-change");
42
+ const covered_diffs_1 = require("./system/sketch/covered-diffs");
37
43
  const viewed_shots_1 = require("./system/sketch/viewed-shots");
44
+ const complete_1 = require("./system/complete");
38
45
  const merge_1 = require("./system/sketch/merge");
39
46
  const merge_step_1 = require("./system/sketch/merge-step");
40
47
  const check_system_1 = require("./system/check-system");
48
+ const stale_base_1 = require("./system/sketch/stale-base");
41
49
  const invocation_1 = require("../invocation");
42
50
  const merged_parts_1 = require("./system/sketch/merged-parts");
51
+ const no_verdict_1 = require("./system/no-verdict");
43
52
  const render_check_1 = require("./system/render-check");
44
53
  const merge_preview_1 = require("./system/sketch/merge-preview");
45
54
  const open_points_1 = require("./system/open-points");
46
55
  const read_open_points_1 = require("./system/read-open-points");
47
56
  const overlay_1 = require("./system/sketch/overlay");
57
+ const system_modules_1 = require("./system/system-modules");
58
+ const unchanged_states_1 = require("./system/sketch/unchanged-states");
48
59
  const rebase_port_1 = require("./system/sketch/rebase-port");
49
60
  const theming_text_1 = require("./system/theming-text");
61
+ const warm_draw_1 = require("./warm-draw");
50
62
  const sketch_1 = require("./system/sketch/sketch");
63
+ const plain_output_1 = require("../plain-output");
64
+ const design_lint_1 = require("./design-lint");
51
65
  exports.SKETCH_USAGE = [
52
- 'sketch new <layer>/<name> [<layer>/<name>…] --variants a,b --by <model id> [--like <layer>/<name>[:<variant>]] [--name <sketch name>] [--round <title>] [--note <text>] [--variant-note <variant>=<text>]… [--override | --into-base] [--product <name>]',
66
+ 'sketch new <layer>/<name> [<layer>/<name>…] --variants a,b --by <model id> [--like <layer>/<name>[:<variant>]] [--name <sketch name>] [--round <title>] [--note <text>] [--variant-note <variant>=<text>]… [--override | --into-base] [--ready] [--product <name>]',
53
67
  'sketch variant <layer>/<name> <variant>[,<variant>…] --from <variant> --by <model id> [--round <title> --note <why the running round lost> [--round-note <what the new round shows>]] [--product <name>]',
54
68
  'sketch round <layer>/<name> <round> [--title <text>] [--note <text>] [--drops <state,state>] --by <model id> [--product <name>]',
55
- 'sketch note <layer>/<name> <variant> <text> --by <model id> [--product <name>]',
69
+ 'sketch covers <layer>/<name> [[<layer>/<name>:]<state>[@<x>,<y>,<w>,<h>]…] --by <model id> [--product <name>]',
70
+ 'sketch note <layer>/<name> [<variant>] <text> [--round <round>] --by <model id> [--product <name>]',
56
71
  'sketch target add <layer>/<name> <layer>/<name> --by <model id> [--product <name>]',
57
72
  'sketch target remove <layer>/<name> <layer>/<name> --by <model id> [--product <name>]',
58
73
  'sketch list [--product <name>] [--json]',
@@ -63,7 +78,7 @@ exports.SKETCH_USAGE = [
63
78
  'sketch check [<layer>/<name>] [--fix] [--product <name>]',
64
79
  'sketch preview <layer>/<name> <variant> [--product <name>] [--json]',
65
80
  'sketch rebase <layer>/<name> [--ported] --by <model id> [--product <name>]',
66
- 'sketch merge <layer>/<name> [--note <reason> [--replace-note]] [--variant <key> --allowed-by <plan ref>] --by <model id> [--product <name>]',
81
+ 'sketch merge <layer>/<name> [--note <reason> [--replace-note]] [--variant <key> --allowed-by <plan ref>] [--decided-by <name>] --by <model id> [--product <name>]',
67
82
  'sketch discard <layer>/<name> --by <model id> [--product <name>]',
68
83
  'sketch reject <layer>/<name> --variant <key> [--reason <text>] --by <model id | designer> [--product <name>]',
69
84
  'sketch reopen <layer>/<name> --variant <key> [--reason <text>] --by <model id | designer> [--product <name>]',
@@ -77,14 +92,16 @@ const FLAG_HELP = {
77
92
  '--like': 'start each variant from another part, or from a variant of the open sketch on it',
78
93
  '--override': 'on a base part: merge into a product copy that overrides the base, not into the base; on a product override: sketch that copy',
79
94
  '--into-base': 'on a part the product overrides: start from the product copy, merge into the base and remove the copy',
95
+ '--ready': 'on new: run sketch ready (its gates are the check) right after opening the sketch; it fails when either refuses and the sketch stays in progress',
80
96
  '--ported': 'on rebase: the conflicting files hold the product change already, ported by hand - keep them and rebase',
81
- '--round': 'the title of a new round',
97
+ '--round': 'the title of a new round; on note: the key of the round whose note to rewrite',
82
98
  '--round-note': 'what the new round shows',
83
99
  '--from': 'the variant to copy',
84
100
  '--title': 'the new title of the round',
85
101
  '--drops': 'the states the round drops on purpose, a comma list',
86
102
  '--variant': 'the variant the command is about; on merge, the only live variant of a sketch with no pick',
87
103
  '--allowed-by': 'the plan entry that lets the merge go without a pick in Studio; noted in merged.json, needs --variant',
104
+ '--decided-by': 'on merge: who picked the variant, as merged.json records it (default user); a name the designer gave you at this terminal, e.g. tom - not with --allowed-by',
88
105
  '--replace-note': "on merge: also write --note over each target part's note",
89
106
  '--reason': 'why; on reject of a variant that is rejected already it sets the reason of that rejection; stored with who wrote it',
90
107
  '--until': 'what the pending change waits on: an open decision, a helper still to land',
@@ -116,6 +133,7 @@ const WRITES = new Set([
116
133
  'variant',
117
134
  'round',
118
135
  'note',
136
+ 'covers',
119
137
  'report',
120
138
  'ready',
121
139
  'hold',
@@ -125,6 +143,11 @@ const WRITES = new Set([
125
143
  'discard',
126
144
  ...VERDICTS,
127
145
  ]);
146
+ const RETRIES = new Set([...WRITES, 'check']);
147
+ const staleBasesOf = (context, options) => {
148
+ var _a;
149
+ return (0, check_system_1.staleSketchBasesOf)(Object.assign(Object.assign({}, options), { invocation: (_a = context.invocation) !== null && _a !== void 0 ? _a : (0, invocation_1.repoInvocation)({ root: context.target, subcommand: 'design' }) }));
150
+ };
128
151
  const fail = (message) => {
129
152
  console.error(message);
130
153
  return 1;
@@ -183,7 +206,7 @@ const variantLineOf = (options) => {
183
206
  const files = sketch.targets.map((part) => partFileOf(Object.assign(Object.assign({}, options), { part }))).join(', ');
184
207
  return ` ${variant}: ${files} assets: ${(0, path_1.relative)(root, (0, path_1.resolve)(sketch.dir, variant, assets_1.ASSETS_FOLDER))}/`;
185
208
  };
186
- const created = (context) => {
209
+ const opened = (context) => {
187
210
  var _a, _b, _c, _d, _e;
188
211
  const { target, config, args } = context;
189
212
  const product = (0, cli_args_1.oneProductOf)({ target, config, asked: args.values['--product'] });
@@ -236,11 +259,35 @@ const created = (context) => {
236
259
  console.log(` shared by every variant, imported as @shared/<path>; edit it here, not in a copy:`);
237
260
  shared.forEach((file) => console.log(` ${(0, path_1.relative)(target, file)}`));
238
261
  }
239
- nextStepsOf(sketch, product.name).forEach((line) => console.log(line));
262
+ nextStepsOf(sketch, product).forEach((line) => console.log(line));
240
263
  return 0;
241
264
  };
242
- const nextStepsOf = (sketch, product) => {
265
+ const created = (context) => __awaiter(void 0, void 0, void 0, function* () {
266
+ const code = opened(context);
267
+ if (code !== 0 || !context.args.flags.has('--ready'))
268
+ return code;
269
+ const found = productAndSketchOf(Object.assign(Object.assign({}, context), { args: Object.assign(Object.assign({}, context.args), { positional: [openedTargetOf(context)] }) }));
270
+ if (typeof found === 'string')
271
+ return fail(found);
272
+ const again = Object.assign(Object.assign({}, context), { args: Object.assign(Object.assign({}, context.args), { positional: [found.sketch.target] }) });
273
+ const readyCode = yield readied(again);
274
+ return readyCode === 0
275
+ ? 0
276
+ : fail(`${found.sketch.target} is still in progress: sketch ready refused - fix it, then run sketch ready`);
277
+ });
278
+ const openedTargetOf = ({ args }) => {
279
+ const [first] = args.positional;
280
+ const name = args.values['--name'];
281
+ return name === undefined ? (first !== null && first !== void 0 ? first : '') : `${first}@${name}`;
282
+ };
283
+ const noteLanguageLineOf = (product) => product.config.noteLanguage === undefined
284
+ ? []
285
+ : [
286
+ ` write every round and variant note in ${note_language_1.NOTE_LANGUAGE_NAMES[product.config.noteLanguage]}: that is the product's UI language`,
287
+ ];
288
+ const nextStepsOf = (sketch, productSource) => {
243
289
  var _a;
290
+ const product = productSource.name;
244
291
  const at = `${sketch.target} --product ${product}`;
245
292
  const first = (_a = sketch.variants[0]) !== null && _a !== void 0 ? _a : '<key>';
246
293
  const running = (0, sketch_1.runningRoundOf)(sketch);
@@ -253,10 +300,11 @@ const nextStepsOf = (sketch, product) => {
253
300
  ]
254
301
  : []),
255
302
  ` sketch check ${at}`,
303
+ ...noteLanguageLineOf(productSource),
256
304
  ` shot ${sketch.targets[0]} --states --variants --product ${product} look at it: ready refuses a pixel diff without a viewed shot`,
257
305
  ` sketch ready ${at} --by <model id>`,
258
306
  ` sketch report ${at} --variant ${first} --by <model id> --done after ready, once you stop drawing a variant; no report runs yet, so none is needed now`,
259
- ` a shared JSON file ready wrote (merged.json, go.json): commit it with \`et design commit-hunks <file> --part ${sketch.targets[0]}\`, never as a whole file another session also edits`,
307
+ ` a shared JSON file ready wrote (merged.json): commit it with \`et design commit-hunks <file> --part ${sketch.targets[0]}\`, never as a whole file another session also edits`,
260
308
  theming_text_1.THEMING_TEXT,
261
309
  ];
262
310
  };
@@ -275,7 +323,7 @@ const VARIANT_USAGE = 'usage: sketch variant <layer>/<name> <variant>[,<variant>
275
323
  const varied = (context) => {
276
324
  var _a;
277
325
  return withSketch(Object.assign(Object.assign({}, context), { noSketchHint: ` - start one with: sketch new ${(_a = context.args.positional[0]) !== null && _a !== void 0 ? _a : '<layer>/<name>'} --variants a,b,c --round "<title>"` }), ({ sketch }) => {
278
- var _a, _b, _c, _d, _e;
326
+ var _a, _b, _c, _d, _e, _f;
279
327
  const { positional, values } = context.args;
280
328
  const variant = positional[1];
281
329
  const from = values['--from'];
@@ -322,6 +370,8 @@ const varied = (context) => {
322
370
  for (const name of variants) {
323
371
  console.log(`${added.target} in progress: variant ${name} from ${from} in round ${(_c = round === null || round === void 0 ? void 0 : round.key) !== null && _c !== void 0 ? _c : ''}`);
324
372
  console.log(variantLineOf({ root: context.target, sketch: added, variant: name }));
373
+ if (((_d = (0, sketch_1.rejectionOf)(added, from)) === null || _d === void 0 ? void 0 : _d.status) === 'withdrawn')
374
+ console.log(` ${name}: from withdrawn ${from}`);
325
375
  }
326
376
  if (title !== undefined && (round === null || round === void 0 ? void 0 : round.note) === '')
327
377
  console.log(`round ${round.key} has no note yet - sketch ready needs one: sketch round ${added.target} ${round.key} --note "<what the round shows>" --by <model id>`);
@@ -331,12 +381,12 @@ const varied = (context) => {
331
381
  sketch,
332
382
  variant: from,
333
383
  reason: 'round',
334
- author: (_d = (0, cli_args_1.authorOf)(context.args)) !== null && _d !== void 0 ? _d : undefined,
384
+ author: (_e = (0, cli_args_1.authorOf)(context.args)) !== null && _e !== void 0 ? _e : undefined,
335
385
  note: lostNote,
336
386
  round: round === null || round === void 0 ? void 0 : round.key,
337
387
  });
338
388
  if (addressed.length > 0)
339
- console.log(`addressed ${addressed.length} comment(s) on variant ${from} in round ${(_e = round === null || round === void 0 ? void 0 : round.key) !== null && _e !== void 0 ? _e : ''}: ${addressed.map(({ id }) => id).join(', ')}`);
389
+ console.log(`addressed ${addressed.length} comment(s) on variant ${from} in round ${(_f = round === null || round === void 0 ? void 0 : round.key) !== null && _f !== void 0 ? _f : ''}: ${addressed.map(({ id }) => id).join(', ')}`);
340
390
  return 0;
341
391
  });
342
392
  };
@@ -424,6 +474,17 @@ const roundEdited = (context) => withSketch(context, ({ sketch }) => {
424
474
  return 0;
425
475
  });
426
476
  const noteEdited = (context) => withSketch(context, ({ sketch }) => {
477
+ const round = context.args.values['--round'];
478
+ if (round !== undefined) {
479
+ const roundNote = context.args.positional.slice(1).join(' ').trim();
480
+ if (roundNote === '')
481
+ return fail('usage: sketch note <layer>/<name> --round <round> <text> --by <model id>');
482
+ const reworded = (0, sketch_1.editRound)({ sketch, round, note: roundNote });
483
+ if (typeof reworded === 'string')
484
+ return fail(reworded);
485
+ console.log(`${reworded.target} round ${round}: ${roundNote}`);
486
+ return 0;
487
+ }
427
488
  const [, variant, ...words] = context.args.positional;
428
489
  const note = words.join(' ').trim();
429
490
  if (!variant || note === '')
@@ -434,6 +495,22 @@ const noteEdited = (context) => withSketch(context, ({ sketch }) => {
434
495
  console.log(`${edited.target} variant ${variant}: ${note}`);
435
496
  return 0;
436
497
  });
498
+ const coversEdited = (context) => withSketch(context, ({ sketch }) => {
499
+ var _a, _b;
500
+ const covers = context.args.positional.slice(1);
501
+ const partProblem = (0, covered_diffs_1.coverPartProblemOf)({ sketch, covers });
502
+ if (partProblem !== null) {
503
+ console.error(partProblem);
504
+ return 2;
505
+ }
506
+ const edited = (0, covered_diffs_1.editCovers)({ sketch, covers });
507
+ if (typeof edited === 'string')
508
+ return fail(edited);
509
+ console.log(((_a = edited.covers) !== null && _a !== void 0 ? _a : []).length === 0
510
+ ? `${edited.target} covers no compare DIFF`
511
+ : `${edited.target} covers the compare DIFFs of ${((_b = edited.covers) !== null && _b !== void 0 ? _b : []).join(', ')} while it is open (ADR 0222)`);
512
+ return 0;
513
+ });
437
514
  const targetRemoved = (context) => {
438
515
  const usage = `usage: ${exports.SKETCH_USAGE.find((line) => line.startsWith('sketch target remove'))}`;
439
516
  const rest = context.args.positional.slice(1);
@@ -473,6 +550,31 @@ const targetAdded = (context) => {
473
550
  return 0;
474
551
  });
475
552
  };
553
+ const readyLockOf = (sketch) => (0, path_1.resolve)((0, os_1.tmpdir)(), `et-sketch-ready-${(0, crypto_1.createHash)('sha256').update(sketch.dir).digest('hex').slice(0, 16)}.lock`);
554
+ const isRunning = (pid) => {
555
+ try {
556
+ process.kill(pid, 0);
557
+ return true;
558
+ }
559
+ catch (_a) {
560
+ return false;
561
+ }
562
+ };
563
+ const lockedReady = (sketch) => {
564
+ const lock = readyLockOf(sketch);
565
+ const holder = Number(contentOf(lock));
566
+ if (holder > 0 && isRunning(holder))
567
+ return null;
568
+ (0, fs_1.writeFileSync)(lock, String(process.pid));
569
+ return () => (0, fs_1.rmSync)(lock, { force: true });
570
+ };
571
+ const reportedReopen = (sketch) => {
572
+ const reopened = (0, sketch_1.reopenChangedReady)(sketch);
573
+ if (!reopened)
574
+ return sketch;
575
+ console.log(`${sketch.target} was ready; ${reopened.changed.join(', ')} changed since - back to in progress`);
576
+ return reopened.sketch;
577
+ };
476
578
  const readied = (context) => {
477
579
  const found = productAndSketchOf(context);
478
580
  if (typeof found === 'string')
@@ -480,21 +582,44 @@ const readied = (context) => {
480
582
  const hold = (0, sketch_1.heldProblemOf)(found.sketch);
481
583
  if (hold !== null)
482
584
  return fail(hold);
483
- const refused = readyRefusalOf(context, found);
585
+ const reopened = reportedReopen(found.sketch);
586
+ const current = { product: found.product, sketch: reopened };
587
+ const refused = (0, phase_timing_1.timedPhase)('gates', () => readyRefusalOf(context, current));
484
588
  if (refused !== null)
485
589
  return refused;
486
- return renderedAndReady(context, found);
590
+ const unlinted = (0, phase_timing_1.timedPhase)('lint', () => (0, design_lint_1.lintGateLinesOf)({
591
+ target: context.target,
592
+ productDir: current.product.dir,
593
+ files: (0, design_lint_1.variantLintFilesOf)(reopened, reopened.variants.filter((variant) => !(0, sketch_1.rejectionOf)(reopened, variant))),
594
+ }));
595
+ if (unlinted.length > 0)
596
+ return fail(`${unlinted.join('\n')}\n${reopened.target} adds lint warnings - fix them before ready`);
597
+ const unlock = lockedReady(reopened);
598
+ if (!unlock)
599
+ return fail(`another sketch ready run on ${reopened.target} is going - wait for it`);
600
+ const run = context.warm
601
+ ? { warm: Object.assign(Object.assign({}, context.warm), { perRun: true }), close: () => __awaiter(void 0, void 0, void 0, function* () { return undefined; }) }
602
+ : (0, warm_draw_1.createRunDraw)(context.target);
603
+ return renderedAndReady(Object.assign(Object.assign({}, context), { warm: run.warm }), current).finally(() => __awaiter(void 0, void 0, void 0, function* () {
604
+ unlock();
605
+ yield run.close();
606
+ }));
487
607
  };
488
608
  const renderedAndReady = (context, found) => __awaiter(void 0, void 0, void 0, function* () {
489
609
  var _a;
490
610
  const { product, sketch } = found;
491
- const rendered = yield renderedVariantsOf({
611
+ const rendered = yield (0, phase_timing_1.timedPhase)('render-check', () => renderedVariantsOf({
492
612
  target: context.target,
493
613
  config: context.config,
494
614
  product,
495
- entries: sketch.variants.filter((variant) => !(0, sketch_1.rejectionOf)(sketch, variant)).map((variant) => ({ sketch, variant })),
615
+ entries: sketch.variants
616
+ .filter((variant) => !(0, sketch_1.rejectionOf)(sketch, variant))
617
+ .map((variant) => ({ sketch, variant })),
496
618
  drawn: false,
497
- });
619
+ warm: context.warm,
620
+ }));
621
+ if ('issues' in rendered && rendered.noVerdict)
622
+ return 1;
498
623
  if ('issues' in rendered && rendered.issues.length > 0)
499
624
  return fail(`${sketch.target} has problems - fix them before ready`);
500
625
  const busyAdded = 'issues' in rendered ? openPointLinesOf({ product, sketch, busy: (_a = rendered.busy) !== null && _a !== void 0 ? _a : [] }).added : [];
@@ -504,17 +629,22 @@ const renderedAndReady = (context, found) => __awaiter(void 0, void 0, void 0, f
504
629
  });
505
630
  const loadedAndReady = (context_1, _a) => __awaiter(void 0, [context_1, _a], void 0, function* (context, { product, sketch }) {
506
631
  var _b, _c;
507
- const unloaded = yield unloadedLinesOf({ target: context.target, config: context.config, product, sketch });
632
+ const unloaded = yield (0, phase_timing_1.timedPhase)('load', () => unloadedLinesOf({ target: context.target, config: context.config, product, sketch, warm: context.warm }));
508
633
  if (unloaded.length > 0)
509
634
  return fail(`${unloaded.join('\n')}\n${sketch.target} does not load - fix it before ready`);
510
- const drifts = yield (0, ready_shots_1.sampleMarkDriftLines)({ target: context.target, config: context.config, product, sketch });
635
+ const drifts = yield (0, phase_timing_1.timedPhase)('mark-drift', () => (0, ready_shots_1.sampleMarkDriftLines)({ target: context.target, config: context.config, product, sketch, warm: context.warm }));
511
636
  if (drifts.length > 0)
512
637
  return fail(`${drifts.join('\n')}\n${sketch.target} draws one sample with different marks - align them before ready`);
513
- const identical = yield (0, ready_shots_1.identicalRenderLines)({ target: context.target, config: context.config, product, sketch });
638
+ const identical = yield (0, phase_timing_1.timedPhase)('identical', () => (0, ready_shots_1.identicalRenderLines)({ target: context.target, config: context.config, product, sketch, warm: context.warm }));
514
639
  if (identical.length > 0)
515
640
  return fail(`${identical.join('\n')}\n${sketch.target} draws variants alike - fix them before ready`);
641
+ const undeclared = yield (0, phase_timing_1.timedPhase)('undeclared', () => undeclaredLinesOf({ target: context.target, config: context.config, product, sketch, warm: context.warm }));
642
+ if (typeof undeclared === 'string')
643
+ return fail(undeclared);
644
+ if (undeclared.length > 0)
645
+ return fail(`${undeclared.join('\n')}\n${sketch.target} draws controls no controls entry declares - declare them before ready`);
516
646
  const changes = sketch.targets.every((key) => product.parts.some((part) => (0, resolve_product_1.partKeyOf)(part) === key))
517
- ? yield (0, ready_shots_1.variantChangesShown)({ target: context.target, config: context.config, product, sketch })
647
+ ? yield (0, phase_timing_1.timedPhase)('changes-shot', () => (0, ready_shots_1.variantChangesShown)({ target: context.target, config: context.config, product, sketch, warm: context.warm }))
518
648
  : null;
519
649
  const unviewed = Array.isArray(changes)
520
650
  ? (0, viewed_shots_1.unviewedShotLinesOf)({
@@ -526,20 +656,47 @@ const loadedAndReady = (context_1, _a) => __awaiter(void 0, [context_1, _a], voi
526
656
  : [];
527
657
  if (unviewed.length > 0)
528
658
  return fail(`${unviewed.join('\n')}\n${sketch.target} draws a pixel diff - view its shot before ready`);
659
+ if (!(0, fs_1.existsSync)((0, path_1.resolve)(sketch.dir, sketch_1.SKETCH_FILE)))
660
+ return fail(`${sketch.target} is gone: another run merged or discarded it while this one checked it`);
529
661
  const ready = sketch.status === 'ready'
530
662
  ? sketch
531
663
  : (0, sketch_1.markSketchReady)({ checkout: context.target, sketch, author: (_c = (0, cli_args_1.authorOf)(context.args)) !== null && _c !== void 0 ? _c : undefined });
532
664
  if (typeof ready === 'string')
533
665
  return fail(ready);
534
- return autoMerged({ context, product, sketch: ready, again: sketch.status === 'ready', changes });
666
+ return (0, phase_timing_1.timedPhase)('auto-merge', () => autoMerged({ context, product, sketch: ready, again: sketch.status === 'ready', changes }));
535
667
  });
536
668
  const stillReady = (options) => {
669
+ (0, sketch_1.writeSketchFile)(Object.assign(Object.assign({}, options.sketch), { mergeHold: { reason: options.reason, at: new Date().toISOString() } }));
537
670
  if (options.again)
538
671
  console.log(`${options.sketch.target} is still ready`);
539
672
  return 0;
540
673
  };
674
+ const gitIn = (target, ...args) => (0, plain_output_1.spawnPlain)(['git', ...args], { cwd: target });
675
+ const mergeDirsOf = (product) => [product.dir, ...(product.base ? [product.base.dir] : [])];
676
+ const cleanBesideSketch = (options) => {
677
+ const status = gitIn(options.target, 'status', '--porcelain', '-z', '--untracked-files=all', '--', ...mergeDirsOf(options.product));
678
+ const root = gitIn(options.target, 'rev-parse', '--show-toplevel');
679
+ if (status.status !== 0 || root.status !== 0)
680
+ return false;
681
+ const top = root.stdout.trim();
682
+ const sketchDir = (0, fs_1.realpathSync)(options.sketch.dir);
683
+ return status.stdout
684
+ .split('\0')
685
+ .filter((entry) => /^.. /.test(entry))
686
+ .every((entry) => (0, path_1.resolve)(top, entry.slice(3)).startsWith(`${sketchDir}/`));
687
+ };
688
+ const committedMerge = (options) => {
689
+ const dirs = mergeDirsOf(options.product);
690
+ const added = gitIn(options.target, 'add', '--all', '--', ...dirs);
691
+ const committed = added.status === 0
692
+ ? gitIn(options.target, 'commit', '-m', `feat(repo): Merge ${options.sketch.target}, no visible change`, '--', ...dirs)
693
+ : added;
694
+ if (committed.status !== 0)
695
+ console.warn(`Could not commit the merge: ${(committed.stderr || committed.stdout).trim()}`);
696
+ return committed.status === 0;
697
+ };
541
698
  const autoMerged = (options) => {
542
- var _a, _b;
699
+ var _a;
543
700
  const { context, product, sketch, again, changes } = options;
544
701
  if (!again)
545
702
  console.log(`${sketch.target} is ready`);
@@ -548,45 +705,87 @@ const autoMerged = (options) => {
548
705
  if (shared.length > 0)
549
706
  console.log(`variant ${variant}: a shared/ edit reaches ${shared.join(', ')}`);
550
707
  }
551
- if (changes === null) {
552
- console.log('auto-merge skipped: new part, the user merges');
553
- return stillReady({ sketch, again });
554
- }
555
- const noChange = typeof changes === 'string' ? changes : (0, no_visible_change_1.noChangeOf)(changes);
708
+ const noChange = changes === null ? 'new part, the user merges' : typeof changes === 'string' ? changes : (0, no_visible_change_1.noChangeOf)(changes);
556
709
  if (noChange !== true) {
557
710
  console.log(`auto-merge skipped: ${noChange}`);
558
- return stillReady({ sketch, again });
711
+ return stillReady({ sketch, again, reason: noChange });
559
712
  }
560
- const author = (_a = (0, cli_args_1.authorOf)(context.args)) !== null && _a !== void 0 ? _a : undefined;
561
- const variant = (_b = sketch.variants.find((candidate) => !(0, sketch_1.rejectionOf)(sketch, candidate))) !== null && _b !== void 0 ? _b : '';
562
- const sketchFile = (0, path_1.resolve)(sketch.dir, sketch_1.SKETCH_FILE);
563
- const undecided = (0, fs_1.readFileSync)(sketchFile, 'utf8');
564
- const decided = (0, sketch_1.decideSketch)({ sketch, decision: { kind: 'pick', variant } });
713
+ return mergedUnchanged({
714
+ target: context.target,
715
+ config: context.config,
716
+ author: (_a = (0, cli_args_1.authorOf)(context.args)) !== null && _a !== void 0 ? _a : undefined,
717
+ product,
718
+ sketch,
719
+ });
720
+ };
721
+ const mergedUnchanged = (options) => {
722
+ var _a;
723
+ const { target, config, author, product, sketch } = options;
724
+ const variant = (_a = sketch.variants.find((candidate) => !(0, sketch_1.rejectionOf)(sketch, candidate))) !== null && _a !== void 0 ? _a : '';
725
+ const commit = cleanBesideSketch({ target, product, sketch });
726
+ const decided = (0, sketch_1.decideSketch)({ sketch, decision: Object.assign({ kind: 'pick', variant }, (0, write_origin_1.originOf)(author !== null && author !== void 0 ? author : '')) });
565
727
  if (typeof decided === 'string')
566
728
  return fail(decided);
567
729
  const written = sharedFilesOf(product);
568
730
  const before = written.map((file) => contentOf(file));
569
731
  const result = (0, merge_1.mergeSketch)({
570
- target: context.target,
571
- config: context.config,
732
+ target,
733
+ config,
572
734
  product,
573
735
  sketch: decided,
574
736
  author,
575
737
  decidedBy: 'auto: no visible change',
576
738
  });
577
739
  if (!Array.isArray(result)) {
578
- (0, fs_1.writeFileSync)(sketchFile, undecided);
740
+ (0, sketch_1.writeSketchFile)(Object.assign(Object.assign({}, sketch), { mergeHold: Object.assign({ reason: result.reason, at: new Date().toISOString() }, (result.dirty ? { dirty: result.dirty } : {})) }));
579
741
  console.warn(`${sketch.target} shows no visible change but did not merge: ${result.reason}`);
580
742
  return 0;
581
743
  }
582
744
  console.log(`No visible change in any state: merged ${sketch.targets.join(', ')} automatically.`);
745
+ if (commit && committedMerge({ target, product, sketch })) {
746
+ console.log(`Committed: feat(repo): Merge ${sketch.target}, no visible change`);
747
+ return 0;
748
+ }
583
749
  commitHunksLines({
584
- target: context.target,
750
+ target,
585
751
  files: written.filter((file, index) => contentOf(file) !== before[index]),
586
752
  parts: sketch.targets,
587
753
  }).forEach((line) => console.log(line));
588
754
  return 0;
589
755
  };
756
+ const stillDirtyOf = (options) => {
757
+ const status = gitIn(options.target, 'status', '--porcelain', '--untracked-files=all', '--', ...options.dirty);
758
+ return status.status !== 0 || status.stdout.trim() !== '';
759
+ };
760
+ /**
761
+ * Merges every ready sketch whose automatic merge uncommitted files refused, once those files are committed or
762
+ * reverted; `except` is a sketch target to leave alone.
763
+ */
764
+ const retriedHeldMerges = (options) => {
765
+ var _a;
766
+ const { target, config, author, except } = options;
767
+ for (const name of Object.keys((_a = config.products) !== null && _a !== void 0 ? _a : {})) {
768
+ const productDir = (0, product_1.productDirOf)({ target, product: name });
769
+ const held = (0, sketch_1.listSketches)({ productDir, product: name }).filter((sketch) => {
770
+ var _a;
771
+ return typeof sketch !== 'string' &&
772
+ sketch.status === 'ready' &&
773
+ !!((_a = sketch.mergeHold) === null || _a === void 0 ? void 0 : _a.dirty) &&
774
+ sketch.target !== except &&
775
+ !stillDirtyOf({ target, dirty: sketch.mergeHold.dirty });
776
+ });
777
+ if (held.length === 0)
778
+ continue;
779
+ const product = (0, cli_args_1.oneProductOf)({ target, config, asked: name });
780
+ if (typeof product === 'string')
781
+ continue;
782
+ for (const sketch of held) {
783
+ console.log(`${sketch.target}: the uncommitted edits that held its automatic merge are gone - merging it now`);
784
+ mergedUnchanged({ target, config, author, product, sketch });
785
+ }
786
+ }
787
+ };
788
+ exports.retriedHeldMerges = retriedHeldMerges;
590
789
  const contentOf = (file) => ((0, fs_1.existsSync)(file) ? (0, fs_1.readFileSync)(file, 'utf8') : null);
591
790
  const sharedFilesOf = (product) => [
592
791
  (0, path_1.resolve)(product.dir, merged_parts_1.MERGED_FILE),
@@ -630,8 +829,37 @@ const roundNotReadyProblemOf = (sketch) => sketch.status === 'ready' || sketch.h
630
829
  ? null
631
830
  : `ROUND-NOT-READY ${sketch.target}: round ${(0, sketch_1.runningRoundOf)(sketch).key} is drawn but still in progress - run \`design sketch ready ${sketch.target}\``;
632
831
  const unloadedLinesOf = (options) => __awaiter(void 0, void 0, void 0, function* () { return (yield (0, ready_shots_1.variantsThatDoNotLoad)(options)).map((line) => `${options.sketch.target} ${line}`); });
832
+ const undeclaredLinesOf = (options) => __awaiter(void 0, void 0, void 0, function* () {
833
+ const { sketch } = options;
834
+ const lines = [];
835
+ for (const variant of sketch.variants.filter((name) => !(0, sketch_1.rejectionOf)(sketch, name))) {
836
+ const { changed } = (0, merge_preview_1.mergePreviewOf)({ product: options.product, sketch, variant });
837
+ const added = yield (0, complete_1.addedUndeclaredControlsOf)(Object.assign(Object.assign({}, options), { sketch: { target: sketch.target, variant }, parts: changed }));
838
+ if ('unavailable' in added)
839
+ return added.unavailable;
840
+ lines.push(...added.lines);
841
+ }
842
+ return lines;
843
+ });
844
+ const baseCommitOf = (options) => {
845
+ var _a;
846
+ const { context, product, sketch } = options;
847
+ const dirs = ((_a = (0, stale_base_1.staleBaseOf)({ product, sketch })) !== null && _a !== void 0 ? _a : []).flatMap((key) => {
848
+ const part = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key);
849
+ return part ? [(0, path_1.dirname)(part.file)] : [];
850
+ });
851
+ if (dirs.length === 0)
852
+ return null;
853
+ const log = (0, plain_output_1.spawnPlain)(['git', 'log', '-1', '--format=%h', '--', ...dirs], { cwd: context.target });
854
+ return log.status === 0 && log.stdout.trim() ? log.stdout.trim() : null;
855
+ };
633
856
  const readyRefusalOf = (context, { product, sketch }) => {
634
857
  const lineOf = (variant, problem) => `${sketch.target} ${variant}: ${problem.rule} ${(0, path_1.relative)(context.target, problem.file)}: ${problem.message}`;
858
+ const stale = staleBasesOf(context, { product, targets: new Set([sketch.target]) });
859
+ if (stale.length > 0) {
860
+ const commit = baseCommitOf({ context, product, sketch });
861
+ return fail(`${stale.map((problem) => problem.line).join('\n')}\n${sketch.target} is stale${commit ? ` (base changed in ${commit})` : ''} - rebase it before ready`);
862
+ }
635
863
  const found = (0, check_sketches_1.variantProblemsOf)({ product, sketch });
636
864
  found.forEach((entry) => noteProblemsBefore(Object.assign({ target: context.target }, entry)));
637
865
  const problems = found
@@ -687,19 +915,36 @@ const beforeLinesOf = ({ sketches, before }) => [...new Set(sketches)].flatMap((
687
915
  .filter((issue) => sketch.targets.includes(issue.part))
688
916
  .map((issue) => (Object.assign(Object.assign({}, issue), { sketch: { target: sketch.target, variant: 'before' } })))));
689
917
  exports.beforeLinesOf = beforeLinesOf;
690
- const renderedVariantsOf = (_a) => __awaiter(void 0, [_a], void 0, function* ({ target, config, product, entries, drawn, }) {
918
+ const unchangedAffectedOf = (options) => (0, warm_draw_1.loadingOn)(options, (server) => __awaiter(void 0, void 0, void 0, function* () {
919
+ return Object.fromEntries(yield Promise.all(options.affected.map((part) => __awaiter(void 0, void 0, void 0, function* () {
920
+ return [
921
+ part,
922
+ yield (0, unchanged_states_1.unchangedStatesOf)(Object.assign(Object.assign({}, options), { part, load: ({ file, product, sketch }) => server.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product, sketch })) })),
923
+ ];
924
+ }))));
925
+ }));
926
+ const renderedVariantsOf = (_a) => __awaiter(void 0, [_a], void 0, function* ({ target, config, product, entries, drawn, warm, }) {
691
927
  var _b, _c, _d;
928
+ const jobs = yield Promise.all(entries.map((_a) => __awaiter(void 0, [_a], void 0, function* ({ sketch, variant }) {
929
+ const preview = (0, merge_preview_1.mergePreviewOf)({ product, sketch, variant });
930
+ return {
931
+ product: product.name,
932
+ sketch: { target: sketch.target, variant },
933
+ parts: [...preview.changed, ...preview.affected],
934
+ unchanged: warm
935
+ ? yield unchangedAffectedOf({ target, config, warm, product, sketch, variant, affected: preview.affected })
936
+ : {},
937
+ };
938
+ })));
939
+ for (const { sketch, unchanged } of jobs)
940
+ for (const [part, states] of Object.entries(unchanged).filter(([, states]) => states.length > 0))
941
+ console.log(`NOTE ${sketch.target} ${sketch.variant}: ${part} draws ${states.length} state${states.length === 1 ? '' : 's'} as merged, not inspected`);
692
942
  const rendered = yield (0, render_check_1.renderIssuesOf)({
693
943
  target,
694
944
  config,
695
- jobs: entries.map(({ sketch, variant }) => {
696
- const preview = (0, merge_preview_1.mergePreviewOf)({ product, sketch, variant });
697
- return {
698
- product: product.name,
699
- sketch: { target: sketch.target, variant },
700
- parts: [...preview.changed, ...preview.affected],
701
- };
702
- }),
945
+ warm,
946
+ jobs,
947
+ onProgress: (line) => console.error(line),
703
948
  before: [...new Set(entries.flatMap(({ sketch }) => sketch.targets))].map((part) => ({
704
949
  product: product.name,
705
950
  part,
@@ -726,19 +971,23 @@ const renderedVariantsOf = (_a) => __awaiter(void 0, [_a], void 0, function* ({
726
971
  if (drawn)
727
972
  rendered.grids.forEach(({ sketch, part, line }) => { var _a, _b; return console.log(`${(_a = sketch === null || sketch === void 0 ? void 0 : sketch.target) !== null && _a !== void 0 ? _a : ''} ${(_b = sketch === null || sketch === void 0 ? void 0 : sketch.variant) !== null && _b !== void 0 ? _b : ''}: ${part} ${line}`); });
728
973
  rendered.warnings.forEach((issue) => { var _a, _b, _c, _d; return console.warn(`${(_b = (_a = issue.sketch) === null || _a === void 0 ? void 0 : _a.target) !== null && _b !== void 0 ? _b : ''} ${(_d = (_c = issue.sketch) === null || _c === void 0 ? void 0 : _c.variant) !== null && _d !== void 0 ? _d : ''}: WARNING ${(0, render_check_1.renderIssueLineOf)(issue)}`); });
729
- (0, render_check_1.groupedIssueLinesOf)(rendered.issues).forEach((line) => console.error(line));
974
+ const { noVerdict } = rendered;
975
+ if (noVerdict)
976
+ [...new Set(entries.map((entry) => entry.sketch.target))].forEach((sketchTarget) => console.error((0, no_verdict_1.noVerdictLineOf)(sketchTarget, noVerdict)));
977
+ else
978
+ (0, render_check_1.groupedIssueLinesOf)(rendered.issues).forEach((line) => console.error(line));
730
979
  (0, exports.beforeLinesOf)({ sketches: entries.map((entry) => entry.sketch), before: (_d = rendered.before) !== null && _d !== void 0 ? _d : [] }).forEach((line) => console.log(line));
731
980
  }
732
981
  return rendered;
733
982
  });
734
983
  const checked = (context) => __awaiter(void 0, void 0, void 0, function* () {
735
- var _a, _b, _c;
984
+ var _a, _b;
736
985
  const { target, config, args } = context;
737
986
  const product = sketchProductOf(context);
738
987
  if (typeof product === 'string')
739
988
  return fail(product);
740
989
  const asked = args.positional[0];
741
- const { unreadable, variants } = (0, check_sketches_1.openSketchProblemsOf)(product);
990
+ const { unreadable, variants } = (0, phase_timing_1.timedPhase)('gates', () => (0, check_sketches_1.openSketchProblemsOf)(product));
742
991
  const named = asked === undefined ? variants : variants.filter((entry) => entry.sketch.target === asked);
743
992
  if (asked !== undefined && named.length === 0)
744
993
  return fail(`NO SKETCH on ${asked} in ${product.name}`);
@@ -756,18 +1005,17 @@ const checked = (context) => __awaiter(void 0, void 0, void 0, function* () {
756
1005
  if (asked === undefined)
757
1006
  unreadable.forEach((problem) => console.error(`${problem.rule} ${(0, path_1.relative)(target, problem.file)}: ${problem.message}`));
758
1007
  new Set(chosen.map((entry) => entry.sketch)).forEach((sketch) => {
1008
+ reportedReopen(sketch);
1009
+ if (product.config.noteLanguage)
1010
+ (0, note_language_1.noteLanguageWarningsOf)(sketch, product.config.noteLanguage).forEach((warning) => console.warn(warning));
759
1011
  if (sketch.hold)
760
1012
  console.warn(`HELD ${sketch.target}: until ${sketch.hold.until}`);
761
1013
  });
762
- const stale = (0, check_system_1.staleSketchBasesOf)({
763
- product,
764
- invocation: (_a = context.invocation) !== null && _a !== void 0 ? _a : (0, invocation_1.repoInvocation)({ root: target, subcommand: 'design' }),
765
- targets: new Set(chosen.map((entry) => entry.sketch.target)),
766
- });
1014
+ const stale = staleBasesOf(context, { product, targets: new Set(chosen.map((entry) => entry.sketch.target)) });
767
1015
  stale.forEach((problem) => console.error(problem.line));
768
1016
  failed || (failed = stale.length > 0);
769
1017
  for (const { sketch, variant, problems, before } of chosen) {
770
- const typed = (0, check_sketches_1.typecheckVariant)({ target, product, sketch, variant });
1018
+ const typed = (0, phase_timing_1.timedPhase)(`tsc ${variant}`, () => (0, check_sketches_1.typecheckVariant)({ target, product, sketch, variant }));
771
1019
  noteProblemsBefore({ target, sketch, variant, before });
772
1020
  (0, check_sketches_1.variantWarningsOf)({ target, product, sketch, variant }).forEach((warning) => console.warn(`${sketch.target} ${variant}: ${warning}`));
773
1021
  const all = [
@@ -782,17 +1030,18 @@ const checked = (context) => __awaiter(void 0, void 0, void 0, function* () {
782
1030
  }
783
1031
  if (!failed)
784
1032
  for (const sketch of new Set(chosen.map((entry) => entry.sketch)))
785
- (yield (0, ready_shots_1.aktuellPlaceholderWarnings)({ target, config, product, sketch })).forEach((warning) => console.warn(warning));
1033
+ (yield (0, phase_timing_1.timedPhase)('aktuell', () => (0, ready_shots_1.aktuellPlaceholderWarnings)({ target, config, product, sketch, warm: context.warm }))).forEach((warning) => console.warn(warning));
786
1034
  const rendered = failed
787
1035
  ? null
788
- : yield renderedVariantsOf({
1036
+ : yield (0, phase_timing_1.timedPhase)('render-check', () => renderedVariantsOf({
789
1037
  target,
790
1038
  config,
791
1039
  product,
792
1040
  entries: chosen,
793
1041
  drawn: true,
794
- });
795
- const busy = rendered !== null && 'issues' in rendered ? ((_b = rendered.busy) !== null && _b !== void 0 ? _b : []) : [];
1042
+ warm: context.warm,
1043
+ }));
1044
+ const busy = rendered !== null && 'issues' in rendered ? ((_a = rendered.busy) !== null && _a !== void 0 ? _a : []) : [];
796
1045
  if (rendered !== null && 'issues' in rendered)
797
1046
  (0, frame_budget_1.frameBudgetWarningsOf)({
798
1047
  drawn: rendered.drawn,
@@ -811,16 +1060,16 @@ const checked = (context) => __awaiter(void 0, void 0, void 0, function* () {
811
1060
  refused += lines.length;
812
1061
  };
813
1062
  for (const sketch of new Set(chosen.map((entry) => entry.sketch))) {
814
- const unloaded = yield unloadedLinesOf({ target, config, product, sketch });
1063
+ const unloaded = yield (0, phase_timing_1.timedPhase)('load', () => unloadedLinesOf({ target, config, product, sketch, warm: context.warm }));
815
1064
  const before = refused;
816
1065
  refuse([
817
1066
  ...unloaded,
818
1067
  ...openPointLinesOf({ product, sketch, busy }).added,
819
- ...[(_c = roundNoteRefusalOf(sketch)) !== null && _c !== void 0 ? _c : []].flat(),
1068
+ ...[(_b = roundNoteRefusalOf(sketch)) !== null && _b !== void 0 ? _b : []].flat(),
820
1069
  ]);
821
1070
  if (!failed && unloaded.length === 0) {
822
- refuse(yield (0, ready_shots_1.sampleMarkDriftLines)({ target, config, product, sketch }));
823
- refuse(yield (0, ready_shots_1.identicalRenderLines)({ target, config, product, sketch }));
1071
+ refuse(yield (0, phase_timing_1.timedPhase)('mark-drift', () => (0, ready_shots_1.sampleMarkDriftLines)({ target, config, product, sketch, warm: context.warm })));
1072
+ refuse(yield (0, phase_timing_1.timedPhase)('identical', () => (0, ready_shots_1.identicalRenderLines)({ target, config, product, sketch, warm: context.warm })));
824
1073
  }
825
1074
  if (!failed && refused === before) {
826
1075
  const problem = roundNotReadyProblemOf(sketch);
@@ -830,9 +1079,13 @@ const checked = (context) => __awaiter(void 0, void 0, void 0, function* () {
830
1079
  }
831
1080
  }
832
1081
  }
833
- if (failed)
1082
+ const staleSince = rendered === null
1083
+ ? []
1084
+ : staleBasesOf(context, { product, targets: new Set(chosen.map((entry) => entry.sketch.target)) }).filter((problem) => !stale.some((before) => before.line === problem.line));
1085
+ staleSince.forEach((problem) => console.error(problem.line));
1086
+ if (failed || staleSince.length > 0)
834
1087
  return 1;
835
- if (rendered !== null && 'issues' in rendered && rendered.issues.length > 0)
1088
+ if (rendered !== null && 'issues' in rendered && (rendered.noVerdict || rendered.issues.length > 0))
836
1089
  return 1;
837
1090
  if (notReady)
838
1091
  return 1;
@@ -857,7 +1110,7 @@ const previewed = (context) => withSketch(context, ({ product, sketch }) => {
857
1110
  });
858
1111
  const merged = (context) => withSketch(context, ({ product, sketch }) => {
859
1112
  var _a, _b;
860
- const { '--note': note, '--variant': flagVariant, '--allowed-by': planRef } = context.args.values;
1113
+ const { '--note': note, '--variant': flagVariant, '--allowed-by': planRef, '--decided-by': decidedBy, } = context.args.values;
861
1114
  const replaceNote = context.args.flags.has('--replace-note');
862
1115
  if (context.args.positional.length > 1)
863
1116
  return fail(`usage: sketch merge <layer>/<name> [--note <reason>] - it merges the variant the user picked`);
@@ -865,11 +1118,13 @@ const merged = (context) => withSketch(context, ({ product, sketch }) => {
865
1118
  return fail('--replace-note needs --note <the new part note>');
866
1119
  if ((flagVariant === undefined) !== (planRef === undefined))
867
1120
  return fail('--variant and --allowed-by go together: name the only live variant and the plan that allows the merge');
1121
+ if (decidedBy !== undefined && (decidedBy.trim() === '' || planRef !== undefined))
1122
+ return fail('--decided-by needs a name and does not go with --allowed-by, which records the plan');
868
1123
  const by = (_a = (0, cli_args_1.authorOf)(context.args)) !== null && _a !== void 0 ? _a : undefined;
869
1124
  const allowed = flagVariant !== undefined && planRef !== undefined && ((_b = sketch.decision) === null || _b === void 0 ? void 0 : _b.kind) !== 'pick'
870
- ? { variant: flagVariant, planRef }
1125
+ ? { variant: flagVariant, planRef, editRef: (0, merge_step_1.editRefOf)({ target: context.target, sketch, planRef }) }
871
1126
  : undefined;
872
- const result = (0, merge_step_1.mergeAndRecord)({
1127
+ const result = (0, phase_timing_1.timedPhase)('merge', () => (0, merge_step_1.mergeAndRecord)({
873
1128
  target: context.target,
874
1129
  config: context.config,
875
1130
  product,
@@ -877,8 +1132,9 @@ const merged = (context) => withSketch(context, ({ product, sketch }) => {
877
1132
  note,
878
1133
  replaceNote,
879
1134
  by,
1135
+ decidedBy: decidedBy === null || decidedBy === void 0 ? void 0 : decidedBy.trim(),
880
1136
  allowed,
881
- });
1137
+ }));
882
1138
  if (typeof result === 'string')
883
1139
  return fail(result);
884
1140
  console.log(`merged ${sketch.target} variant ${result.variant} into ${product.name}: ${result.parts.join(', ')}`);
@@ -957,7 +1213,13 @@ const withdrawnVariant = (context_1, _a) => __awaiter(void 0, [context_1, _a], v
957
1213
  return fail(`${sketch.target} has no variant "${variant}" - it has ${sketch.variants.join(', ')}`);
958
1214
  if (!(0, sketch_1.authorsOf)(sketch, variant).includes(by))
959
1215
  return fail(`${sketch.target} variant ${variant} was not drawn by ${by} - only the agent that drew it withdraws it`);
960
- const identical = yield (0, ready_shots_1.identicalRenders)({ target: context.target, config: context.config, product, sketch });
1216
+ const identical = yield (0, ready_shots_1.identicalRenders)({
1217
+ target: context.target,
1218
+ config: context.config,
1219
+ product,
1220
+ sketch,
1221
+ warm: context.warm,
1222
+ });
961
1223
  const twin = identical.find((render) => render.variant === variant && render.sibling !== null);
962
1224
  if (!twin)
963
1225
  return fail(`${sketch.target} variant ${variant} does not draw the same pixels as a sibling variant in its first changed state - redraw it or ask for a reject`);
@@ -972,6 +1234,7 @@ const COMMANDS = {
972
1234
  variant: varied,
973
1235
  round: roundEdited,
974
1236
  note: noteEdited,
1237
+ covers: coversEdited,
975
1238
  list: listed,
976
1239
  report: reported,
977
1240
  ready: readied,
@@ -1003,7 +1266,8 @@ const flagsOf = (command) => {
1003
1266
  * discards sketches, and rejects, reopens and withdraws their variants.
1004
1267
  */
1005
1268
  const designSketch = (options) => {
1006
- const { target, argv, invocation } = options;
1269
+ var _a, _b;
1270
+ const { target, argv, invocation, warm } = options;
1007
1271
  const [command = '', ...rest] = argv;
1008
1272
  const run = COMMANDS[command];
1009
1273
  const args = (0, cli_args_1.argsOf)(rest, flagsOf(command));
@@ -1021,7 +1285,16 @@ const designSketch = (options) => {
1021
1285
  const config = (0, cli_args_1.configOf)(target);
1022
1286
  if (typeof config === 'string')
1023
1287
  return fail(config);
1024
- return run({ target, config, args, invocation });
1288
+ if (RETRIES.has(command)) {
1289
+ const named = (0, sketch_1.parseTarget)((_a = args.positional[0]) !== null && _a !== void 0 ? _a : '');
1290
+ (0, exports.retriedHeldMerges)({
1291
+ target,
1292
+ config,
1293
+ author: (_b = (0, cli_args_1.authorOf)(args)) !== null && _b !== void 0 ? _b : undefined,
1294
+ except: typeof named === 'string' ? undefined : (0, resolve_product_1.partKeyOf)(named),
1295
+ });
1296
+ }
1297
+ return run({ target, config, args, invocation, warm });
1025
1298
  };
1026
1299
  exports.designSketch = designSketch;
1027
1300
  //# sourceMappingURL=sketch-command.js.map