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

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 (592) hide show
  1. package/CHANGELOG.md +417 -0
  2. package/build-info.json +1 -0
  3. package/design/define-call.ts +99 -31
  4. package/design/define-part.ts +50 -3
  5. package/design/icon-sheet.ts +1 -1
  6. package/design/interaction-rows.ts +13 -6
  7. package/design/logo-sheet.ts +52 -0
  8. package/design/mark-part.ts +51 -1
  9. package/design/motion-drive.ts +215 -0
  10. package/design/motion-runtime.ts +14 -2
  11. package/design/motion-tokens.ts +177 -0
  12. package/design/token-sheet.ts +1 -1
  13. package/design/web/frame-fill.ts +4 -0
  14. package/design/web/frame-fit.ts +7 -0
  15. package/design/web/frame-scheme.ts +44 -0
  16. package/design/web/frame-surfaces.ts +294 -0
  17. package/design/web/frame.ts +162 -43
  18. package/design/web/surface-interactive.css +42 -0
  19. package/design/with-action.ts +29 -0
  20. package/package.json +3 -1
  21. package/src/index.js +9 -1
  22. package/src/index.js.map +1 -1
  23. package/src/lib/design/asset-shot.js +2 -2
  24. package/src/lib/design/asset-shot.js.map +1 -1
  25. package/src/lib/design/build-watch.d.ts +26 -0
  26. package/src/lib/design/build-watch.js +138 -0
  27. package/src/lib/design/build-watch.js.map +1 -0
  28. package/src/lib/design/calls-tsconfig.d.ts +2 -0
  29. package/src/lib/design/calls-tsconfig.js +10 -3
  30. package/src/lib/design/calls-tsconfig.js.map +1 -1
  31. package/src/lib/design/check.d.ts +1 -0
  32. package/src/lib/design/check.js +195 -13
  33. package/src/lib/design/check.js.map +1 -1
  34. package/src/lib/design/commit-hunks.d.ts +22 -0
  35. package/src/lib/design/commit-hunks.js +173 -0
  36. package/src/lib/design/commit-hunks.js.map +1 -0
  37. package/src/lib/design/contact-sheet.d.ts +9 -0
  38. package/src/lib/design/contact-sheet.js +38 -4
  39. package/src/lib/design/contact-sheet.js.map +1 -1
  40. package/src/lib/design/design-command.d.ts +2 -0
  41. package/src/lib/design/design-command.js +183 -15
  42. package/src/lib/design/design-command.js.map +1 -1
  43. package/src/lib/design/draw-ledger.d.ts +36 -0
  44. package/src/lib/design/draw-ledger.js +52 -0
  45. package/src/lib/design/draw-ledger.js.map +1 -0
  46. package/src/lib/design/force-interactions.d.ts +1 -1
  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/inbox-command.js +9 -5
  50. package/src/lib/design/inbox-command.js.map +1 -1
  51. package/src/lib/design/mcp-command.d.ts +28 -3
  52. package/src/lib/design/mcp-command.js +134 -21
  53. package/src/lib/design/mcp-command.js.map +1 -1
  54. package/src/lib/design/merge-compare.d.ts +10 -2
  55. package/src/lib/design/merge-compare.js +63 -11
  56. package/src/lib/design/merge-compare.js.map +1 -1
  57. package/src/lib/design/motion-command.js +10 -16
  58. package/src/lib/design/motion-command.js.map +1 -1
  59. package/src/lib/design/motion-shot.js +3 -2
  60. package/src/lib/design/motion-shot.js.map +1 -1
  61. package/src/lib/design/new-call.js +19 -10
  62. package/src/lib/design/new-call.js.map +1 -1
  63. package/src/lib/design/part-marks.d.ts +3 -2
  64. package/src/lib/design/part-marks.js +13 -5
  65. package/src/lib/design/part-marks.js.map +1 -1
  66. package/src/lib/design/paths.d.ts +42 -0
  67. package/src/lib/design/paths.js +50 -1
  68. package/src/lib/design/paths.js.map +1 -1
  69. package/src/lib/design/product-command.d.ts +1 -1
  70. package/src/lib/design/product-command.js +12 -14
  71. package/src/lib/design/product-command.js.map +1 -1
  72. package/src/lib/design/ready-shots.d.ts +29 -3
  73. package/src/lib/design/ready-shots.js +105 -5
  74. package/src/lib/design/ready-shots.js.map +1 -1
  75. package/src/lib/design/render-packages.d.ts +9 -17
  76. package/src/lib/design/render-packages.js +25 -63
  77. package/src/lib/design/render-packages.js.map +1 -1
  78. package/src/lib/design/render-worker.js +2 -3
  79. package/src/lib/design/render-worker.js.map +1 -1
  80. package/src/lib/design/render.d.ts +2 -0
  81. package/src/lib/design/render.js +32 -7
  82. package/src/lib/design/render.js.map +1 -1
  83. package/src/lib/design/serve.d.ts +23 -3
  84. package/src/lib/design/serve.js +288 -35
  85. package/src/lib/design/serve.js.map +1 -1
  86. package/src/lib/design/server-identity.d.ts +36 -0
  87. package/src/lib/design/server-identity.js +68 -0
  88. package/src/lib/design/server-identity.js.map +1 -0
  89. package/src/lib/design/settle-frames.d.ts +4 -0
  90. package/src/lib/design/settle-frames.js +22 -0
  91. package/src/lib/design/settle-frames.js.map +1 -0
  92. package/src/lib/design/shot-command.d.ts +30 -6
  93. package/src/lib/design/shot-command.js +144 -56
  94. package/src/lib/design/shot-command.js.map +1 -1
  95. package/src/lib/design/shot-store.d.ts +24 -0
  96. package/src/lib/design/shot-store.js +120 -0
  97. package/src/lib/design/shot-store.js.map +1 -0
  98. package/src/lib/design/shot.d.ts +71 -1
  99. package/src/lib/design/shot.js +253 -40
  100. package/src/lib/design/shot.js.map +1 -1
  101. package/src/lib/design/sketch-command.d.ts +6 -1
  102. package/src/lib/design/sketch-command.js +452 -136
  103. package/src/lib/design/sketch-command.js.map +1 -1
  104. package/src/lib/design/ssr-shims.d.ts +2 -0
  105. package/src/lib/design/ssr-shims.js +12 -1
  106. package/src/lib/design/ssr-shims.js.map +1 -1
  107. package/src/lib/design/stale-cli-dist.d.ts +11 -0
  108. package/src/lib/design/stale-cli-dist.js +56 -0
  109. package/src/lib/design/stale-cli-dist.js.map +1 -0
  110. package/src/lib/design/stamp.d.ts +18 -1
  111. package/src/lib/design/stamp.js +53 -7
  112. package/src/lib/design/stamp.js.map +1 -1
  113. package/src/lib/design/started-by-studio.d.ts +1 -0
  114. package/src/lib/design/started-by-studio.js +6 -0
  115. package/src/lib/design/started-by-studio.js.map +1 -0
  116. package/src/lib/design/studio-api.d.ts +35 -4
  117. package/src/lib/design/studio-api.js +312 -41
  118. package/src/lib/design/studio-api.js.map +1 -1
  119. package/src/lib/design/system/accept-command.d.ts +39 -5
  120. package/src/lib/design/system/accept-command.js +109 -25
  121. package/src/lib/design/system/accept-command.js.map +1 -1
  122. package/src/lib/design/system/accepted-pictures.d.ts +83 -0
  123. package/src/lib/design/system/accepted-pictures.js +324 -0
  124. package/src/lib/design/system/accepted-pictures.js.map +1 -0
  125. package/src/lib/design/system/action-lost.d.ts +59 -0
  126. package/src/lib/design/system/action-lost.js +120 -0
  127. package/src/lib/design/system/action-lost.js.map +1 -0
  128. package/src/lib/design/system/action-press.d.ts +23 -0
  129. package/src/lib/design/system/action-press.js +76 -0
  130. package/src/lib/design/system/action-press.js.map +1 -0
  131. package/src/lib/design/system/action-undeclared.d.ts +34 -0
  132. package/src/lib/design/system/action-undeclared.js +81 -0
  133. package/src/lib/design/system/action-undeclared.js.map +1 -0
  134. package/src/lib/design/system/actions-command.d.ts +101 -0
  135. package/src/lib/design/system/actions-command.js +695 -0
  136. package/src/lib/design/system/actions-command.js.map +1 -0
  137. package/src/lib/design/system/actions.d.ts +158 -0
  138. package/src/lib/design/system/actions.js +295 -0
  139. package/src/lib/design/system/actions.js.map +1 -0
  140. package/src/lib/design/system/app-files.d.ts +10 -0
  141. package/src/lib/design/system/app-files.js +159 -0
  142. package/src/lib/design/system/app-files.js.map +1 -0
  143. package/src/lib/design/system/bespoke-controls.d.ts +30 -0
  144. package/src/lib/design/system/bespoke-controls.js +147 -0
  145. package/src/lib/design/system/bespoke-controls.js.map +1 -0
  146. package/src/lib/design/system/build-ready-contract.d.ts +27 -0
  147. package/src/lib/design/system/build-ready-contract.js +12 -0
  148. package/src/lib/design/system/build-ready-contract.js.map +1 -0
  149. package/src/lib/design/system/check-rules.d.ts +1 -0
  150. package/src/lib/design/system/check-rules.js +82 -0
  151. package/src/lib/design/system/check-rules.js.map +1 -0
  152. package/src/lib/design/system/check-system.d.ts +62 -3
  153. package/src/lib/design/system/check-system.js +527 -34
  154. package/src/lib/design/system/check-system.js.map +1 -1
  155. package/src/lib/design/system/colour.d.ts +4 -1
  156. package/src/lib/design/system/colour.js +54 -2
  157. package/src/lib/design/system/colour.js.map +1 -1
  158. package/src/lib/design/system/comments/comment.d.ts +4 -1
  159. package/src/lib/design/system/comments/comment.js +13 -4
  160. package/src/lib/design/system/comments/comment.js.map +1 -1
  161. package/src/lib/design/system/comments/inbox.js +2 -2
  162. package/src/lib/design/system/comments/inbox.js.map +1 -1
  163. package/src/lib/design/system/compare-command.d.ts +119 -0
  164. package/src/lib/design/system/compare-command.js +558 -0
  165. package/src/lib/design/system/compare-command.js.map +1 -0
  166. package/src/lib/design/system/complete-command.js +7 -3
  167. package/src/lib/design/system/complete-command.js.map +1 -1
  168. package/src/lib/design/system/complete.d.ts +99 -3
  169. package/src/lib/design/system/complete.js +358 -88
  170. package/src/lib/design/system/complete.js.map +1 -1
  171. package/src/lib/design/system/component-outputs.d.ts +20 -0
  172. package/src/lib/design/system/component-outputs.js +86 -0
  173. package/src/lib/design/system/component-outputs.js.map +1 -0
  174. package/src/lib/design/system/contrast-check.d.ts +6 -1
  175. package/src/lib/design/system/contrast-check.js +179 -13
  176. package/src/lib/design/system/contrast-check.js.map +1 -1
  177. package/src/lib/design/system/demo-backdrop.d.ts +11 -0
  178. package/src/lib/design/system/demo-backdrop.js +41 -0
  179. package/src/lib/design/system/demo-backdrop.js.map +1 -0
  180. package/src/lib/design/system/design-hash.d.ts +31 -0
  181. package/src/lib/design/system/design-hash.js +73 -0
  182. package/src/lib/design/system/design-hash.js.map +1 -0
  183. package/src/lib/design/system/disabled-interaction.d.ts +8 -0
  184. package/src/lib/design/system/disabled-interaction.js +37 -0
  185. package/src/lib/design/system/disabled-interaction.js.map +1 -0
  186. package/src/lib/design/system/dom-command.d.ts +36 -0
  187. package/src/lib/design/system/dom-command.js +175 -0
  188. package/src/lib/design/system/dom-command.js.map +1 -0
  189. package/src/lib/design/system/drawn-open-points.d.ts +38 -0
  190. package/src/lib/design/system/drawn-open-points.js +94 -0
  191. package/src/lib/design/system/drawn-open-points.js.map +1 -0
  192. package/src/lib/design/system/dropped-props.d.ts +25 -0
  193. package/src/lib/design/system/dropped-props.js +159 -0
  194. package/src/lib/design/system/dropped-props.js.map +1 -0
  195. package/src/lib/design/system/embedded-actions.d.ts +21 -0
  196. package/src/lib/design/system/embedded-actions.js +37 -0
  197. package/src/lib/design/system/embedded-actions.js.map +1 -0
  198. package/src/lib/design/system/exceptions.js +2 -1
  199. package/src/lib/design/system/exceptions.js.map +1 -1
  200. package/src/lib/design/system/flows/flow.js +2 -1
  201. package/src/lib/design/system/flows/flow.js.map +1 -1
  202. package/src/lib/design/system/frozen-animations.d.ts +13 -0
  203. package/src/lib/design/system/frozen-animations.js +51 -0
  204. package/src/lib/design/system/frozen-animations.js.map +1 -0
  205. package/src/lib/design/system/go-batch.d.ts +24 -0
  206. package/src/lib/design/system/go-batch.js +110 -0
  207. package/src/lib/design/system/go-batch.js.map +1 -0
  208. package/src/lib/design/system/go-command.d.ts +4 -0
  209. package/src/lib/design/system/go-command.js +64 -0
  210. package/src/lib/design/system/go-command.js.map +1 -0
  211. package/src/lib/design/system/go-guard.d.ts +26 -0
  212. package/src/lib/design/system/go-guard.js +70 -0
  213. package/src/lib/design/system/go-guard.js.map +1 -0
  214. package/src/lib/design/system/go-step.d.ts +13 -0
  215. package/src/lib/design/system/go-step.js +84 -0
  216. package/src/lib/design/system/go-step.js.map +1 -0
  217. package/src/lib/design/system/handoff.js +2 -1
  218. package/src/lib/design/system/handoff.js.map +1 -1
  219. package/src/lib/design/system/harness-build-cache.d.ts +35 -0
  220. package/src/lib/design/system/harness-build-cache.js +175 -0
  221. package/src/lib/design/system/harness-build-cache.js.map +1 -0
  222. package/src/lib/design/system/harness-command.d.ts +7 -0
  223. package/src/lib/design/system/harness-command.js +51 -0
  224. package/src/lib/design/system/harness-command.js.map +1 -0
  225. package/src/lib/design/system/harness-config.d.ts +9 -0
  226. package/src/lib/design/system/harness-config.js +65 -0
  227. package/src/lib/design/system/harness-config.js.map +1 -0
  228. package/src/lib/design/system/harness-map.d.ts +44 -0
  229. package/src/lib/design/system/harness-map.js +126 -0
  230. package/src/lib/design/system/harness-map.js.map +1 -0
  231. package/src/lib/design/system/harness-samples.d.ts +20 -0
  232. package/src/lib/design/system/harness-samples.js +92 -0
  233. package/src/lib/design/system/harness-samples.js.map +1 -0
  234. package/src/lib/design/system/harness-server.d.ts +40 -0
  235. package/src/lib/design/system/harness-server.js +296 -0
  236. package/src/lib/design/system/harness-server.js.map +1 -0
  237. package/src/lib/design/system/imports.js +14 -1
  238. package/src/lib/design/system/imports.js.map +1 -1
  239. package/src/lib/design/system/in-order-at-once.d.ts +6 -0
  240. package/src/lib/design/system/in-order-at-once.js +28 -0
  241. package/src/lib/design/system/in-order-at-once.js.map +1 -0
  242. package/src/lib/design/system/inventory-approval.js +2 -1
  243. package/src/lib/design/system/inventory-approval.js.map +1 -1
  244. package/src/lib/design/system/inventory.d.ts +13 -4
  245. package/src/lib/design/system/inventory.js +36 -7
  246. package/src/lib/design/system/inventory.js.map +1 -1
  247. package/src/lib/design/system/list-system.d.ts +8 -1
  248. package/src/lib/design/system/list-system.js +13 -3
  249. package/src/lib/design/system/list-system.js.map +1 -1
  250. package/src/lib/design/system/live-actions.d.ts +121 -0
  251. package/src/lib/design/system/live-actions.js +665 -0
  252. package/src/lib/design/system/live-actions.js.map +1 -0
  253. package/src/lib/design/system/live-compare.d.ts +136 -0
  254. package/src/lib/design/system/live-compare.js +441 -0
  255. package/src/lib/design/system/live-compare.js.map +1 -0
  256. package/src/lib/design/system/live-uncovered.d.ts +40 -0
  257. package/src/lib/design/system/live-uncovered.js +123 -0
  258. package/src/lib/design/system/live-uncovered.js.map +1 -0
  259. package/src/lib/design/system/nested-scroll.d.ts +7 -0
  260. package/src/lib/design/system/nested-scroll.js +25 -0
  261. package/src/lib/design/system/nested-scroll.js.map +1 -0
  262. package/src/lib/design/system/notes/note.js +2 -1
  263. package/src/lib/design/system/notes/note.js.map +1 -1
  264. package/src/lib/design/system/occluded.d.ts +13 -0
  265. package/src/lib/design/system/occluded.js +111 -0
  266. package/src/lib/design/system/occluded.js.map +1 -0
  267. package/src/lib/design/system/open-points.d.ts +119 -0
  268. package/src/lib/design/system/open-points.js +185 -0
  269. package/src/lib/design/system/open-points.js.map +1 -0
  270. package/src/lib/design/system/part-build-ready.d.ts +39 -0
  271. package/src/lib/design/system/part-build-ready.js +107 -0
  272. package/src/lib/design/system/part-build-ready.js.map +1 -0
  273. package/src/lib/design/system/part-command.js +2 -9
  274. package/src/lib/design/system/part-command.js.map +1 -1
  275. package/src/lib/design/system/part-compare.d.ts +123 -0
  276. package/src/lib/design/system/part-compare.js +396 -0
  277. package/src/lib/design/system/part-compare.js.map +1 -0
  278. package/src/lib/design/system/part-go.d.ts +70 -0
  279. package/src/lib/design/system/part-go.js +94 -0
  280. package/src/lib/design/system/part-go.js.map +1 -0
  281. package/src/lib/design/system/part-ready.d.ts +90 -0
  282. package/src/lib/design/system/part-ready.js +172 -0
  283. package/src/lib/design/system/part-ready.js.map +1 -0
  284. package/src/lib/design/system/part-task.d.ts +147 -0
  285. package/src/lib/design/system/part-task.js +285 -0
  286. package/src/lib/design/system/part-task.js.map +1 -0
  287. package/src/lib/design/system/pointer-focus.d.ts +81 -0
  288. package/src/lib/design/system/pointer-focus.js +152 -0
  289. package/src/lib/design/system/pointer-focus.js.map +1 -0
  290. package/src/lib/design/system/prettier.d.ts +10 -0
  291. package/src/lib/design/system/prettier.js +36 -0
  292. package/src/lib/design/system/prettier.js.map +1 -0
  293. package/src/lib/design/system/reach.d.ts +12 -0
  294. package/src/lib/design/system/reach.js +186 -0
  295. package/src/lib/design/system/reach.js.map +1 -0
  296. package/src/lib/design/system/reachable-controls.d.ts +6 -0
  297. package/src/lib/design/system/reachable-controls.js +19 -0
  298. package/src/lib/design/system/reachable-controls.js.map +1 -0
  299. package/src/lib/design/system/reachable-files.d.ts +14 -0
  300. package/src/lib/design/system/reachable-files.js +101 -0
  301. package/src/lib/design/system/reachable-files.js.map +1 -0
  302. package/src/lib/design/system/reached-state.d.ts +23 -0
  303. package/src/lib/design/system/reached-state.js +53 -0
  304. package/src/lib/design/system/reached-state.js.map +1 -0
  305. package/src/lib/design/system/read-open-points.d.ts +33 -0
  306. package/src/lib/design/system/read-open-points.js +110 -0
  307. package/src/lib/design/system/read-open-points.js.map +1 -0
  308. package/src/lib/design/system/ready-command.d.ts +11 -0
  309. package/src/lib/design/system/ready-command.js +82 -0
  310. package/src/lib/design/system/ready-command.js.map +1 -0
  311. package/src/lib/design/system/render-check.d.ts +52 -0
  312. package/src/lib/design/system/render-check.js +479 -60
  313. package/src/lib/design/system/render-check.js.map +1 -1
  314. package/src/lib/design/system/resolve-product.d.ts +2 -1
  315. package/src/lib/design/system/resolve-product.js +25 -3
  316. package/src/lib/design/system/resolve-product.js.map +1 -1
  317. package/src/lib/design/system/rules/app-spec.d.ts +30 -0
  318. package/src/lib/design/system/rules/app-spec.js +87 -0
  319. package/src/lib/design/system/rules/app-spec.js.map +1 -0
  320. package/src/lib/design/system/rules/canonical-class.d.ts +2 -0
  321. package/src/lib/design/system/rules/canonical-class.js +36 -110
  322. package/src/lib/design/system/rules/canonical-class.js.map +1 -1
  323. package/src/lib/design/system/rules/capability-place.d.ts +44 -0
  324. package/src/lib/design/system/rules/capability-place.js +116 -0
  325. package/src/lib/design/system/rules/capability-place.js.map +1 -0
  326. package/src/lib/design/system/rules/denied-class.d.ts +9 -0
  327. package/src/lib/design/system/rules/denied-class.js +121 -0
  328. package/src/lib/design/system/rules/denied-class.js.map +1 -0
  329. package/src/lib/design/system/rules/exemptions.d.ts +18 -0
  330. package/src/lib/design/system/rules/exemptions.js +18 -0
  331. package/src/lib/design/system/rules/exemptions.js.map +1 -0
  332. package/src/lib/design/system/rules/flow.js +1 -1
  333. package/src/lib/design/system/rules/flow.js.map +1 -1
  334. package/src/lib/design/system/rules/glued-interpolation.d.ts +8 -0
  335. package/src/lib/design/system/rules/glued-interpolation.js +61 -0
  336. package/src/lib/design/system/rules/glued-interpolation.js.map +1 -0
  337. package/src/lib/design/system/rules/hard-coded-colour.js +2 -1
  338. package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -1
  339. package/src/lib/design/system/rules/implemented-components.d.ts +22 -0
  340. package/src/lib/design/system/rules/implemented-components.js +45 -0
  341. package/src/lib/design/system/rules/implemented-components.js.map +1 -0
  342. package/src/lib/design/system/rules/implements.d.ts +8 -0
  343. package/src/lib/design/system/rules/implements.js +48 -0
  344. package/src/lib/design/system/rules/implements.js.map +1 -0
  345. package/src/lib/design/system/rules/inline-svg.js +4 -1
  346. package/src/lib/design/system/rules/inline-svg.js.map +1 -1
  347. package/src/lib/design/system/rules/inline-ui-in-page-open.d.ts +13 -0
  348. package/src/lib/design/system/rules/inline-ui-in-page-open.js +5 -0
  349. package/src/lib/design/system/rules/inline-ui-in-page-open.js.map +1 -0
  350. package/src/lib/design/system/rules/inline-ui-in-page.d.ts +18 -0
  351. package/src/lib/design/system/rules/inline-ui-in-page.js +123 -0
  352. package/src/lib/design/system/rules/inline-ui-in-page.js.map +1 -0
  353. package/src/lib/design/system/rules/inline-ui.d.ts +16 -0
  354. package/src/lib/design/system/rules/inline-ui.js +100 -0
  355. package/src/lib/design/system/rules/inline-ui.js.map +1 -0
  356. package/src/lib/design/system/rules/motion.d.ts +2 -0
  357. package/src/lib/design/system/rules/motion.js +35 -2
  358. package/src/lib/design/system/rules/motion.js.map +1 -1
  359. package/src/lib/design/system/rules/native-title.d.ts +7 -0
  360. package/src/lib/design/system/rules/native-title.js +64 -0
  361. package/src/lib/design/system/rules/native-title.js.map +1 -0
  362. package/src/lib/design/system/rules/option-values.d.ts +15 -0
  363. package/src/lib/design/system/rules/option-values.js +145 -0
  364. package/src/lib/design/system/rules/option-values.js.map +1 -0
  365. package/src/lib/design/system/rules/orphan-endpoint-known.d.ts +12 -0
  366. package/src/lib/design/system/rules/orphan-endpoint-known.js +20 -0
  367. package/src/lib/design/system/rules/orphan-endpoint-known.js.map +1 -0
  368. package/src/lib/design/system/rules/orphan-endpoint.d.ts +23 -0
  369. package/src/lib/design/system/rules/orphan-endpoint.js +166 -0
  370. package/src/lib/design/system/rules/orphan-endpoint.js.map +1 -0
  371. package/src/lib/design/system/rules/part-rewrite.d.ts +13 -0
  372. package/src/lib/design/system/rules/part-rewrite.js +125 -0
  373. package/src/lib/design/system/rules/part-rewrite.js.map +1 -0
  374. package/src/lib/design/system/rules/sample-default-known.d.ts +5 -0
  375. package/src/lib/design/system/rules/sample-default-known.js +17 -0
  376. package/src/lib/design/system/rules/sample-default-known.js.map +1 -0
  377. package/src/lib/design/system/rules/sample-default.d.ts +22 -0
  378. package/src/lib/design/system/rules/sample-default.js +92 -0
  379. package/src/lib/design/system/rules/sample-default.js.map +1 -0
  380. package/src/lib/design/system/rules/stale-replace.js +45 -3
  381. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  382. package/src/lib/design/system/rules/state-in-component.d.ts +16 -0
  383. package/src/lib/design/system/rules/state-in-component.js +101 -0
  384. package/src/lib/design/system/rules/state-in-component.js.map +1 -0
  385. package/src/lib/design/system/rules/tailwind-classes.d.ts +51 -0
  386. package/src/lib/design/system/rules/tailwind-classes.js +232 -0
  387. package/src/lib/design/system/rules/tailwind-classes.js.map +1 -0
  388. package/src/lib/design/system/rules/top-level-await.d.ts +9 -0
  389. package/src/lib/design/system/rules/top-level-await.js +62 -0
  390. package/src/lib/design/system/rules/top-level-await.js.map +1 -0
  391. package/src/lib/design/system/rules/unbound-input-known.d.ts +5 -0
  392. package/src/lib/design/system/rules/unbound-input-known.js +47 -0
  393. package/src/lib/design/system/rules/unbound-input-known.js.map +1 -0
  394. package/src/lib/design/system/rules/unbound-input.d.ts +22 -0
  395. package/src/lib/design/system/rules/unbound-input.js +61 -0
  396. package/src/lib/design/system/rules/unbound-input.js.map +1 -0
  397. package/src/lib/design/system/rules/uncovered-region.d.ts +13 -0
  398. package/src/lib/design/system/rules/uncovered-region.js +36 -0
  399. package/src/lib/design/system/rules/uncovered-region.js.map +1 -0
  400. package/src/lib/design/system/rules/undefined-class.d.ts +9 -0
  401. package/src/lib/design/system/rules/undefined-class.js +32 -0
  402. package/src/lib/design/system/rules/undefined-class.js.map +1 -0
  403. package/src/lib/design/system/rules/undefined-token.d.ts +1 -1
  404. package/src/lib/design/system/rules/undefined-token.js +7 -61
  405. package/src/lib/design/system/rules/undefined-token.js.map +1 -1
  406. package/src/lib/design/system/rules/utility-css.d.ts +2 -1
  407. package/src/lib/design/system/rules/utility-css.js +29 -14
  408. package/src/lib/design/system/rules/utility-css.js.map +1 -1
  409. package/src/lib/design/system/rules/view-coverage.d.ts +8 -0
  410. package/src/lib/design/system/rules/view-coverage.js +51 -0
  411. package/src/lib/design/system/rules/view-coverage.js.map +1 -0
  412. package/src/lib/design/system/rules/visible-change.d.ts +20 -0
  413. package/src/lib/design/system/rules/visible-change.js +48 -0
  414. package/src/lib/design/system/rules/visible-change.js.map +1 -0
  415. package/src/lib/design/system/sdk-errors.d.ts +14 -0
  416. package/src/lib/design/system/sdk-errors.js +38 -0
  417. package/src/lib/design/system/sdk-errors.js.map +1 -0
  418. package/src/lib/design/system/see-through.d.ts +12 -0
  419. package/src/lib/design/system/see-through.js +112 -0
  420. package/src/lib/design/system/see-through.js.map +1 -0
  421. package/src/lib/design/system/settled-panes.d.ts +18 -0
  422. package/src/lib/design/system/settled-panes.js +70 -0
  423. package/src/lib/design/system/settled-panes.js.map +1 -0
  424. package/src/lib/design/system/sketch/after-merge.d.ts +11 -0
  425. package/src/lib/design/system/sketch/after-merge.js +51 -0
  426. package/src/lib/design/system/sketch/after-merge.js.map +1 -0
  427. package/src/lib/design/system/sketch/aktuell-placeholders.d.ts +30 -0
  428. package/src/lib/design/system/sketch/aktuell-placeholders.js +87 -0
  429. package/src/lib/design/system/sketch/aktuell-placeholders.js.map +1 -0
  430. package/src/lib/design/system/sketch/baseline.d.ts +29 -2
  431. package/src/lib/design/system/sketch/baseline.js +33 -9
  432. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  433. package/src/lib/design/system/sketch/check-sketches.d.ts +11 -0
  434. package/src/lib/design/system/sketch/check-sketches.js +54 -6
  435. package/src/lib/design/system/sketch/check-sketches.js.map +1 -1
  436. package/src/lib/design/system/sketch/cli-args.d.ts +12 -2
  437. package/src/lib/design/system/sketch/cli-args.js +18 -3
  438. package/src/lib/design/system/sketch/cli-args.js.map +1 -1
  439. package/src/lib/design/system/sketch/edit-sketch.d.ts +21 -0
  440. package/src/lib/design/system/sketch/edit-sketch.js +117 -0
  441. package/src/lib/design/system/sketch/edit-sketch.js.map +1 -0
  442. package/src/lib/design/system/sketch/frame-budget.d.ts +24 -0
  443. package/src/lib/design/system/sketch/frame-budget.js +23 -0
  444. package/src/lib/design/system/sketch/frame-budget.js.map +1 -0
  445. package/src/lib/design/system/sketch/identical-renders.d.ts +31 -0
  446. package/src/lib/design/system/sketch/identical-renders.js +137 -0
  447. package/src/lib/design/system/sketch/identical-renders.js.map +1 -0
  448. package/src/lib/design/system/sketch/merge-shared.d.ts +2 -0
  449. package/src/lib/design/system/sketch/merge-shared.js +7 -10
  450. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  451. package/src/lib/design/system/sketch/merge-step.d.ts +35 -0
  452. package/src/lib/design/system/sketch/merge-step.js +98 -0
  453. package/src/lib/design/system/sketch/merge-step.js.map +1 -0
  454. package/src/lib/design/system/sketch/merge.d.ts +10 -3
  455. package/src/lib/design/system/sketch/merge.js +122 -17
  456. package/src/lib/design/system/sketch/merge.js.map +1 -1
  457. package/src/lib/design/system/sketch/merged-layout.d.ts +17 -0
  458. package/src/lib/design/system/sketch/merged-layout.js +57 -0
  459. package/src/lib/design/system/sketch/merged-layout.js.map +1 -0
  460. package/src/lib/design/system/sketch/merged-parts.d.ts +41 -11
  461. package/src/lib/design/system/sketch/merged-parts.js +113 -50
  462. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  463. package/src/lib/design/system/sketch/no-visible-change.d.ts +10 -0
  464. package/src/lib/design/system/sketch/no-visible-change.js +16 -6
  465. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  466. package/src/lib/design/system/sketch/part-definition.d.ts +56 -0
  467. package/src/lib/design/system/sketch/part-definition.js +129 -13
  468. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  469. package/src/lib/design/system/sketch/rebase-port.d.ts +24 -0
  470. package/src/lib/design/system/sketch/rebase-port.js +170 -0
  471. package/src/lib/design/system/sketch/rebase-port.js.map +1 -0
  472. package/src/lib/design/system/sketch/sample-mark-drift.d.ts +33 -0
  473. package/src/lib/design/system/sketch/sample-mark-drift.js +88 -0
  474. package/src/lib/design/system/sketch/sample-mark-drift.js.map +1 -0
  475. package/src/lib/design/system/sketch/sketch-check-worker.d.ts +1 -0
  476. package/src/lib/design/system/sketch/sketch-check-worker.js +27 -0
  477. package/src/lib/design/system/sketch/sketch-check-worker.js.map +1 -0
  478. package/src/lib/design/system/sketch/sketch-checker.d.ts +27 -0
  479. package/src/lib/design/system/sketch/sketch-checker.js +99 -0
  480. package/src/lib/design/system/sketch/sketch-checker.js.map +1 -0
  481. package/src/lib/design/system/sketch/sketch.d.ts +78 -2
  482. package/src/lib/design/system/sketch/sketch.js +247 -54
  483. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  484. package/src/lib/design/system/sketch/stale-base.d.ts +22 -0
  485. package/src/lib/design/system/sketch/stale-base.js +56 -0
  486. package/src/lib/design/system/sketch/stale-base.js.map +1 -0
  487. package/src/lib/design/system/sketch/unchanged-states.d.ts +36 -1
  488. package/src/lib/design/system/sketch/unchanged-states.js +60 -17
  489. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  490. package/src/lib/design/system/sketch/unused-closure.js +26 -4
  491. package/src/lib/design/system/sketch/unused-closure.js.map +1 -1
  492. package/src/lib/design/system/sketch/unused-files.d.ts +1 -1
  493. package/src/lib/design/system/sketch/unused-files.js +6 -3
  494. package/src/lib/design/system/sketch/unused-files.js.map +1 -1
  495. package/src/lib/design/system/sketch/viewed-shots.d.ts +24 -0
  496. package/src/lib/design/system/sketch/viewed-shots.js +61 -0
  497. package/src/lib/design/system/sketch/viewed-shots.js.map +1 -0
  498. package/src/lib/design/system/slow-checks.d.ts +40 -0
  499. package/src/lib/design/system/slow-checks.js +197 -0
  500. package/src/lib/design/system/slow-checks.js.map +1 -0
  501. package/src/lib/design/system/slow-run.d.ts +57 -0
  502. package/src/lib/design/system/slow-run.js +253 -0
  503. package/src/lib/design/system/slow-run.js.map +1 -0
  504. package/src/lib/design/system/stale-design-mocks.d.ts +20 -0
  505. package/src/lib/design/system/stale-design-mocks.js +59 -0
  506. package/src/lib/design/system/stale-design-mocks.js.map +1 -0
  507. package/src/lib/design/system/stale-dist.d.ts +25 -0
  508. package/src/lib/design/system/stale-dist.js +91 -0
  509. package/src/lib/design/system/stale-dist.js.map +1 -0
  510. package/src/lib/design/system/stale-parts.d.ts +30 -0
  511. package/src/lib/design/system/stale-parts.js +106 -0
  512. package/src/lib/design/system/stale-parts.js.map +1 -0
  513. package/src/lib/design/system/surface-nesting.d.ts +11 -0
  514. package/src/lib/design/system/surface-nesting.js +86 -0
  515. package/src/lib/design/system/surface-nesting.js.map +1 -0
  516. package/src/lib/design/system/system-command.js +8 -6
  517. package/src/lib/design/system/system-command.js.map +1 -1
  518. package/src/lib/design/system/system-modules.d.ts +16 -1
  519. package/src/lib/design/system/system-modules.js +18 -2
  520. package/src/lib/design/system/system-modules.js.map +1 -1
  521. package/src/lib/design/system/system-tsconfig.js +2 -2
  522. package/src/lib/design/system/system-tsconfig.js.map +1 -1
  523. package/src/lib/design/system/task-command.d.ts +51 -0
  524. package/src/lib/design/system/task-command.js +233 -0
  525. package/src/lib/design/system/task-command.js.map +1 -0
  526. package/src/lib/design/system/theming-text.d.ts +2 -0
  527. package/src/lib/design/system/theming-text.js +6 -0
  528. package/src/lib/design/system/theming-text.js.map +1 -0
  529. package/src/lib/design/system/tom-confirm.d.ts +40 -0
  530. package/src/lib/design/system/tom-confirm.js +55 -0
  531. package/src/lib/design/system/tom-confirm.js.map +1 -0
  532. package/src/lib/design/system/touched-parts.d.ts +16 -0
  533. package/src/lib/design/system/touched-parts.js +122 -0
  534. package/src/lib/design/system/touched-parts.js.map +1 -0
  535. package/src/lib/design/system/ts-source.d.ts +5 -0
  536. package/src/lib/design/system/ts-source.js +35 -4
  537. package/src/lib/design/system/ts-source.js.map +1 -1
  538. package/src/lib/design/system/unchanged-rows.d.ts +15 -0
  539. package/src/lib/design/system/unchanged-rows.js +134 -0
  540. package/src/lib/design/system/unchanged-rows.js.map +1 -0
  541. package/src/lib/design/system/uncommitted-decisions.d.ts +6 -0
  542. package/src/lib/design/system/uncommitted-decisions.js +38 -0
  543. package/src/lib/design/system/uncommitted-decisions.js.map +1 -0
  544. package/src/lib/design/system/uncovered-regions.d.ts +61 -0
  545. package/src/lib/design/system/uncovered-regions.js +171 -0
  546. package/src/lib/design/system/uncovered-regions.js.map +1 -0
  547. package/src/lib/design/system/unused-base-parts.d.ts +7 -0
  548. package/src/lib/design/system/unused-base-parts.js +76 -0
  549. package/src/lib/design/system/unused-base-parts.js.map +1 -0
  550. package/src/lib/design/system/visible-change-command.d.ts +48 -0
  551. package/src/lib/design/system/visible-change-command.js +308 -0
  552. package/src/lib/design/system/visible-change-command.js.map +1 -0
  553. package/src/lib/design/system/visible-change-parts.d.ts +28 -0
  554. package/src/lib/design/system/visible-change-parts.js +96 -0
  555. package/src/lib/design/system/visible-change-parts.js.map +1 -0
  556. package/src/lib/design/system/visible-change.d.ts +82 -0
  557. package/src/lib/design/system/visible-change.js +149 -0
  558. package/src/lib/design/system/visible-change.js.map +1 -0
  559. package/src/lib/design/thumb.d.ts +50 -6
  560. package/src/lib/design/thumb.js +154 -54
  561. package/src/lib/design/thumb.js.map +1 -1
  562. package/src/lib/design/typecheck.d.ts +1 -1
  563. package/src/lib/design/typecheck.js +3 -3
  564. package/src/lib/design/typecheck.js.map +1 -1
  565. package/src/lib/design/unstable-cells.d.ts +23 -0
  566. package/src/lib/design/unstable-cells.js +40 -0
  567. package/src/lib/design/unstable-cells.js.map +1 -0
  568. package/src/lib/design/variant-diff.js +1 -1
  569. package/src/lib/design/variant-diff.js.map +1 -1
  570. package/src/lib/design/wait.d.ts +15 -0
  571. package/src/lib/design/wait.js +30 -0
  572. package/src/lib/design/wait.js.map +1 -0
  573. package/src/lib/json-file.d.ts +11 -0
  574. package/src/lib/json-file.js +21 -0
  575. package/src/lib/json-file.js.map +1 -0
  576. package/src/lib/source-hash.d.ts +7 -0
  577. package/src/lib/source-hash.js +62 -0
  578. package/src/lib/source-hash.js.map +1 -0
  579. package/src/lib/update/agent-setup.js +2 -1
  580. package/src/lib/update/agent-setup.js.map +1 -1
  581. package/src/lib/update/migration-manifest.d.ts +12 -0
  582. package/src/lib/update/migration-manifest.js +13 -0
  583. package/src/lib/update/migration-manifest.js.map +1 -1
  584. package/src/lib/update/migration-record.js +2 -1
  585. package/src/lib/update/migration-record.js.map +1 -1
  586. package/src/lib/update/pending.js +2 -1
  587. package/src/lib/update/pending.js.map +1 -1
  588. package/src/lib/update/run-migrations.d.ts +3 -2
  589. package/src/lib/update/run-migrations.js +38 -5
  590. package/src/lib/update/run-migrations.js.map +1 -1
  591. package/src/lib/update/tasks.js +2 -1
  592. package/src/lib/update/tasks.js.map +1 -1
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __rest = (this && this.__rest) || function (s, e) {
3
12
  var t = {};
4
13
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -11,9 +20,10 @@ var __rest = (this && this.__rest) || function (s, e) {
11
20
  return t;
12
21
  };
13
22
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.editRound = exports.addVariant = exports.rebaseSketch = exports.decideSketch = exports.releaseSketch = exports.holdSketch = exports.heldProblemOf = exports.markSketchReady = exports.finishSketchReport = exports.clearSketchReport = exports.readSketchReport = exports.reportSketch = exports.sketchReportPath = exports.withAuthor = exports.createSketch = exports.sketchSourceOf = exports.writeSketchFile = exports.findSketch = exports.listSketches = exports.readSketch = exports.authorsOf = exports.rejectedProblemOf = exports.rejectionOf = exports.runningRoundOf = exports.isVariantName = exports.parseTarget = exports.sourceFilesIn = exports.variantSharedDirOf = exports.sharedDirOf = exports.SHARED_FOLDER = exports.variantDirOf = exports.sketchDirOf = exports.sketchFolderOf = exports.sketchesDirOf = exports.SKETCH_FILE = exports.SKETCH_MERGES = exports.SKETCH_STATUSES = void 0;
23
+ exports.editRound = exports.editVariantNote = exports.addVariant = exports.rebaseSketch = exports.decideSketch = exports.withdrawVariant = exports.releaseSketch = exports.holdSketch = exports.heldProblemOf = exports.markSketchReady = exports.finishSketchReport = exports.clearSketchReport = exports.readSketchReport = exports.reportSketch = exports.sketchReportPath = exports.withAuthor = exports.removeTarget = exports.addTarget = exports.createSketch = exports.sketchSourceOf = exports.writeSketchFile = exports.findSketch = exports.listSketchesInTurns = exports.listSketches = exports.readSketch = exports.authorsOf = exports.rejectedProblemOf = exports.rejectionOf = exports.runningRoundOf = exports.isVariantName = exports.parseTarget = exports.rewriteSharedImports = exports.rebaseOutsideImports = exports.relativeSpecifierOf = exports.withSharedImports = exports.sourceFilesIn = exports.SOURCE_FILE = exports.variantSharedDirOf = exports.sharedDirOf = exports.SHARED_FOLDER = exports.variantDirOf = exports.sketchDirOf = exports.sketchIdOf = exports.sketchFolderOf = exports.sketchesDirOf = exports.SKETCH_FILE = exports.SKETCH_MERGES = exports.SKETCH_STATUSES = void 0;
15
24
  const fs_1 = require("fs");
16
25
  const path_1 = require("path");
26
+ const promises_1 = require("timers/promises");
17
27
  const json_layout_1 = require("../../json-layout");
18
28
  const status_1 = require("../../status");
19
29
  const assets_1 = require("../assets");
@@ -30,8 +40,10 @@ const NAME = /^[a-z0-9][a-z0-9-]*$/u;
30
40
  exports.SKETCH_FILE = 'sketch.json';
31
41
  const sketchesDirOf = (productDir) => (0, path_1.resolve)(productDir, 'sketches');
32
42
  exports.sketchesDirOf = sketchesDirOf;
33
- const sketchFolderOf = (target) => `${target.layer}-${target.name}`;
43
+ const sketchFolderOf = (target) => `${target.layer}-${target.name}${target.sketch ? `.${target.sketch}` : ''}`;
34
44
  exports.sketchFolderOf = sketchFolderOf;
45
+ const sketchIdOf = (target) => `${(0, resolve_product_1.partKeyOf)(target)}${target.sketch ? `@${target.sketch}` : ''}`;
46
+ exports.sketchIdOf = sketchIdOf;
35
47
  const sketchDirOf = (options) => (0, path_1.resolve)((0, exports.sketchesDirOf)(options.productDir), (0, exports.sketchFolderOf)(options.sketch));
36
48
  exports.sketchDirOf = sketchDirOf;
37
49
  const variantDirOf = (sketch, variant) => (0, path_1.resolve)(sketch.dir, variant);
@@ -41,29 +53,70 @@ exports.sharedDirOf = sharedDirOf;
41
53
  /** A variant's own `shared/` folder: a file there wins over the sketch's `shared/` file of the same path. */
42
54
  const variantSharedDirOf = (sketch, variant) => (0, path_1.resolve)((0, exports.variantDirOf)(sketch, variant), imports_1.SHARED_FOLDER);
43
55
  exports.variantSharedDirOf = variantSharedDirOf;
44
- const SOURCE = /\.(?:ts|js|mjs)$/u;
56
+ exports.SOURCE_FILE = /\.(?:ts|js|mjs)$/u;
45
57
  const sourceFilesIn = (dir) => (0, fs_1.existsSync)(dir)
46
58
  ? (0, fs_1.readdirSync)(dir, { recursive: true })
47
- .filter((path) => SOURCE.test(path))
59
+ .filter((path) => exports.SOURCE_FILE.test(path))
48
60
  .map((path) => (0, path_1.resolve)(dir, path))
49
61
  : [];
50
62
  exports.sourceFilesIn = sourceFilesIn;
51
- const liftShared = (options) => {
52
- const { partDir, sketchSharedDir } = options;
63
+ /** `source`, the file `file` of the part in `partDir`, with its relative imports of the part's own `shared/` folder as `@shared/`. */
64
+ const withSharedImports = (options) => {
65
+ const { source, file, partDir } = options;
53
66
  const shared = (0, path_1.resolve)(partDir, imports_1.SHARED_FOLDER);
54
- if (!(0, fs_1.existsSync)(shared))
55
- return;
56
- for (const file of (0, exports.sourceFilesIn)(partDir)) {
67
+ return source.replace(/(['"])(\.{1,2}\/[^'"]+)\1/gu, (...[match = '', quote = '', specifier = '']) => {
68
+ const path = (0, path_1.relative)(shared, (0, path_1.resolve)((0, path_1.dirname)(file), specifier));
69
+ return path.startsWith('..') || (0, path_1.isAbsolute)(path)
70
+ ? match
71
+ : `${quote}${imports_1.SHARED_PREFIX}${path.split(path_1.sep).join('/')}${quote}`;
72
+ });
73
+ };
74
+ exports.withSharedImports = withSharedImports;
75
+ const insideOf = (dir, path) => {
76
+ const rest = (0, path_1.relative)(dir, path);
77
+ return !rest.startsWith('..') && !(0, path_1.isAbsolute)(rest);
78
+ };
79
+ const relativeSpecifierOf = (options) => {
80
+ const path = (0, path_1.relative)((0, path_1.dirname)(options.from), options.to).split(path_1.sep).join('/');
81
+ return path.startsWith('.') ? path : `./${path}`;
82
+ };
83
+ exports.relativeSpecifierOf = relativeSpecifierOf;
84
+ /**
85
+ * Rewrites the relative imports of the files in `dir`, a copy of the folder `from`, that leave `from` - and `within`,
86
+ * when given - so they reach the same files from `dir`.
87
+ */
88
+ const rebaseOutsideImports = (options) => {
89
+ const { dir, from, within } = options;
90
+ for (const file of (0, exports.sourceFilesIn)(dir)) {
91
+ const original = (0, path_1.resolve)(from, (0, path_1.relative)(dir, file));
57
92
  const source = (0, fs_1.readFileSync)(file, 'utf8');
58
93
  const rewritten = source.replace(/(['"])(\.{1,2}\/[^'"]+)\1/gu, (...[match = '', quote = '', specifier = '']) => {
59
- const path = (0, path_1.relative)(shared, (0, path_1.resolve)((0, path_1.dirname)(file), specifier));
60
- return path.startsWith('..') || (0, path_1.isAbsolute)(path)
94
+ const path = (0, path_1.resolve)((0, path_1.dirname)(original), specifier);
95
+ return insideOf(from, path) || (within !== undefined && insideOf(within, path))
61
96
  ? match
62
- : `${quote}${imports_1.SHARED_PREFIX}${path.split(path_1.sep).join('/')}${quote}`;
97
+ : `${quote}${(0, exports.relativeSpecifierOf)({ from: file, to: path })}${quote}`;
63
98
  });
64
99
  if (rewritten !== source)
65
100
  (0, fs_1.writeFileSync)(file, rewritten);
66
101
  }
102
+ };
103
+ exports.rebaseOutsideImports = rebaseOutsideImports;
104
+ /** Rewrites the relative imports of the part's own `shared/` folder in its files to `@shared/`. */
105
+ const rewriteSharedImports = (partDir) => {
106
+ for (const file of (0, exports.sourceFilesIn)(partDir)) {
107
+ const source = (0, fs_1.readFileSync)(file, 'utf8');
108
+ const rewritten = (0, exports.withSharedImports)({ source, file, partDir });
109
+ if (rewritten !== source)
110
+ (0, fs_1.writeFileSync)(file, rewritten);
111
+ }
112
+ };
113
+ exports.rewriteSharedImports = rewriteSharedImports;
114
+ const liftShared = (options) => {
115
+ const { partDir, sketchSharedDir } = options;
116
+ const shared = (0, path_1.resolve)(partDir, imports_1.SHARED_FOLDER);
117
+ if (!(0, fs_1.existsSync)(shared))
118
+ return;
119
+ (0, exports.rewriteSharedImports)(partDir);
67
120
  (0, fs_1.cpSync)(shared, sketchSharedDir, { recursive: true });
68
121
  (0, fs_1.rmSync)(shared, { recursive: true });
69
122
  };
@@ -86,17 +139,22 @@ const sharedClashOf = (parts) => {
86
139
  };
87
140
  /** Reads `<layer>/<name>` as a sketch target, or answers with why it is not one. */
88
141
  const parseTarget = (value) => {
89
- const [layer = '', name = '', ...rest] = (value !== null && value !== void 0 ? value : '').split('/');
90
- if (!(0, layers_1.isLayer)(layer) || !NAME.test(name) || rest.length > 0)
91
- return `"${value !== null && value !== void 0 ? value : ''}" is no target - pass <layer>/<name>, the layer one of foundations, components, elements, pages`;
92
- return { layer, name };
142
+ const [asked = '', sketch, ...more] = (value !== null && value !== void 0 ? value : '').split('@');
143
+ const [layer = '', name = '', ...rest] = asked.split('/');
144
+ if (!(0, layers_1.isLayer)(layer) ||
145
+ !NAME.test(name) ||
146
+ rest.length > 0 ||
147
+ more.length > 0 ||
148
+ (sketch !== undefined && !NAME.test(sketch)))
149
+ return `"${value !== null && value !== void 0 ? value : ''}" is no target - pass <layer>/<name>[@<sketch name>], the layer one of foundations, components, elements, pages`;
150
+ return sketch === undefined ? { layer, name } : { layer, name, sketch };
93
151
  };
94
152
  exports.parseTarget = parseTarget;
95
153
  const isVariantName = (name) => NAME.test(name) && name !== imports_1.SHARED_FOLDER;
96
154
  exports.isVariantName = isVariantName;
97
155
  const foldersOf = (dir) => (0, fs_1.existsSync)(dir)
98
156
  ? (0, fs_1.readdirSync)(dir)
99
- .filter((name) => (0, fs_1.statSync)((0, path_1.resolve)(dir, name)).isDirectory())
157
+ .filter((name) => { var _a; return (_a = (0, fs_1.statSync)((0, path_1.resolve)(dir, name), { throwIfNoEntry: false })) === null || _a === void 0 ? void 0 : _a.isDirectory(); })
100
158
  .sort()
101
159
  : [];
102
160
  const isStatus = (value) => exports.SKETCH_STATUSES.includes(value);
@@ -128,6 +186,8 @@ const isRejection = (value) => {
128
186
  typeof rejection.decidedAt === 'string' &&
129
187
  isOptionalText(rejection.reason) &&
130
188
  (rejection.reasonBy === undefined || isVerdictBy(rejection.reasonBy)) &&
189
+ (rejection.status === undefined || rejection.status === 'withdrawn') &&
190
+ (rejection.withdrawnBy === undefined || typeof rejection.withdrawnBy === 'string') &&
131
191
  (rejection.reopened === undefined || isReopening(rejection.reopened)));
132
192
  };
133
193
  const isRejections = (value) => typeof value === 'object' &&
@@ -154,6 +214,16 @@ const isHold = (value) => {
154
214
  typeof hold.by === 'string' &&
155
215
  typeof hold.heldAt === 'string');
156
216
  };
217
+ const isStringList = (value) => Array.isArray(value) && value.every((entry) => typeof entry === 'string');
218
+ const isPortMark = (value) => {
219
+ const mark = value;
220
+ return (typeof mark === 'object' &&
221
+ mark !== null &&
222
+ isStringList(mark.merged) &&
223
+ isStringList(mark.parts) &&
224
+ isStringList(mark.reasons) &&
225
+ typeof mark.at === 'string');
226
+ };
157
227
  const FIRST_ROUND = 'r1';
158
228
  const firstRoundOf = (title = '', note = '') => ({ key: FIRST_ROUND, title, note: note.trim() });
159
229
  const nextRoundKeyOf = (rounds) => `r${Math.max(0, ...rounds.map((round) => { var _a, _b; return Number((_b = (_a = /^r(\d+)$/u.exec(round.key)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : 0); })) + 1}`;
@@ -207,7 +277,7 @@ const readSketch = (options) => {
207
277
  if (parsed.variantInfo !== undefined && !isVariantInfo(parsed.variantInfo))
208
278
  return `${file}: variantInfo must be { <variant>: { authors?: string[], round?: string, note?: string } }`;
209
279
  if (parsed.rejections !== undefined && !isRejections(parsed.rejections))
210
- return `${file}: rejections must be { <variant>: [{ by: designer | agent, decidedAt, reason?, reasonBy?, reopened?: { by, decidedAt, reason? } }] }, each but the last reopened`;
280
+ return `${file}: rejections must be { <variant>: [{ by: designer | agent, decidedAt, reason?, reasonBy?, status?: withdrawn, withdrawnBy?, reopened?: { by, decidedAt, reason? } }] }, each but the last reopened`;
211
281
  if (parsed.rounds !== undefined && !isRounds(parsed.rounds))
212
282
  return `${file}: rounds must be a non-empty list of { key, title, note } with unique keys`;
213
283
  if (parsed.merge !== undefined && !exports.SKETCH_MERGES.includes(parsed.merge))
@@ -216,6 +286,8 @@ const readSketch = (options) => {
216
286
  return `${file}: hold must be { until, by, heldAt }`;
217
287
  if (parsed.hold !== undefined && parsed.status !== 'in progress')
218
288
  return `${file}: a held sketch must be in progress`;
289
+ if (parsed.portAfterMerge !== undefined && !isPortMark(parsed.portAfterMerge))
290
+ return `${file}: portAfterMerge must be { merged: string[], parts: string[], reasons: string[], at }`;
219
291
  const rounds = (_b = parsed.rounds) !== null && _b !== void 0 ? _b : [firstRoundOf()];
220
292
  const running = (0, exports.runningRoundOf)({ rounds }).key;
221
293
  const variants = foldersOf(dir).filter((folder) => folder !== imports_1.SHARED_FOLDER);
@@ -235,6 +307,16 @@ exports.readSketch = readSketch;
235
307
  /** Every sketch folder of a product, read; a folder that cannot be read answers with its problem. */
236
308
  const listSketches = (options) => foldersOf((0, exports.sketchesDirOf)(options.productDir)).map((folder) => (0, exports.readSketch)({ product: options.product, dir: (0, path_1.resolve)((0, exports.sketchesDirOf)(options.productDir), folder) }));
237
309
  exports.listSketches = listSketches;
310
+ /** `listSketches`, letting the server answer other requests before each sketch it reads. */
311
+ const listSketchesInTurns = (options) => __awaiter(void 0, void 0, void 0, function* () {
312
+ const listed = [];
313
+ for (const folder of foldersOf((0, exports.sketchesDirOf)(options.productDir))) {
314
+ yield (0, promises_1.setImmediate)();
315
+ listed.push((0, exports.readSketch)({ product: options.product, dir: (0, path_1.resolve)((0, exports.sketchesDirOf)(options.productDir), folder) }));
316
+ }
317
+ return listed;
318
+ });
319
+ exports.listSketchesInTurns = listSketchesInTurns;
238
320
  /** The open sketch that targets `sketch`, found by its first target or by any other it names; `null` when none does. */
239
321
  const findSketch = (options) => {
240
322
  var _a;
@@ -242,11 +324,14 @@ const findSketch = (options) => {
242
324
  if ((0, fs_1.existsSync)(dir))
243
325
  return (0, exports.readSketch)({ product: options.product, dir });
244
326
  const key = (0, resolve_product_1.partKeyOf)(options.sketch);
245
- return ((_a = (0, exports.listSketches)(options).find((sketch) => typeof sketch !== 'string' && sketch.targets.includes(key))) !== null && _a !== void 0 ? _a : null);
327
+ return ((_a = (0, exports.listSketches)(options).find((sketch) => typeof sketch !== 'string' &&
328
+ sketch.targets.includes(key) &&
329
+ parseSketchName(sketch.target) === options.sketch.sketch)) !== null && _a !== void 0 ? _a : null);
246
330
  };
247
331
  exports.findSketch = findSketch;
332
+ const parseSketchName = (target) => target.split('@')[1];
248
333
  const writeSketchFile = (sketch) => {
249
- const file = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ target: (0, resolve_product_1.partKeyOf)(sketch) }, (sketch.targets.length > 1 ? { targets: sketch.targets } : {})), { status: sketch.status, createdAt: sketch.createdAt }), (sketch.baseline ? { baseline: sketch.baseline } : {})), (sketch.decision ? { decision: sketch.decision } : {})), { rounds: sketch.rounds }), (Object.keys(sketch.variantInfo).length > 0 ? { variantInfo: sketch.variantInfo } : {})), (sketch.rejections && Object.keys(sketch.rejections).length > 0 ? { rejections: sketch.rejections } : {})), (sketch.merge ? { merge: sketch.merge } : {})), (sketch.hold ? { hold: sketch.hold } : {}));
334
+ const file = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ target: sketch.target }, (sketch.targets.length > 1 ? { targets: sketch.targets } : {})), { status: sketch.status, createdAt: sketch.createdAt }), (sketch.baseline ? { baseline: sketch.baseline } : {})), (sketch.decision ? { decision: sketch.decision } : {})), { rounds: sketch.rounds }), (Object.keys(sketch.variantInfo).length > 0 ? { variantInfo: sketch.variantInfo } : {})), (sketch.rejections && Object.keys(sketch.rejections).length > 0 ? { rejections: sketch.rejections } : {})), (sketch.merge ? { merge: sketch.merge } : {})), (sketch.hold ? { hold: sketch.hold } : {})), (sketch.portAfterMerge ? { portAfterMerge: sketch.portAfterMerge } : {}));
250
335
  (0, fs_1.writeFileSync)((0, path_1.resolve)(sketch.dir, exports.SKETCH_FILE), (0, json_layout_1.jsonLayoutOf)(file));
251
336
  };
252
337
  exports.writeSketchFile = writeSketchFile;
@@ -344,20 +429,44 @@ const variantInfoOf = (options) => {
344
429
  var _a;
345
430
  return (Object.assign(Object.assign(Object.assign({}, (options.author ? { authors: [options.author] } : {})), { round: options.round }), (((_a = options.note) === null || _a === void 0 ? void 0 : _a.trim()) ? { note: options.note.trim() } : {})));
346
431
  };
432
+ const seedTarget = (options) => {
433
+ const { product, dir, variant, target, author, like } = options;
434
+ const folder = (0, path_1.resolve)(dir, variant, target.layer, target.name);
435
+ const existing = product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === (0, resolve_product_1.partKeyOf)(target));
436
+ (0, fs_1.mkdirSync)(folder, { recursive: true });
437
+ if (like) {
438
+ copyPartAs({ from: like, to: folder, name: target.name });
439
+ (0, exports.rebaseOutsideImports)({ dir: folder, from: like.folder });
440
+ liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
441
+ }
442
+ else if (existing) {
443
+ (0, fs_1.cpSync)((0, path_1.resolve)(existing.file, '..'), folder, { recursive: true });
444
+ (0, exports.rebaseOutsideImports)({ dir: folder, from: (0, path_1.resolve)(existing.file, '..') });
445
+ liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
446
+ }
447
+ else if (target.layer === 'pages') {
448
+ const widths = [...new Set(Object.values(product.presets).map((preset) => preset.width))].sort((a, b) => a - b);
449
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), pageStubOf({ name: target.name, madeBy: author, widths }));
450
+ }
451
+ else {
452
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), stubOf(target.name));
453
+ (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.css`), '');
454
+ }
455
+ };
456
+ const alreadySketched = (target) => `${target} already has an open sketch - merge or discard it first, or extract the region into a part and sketch that`;
347
457
  /**
348
458
  * Opens a sketch on a target, in progress, with one folder per variant, all in round 1 and with `author` as their
349
459
  * author. Each variant starts from `like` when given - renamed to the target, without its `madeBy`, and with its
350
460
  * sketch's `shared/` folder - else from the part the product resolves for the target, or from an empty part when the
351
461
  * target is new. A part's own `shared/` folder becomes the sketch's, imported as `@shared/`. A target holds one open
352
- * sketch at a time. Each of `others` joins every variant the same way, as a further target; `like` takes one target only.
462
+ * sketch at a time, or one per sketch name when `sketch.sketch` names it. Each of `others` joins every variant the same way, as a further target; `like` takes one target only.
353
463
  * A target the product overrides in its base needs `merge`: `override` or `into-base`.
354
464
  */
355
465
  const createSketch = (options) => {
356
466
  var _a;
357
467
  const { product, sketch, variants, roundTitle, roundNote, author, like, variantNotes, merge } = options;
358
468
  const dir = (0, exports.sketchDirOf)({ productDir: product.dir, sketch });
359
- const key = (0, resolve_product_1.partKeyOf)(sketch);
360
- const all = [sketch, ...((_a = options.others) !== null && _a !== void 0 ? _a : [])];
469
+ const all = [sketch, ...((_a = options.others) !== null && _a !== void 0 ? _a : []).map((other) => (Object.assign(Object.assign({}, other), { sketch: sketch.sketch })))];
361
470
  const targets = all.map(resolve_product_1.partKeyOf);
362
471
  if (new Set(targets).size !== targets.length)
363
472
  return 'name each target once';
@@ -365,7 +474,7 @@ const createSketch = (options) => {
365
474
  return '--like starts one target - open a sketch with several targets without it';
366
475
  const taken = all.find((target) => (0, exports.findSketch)({ productDir: product.dir, product: product.name, sketch: target }) !== null);
367
476
  if ((0, fs_1.existsSync)(dir) || taken)
368
- return `${(0, resolve_product_1.partKeyOf)(taken !== null && taken !== void 0 ? taken : sketch)} already has an open sketch - merge or discard it first`;
477
+ return alreadySketched((0, exports.sketchIdOf)(taken !== null && taken !== void 0 ? taken : sketch));
369
478
  if (variants.length === 0)
370
479
  return 'name at least one variant';
371
480
  const mergeProblem = mergeProblemOf({ product, targets, merge });
@@ -383,31 +492,12 @@ const createSketch = (options) => {
383
492
  return clash;
384
493
  for (const variant of variants) {
385
494
  (0, fs_1.mkdirSync)((0, path_1.resolve)(dir, variant, assets_1.ASSETS_FOLDER), { recursive: true });
386
- for (const target of all) {
387
- const folder = (0, path_1.resolve)(dir, variant, target.layer, target.name);
388
- const existing = product.parts.find((part) => (0, resolve_product_1.partKeyOf)(part) === (0, resolve_product_1.partKeyOf)(target));
389
- (0, fs_1.mkdirSync)(folder, { recursive: true });
390
- if (like) {
391
- copyPartAs({ from: like, to: folder, name: target.name });
392
- liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
393
- }
394
- else if (existing) {
395
- (0, fs_1.cpSync)((0, path_1.resolve)(existing.file, '..'), folder, { recursive: true });
396
- liftShared({ partDir: folder, sketchSharedDir: (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER) });
397
- }
398
- else if (target.layer === 'pages') {
399
- const widths = [...new Set(Object.values(product.presets).map((preset) => preset.width))].sort((a, b) => a - b);
400
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), pageStubOf({ name: target.name, madeBy: author, widths }));
401
- }
402
- else {
403
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.ts`), stubOf(target.name));
404
- (0, fs_1.writeFileSync)((0, path_1.resolve)(folder, `${target.name}.css`), '');
405
- }
406
- }
495
+ for (const target of all)
496
+ seedTarget({ product, dir, variant, target, author, like });
407
497
  }
408
498
  if (like === null || like === void 0 ? void 0 : like.shared)
409
499
  (0, fs_1.cpSync)(like.shared, (0, path_1.resolve)(dir, imports_1.SHARED_FOLDER), { recursive: true });
410
- const created = Object.assign({ target: key, targets, status: 'in progress', createdAt: new Date().toISOString(), baseline: (0, baseline_1.baselineOf)(product), rounds: [firstRoundOf(roundTitle, roundNote)], variantInfo: Object.fromEntries(variants.map((variant) => [
500
+ const created = Object.assign({ target: (0, exports.sketchIdOf)(sketch), targets, status: 'in progress', createdAt: new Date().toISOString(), baseline: (0, baseline_1.baselineOf)(product), rounds: [firstRoundOf(roundTitle, roundNote)], variantInfo: Object.fromEntries(variants.map((variant) => [
411
501
  variant,
412
502
  variantInfoOf({ round: FIRST_ROUND, author, note: variantNotes === null || variantNotes === void 0 ? void 0 : variantNotes.get(variant) }),
413
503
  ])), product: product.name, layer: sketch.layer, name: sketch.name, dir, variants: [...variants].sort() }, (merge ? { merge } : {}));
@@ -415,6 +505,66 @@ const createSketch = (options) => {
415
505
  return created;
416
506
  };
417
507
  exports.createSketch = createSketch;
508
+ /**
509
+ * Adds `part` as a further target of an open sketch, seeding it into every variant like `createSketch` does. The part
510
+ * must not be a target of an open sketch already, and follows the sketch's merge mode.
511
+ */
512
+ const addTarget = (options) => {
513
+ const { product, sketch, part, author } = options;
514
+ const key = (0, resolve_product_1.partKeyOf)(part);
515
+ if (sketch.targets.includes(key))
516
+ return `${sketch.target} targets ${key} already`;
517
+ const layerProblem = layerProblemOf({ sketch, part });
518
+ if (layerProblem)
519
+ return layerProblem;
520
+ const taken = (0, exports.findSketch)({
521
+ productDir: product.dir,
522
+ product: product.name,
523
+ sketch: Object.assign(Object.assign({}, part), { sketch: parseSketchName(sketch.target) }),
524
+ });
525
+ if (taken !== null)
526
+ return alreadySketched(key);
527
+ const mergeProblem = mergeProblemOf({ product, targets: [key], merge: sketch.merge });
528
+ if (mergeProblem)
529
+ return mergeProblem;
530
+ const clash = sharedClashOf([product.parts.find((existing) => (0, resolve_product_1.partKeyOf)(existing) === key)]);
531
+ if (clash)
532
+ return clash;
533
+ for (const variant of sketch.variants)
534
+ seedTarget({ product, dir: sketch.dir, variant, target: part, author });
535
+ const added = Object.assign(Object.assign({}, sketch), { targets: [...sketch.targets, key] });
536
+ (0, exports.writeSketchFile)(added);
537
+ return added;
538
+ };
539
+ exports.addTarget = addTarget;
540
+ const layerProblemOf = (options) => {
541
+ const { sketch, part } = options;
542
+ const layers = sketch.targets.map((key) => { var _a; return (_a = key.split('/')[0]) !== null && _a !== void 0 ? _a : ''; }).filter(layers_1.isLayer);
543
+ if (!(0, layers_1.isLayer)(part.layer) ||
544
+ layers.some((layer) => (0, layers_1.mayUse)({ from: layer, to: part.layer }) || (0, layers_1.mayUse)({ from: part.layer, to: layer }))) {
545
+ return undefined;
546
+ }
547
+ const [first = part.layer] = layers;
548
+ return `${sketch.target} cannot target ${(0, resolve_product_1.partKeyOf)(part)} (UPWARD-DEPENDENCY): ${first} may use ${layers_1.LAYER_USES[first].join(', ')}, not ${part.layer}`;
549
+ };
550
+ /**
551
+ * Removes `part` from the targets of an open sketch and deletes its folder in every variant. The first target
552
+ * cannot be removed.
553
+ */
554
+ const removeTarget = (options) => {
555
+ const { sketch, part } = options;
556
+ const key = (0, resolve_product_1.partKeyOf)(part);
557
+ if (!sketch.targets.includes(key))
558
+ return `${sketch.target} does not target ${key}`;
559
+ if (sketch.targets[0] === key)
560
+ return `${key} is the main target of ${sketch.target} - discard the sketch instead`;
561
+ for (const variant of sketch.variants)
562
+ (0, fs_1.rmSync)((0, path_1.resolve)(sketch.dir, variant, part.layer, part.name), { recursive: true, force: true });
563
+ const removed = Object.assign(Object.assign({}, sketch), { targets: sketch.targets.filter((target) => target !== key) });
564
+ (0, exports.writeSketchFile)(removed);
565
+ return removed;
566
+ };
567
+ exports.removeTarget = removeTarget;
418
568
  const reportSlugOf = (sketch) => `sketches/${sketch.product}/${(0, exports.sketchFolderOf)(sketch)}`;
419
569
  /** The sketch with `author` among the authors of `variant`; the same sketch when it is there already. */
420
570
  const withAuthor = (options) => {
@@ -432,17 +582,21 @@ exports.sketchReportPath = sketchReportPath;
432
582
  const REPORT_LIMIT = 400;
433
583
  /**
434
584
  * Records what an agent builds on a variant of a sketch right now ("phone, outline state"), for Studio to show,
435
- * and adds the agent's model id to the variant's authors in `sketch.json` unless it is there already.
585
+ * and adds the agent's model id to the variant's authors in `sketch.json` unless it is there already. A ready sketch
586
+ * refuses a report unless `reopen` moves it back to in progress.
436
587
  */
437
588
  const reportSketch = (options) => {
438
- const { checkout, sketch, variant, author, message } = options;
589
+ const { checkout, sketch, variant, author, message, reopen } = options;
439
590
  if (!sketch.variants.includes(variant))
440
591
  return `${sketch.target} has no variant "${variant}" - it has ${sketch.variants.join(', ') || 'none'}`;
441
592
  if (author.trim() === '')
442
593
  return 'a report needs --by <model id>';
443
- if (sketch.status !== 'in progress')
444
- return `${sketch.target} is ${sketch.status}, not in progress - Studio shows a report only while the sketch is in progress, so nothing was recorded`;
445
- const reported = (0, exports.withAuthor)({ sketch, variant, author });
594
+ if (sketch.status === 'ready' && sketch.decision)
595
+ return `${sketch.target} is decided (${sketch.decision.kind}) - a report would reopen it, so nothing was recorded`;
596
+ if (sketch.status === 'ready' && !reopen)
597
+ return `${sketch.target} is ready - a report moves it back to in progress, so nothing was recorded; add --reopen if the user asked for a change`;
598
+ const open = sketch.status === 'ready' ? Object.assign(Object.assign({}, sketch), { status: 'in progress' }) : sketch;
599
+ const reported = (0, exports.withAuthor)({ sketch: open, variant, author });
446
600
  if (reported !== sketch)
447
601
  (0, exports.writeSketchFile)(reported);
448
602
  const path = (0, exports.sketchReportPath)({ checkout, sketch });
@@ -513,7 +667,9 @@ const markSketchReady = (options) => {
513
667
  };
514
668
  exports.markSketchReady = markSketchReady;
515
669
  /** Why a held sketch cannot be ready, or `null` when it holds nothing. */
516
- const heldProblemOf = (sketch) => sketch.hold ? `${sketch.target} is held until: ${sketch.hold.until} - make the change, then sketch release it` : null;
670
+ const heldProblemOf = (sketch) => sketch.hold
671
+ ? `${sketch.target} is held until: ${sketch.hold.until} - make the change, then run \`et design sketch release ${sketch.target} --by <name>\``
672
+ : null;
517
673
  exports.heldProblemOf = heldProblemOf;
518
674
  /**
519
675
  * Holds a sketch until a change that waits on something is made: it goes back to in progress, which drops a pick
@@ -570,6 +726,33 @@ const withVerdict = (sketch, verdict) => {
570
726
  const { decision } = sketch, rest = __rest(sketch, ["decision"]);
571
727
  return Object.assign(Object.assign(Object.assign({}, rest), (decision && !unpicked ? { decision } : {})), { rejections: Object.assign(Object.assign({}, sketch.rejections), { [variant]: next }) });
572
728
  };
729
+ /**
730
+ * Takes a variant out of the open set as `withdrawn` by the agent `by`, with `reason`; refused when `by` did not draw
731
+ * the variant or it is rejected already. Writes sketch.json.
732
+ */
733
+ const withdrawVariant = (options) => {
734
+ var _a, _b;
735
+ const { sketch, variant, by, reason } = options;
736
+ if (!sketch.variants.includes(variant))
737
+ return `${sketch.target} has no variant "${variant}" - it has ${sketch.variants.join(', ')}`;
738
+ if ((0, exports.rejectionOf)(sketch, variant))
739
+ return `${sketch.target} variant ${variant} is rejected or withdrawn already`;
740
+ if (!(0, exports.authorsOf)(sketch, variant).includes(by))
741
+ return `${sketch.target} variant ${variant} was not drawn by ${by}${drawerNote(sketch, variant)} - only its author withdraws it`;
742
+ const withdrawn = withVerdict(sketch, { kind: 'reject', variant, reason, by: 'agent' });
743
+ if (typeof withdrawn === 'string')
744
+ return withdrawn;
745
+ const history = (_b = (_a = withdrawn.rejections) === null || _a === void 0 ? void 0 : _a[variant]) !== null && _b !== void 0 ? _b : [];
746
+ const last = history[history.length - 1];
747
+ const marked = Object.assign(Object.assign({}, withdrawn), { rejections: Object.assign(Object.assign({}, withdrawn.rejections), { [variant]: [...history.slice(0, -1), Object.assign(Object.assign({}, last), { status: 'withdrawn', withdrawnBy: by })] }) });
748
+ (0, exports.writeSketchFile)(marked);
749
+ return marked;
750
+ };
751
+ exports.withdrawVariant = withdrawVariant;
752
+ const drawerNote = (sketch, variant) => {
753
+ const authors = (0, exports.authorsOf)(sketch, variant);
754
+ return authors.length > 0 ? ` (drawn by ${authors.join(', ')})` : '';
755
+ };
573
756
  /**
574
757
  * Records the user's pick or discard on a sketch, the decision Studio writes and the agent acts on, or a verdict on
575
758
  * one variant. A rejected variant cannot be picked; rejecting the picked variant clears the pick.
@@ -601,7 +784,8 @@ exports.decideSketch = decideSketch;
601
784
  * up to date with the parts that changed in the product since the sketch was created.
602
785
  */
603
786
  const rebaseSketch = (options) => {
604
- const rebased = Object.assign(Object.assign({}, options.sketch), { baseline: (0, baseline_1.baselineOf)(options.product) });
787
+ const _a = options.sketch, { portAfterMerge: _ported } = _a, sketch = __rest(_a, ["portAfterMerge"]);
788
+ const rebased = Object.assign(Object.assign({}, sketch), { baseline: (0, baseline_1.baselineOf)(options.product) });
605
789
  (0, exports.writeSketchFile)(rebased);
606
790
  return rebased;
607
791
  };
@@ -631,7 +815,7 @@ const addVariant = (options) => {
631
815
  { key: nextRoundKeyOf(sketch.rounds), title: round.title.trim(), note: (_c = (_b = round.note) === null || _b === void 0 ? void 0 : _b.trim()) !== null && _c !== void 0 ? _c : '' },
632
816
  ]
633
817
  : sketch.rounds;
634
- (0, fs_1.cpSync)((0, exports.variantDirOf)(sketch, from), (0, exports.variantDirOf)(sketch, variant), { recursive: true });
818
+ (0, fs_1.cpSync)((0, exports.variantDirOf)(sketch, from), (0, exports.variantDirOf)(sketch, variant), { recursive: true, verbatimSymlinks: true });
635
819
  (0, fs_1.mkdirSync)((0, path_1.resolve)((0, exports.variantDirOf)(sketch, variant), assets_1.ASSETS_FOLDER), { recursive: true });
636
820
  const { decision: _decision } = sketch, undecided = __rest(sketch, ["decision"]);
637
821
  const added = Object.assign(Object.assign({}, undecided), { status: 'in progress', rounds, variantInfo: Object.assign(Object.assign({}, sketch.variantInfo), { [variant]: variantInfoOf({ round: (0, exports.runningRoundOf)({ rounds }).key, author }) }), variants: [...sketch.variants, variant].sort() });
@@ -644,6 +828,15 @@ const withDrops = (round, drops) => {
644
828
  return drops && drops.length > 0 ? Object.assign(Object.assign({}, rest), { drops }) : rest;
645
829
  };
646
830
  /** Changes the title, the note and the dropped states of the round with key `round`; a field left out stays as it is. */
831
+ const editVariantNote = (options) => {
832
+ const { sketch, variant, note } = options;
833
+ if (!sketch.variants.includes(variant))
834
+ return `${sketch.target} has no variant "${variant}" - it has ${sketch.variants.join(', ')}`;
835
+ const edited = Object.assign(Object.assign({}, sketch), { variantInfo: Object.assign(Object.assign({}, sketch.variantInfo), { [variant]: Object.assign(Object.assign({}, sketch.variantInfo[variant]), { note: note.trim() }) }) });
836
+ (0, exports.writeSketchFile)(edited);
837
+ return edited;
838
+ };
839
+ exports.editVariantNote = editVariantNote;
647
840
  const editRound = (options) => {
648
841
  const { sketch, round, title, note, drops } = options;
649
842
  if (!sketch.rounds.some((entry) => entry.key === round))