@12ui/design 0.2.27 → 0.2.29

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 (405) hide show
  1. package/README.md +141 -87
  2. package/SKILL.md +5 -5
  3. package/dist/branch-completion.d.ts.map +1 -1
  4. package/dist/branch-completion.js +37 -14
  5. package/dist/branch-completion.js.map +1 -1
  6. package/dist/branch-execution.d.ts.map +1 -1
  7. package/dist/branch-execution.js +28 -8
  8. package/dist/branch-execution.js.map +1 -1
  9. package/dist/branch-identity.d.ts +10 -4
  10. package/dist/branch-identity.d.ts.map +1 -1
  11. package/dist/branch-identity.js +9 -6
  12. package/dist/branch-identity.js.map +1 -1
  13. package/dist/branch-page-conversion.d.ts +9 -8
  14. package/dist/branch-page-conversion.d.ts.map +1 -1
  15. package/dist/branch-page-conversion.js +8 -2
  16. package/dist/branch-page-conversion.js.map +1 -1
  17. package/dist/branch-page-packaging.d.ts +31 -0
  18. package/dist/branch-page-packaging.d.ts.map +1 -0
  19. package/dist/branch-page-packaging.js +86 -0
  20. package/dist/branch-page-packaging.js.map +1 -0
  21. package/dist/branch-plan.d.ts +6 -0
  22. package/dist/branch-plan.d.ts.map +1 -1
  23. package/dist/branch-plan.js +6 -1
  24. package/dist/branch-plan.js.map +1 -1
  25. package/dist/branch-progress.d.ts +22 -0
  26. package/dist/branch-progress.d.ts.map +1 -1
  27. package/dist/branch-progress.js +33 -8
  28. package/dist/branch-progress.js.map +1 -1
  29. package/dist/branch-run-record.d.ts +9 -0
  30. package/dist/branch-run-record.d.ts.map +1 -1
  31. package/dist/branch-run-record.js.map +1 -1
  32. package/dist/branch-status.d.ts +2 -0
  33. package/dist/branch-status.d.ts.map +1 -1
  34. package/dist/branch-status.js +60 -15
  35. package/dist/branch-status.js.map +1 -1
  36. package/dist/branch-winner.d.ts +13 -15
  37. package/dist/branch-winner.d.ts.map +1 -1
  38. package/dist/branch-winner.js +25 -77
  39. package/dist/branch-winner.js.map +1 -1
  40. package/dist/cli-arguments.d.ts.map +1 -1
  41. package/dist/cli-arguments.js +1 -0
  42. package/dist/cli-arguments.js.map +1 -1
  43. package/dist/cli-auth-command.d.ts.map +1 -1
  44. package/dist/cli-auth-command.js +5 -0
  45. package/dist/cli-auth-command.js.map +1 -1
  46. package/dist/cli-auth-onboarding.d.ts +12 -0
  47. package/dist/cli-auth-onboarding.d.ts.map +1 -0
  48. package/dist/cli-auth-onboarding.js +21 -0
  49. package/dist/cli-auth-onboarding.js.map +1 -0
  50. package/dist/cli-branch-command.d.ts +14 -19
  51. package/dist/cli-branch-command.d.ts.map +1 -1
  52. package/dist/cli-branch-command.js +207 -137
  53. package/dist/cli-branch-command.js.map +1 -1
  54. package/dist/cli-capabilities.d.ts +16 -51
  55. package/dist/cli-capabilities.d.ts.map +1 -1
  56. package/dist/cli-capabilities.js +23 -26
  57. package/dist/cli-capabilities.js.map +1 -1
  58. package/dist/cli-cli-command.d.ts +3 -0
  59. package/dist/cli-cli-command.d.ts.map +1 -1
  60. package/dist/cli-cli-command.js +15 -3
  61. package/dist/cli-cli-command.js.map +1 -1
  62. package/dist/cli-conversion-derivation.d.ts +30 -0
  63. package/dist/cli-conversion-derivation.d.ts.map +1 -0
  64. package/dist/{cli-export-command.js → cli-conversion-derivation.js} +178 -110
  65. package/dist/cli-conversion-derivation.js.map +1 -0
  66. package/dist/cli-conversion-output-directory.d.ts +5 -0
  67. package/dist/cli-conversion-output-directory.d.ts.map +1 -0
  68. package/dist/{cli-export-output-directory.js → cli-conversion-output-directory.js} +10 -10
  69. package/dist/cli-conversion-output-directory.js.map +1 -0
  70. package/dist/cli-convert-command.d.ts +9 -0
  71. package/dist/cli-convert-command.d.ts.map +1 -1
  72. package/dist/cli-convert-command.js +528 -158
  73. package/dist/cli-convert-command.js.map +1 -1
  74. package/dist/cli-corpus-command.d.ts.map +1 -1
  75. package/dist/cli-corpus-command.js +77 -10
  76. package/dist/cli-corpus-command.js.map +1 -1
  77. package/dist/cli-corpus-reference-downloads.d.ts +5 -0
  78. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -1
  79. package/dist/cli-corpus-reference-downloads.js +18 -7
  80. package/dist/cli-corpus-reference-downloads.js.map +1 -1
  81. package/dist/cli-corpus-run.d.ts +9 -0
  82. package/dist/cli-corpus-run.d.ts.map +1 -1
  83. package/dist/cli-corpus-run.js +18 -0
  84. package/dist/cli-corpus-run.js.map +1 -1
  85. package/dist/cli-detach.d.ts +12 -4
  86. package/dist/cli-detach.d.ts.map +1 -1
  87. package/dist/cli-detach.js +49 -17
  88. package/dist/cli-detach.js.map +1 -1
  89. package/dist/cli-draft-command.d.ts +44 -61
  90. package/dist/cli-draft-command.d.ts.map +1 -1
  91. package/dist/cli-draft-command.js +307 -180
  92. package/dist/cli-draft-command.js.map +1 -1
  93. package/dist/cli-help/conversion.d.ts +30 -0
  94. package/dist/cli-help/conversion.d.ts.map +1 -0
  95. package/dist/cli-help/conversion.js +55 -0
  96. package/dist/cli-help/conversion.js.map +1 -0
  97. package/dist/cli-help/design.d.ts +84 -0
  98. package/dist/cli-help/design.d.ts.map +1 -0
  99. package/dist/cli-help/design.js +152 -0
  100. package/dist/cli-help/design.js.map +1 -0
  101. package/dist/cli-help/index.d.ts +234 -0
  102. package/dist/cli-help/index.d.ts.map +1 -0
  103. package/dist/cli-help/index.js +32 -0
  104. package/dist/cli-help/index.js.map +1 -0
  105. package/dist/cli-help/meta.d.ts +24 -0
  106. package/dist/cli-help/meta.d.ts.map +1 -0
  107. package/dist/cli-help/meta.js +30 -0
  108. package/dist/cli-help/meta.js.map +1 -0
  109. package/dist/cli-help/render.d.ts +4 -0
  110. package/dist/cli-help/render.d.ts.map +1 -0
  111. package/dist/cli-help/render.js +28 -0
  112. package/dist/cli-help/render.js.map +1 -0
  113. package/dist/cli-help/setup.d.ts +93 -0
  114. package/dist/cli-help/setup.d.ts.map +1 -0
  115. package/dist/cli-help/setup.js +142 -0
  116. package/dist/cli-help/setup.js.map +1 -0
  117. package/dist/cli-help/types.d.ts +10 -0
  118. package/dist/cli-help/types.d.ts.map +1 -0
  119. package/dist/cli-help/types.js +2 -0
  120. package/dist/cli-help/types.js.map +1 -0
  121. package/dist/cli-next-command.d.ts +11 -8
  122. package/dist/cli-next-command.d.ts.map +1 -1
  123. package/dist/cli-next-command.js +288 -88
  124. package/dist/cli-next-command.js.map +1 -1
  125. package/dist/cli-output-paths.d.ts +2 -23
  126. package/dist/cli-output-paths.d.ts.map +1 -1
  127. package/dist/cli-output-paths.js +2 -36
  128. package/dist/cli-output-paths.js.map +1 -1
  129. package/dist/cli-package-command.d.ts +1 -0
  130. package/dist/cli-package-command.d.ts.map +1 -1
  131. package/dist/cli-package-command.js +107 -34
  132. package/dist/cli-package-command.js.map +1 -1
  133. package/dist/cli-pending-auth.d.ts +20 -0
  134. package/dist/cli-pending-auth.d.ts.map +1 -0
  135. package/dist/cli-pending-auth.js +160 -0
  136. package/dist/cli-pending-auth.js.map +1 -0
  137. package/dist/cli-progress.d.ts +256 -75
  138. package/dist/cli-progress.d.ts.map +1 -1
  139. package/dist/cli-progress.js +425 -98
  140. package/dist/cli-progress.js.map +1 -1
  141. package/dist/cli-review-command.d.ts +8 -0
  142. package/dist/cli-review-command.d.ts.map +1 -0
  143. package/dist/cli-review-command.js +71 -0
  144. package/dist/cli-review-command.js.map +1 -0
  145. package/dist/cli-run.d.ts +2 -0
  146. package/dist/cli-run.d.ts.map +1 -1
  147. package/dist/cli-run.js +62 -73
  148. package/dist/cli-run.js.map +1 -1
  149. package/dist/cli-skill-command.d.ts +3 -0
  150. package/dist/cli-skill-command.d.ts.map +1 -1
  151. package/dist/cli-skill-command.js +26 -3
  152. package/dist/cli-skill-command.js.map +1 -1
  153. package/dist/cli-usage.d.ts +17 -8
  154. package/dist/cli-usage.d.ts.map +1 -1
  155. package/dist/cli-usage.js +57 -40
  156. package/dist/cli-usage.js.map +1 -1
  157. package/dist/config.d.ts +1 -0
  158. package/dist/config.d.ts.map +1 -1
  159. package/dist/config.js +8 -2
  160. package/dist/config.js.map +1 -1
  161. package/dist/conversion-client.d.ts +4 -0
  162. package/dist/conversion-client.d.ts.map +1 -1
  163. package/dist/conversion-client.js +8 -1
  164. package/dist/conversion-client.js.map +1 -1
  165. package/dist/conversion-outputs.d.ts +11 -0
  166. package/dist/conversion-outputs.d.ts.map +1 -1
  167. package/dist/conversion-outputs.js +13 -1
  168. package/dist/conversion-outputs.js.map +1 -1
  169. package/dist/conversion-receipt.d.ts +1 -1
  170. package/dist/conversion-receipt.js +1 -1
  171. package/dist/conversion-recovery.d.ts +20 -0
  172. package/dist/conversion-recovery.d.ts.map +1 -0
  173. package/dist/conversion-recovery.js +61 -0
  174. package/dist/conversion-recovery.js.map +1 -0
  175. package/dist/conversion-status-contract.js +1 -1
  176. package/dist/conversion-status-contract.js.map +1 -1
  177. package/dist/credential-setup.d.ts +9 -1
  178. package/dist/credential-setup.d.ts.map +1 -1
  179. package/dist/credential-setup.js +13 -1
  180. package/dist/credential-setup.js.map +1 -1
  181. package/dist/draft-adoption.d.ts +9 -3
  182. package/dist/draft-adoption.d.ts.map +1 -1
  183. package/dist/draft-adoption.js +26 -41
  184. package/dist/draft-adoption.js.map +1 -1
  185. package/dist/draft-identity.d.ts +9 -12
  186. package/dist/draft-identity.d.ts.map +1 -1
  187. package/dist/draft-identity.js +0 -0
  188. package/dist/draft-identity.js.map +1 -1
  189. package/dist/draft-run.d.ts +9 -19
  190. package/dist/draft-run.d.ts.map +1 -1
  191. package/dist/draft-run.js +67 -95
  192. package/dist/draft-run.js.map +1 -1
  193. package/dist/draft-workspace.d.ts +26 -18
  194. package/dist/draft-workspace.d.ts.map +1 -1
  195. package/dist/draft-workspace.js +16 -5
  196. package/dist/draft-workspace.js.map +1 -1
  197. package/dist/hosted-draft-identity.d.ts +20 -0
  198. package/dist/hosted-draft-identity.d.ts.map +1 -0
  199. package/dist/hosted-draft-identity.js +30 -0
  200. package/dist/hosted-draft-identity.js.map +1 -0
  201. package/dist/hosted-draft-run.d.ts +60 -0
  202. package/dist/hosted-draft-run.d.ts.map +1 -0
  203. package/dist/hosted-draft-run.js +97 -0
  204. package/dist/hosted-draft-run.js.map +1 -0
  205. package/dist/legacy-codex-cleanup.d.ts +13 -0
  206. package/dist/legacy-codex-cleanup.d.ts.map +1 -1
  207. package/dist/legacy-codex-cleanup.js +83 -0
  208. package/dist/legacy-codex-cleanup.js.map +1 -1
  209. package/dist/legacy-skill-catalog.d.ts +2 -2
  210. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  211. package/dist/legacy-skill-catalog.js +76 -5
  212. package/dist/legacy-skill-catalog.js.map +1 -1
  213. package/dist/login-auth.d.ts +38 -0
  214. package/dist/login-auth.d.ts.map +1 -1
  215. package/dist/login-auth.js +67 -16
  216. package/dist/login-auth.js.map +1 -1
  217. package/dist/mcp-tool-definitions.js +1 -1
  218. package/dist/mcp-tool-definitions.js.map +1 -1
  219. package/dist/next-target.d.ts +1 -4
  220. package/dist/next-target.d.ts.map +1 -1
  221. package/dist/next-target.js +5 -9
  222. package/dist/next-target.js.map +1 -1
  223. package/dist/next-wait-lease.d.ts +18 -0
  224. package/dist/next-wait-lease.d.ts.map +1 -0
  225. package/dist/next-wait-lease.js +143 -0
  226. package/dist/next-wait-lease.js.map +1 -0
  227. package/dist/next-wait-process.d.ts +17 -0
  228. package/dist/next-wait-process.d.ts.map +1 -0
  229. package/dist/next-wait-process.js +40 -0
  230. package/dist/next-wait-process.js.map +1 -0
  231. package/dist/package-client.d.ts +30 -0
  232. package/dist/package-client.d.ts.map +1 -1
  233. package/dist/package-client.js.map +1 -1
  234. package/dist/package-submission.d.ts +17 -0
  235. package/dist/package-submission.d.ts.map +1 -1
  236. package/dist/package-submission.js +13 -0
  237. package/dist/package-submission.js.map +1 -1
  238. package/dist/pending-auth-store.d.ts +15 -0
  239. package/dist/pending-auth-store.d.ts.map +1 -0
  240. package/dist/pending-auth-store.js +90 -0
  241. package/dist/pending-auth-store.js.map +1 -0
  242. package/dist/responsive-quality.d.ts +2 -2
  243. package/dist/responsive-quality.js +2 -2
  244. package/dist/review-discovery.d.ts +10 -0
  245. package/dist/review-discovery.d.ts.map +1 -0
  246. package/dist/review-discovery.js +381 -0
  247. package/dist/review-discovery.js.map +1 -0
  248. package/dist/review-edit-html.d.ts +6 -0
  249. package/dist/review-edit-html.d.ts.map +1 -0
  250. package/dist/review-edit-html.js +11 -0
  251. package/dist/review-edit-html.js.map +1 -0
  252. package/dist/review-edit-source.d.ts +22 -0
  253. package/dist/review-edit-source.d.ts.map +1 -0
  254. package/dist/review-edit-source.js +103 -0
  255. package/dist/review-edit-source.js.map +1 -0
  256. package/dist/review-edit.d.ts +15 -0
  257. package/dist/review-edit.d.ts.map +1 -0
  258. package/dist/review-edit.js +192 -0
  259. package/dist/review-edit.js.map +1 -0
  260. package/dist/review-layerdoc-diff.d.ts +7 -0
  261. package/dist/review-layerdoc-diff.d.ts.map +1 -0
  262. package/dist/review-layerdoc-diff.js +92 -0
  263. package/dist/review-layerdoc-diff.js.map +1 -0
  264. package/dist/review-page-assets.d.ts +3 -0
  265. package/dist/review-page-assets.d.ts.map +1 -0
  266. package/dist/review-page-assets.js +43 -0
  267. package/dist/review-page-assets.js.map +1 -0
  268. package/dist/review-page.d.ts +3 -0
  269. package/dist/review-page.d.ts.map +1 -0
  270. package/dist/review-page.js +237 -0
  271. package/dist/review-page.js.map +1 -0
  272. package/dist/review-pricing.d.ts +14 -0
  273. package/dist/review-pricing.d.ts.map +1 -0
  274. package/dist/review-pricing.js +23 -0
  275. package/dist/review-pricing.js.map +1 -0
  276. package/dist/review-server.d.ts +15 -0
  277. package/dist/review-server.d.ts.map +1 -0
  278. package/dist/review-server.js +204 -0
  279. package/dist/review-server.js.map +1 -0
  280. package/dist/review-store.d.ts +11 -0
  281. package/dist/review-store.d.ts.map +1 -0
  282. package/dist/review-store.js +96 -0
  283. package/dist/review-store.js.map +1 -0
  284. package/dist/review-types.d.ts +128 -0
  285. package/dist/review-types.d.ts.map +1 -0
  286. package/dist/review-types.js +2 -0
  287. package/dist/review-types.js.map +1 -0
  288. package/dist/run-journal-commands.d.ts.map +1 -1
  289. package/dist/run-journal-commands.js +34 -76
  290. package/dist/run-journal-commands.js.map +1 -1
  291. package/dist/run-journal-in-flight.d.ts +2 -2
  292. package/dist/run-journal-in-flight.d.ts.map +1 -1
  293. package/dist/run-journal-in-flight.js +0 -0
  294. package/dist/run-journal-in-flight.js.map +1 -1
  295. package/dist/skill-installer.d.ts +2 -2
  296. package/dist/skill-installer.d.ts.map +1 -1
  297. package/dist/skill-installer.js +2 -2
  298. package/dist/skill-installer.js.map +1 -1
  299. package/open-design.json +3 -3
  300. package/package.json +1 -1
  301. package/skills/12ui-design/SKILL.md +62 -0
  302. package/skills/12ui-design/agents/openai.yaml +6 -0
  303. package/skills/12ui-design/inspire.md +11 -0
  304. package/dist/cli-create-command.d.ts +0 -59
  305. package/dist/cli-create-command.d.ts.map +0 -1
  306. package/dist/cli-create-command.js +0 -354
  307. package/dist/cli-create-command.js.map +0 -1
  308. package/dist/cli-export-command.d.ts +0 -26
  309. package/dist/cli-export-command.d.ts.map +0 -1
  310. package/dist/cli-export-command.js.map +0 -1
  311. package/dist/cli-export-output-directory.d.ts +0 -5
  312. package/dist/cli-export-output-directory.d.ts.map +0 -1
  313. package/dist/cli-export-output-directory.js.map +0 -1
  314. package/dist/cli-image-batch-command.d.ts +0 -29
  315. package/dist/cli-image-batch-command.d.ts.map +0 -1
  316. package/dist/cli-image-batch-command.js +0 -236
  317. package/dist/cli-image-batch-command.js.map +0 -1
  318. package/dist/cli-image-batch-materialize.d.ts +0 -27
  319. package/dist/cli-image-batch-materialize.d.ts.map +0 -1
  320. package/dist/cli-image-batch-materialize.js +0 -41
  321. package/dist/cli-image-batch-materialize.js.map +0 -1
  322. package/dist/cli-image-batch-resume.d.ts +0 -36
  323. package/dist/cli-image-batch-resume.d.ts.map +0 -1
  324. package/dist/cli-image-batch-resume.js +0 -176
  325. package/dist/cli-image-batch-resume.js.map +0 -1
  326. package/dist/cli-image-command.d.ts +0 -10
  327. package/dist/cli-image-command.d.ts.map +0 -1
  328. package/dist/cli-image-command.js +0 -106
  329. package/dist/cli-image-command.js.map +0 -1
  330. package/dist/cli-select-command.d.ts +0 -16
  331. package/dist/cli-select-command.d.ts.map +0 -1
  332. package/dist/cli-select-command.js +0 -60
  333. package/dist/cli-select-command.js.map +0 -1
  334. package/dist/create-identity.d.ts +0 -25
  335. package/dist/create-identity.d.ts.map +0 -1
  336. package/dist/create-identity.js +0 -0
  337. package/dist/create-identity.js.map +0 -1
  338. package/dist/draft-prompts.d.ts +0 -35
  339. package/dist/draft-prompts.d.ts.map +0 -1
  340. package/dist/draft-prompts.js +0 -51
  341. package/dist/draft-prompts.js.map +0 -1
  342. package/dist/image-batch-status.d.ts +0 -42
  343. package/dist/image-batch-status.d.ts.map +0 -1
  344. package/dist/image-batch-status.js +0 -143
  345. package/dist/image-batch-status.js.map +0 -1
  346. package/dist/image-generation-batch-attempt.d.ts +0 -28
  347. package/dist/image-generation-batch-attempt.d.ts.map +0 -1
  348. package/dist/image-generation-batch-attempt.js +0 -48
  349. package/dist/image-generation-batch-attempt.js.map +0 -1
  350. package/dist/image-generation-batch-manifest.d.ts +0 -25
  351. package/dist/image-generation-batch-manifest.d.ts.map +0 -1
  352. package/dist/image-generation-batch-manifest.js +0 -97
  353. package/dist/image-generation-batch-manifest.js.map +0 -1
  354. package/dist/image-generation-completion.d.ts +0 -43
  355. package/dist/image-generation-completion.d.ts.map +0 -1
  356. package/dist/image-generation-completion.js +0 -54
  357. package/dist/image-generation-completion.js.map +0 -1
  358. package/dist/image-generation-error.d.ts +0 -3
  359. package/dist/image-generation-error.d.ts.map +0 -1
  360. package/dist/image-generation-error.js +0 -30
  361. package/dist/image-generation-error.js.map +0 -1
  362. package/dist/image-generation-evidence.d.ts +0 -43
  363. package/dist/image-generation-evidence.d.ts.map +0 -1
  364. package/dist/image-generation-evidence.js +0 -28
  365. package/dist/image-generation-evidence.js.map +0 -1
  366. package/dist/image-generation-fs.d.ts +0 -3
  367. package/dist/image-generation-fs.d.ts.map +0 -1
  368. package/dist/image-generation-fs.js +0 -23
  369. package/dist/image-generation-fs.js.map +0 -1
  370. package/dist/image-generation-output.d.ts +0 -3
  371. package/dist/image-generation-output.d.ts.map +0 -1
  372. package/dist/image-generation-output.js +0 -51
  373. package/dist/image-generation-output.js.map +0 -1
  374. package/dist/image-generation-request.d.ts +0 -43
  375. package/dist/image-generation-request.d.ts.map +0 -1
  376. package/dist/image-generation-request.js +0 -52
  377. package/dist/image-generation-request.js.map +0 -1
  378. package/dist/image-generation-resume.d.ts +0 -49
  379. package/dist/image-generation-resume.d.ts.map +0 -1
  380. package/dist/image-generation-resume.js +0 -96
  381. package/dist/image-generation-resume.js.map +0 -1
  382. package/dist/image-generation-run.d.ts +0 -46
  383. package/dist/image-generation-run.d.ts.map +0 -1
  384. package/dist/image-generation-run.js +0 -158
  385. package/dist/image-generation-run.js.map +0 -1
  386. package/dist/image-generation-staging.d.ts +0 -25
  387. package/dist/image-generation-staging.d.ts.map +0 -1
  388. package/dist/image-generation-staging.js +0 -80
  389. package/dist/image-generation-staging.js.map +0 -1
  390. package/dist/image-generation-usage.d.ts +0 -75
  391. package/dist/image-generation-usage.d.ts.map +0 -1
  392. package/dist/image-generation-usage.js +0 -219
  393. package/dist/image-generation-usage.js.map +0 -1
  394. package/dist/image-provider-preflight.d.ts +0 -21
  395. package/dist/image-provider-preflight.d.ts.map +0 -1
  396. package/dist/image-provider-preflight.js +0 -184
  397. package/dist/image-provider-preflight.js.map +0 -1
  398. package/dist/selection-record.d.ts +0 -97
  399. package/dist/selection-record.d.ts.map +0 -1
  400. package/dist/selection-record.js +0 -138
  401. package/dist/selection-record.js.map +0 -1
  402. package/skills/design/SKILL.md +0 -116
  403. package/skills/design/agents/openai.yaml +0 -8
  404. package/skills/design/assets/large-logo.svg +0 -3
  405. package/skills/design/assets/small-400px.png +0 -0
package/README.md CHANGED
@@ -16,7 +16,7 @@ Or use the genuinely npm-free macOS/Linux installer:
16
16
  curl -fsSL https://12ui.com/install.sh | sh
17
17
  ```
18
18
 
19
- Both paths pin the exact CLI version, install `design` into every detected
19
+ Both paths pin the exact CLI version, install `12ui-design` into every detected
20
20
  Codex, Claude Code, Grok CLI, Cursor CLI, Antigravity, and GitHub Copilot CLI
21
21
  installation, and
22
22
  open the 12ui device-approval page. The resulting user-owned credential has
@@ -69,7 +69,7 @@ unless `--force` is explicit.
69
69
 
70
70
  ## One visual interface skill
71
71
 
72
- `design` routes every UI, web, and mobile request and covers the whole
72
+ `12ui-design` routes every UI, web, and mobile request and covers the whole
73
73
  pipeline. Finished screenshots go straight to conversion, tiny edits stay
74
74
  code-only, and a rough brief explores corpus-grounded directions as images
75
75
  before anything is built:
@@ -78,11 +78,14 @@ before anything is built:
78
78
  references, preserving endpoint order and metrics, when the references
79
79
  themselves are the deliverable.
80
80
  - Drafting claims one `/api/v1/create` run, dispatches each candidate slot
81
- once, and downloads the images without re-buying a settled slot.
81
+ once, and downloads the images without re-buying a settled slot. The caller
82
+ authenticates only to 12ui; the service owns its image-provider credentials.
82
83
  - Branching is required whenever the deliverable is more than one viewport.
83
84
  One `12ui branch execute` run expands one approved design into the 2-8
84
85
  screens the server plans, dispatching each only once its dependency and
85
- footer gates clear, and converts each page as one ordered package.
86
+ footer gates clear. Conversion keeps ordered `web_page` viewports in one
87
+ package and emits each complete `web_app`, `mobile_app`, or `immersive` state
88
+ as its own page.
86
89
  - Conversion turns a finished PNG, JPEG, or WebP into LayerDoc and any
87
90
  supported responsive, fixed, project, or document export, and converts the
88
91
  ordered viewports of one page as a single package.
@@ -106,53 +109,40 @@ manual recreation.
106
109
  --reference-image ./current-homepage.png \
107
110
  --out-dir ./references \
108
111
  --count 4
109
- 12ui image generate-batch --manifest ./generation.json
110
- 12ui image batch-status --manifest ./generation.json
112
+ 12ui draft \
113
+ --concept "Editorial architecture homepage with warm materiality" \
114
+ --candidates 4
115
+ 12ui next <run-dir> --wait
111
116
  12ui branch execute \
112
- --winner-image ./candidates/A.png \
117
+ --start <run-dir>/candidates/A.png \
113
118
  --concept "Editorial architecture studio site" \
114
119
  --scope site \
115
- --out-dir ./branch \
116
120
  --convert html
117
- 12ui branch status --out-dir ./branch
118
- 12ui export <base-layerdoc-conversion-id> \
119
- --output html,pdf,psd,pptx,sketch,web_project \
120
- --out-dir ./exports \
121
- --web-profile ./web-profile.json \
122
- --idempotency-key product-exports-v1
121
+ 12ui next <branch-run-dir> --wait
122
+ 12ui convert <conversion-id> \
123
+ --output html_fixed,pdf,psd,pptx,sketch \
124
+ --out-dir ./exports
123
125
  ```
124
126
 
125
- `image generate-batch` accepts 2-16 manifest jobs, preflights one provider,
126
- reserves every attempt before dispatch, starts all provider calls concurrently,
127
- and waits for the complete batch. Each job has one prompt, one reference, one
128
- PNG output, and one stable idempotency key. Per-candidate and batch evidence
129
- records provider-start and completion times. It never retries a candidate or
130
- switches providers after dispatch.
131
-
132
- Candidates are written into a hidden staging directory and moved into place only
133
- once the batch is terminal, so a caller listing the output directory can never
134
- observe a half-written batch. Completion is published as a
135
- `generation.complete.json` sentinel beside the candidates, carrying each
136
- candidate's status, sha256, and byte count. `--resume` recovers an interrupted
137
- batch: it delivers candidates that were already generated and re-requests only
138
- those the provider provably never billed, so it can never buy a candidate twice,
139
- and it refuses a batch that already completed.
140
-
141
- The single-candidate `image generate` command remains available. Both commands
142
- resolve authenticated Codex first, then `OPENAI_API_KEY` from the process or
143
- exactly `<project-root>/.env`. They refuse a Git-tracked `.env`, never store or
144
- print the key, and always write PNG bytes.
145
-
146
- `export` downloads one successful base LayerDoc once and dispatches the chosen
147
- formats in parallel. Project exports require exact web/native profiles; image
148
- extraction is not repeated. The command creates parent directories as needed
149
- and accepts an existing destination directory, but refuses before any API
150
- request when a selected output, its asset directory, or
151
- `export-manifest.json` already exists.
152
-
153
- `capabilities --json` reports the exact `projectProfileSchema`, including the
154
- required fields and `version: 1` constraint, beside the supported
155
- `projectProfiles` combinations.
127
+ `draft` accepts 2-16 candidates and defaults to four. It records the corpus set,
128
+ hosted run id, stable service slots, output paths, and claim key in `draft.json`
129
+ before dispatch. The detached worker posts only slots whose durable service
130
+ state is still `pending`; in-flight, succeeded, and failed slots are never
131
+ posted again. Successful PNGs are digest-checked and written atomically under
132
+ `<run-dir>/candidates/`, with terminal evidence in `draft.complete.json`.
133
+
134
+ The retired local `image` commands and provider preflight are not part of the
135
+ CLI. Draft never inspects Codex authentication, `OPENAI_API_KEY`, project
136
+ `.env` files, or any other caller-side image-provider credential.
137
+
138
+ `convert <conversion-id>` downloads one successful base LayerDoc once and
139
+ dispatches the chosen formats concurrently. It creates the destination
140
+ directory as needed, but refuses before any API request when a selected output,
141
+ its asset directory, or `export-manifest.json` already exists.
142
+
143
+ `capabilities --json` reports the CLI's exact inputs and outputs, model and
144
+ responsive-quality choices, duration hints, status commands, and durable
145
+ journal/receipt contracts.
156
146
 
157
147
  ## Design Corpus inspiration
158
148
 
@@ -280,68 +270,64 @@ strict manifest, asset mapping, normalization, page-join, and limit contract.
280
270
 
281
271
  ```bash
282
272
  export TWELVE_UI_API_KEY=your-key
283
- 12ui convert ./screen.png --output layerdoc --out ./screen.layerdoc.json
284
- 12ui convert ./screen.png --output html --model pro --width 1440 --out ./screen.html --timeout-ms 7200000
285
- 12ui convert ./screen.layerdoc.json --output html --out ./screen.html --idempotency-key screen-html-v1
286
- 12ui convert ./screen.layerdoc.json --output pptx --out ./screen.pptx --idempotency-key screen-pptx-v1
287
- 12ui convert ./screen.layerdoc.json --output web_project --profile ./react-tailwind.json --out ./screen-react.zip
288
- 12ui convert ./screen.layerdoc.json --output app_project --profile '{"version":1,"framework":"swiftui","styling":"native","language":"swift","packaging":"project"}' --out ./screen-ios.zip
273
+ 12ui convert ./screen.png --output layerdoc --out-dir ./converted
274
+ 12ui convert ./screen.png --output html --model pro --width 1440 --out-dir ./responsive --timeout-ms 7200000
275
+ 12ui convert ./screen.layerdoc.json --output html_fixed --out-dir ./fixed --idempotency-key screen-html-v1
276
+ 12ui convert ./screen.layerdoc.json --output pptx --out-dir ./slides --idempotency-key screen-pptx-v1
277
+ 12ui convert <layerdoc-conversion-id> --output html_fixed,pdf,psd,pptx,sketch --out-dir ./exports
289
278
  12ui convert package --manifest ./package.json --out-dir ./pages
290
- 12ui resume conversion-id --output layerdoc --out ./screen.layerdoc.json
279
+ 12ui resume conversion-id
291
280
  ```
292
281
 
293
282
  `convert package` submits the ordered viewports of one continuous page as ONE
294
283
  package conversion per page, which is what preserves page order and stitching;
295
- converting a stacked page one image at a time loses both. Every viewport of a
284
+ converting a continuous page one image at a time loses both. `branch execute`
285
+ uses that shape only for declared `web_page` documents; complete app states are
286
+ separate one-viewport pages. Every viewport of a
296
287
  page must share one width, checked locally before anything is bought. A viewport
297
288
  may name `sourceConversionId` to reuse an already succeeded conversion of
298
289
  exactly those bytes instead of paying for it twice.
299
290
 
300
- Long commands block until they finish, and `--wait` names that default
301
- explicitly. While one runs, `12ui branch status --out-dir <dir>` and
302
- `12ui image batch-status --manifest <file>` report forward motion per-item
303
- state, elapsed against typical, and what to do next — without touching the run.
304
- Do not infer progress from a directory listing: staged work is materialized in
305
- one atomic pass at the end.
291
+ Draft and branch runs detach by default; `--wait` keeps either in the current
292
+ shell. While one runs, `12ui next <run-dir>` reports per-item state, elapsed
293
+ against typical, and what to do next without dispatching replacement work. Do
294
+ not infer progress from a directory listing.
306
295
 
307
296
  Each conversion also writes a verified `<out>.assets/manifest.json` plus every
308
297
  signed raster artifact beside the requested result. Set `TWELVE_UI_ORIGIN` to
309
298
  override `https://12ui.com`; waits default to the operation expiry and can be
310
299
  bounded explicitly with `--timeout-ms`.
311
300
 
312
- For a detached conversion, omit `--out` from `convert`, capture its JSON stdout,
313
- and pass the returned ID plus both `--output` and `--out` to `resume`. The
314
- detached create does not materialize the output file:
301
+ `convert` blocks and records the original filenames before admission. If its
302
+ shell is interrupted after a conversion ID is returned, bare `resume` restores
303
+ every artifact in that original purchase. `--out-dir` keeps the recorded
304
+ basenames but moves recovery into another directory. For an older or externally
305
+ created operation without a local recovery record, the power form names its
306
+ exact output and destination:
315
307
 
316
308
  ```bash
317
- set -o pipefail
318
- 12ui convert ./screen.png \
319
- --output layerdoc \
320
- --model standard \
321
- --idempotency-key screen-layerdoc-v1 \
322
- --detach | tee ./screen.operation.json
323
309
  12ui resume conversion-id --output layerdoc --out ./screen.layerdoc.json
324
310
  ```
325
311
 
326
- If create fails before emitting an operation ID, `resume` is not possible.
327
- Repeat the exact create request with the same explicit `--idempotency-key` so
328
- the service can return the original operation without repeating completed paid
329
- work. When the key is omitted, the client generates a new UUID. The CLI prints
330
- operation/result metadata to stdout; persist it when durable local evidence is
331
- required.
312
+ If admission fails before emitting an operation ID, repeat the exact request
313
+ with the same explicit `--idempotency-key` so the service can replay the
314
+ original operation without repeating settled paid work. When the key is
315
+ omitted, the client generates a new UUID.
332
316
 
333
317
  Image conversions accept `--model fast|standard|pro`; omission selects
334
- `standard`. In `layerdoc-worker-v148`, Fast, Standard, and Pro all use
318
+ `standard`. Beginning with `layerdoc-worker-v148` and still in the current
319
+ `layerdoc-worker-v190`, Fast, Standard, and Pro all use
335
320
  `gpt-5.6-terra-low` for primary extraction. Fast retains color-guided
336
321
  deterministic inpainting, source-grounded flat-border cutouts, and 1x source crops without
337
322
  secondary metadata refinement, generative cleanup, provider background
338
323
  removal, or upscaling. Standard has no secondary metadata refinement and uses
339
- one atomic GPT Image 2 result for each opaque clean target, with Pixelcut-first
324
+ one target-scoped atomic GPT Image 2 result for each opaque clean target, with Pixelcut-first
340
325
  alpha isolation and Bria admitted only after a durable hard-invalid or
341
326
  reconciled terminal Pixelcut failure. Standard performs no Luna candidate
342
327
  review. Pro retains a separate `gpt-5.6-terra-low` metadata-refinement call, a
343
- three-sample atomic opaque-clean portfolio with one comparative Luna review,
344
- and the complete revision-frozen FAL alpha portfolio. GPT Image 2 is opaque-only.
328
+ target-scoped atomic clean plus the shared whole-image clean for atomic-region
329
+ targets, one comparative Luna review, and the complete revision-frozen FAL
330
+ alpha portfolio. GPT Image 2 is opaque-only.
345
331
  Provider-routed cutouts keep enhanced upscaling; accepted deterministic Fast
346
332
  cutouts are resized locally. The option is not accepted for LayerDoc input
347
333
  because downstream compilation is deterministic.
@@ -361,16 +347,85 @@ raster references must still be valid and must belong to the same authenticated
361
347
  account. The service resolves those owned artifacts directly; it does not fetch
362
348
  arbitrary remote URLs. LayerDoc input produces `layerdoc`, `html`,
363
349
  `html_fixed`, `svg`, `png`, `jpg` (JPEG), `webp`, `pdf`, `psd`, `pptx`,
364
- `sketch`, `web_project`, or `app_project`. Project outputs require
365
- `--profile <json|file>`; the CLI also accepts `--profile @file.json`.
350
+ or `sketch`. The typed Node client and MCP integration documented below retain
351
+ the exact-profile `web_project` and `app_project` integration surface.
352
+
353
+ ### Review stored work
354
+
355
+ ```bash
356
+ 12ui review ./my-run
357
+ 12ui review --all
358
+ ```
359
+
360
+ `review` starts a read-only-by-default server on an ephemeral localhost port,
361
+ prints its URL, and opens it in the browser. The page places draft candidates
362
+ side by side, shows branch screens and exported page HTML, and renders conversion
363
+ outputs. Pass one run or workspace directory, or use `--all` to find automatic
364
+ draft workspaces in the current system temp directory and runs under the current
365
+ project's `.12ui` directory. The server never binds to a network interface.
366
+
367
+ This discovery follows the CLI's existing storage contracts: automatic drafts
368
+ live under the system temp root as `12ui-*` directories with `draft.json` and
369
+ `candidates/` (`src/draft-workspace.ts`); branch artifacts live under
370
+ `<run-dir>/branch/{screens,pages}` (`src/branch-run-record.ts`); workspace
371
+ commands append artifacts to `<workspace>/journal.jsonl` (`src/run-journal.ts`),
372
+ and conversions write outputs beside their input unless `--out-dir` selects a
373
+ workspace (`src/cli-convert-command.ts`). An explicit directory is searched for
374
+ those markers so a parent containing several stored runs can be reviewed at
375
+ once.
376
+
377
+ Notes and marks are the only automatic writes. Each run stores them atomically
378
+ in `<run-dir>/review.json`, mode `0600`, and reloads them whenever the page is
379
+ opened. `pick` and `approve` are deliberately separate marks; Clear records no
380
+ mark. Agents can consume the file directly:
381
+
382
+ ```json
383
+ {
384
+ "version": 1,
385
+ "updatedAt": "2026-08-21T01:23:45.000Z",
386
+ "items": {
387
+ "draft-candidate-a-0123abcd": {
388
+ "feedback": {
389
+ "note": "Keep the hierarchy and reduce the footer.",
390
+ "mark": "pick",
391
+ "updatedAt": "2026-08-21T01:23:45.000Z"
392
+ },
393
+ "edits": [
394
+ {
395
+ "id": "edit-0123abcd",
396
+ "prompt": "Change the heading to Northstar notes.",
397
+ "createdAt": "2026-08-21T01:25:00.000Z",
398
+ "editOperationId": "edit-operation-id",
399
+ "renderOperationId": "render-operation-id",
400
+ "original": "screen.layerdoc.json",
401
+ "layerdoc": "review/edits/edit-0123abcd.layerdoc.json",
402
+ "html": "review/edits/edit-0123abcd.html"
403
+ }
404
+ ]
405
+ }
406
+ }
407
+ }
408
+ ```
409
+
410
+ Item keys are stable hashes of their kind and run-relative path. `mark` is
411
+ `"pick"`, `"approve"`, or `null`; `edits` is omitted until an edit succeeds.
412
+
413
+ When an item is a LayerDoc and conversion credentials are configured, the page
414
+ offers an explicit text edit. It shows the price first and asks for confirmation
415
+ before calling the existing `POST /api/v1/edit` contract. A Design edit is a
416
+ metered action: it uses the daily allowance when available or costs $0.03;
417
+ requested image actions may cost another $0.02-$0.30. The review server never
418
+ applies an edit by itself. A successful edit and its deterministic fixed HTML
419
+ render are written under `<run-dir>/review/edits/` and displayed beside the
420
+ original.
366
421
 
367
422
  ### The run journal
368
423
 
369
424
  Every command that owns a workspace directory — a draft run directory, a branch
370
- out-dir, a convert or export output directory — appends what it did to
425
+ out-dir, or a convert output directory — appends what it did to
371
426
  `<workspace>/journal.jsonl`. One JSON line when the command begins and one when
372
- it exits, including refusals and failures. The detached workers that
373
- `branch execute`, `branch resume`, and `image generate-batch` spawn append to
427
+ it exits, including refusals and failures. The detached workers that `draft`,
428
+ `branch execute`, and `branch resume` spawn append to
374
429
  the same file as the command that started them, so a run's whole history is in
375
430
  one place whether or not the shell that launched it survived.
376
431
 
@@ -631,8 +686,7 @@ create metered work. Set an `idempotencyKey` for any ambiguous conversion
631
686
  create that may need to be repeated; otherwise the conversion client generates
632
687
  a new UUID. Corpus retrieval always persists its key before the request.
633
688
 
634
- Draft preparation/generation and Branch execute/resume remain deliberate CLI
635
- workflows (`12ui draft`, `12ui image generate-batch`, and `12ui branch`). They
636
- coordinate local provider tools, durable run directories, progress streaming,
637
- and multi-page packaging; the MCP surface does not duplicate those
689
+ Draft and Branch execute/resume remain deliberate CLI workflows (`12ui draft`
690
+ and `12ui branch`). They coordinate hosted service runs, durable local run
691
+ directories, progress streaming, and multi-page packaging; the MCP surface does not duplicate those
638
692
  orchestrators or quietly dispatch paid work from a status call.
package/SKILL.md CHANGED
@@ -7,16 +7,16 @@ description: "Runs the complete 12UI visual-interface workflow inside Open
7
7
 
8
8
  # 12UI for Open Design
9
9
 
10
- `skills/design/SKILL.md` is the whole contract: it covers reference search,
10
+ `skills/12ui-design/SKILL.md` is the whole contract: it covers reference search,
11
11
  hosted candidate generation, branching an approved direction across a page,
12
12
  site, or multi-state app, and converting a finished image into LayerDoc and
13
13
  production exports. The four stage skills it replaced were retired on
14
14
  2026-08-16.
15
15
 
16
- For a normal interface request, follow `skills/design/SKILL.md` end to end:
16
+ For a normal interface request, follow `skills/12ui-design/SKILL.md` end to end:
17
17
  create four corpus-conditioned candidates, present their actual images through
18
18
  Open Design's `twelve-ui-direction` choice surface, record the selected slot and
19
- rationale with `12ui select`, then convert or branch exactly that candidate.
19
+ rationale in the Open Design choice, then convert or branch exactly that image.
20
20
  Do not substitute Open Design's generic direction cards for the generated 12UI
21
21
  candidates.
22
22
 
@@ -28,7 +28,7 @@ dispatch paid work when it is absent, rejected, or times out.
28
28
  Use `12ui` when it is available on `PATH`. Otherwise invoke the pinned CLI that
29
29
  the plugin's `open-design.json` MCP entry uses:
30
30
 
31
- npx -y @12ui/design@0.2.27 <command> ...
31
+ npx -y @12ui/design@0.2.29 <command> ...
32
32
 
33
33
  Run `12ui auth status --json` (or its pinned `npx` equivalent) before the paid
34
34
  preflight. A desktop user can authenticate with `12ui auth login`; a headless
@@ -37,6 +37,6 @@ the plugin manifest, command output, or generated artifacts.
37
37
 
38
38
  Treat the generated HTML or project export as the implementation, materialize
39
39
  it in the Open Design project workspace, and publish it as a live artifact for
40
- preview and critique. Preserve the 12UI run directory, selection evidence,
40
+ preview and critique. Preserve the 12UI run directory, chosen-image rationale,
41
41
  conversion IDs, and export manifests with the project so reruns can resume
42
42
  settled work instead of buying it again.
@@ -1 +1 @@
1
- {"version":3,"file":"branch-completion.d.ts","sourceRoot":"","sources":["../src/branch-completion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAE1B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IACrE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACpC,KAAG,gBA4JH,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,KAAG,KAAK,GAAG,IAwBX,CAAC"}
1
+ {"version":3,"file":"branch-completion.d.ts","sourceRoot":"","sources":["../src/branch-completion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAKzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAE1B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IACrE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACpC,KAAG,gBAoLH,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,KAAG,KAAK,GAAG,IAwBX,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { BRANCH_WORKFLOW_REVISION, branchConceptDigest } from './branch-identity.js';
2
+ import { branchConversionPages, branchPackageSourcePage, } from './branch-page-packaging.js';
2
3
  import { branchBlockedSlots } from './branch-schedule.js';
3
4
  import { branchPlanPath, } from './branch-run-record.js';
4
5
  /**
@@ -22,10 +23,14 @@ export const buildCompletion = (args) => {
22
23
  footer: screen.footer,
23
24
  dependsOnSlot: screen.dependsOnSlot,
24
25
  }))).map((entry) => [entry.slot, entry]));
25
- const pageIdByIndex = new Map(args.plan.pages.map((page) => [page.index, page.id]));
26
+ const packagePages = branchConversionPages(args.plan);
27
+ const packagePlacementBySlot = new Map(packagePages.flatMap((page, index) => (page.slots.map((slot) => [slot, { page, index }]))));
26
28
  const screens = args.plan.screens.map((screen) => {
27
29
  const downloaded = args.screens.get(screen.slot);
28
30
  const block = blocked.get(screen.slot);
31
+ const packaged = packagePlacementBySlot.get(screen.slot);
32
+ const packagedPageIndex = packaged?.index ?? screen.pageIndex;
33
+ const packagedViewportOrdinal = packaged?.page.packageLineage ? 1 : screen.viewportOrdinal;
29
34
  const status = screen.status === 'succeeded' && downloaded
30
35
  ? 'succeeded'
31
36
  : block
@@ -33,9 +38,15 @@ export const buildCompletion = (args) => {
33
38
  : 'failed';
34
39
  return {
35
40
  slot: screen.slot,
36
- pageIndex: screen.pageIndex,
37
- pageId: pageIdByIndex.get(screen.pageIndex) ?? `p${screen.pageIndex}`,
38
- viewportOrdinal: screen.viewportOrdinal,
41
+ pageIndex: packagedPageIndex,
42
+ pageId: packaged?.page.id ?? `p${screen.pageIndex}`,
43
+ viewportOrdinal: packagedViewportOrdinal,
44
+ ...(packagedPageIndex === screen.pageIndex
45
+ ? {}
46
+ : { generationPageIndex: screen.pageIndex }),
47
+ ...(packagedViewportOrdinal === screen.viewportOrdinal
48
+ ? {}
49
+ : { generationViewportOrdinal: screen.viewportOrdinal }),
39
50
  status,
40
51
  direction: screen.direction,
41
52
  ...(downloaded
@@ -56,16 +67,27 @@ export const buildCompletion = (args) => {
56
67
  const succeededCount = screens.filter((screen) => screen.status === 'succeeded').length;
57
68
  const blockedCount = screens.filter((screen) => screen.status === 'blocked').length;
58
69
  const failedCount = screens.length - succeededCount - blockedCount;
59
- const pages = args.plan.pages.map((page) => ({
60
- index: page.index,
61
- id: page.id,
62
- kind: page.kind,
63
- title: page.title,
64
- slots: page.slots,
65
- startsFromWinner: page.startsFromWinner,
66
- ...(page.synthesized ? { synthesized: true } : {}),
67
- ...(args.conversions.has(page.id) ? { conversion: args.conversions.get(page.id) } : {}),
68
- }));
70
+ const pages = packagePages.map((page, index) => {
71
+ const source = branchPackageSourcePage(page);
72
+ const sourceViewportOrdinal = page.packageLineage?.viewportOrdinal;
73
+ return {
74
+ index,
75
+ id: page.id,
76
+ kind: page.kind,
77
+ title: page.title,
78
+ slots: page.slots,
79
+ startsFromWinner: page.startsFromWinner,
80
+ ...(page.synthesized ? { synthesized: true } : {}),
81
+ ...(source.index === index && source.id === page.id && sourceViewportOrdinal === undefined
82
+ ? {}
83
+ : {
84
+ sourcePageIndex: source.index,
85
+ sourcePageId: source.id,
86
+ ...(sourceViewportOrdinal === undefined ? {} : { sourceViewportOrdinal }),
87
+ }),
88
+ ...(args.conversions.has(page.id) ? { conversion: args.conversions.get(page.id) } : {}),
89
+ };
90
+ });
69
91
  const convertedPageCount = pages.filter((page) => (page.conversion?.status === 'succeeded')).length;
70
92
  const notes = [];
71
93
  if (blockedCount > 0) {
@@ -132,6 +154,7 @@ export const buildCompletion = (args) => {
132
154
  failedCount,
133
155
  blockedCount,
134
156
  pageCount: pages.length,
157
+ logicalPageCount: args.plan.pages.length,
135
158
  convertedPageCount,
136
159
  ...(winnerPagesFailed.length > 0 ? { winnerPageFailed: true } : {}),
137
160
  ...(trim ? { trimmed: trim } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"branch-completion.js","sourceRoot":"","sources":["../src/branch-completion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"branch-completion.js","sourceRoot":"","sources":["../src/branch-completion.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"branch-execution.d.ts","sourceRoot":"","sources":["../src/branch-execution.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAgBnC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAiBrC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,oBAAoB,KAAG,MAiB/D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,qBAAqB,KAAG,MAQlE,CAAC;AAqCF,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,CAAC,EAAE,+BAA+B,CAAC;IAChD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,qBAAqB,CA2WhC,CAAC"}
1
+ {"version":3,"file":"branch-execution.d.ts","sourceRoot":"","sources":["../src/branch-execution.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAa5B,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAgBnC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAiBrC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,oBAAoB,KAAG,MAsB/D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,qBAAqB,KAAG,MAQlE,CAAC;AAqCF,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,CAAC,EAAE,+BAA+B,CAAC;IAChD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,qBAAqB,CAyXhC,CAAC"}
@@ -5,6 +5,7 @@ import { buildCompletion, terminalFailure } from './branch-completion.js';
5
5
  import { createRunMaterializer } from './branch-materialize.js';
6
6
  import { branchScreenPath } from './branch-downloads.js';
7
7
  import { createBranchPageConversions } from './branch-page-conversion.js';
8
+ import { branchConversionPages } from './branch-page-packaging.js';
8
9
  import { invalidateConversionReceipts, readLegacyConversionReceipts, recordConversionReceipt, } from './conversion-receipt.js';
9
10
  import { BRANCH_PAGE_CONCURRENCY_DEFAULT } from './cli-progress.js';
10
11
  import { applyBranchEnvelope, normalizeBranchPlan, } from './branch-plan.js';
@@ -31,8 +32,9 @@ const BUILD_PLAN_RETRIES = 3;
31
32
  * rather than only in the record nobody reads until afterwards.
32
33
  */
33
34
  export const describeBranchPlan = (plan) => {
34
- const approved = plan.pages.filter((page) => page.startsFromWinner).length;
35
- const rest = plan.pages.length - approved;
35
+ const outputPages = branchConversionPages(plan);
36
+ const approved = outputPages.filter((page) => page.startsFromWinner).length;
37
+ const rest = outputPages.length - approved;
36
38
  const composition = approved === 0
37
39
  ? ', '
38
40
  : rest === 0
@@ -46,7 +48,11 @@ export const describeBranchPlan = (plan) => {
46
48
  : `; --max-screens ${trim.maxScreens} leaves out ${trim.slots.length} planned screen(s):`
47
49
  + ` ${trim.slots.join(', ')}`
48
50
  : '';
49
- return `${plan.pages.length} page(s)${composition}${plan.screens.length} screen(s) to generate${left}`;
51
+ const packaging = outputPages.length === plan.pages.length
52
+ ? `${plan.pages.length} page(s)`
53
+ : `${plan.pages.length} logical page group(s) packaged as ${outputPages.length}`
54
+ + ' conversion page(s), with complete app states separate';
55
+ return `${packaging}${composition}${plan.screens.length} screen(s) to generate${left}`;
50
56
  };
51
57
  export const deriveBranchRunKey = (inputs) => (inputs.idempotencyKey ?? branchRunKey({
52
58
  winner: inputs.winner.kind === 'run'
@@ -125,6 +131,8 @@ export const executeBranchRun = async (args) => {
125
131
  let progressPhase = 'claiming';
126
132
  let progressRunId = '';
127
133
  let progressScreens = [];
134
+ let progressPageCount;
135
+ let progressLogicalPageCount;
128
136
  const publish = () => {
129
137
  pendingProgress = {
130
138
  version: 1,
@@ -133,6 +141,10 @@ export const executeBranchRun = async (args) => {
133
141
  startedAt,
134
142
  updatedAt: new Date().toISOString(),
135
143
  screens: progressScreens,
144
+ ...(progressPageCount === undefined ? {} : { pageCount: progressPageCount }),
145
+ ...(progressLogicalPageCount === undefined
146
+ ? {}
147
+ : { logicalPageCount: progressLogicalPageCount }),
136
148
  ...(packageProgress.size > 0 ? { packages: [...packageProgress.values()] } : {}),
137
149
  };
138
150
  drainProgress();
@@ -228,6 +240,9 @@ export const executeBranchRun = async (args) => {
228
240
  });
229
241
  await writeBranchPlanRecord(branchPlanPath(outDir), plan);
230
242
  emit({ kind: 'phase', phase: 'plan', detail: describeBranchPlan(plan) });
243
+ const packagePageCount = branchConversionPages(plan).length;
244
+ progressPageCount = packagePageCount;
245
+ progressLogicalPageCount = plan.pages.length;
231
246
  const convert = inputs.convert;
232
247
  const packageClient = args.packageClient;
233
248
  // Refused before the run buys anything rather than after every screen is paid
@@ -236,7 +251,8 @@ export const executeBranchRun = async (args) => {
236
251
  throw new Error('A conversion package client is required for --convert');
237
252
  // True whenever the run converts: `normalizeBranchPlan` guarantees a source
238
253
  // page in both scopes, so the winner's bytes are always part of the work.
239
- const needsWinner = Boolean(convert) && plan.pages.some((page) => page.startsFromWinner);
254
+ const needsWinner = Boolean(convert) && branchConversionPages(plan)
255
+ .some((page) => page.startsFromWinner);
240
256
  const materializer = createRunMaterializer({
241
257
  client: args.branchClient,
242
258
  runId: envelope.id,
@@ -344,14 +360,17 @@ export const executeBranchRun = async (args) => {
344
360
  * ones this overlap missed.
345
361
  */
346
362
  const convertWholePages = (livePlan) => {
347
- for (const page of livePlan.pages) {
363
+ for (const page of branchConversionPages(livePlan)) {
348
364
  const own = livePlan.screens.filter((screen) => page.slots.includes(screen.slot));
349
- if (own.length === 0 || !own.every((screen) => screen.status === 'succeeded'))
365
+ if (!own.every((screen) => screen.status === 'succeeded'))
350
366
  continue;
351
367
  pages?.start(livePlan, page);
352
368
  }
353
369
  };
354
370
  let stopped = null;
371
+ // A winner-only conversion page is ready before any generated state. This is
372
+ // common after app-state splitting, so let it overlap generation too.
373
+ convertWholePages(plan);
355
374
  publishProgress('dispatching', envelope.id, branchProgressScreens(plan, {}));
356
375
  if (plan.screens.length > 0) {
357
376
  const dispatched = await runBranchDispatch({
@@ -390,9 +409,10 @@ export const executeBranchRun = async (args) => {
390
409
  emit({
391
410
  kind: 'phase',
392
411
  phase: 'convert',
393
- detail: `one package conversion per whole page, up to ${args.pageConcurrency ?? BRANCH_PAGE_CONCURRENCY_DEFAULT} at a time`,
412
+ detail: `${packagePageCount} package conversion page(s): continuous documents stay joined,`
413
+ + ` complete app states stay separate; up to ${args.pageConcurrency ?? BRANCH_PAGE_CONCURRENCY_DEFAULT} at a time`,
394
414
  });
395
- for (const page of plan.pages)
415
+ for (const page of branchConversionPages(plan))
396
416
  pages?.start(plan, page);
397
417
  }
398
418
  // Every page settles, including any that started while screens were still