forgebook 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/README.md +914 -72
  2. package/dist/bin/forgebook/agentClient.d.ts +2 -1
  3. package/dist/bin/forgebook/agentClient.js +13 -6
  4. package/dist/bin/forgebook/agentGuide.d.ts +59 -0
  5. package/dist/bin/forgebook/agentGuide.js +203 -0
  6. package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
  7. package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
  8. package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
  9. package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
  10. package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
  11. package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
  12. package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
  13. package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
  14. package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
  15. package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
  16. package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
  17. package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
  18. package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
  19. package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
  20. package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
  21. package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
  22. package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
  23. package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
  24. package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
  25. package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
  26. package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
  27. package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
  28. package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
  29. package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
  30. package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
  31. package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
  32. package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
  33. package/dist/bin/forgebook/agentText.d.ts +23 -3
  34. package/dist/bin/forgebook/agentText.js +175 -28
  35. package/dist/bin/forgebook/agents.md +20 -191
  36. package/dist/bin/forgebook/agentsText.js +2 -1
  37. package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
  38. package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
  39. package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
  40. package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
  41. package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
  42. package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
  43. package/dist/bin/forgebook/auditCommand.d.mts +8 -0
  44. package/dist/bin/forgebook/auditCommand.mjs +75 -0
  45. package/dist/bin/forgebook/auditRun.d.ts +95 -0
  46. package/dist/bin/forgebook/auditRun.js +270 -0
  47. package/dist/bin/forgebook/browserRun.d.ts +21 -0
  48. package/dist/bin/forgebook/browserRun.js +57 -0
  49. package/dist/bin/forgebook/buildFailure.d.ts +7 -0
  50. package/dist/bin/forgebook/buildFailure.js +47 -0
  51. package/dist/bin/forgebook/buildWatch.d.ts +52 -0
  52. package/dist/bin/forgebook/buildWatch.js +137 -0
  53. package/dist/bin/forgebook/builtCatalogue.js +9 -5
  54. package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
  55. package/dist/bin/forgebook/catalogueCommands.js +23 -0
  56. package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
  57. package/dist/bin/forgebook/catalogueVite.js +14 -6
  58. package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
  59. package/dist/bin/forgebook/commandCacheClaim.js +170 -0
  60. package/dist/bin/forgebook/commandServer.d.ts +8 -0
  61. package/dist/bin/forgebook/commandServer.js +61 -13
  62. package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
  63. package/dist/bin/forgebook/graphCommand.d.mts +8 -0
  64. package/dist/bin/forgebook/graphCommand.mjs +84 -0
  65. package/dist/bin/forgebook/guide/commands.md +57 -0
  66. package/dist/bin/forgebook/guide/devices.md +17 -0
  67. package/dist/bin/forgebook/guide/docs-pages.md +13 -0
  68. package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
  69. package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
  70. package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
  71. package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
  72. package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
  73. package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
  74. package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
  75. package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
  76. package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
  77. package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
  78. package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
  79. package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
  80. package/dist/bin/forgebook/guide/links.md +29 -0
  81. package/dist/bin/forgebook/guide/setup.md +23 -0
  82. package/dist/bin/forgebook/guide/stories.md +90 -0
  83. package/dist/bin/forgebook/guide/switches.md +43 -0
  84. package/dist/bin/forgebook/guideCommand.d.mts +13 -0
  85. package/dist/bin/forgebook/guideCommand.mjs +37 -0
  86. package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
  87. package/dist/bin/forgebook/importers/storybook.js +11 -5
  88. package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
  89. package/dist/bin/forgebook/initCommands.d.mts +11 -0
  90. package/dist/bin/forgebook/initCommands.mjs +51 -78
  91. package/dist/bin/forgebook/initConfig.d.ts +5 -3
  92. package/dist/bin/forgebook/initConfig.js +6 -3
  93. package/dist/bin/forgebook/initInstall.d.ts +15 -0
  94. package/dist/bin/forgebook/initInstall.js +77 -0
  95. package/dist/bin/forgebook/initPrint.d.ts +9 -0
  96. package/dist/bin/forgebook/initPrint.js +60 -0
  97. package/dist/bin/forgebook/initRefusals.d.ts +45 -0
  98. package/dist/bin/forgebook/initRefusals.js +91 -0
  99. package/dist/bin/forgebook/initRun.d.ts +28 -0
  100. package/dist/bin/forgebook/initRun.js +311 -0
  101. package/dist/bin/forgebook/mcpCommand.mjs +38 -4
  102. package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
  103. package/dist/bin/forgebook/mcpGraph.js +24 -0
  104. package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
  105. package/dist/bin/forgebook/mcpTokens.js +58 -0
  106. package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
  107. package/dist/bin/forgebook/mcpToolParts.js +10 -0
  108. package/dist/bin/forgebook/mcpTools.d.ts +13 -6
  109. package/dist/bin/forgebook/mcpTools.js +57 -90
  110. package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
  111. package/dist/bin/forgebook/mcpVerify.js +36 -0
  112. package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
  113. package/dist/bin/forgebook/migrate/codemods.js +61 -0
  114. package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
  115. package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
  116. package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
  117. package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
  118. package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
  119. package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
  120. package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
  121. package/dist/bin/forgebook/migrate/migrateText.js +30 -0
  122. package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
  123. package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
  124. package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
  125. package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
  126. package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
  127. package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
  128. package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
  129. package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
  130. package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
  131. package/dist/bin/forgebook/newProject/newProject.js +180 -0
  132. package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
  133. package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
  134. package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
  135. package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
  136. package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
  137. package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
  138. package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
  139. package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
  140. package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
  141. package/dist/bin/forgebook/newProject/projectLook.js +293 -0
  142. package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
  143. package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
  144. package/dist/bin/forgebook/newRepair.d.ts +45 -0
  145. package/dist/bin/forgebook/newRepair.js +157 -0
  146. package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
  147. package/dist/bin/forgebook/newRepairRun.js +148 -0
  148. package/dist/bin/forgebook/newStories.d.ts +23 -1
  149. package/dist/bin/forgebook/newStories.js +101 -11
  150. package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
  151. package/dist/bin/forgebook/newStoriesFile.js +43 -4
  152. package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
  153. package/dist/bin/forgebook/prebundleRun.js +28 -8
  154. package/dist/bin/forgebook/proofCommand.d.mts +15 -0
  155. package/dist/bin/forgebook/proofCommand.mjs +212 -0
  156. package/dist/bin/forgebook/proofRun.d.ts +63 -0
  157. package/dist/bin/forgebook/proofRun.js +412 -0
  158. package/dist/bin/forgebook/proofText.d.ts +36 -0
  159. package/dist/bin/forgebook/proofText.js +131 -0
  160. package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
  161. package/dist/bin/forgebook/proofWorkflow.js +205 -0
  162. package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
  163. package/dist/bin/forgebook/setArgsTool.js +70 -0
  164. package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
  165. package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
  166. package/dist/bin/forgebook/storyCheckRun.js +83 -9
  167. package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
  168. package/dist/bin/forgebook/storyFileIds.js +14 -0
  169. package/dist/bin/forgebook/stressCases.d.ts +31 -0
  170. package/dist/bin/forgebook/stressCases.js +79 -0
  171. package/dist/bin/forgebook/stressRun.d.ts +12 -0
  172. package/dist/bin/forgebook/stressRun.js +61 -0
  173. package/dist/bin/forgebook/stressText.d.ts +27 -0
  174. package/dist/bin/forgebook/stressText.js +46 -0
  175. package/dist/bin/forgebook/verifyBase.d.ts +45 -0
  176. package/dist/bin/forgebook/verifyBase.js +196 -0
  177. package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
  178. package/dist/bin/forgebook/verifyCommand.mjs +125 -0
  179. package/dist/bin/forgebook/verifyRun.d.ts +63 -0
  180. package/dist/bin/forgebook/verifyRun.js +108 -0
  181. package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
  182. package/dist/bin/forgebook/verifyVerdict.js +297 -0
  183. package/dist/bin/forgebook/workflowActions.d.ts +23 -0
  184. package/dist/bin/forgebook/workflowActions.js +23 -0
  185. package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
  186. package/dist/src/addressArgs.d.ts +29 -5
  187. package/dist/src/addressArgs.js +58 -16
  188. package/dist/src/addressArgsParam.d.ts +54 -0
  189. package/dist/src/addressArgsParam.js +51 -0
  190. package/dist/src/addressTexts.d.ts +14 -0
  191. package/dist/src/addressTexts.js +28 -21
  192. package/dist/src/agentIndexFile.d.ts +11 -0
  193. package/dist/src/agentIndexFile.js +11 -0
  194. package/dist/src/argConditions.d.ts +52 -0
  195. package/dist/src/argConditions.js +80 -0
  196. package/dist/src/argControl.d.ts +100 -0
  197. package/dist/src/argControl.js +0 -0
  198. package/dist/src/argExpression.d.ts +21 -0
  199. package/dist/src/argExpression.js +30 -0
  200. package/dist/src/argTypes.d.ts +40 -51
  201. package/dist/src/argTypes.js +66 -184
  202. package/dist/src/argsProps.d.ts +3 -3
  203. package/dist/src/argsProps.js +11 -5
  204. package/dist/src/bundlerErrors.d.ts +29 -0
  205. package/dist/src/bundlerErrors.js +49 -0
  206. package/dist/src/catalogue.d.ts +31 -0
  207. package/dist/src/catalogue.js +13 -2
  208. package/dist/src/catalogueRefs.d.ts +75 -0
  209. package/dist/src/catalogueRefs.js +122 -0
  210. package/dist/src/componentDocs.d.ts +71 -0
  211. package/dist/src/componentDocs.js +15 -2
  212. package/dist/src/frame/callValues.d.ts +19 -0
  213. package/dist/src/frame/callValues.js +58 -0
  214. package/dist/src/frame/canvasScheme.d.ts +33 -0
  215. package/dist/src/frame/canvasScheme.js +67 -0
  216. package/dist/src/frame/frame.css +36 -3
  217. package/dist/src/frame/frameStatus.d.ts +16 -1
  218. package/dist/src/frame/frameStatus.js +16 -1
  219. package/dist/src/frame/frameView.js +4 -3
  220. package/dist/src/frame/mountFrame.d.ts +7 -1
  221. package/dist/src/frame/mountFrame.js +153 -46
  222. package/dist/src/frame/panelValues.d.ts +35 -0
  223. package/dist/src/frame/panelValues.js +127 -0
  224. package/dist/src/frame/playActions.d.ts +39 -0
  225. package/dist/src/frame/playActions.js +98 -0
  226. package/dist/src/frame/playStepper.d.ts +28 -0
  227. package/dist/src/frame/playStepper.js +38 -0
  228. package/dist/src/frame/playStory.d.ts +9 -1
  229. package/dist/src/frame/playStory.js +49 -3
  230. package/dist/src/frame/renderer.d.ts +34 -1
  231. package/dist/src/frame/renderer.js +24 -0
  232. package/dist/src/frame/shellChannel.d.ts +1 -1
  233. package/dist/src/frame/shellChannel.js +1 -1
  234. package/dist/src/frame/shellCheck.d.ts +17 -0
  235. package/dist/src/frame/shellCheck.js +25 -0
  236. package/dist/src/frame/shellMessageCheck.d.ts +7 -0
  237. package/dist/src/frame/shellMessageCheck.js +53 -0
  238. package/dist/src/frame/storyContent.d.ts +50 -0
  239. package/dist/src/frame/storyContent.js +73 -0
  240. package/dist/src/frame/storyModule.d.ts +9 -0
  241. package/dist/src/frame/storyModule.js +20 -2
  242. package/dist/src/frame/storyRun.d.ts +15 -7
  243. package/dist/src/frame/storyRun.js +64 -15
  244. package/dist/src/frame/valueSheets.d.ts +35 -0
  245. package/dist/src/frame/valueSheets.js +99 -0
  246. package/dist/src/hotModules.d.ts +20 -0
  247. package/dist/src/hotModules.js +23 -0
  248. package/dist/src/jsxCode.d.ts +1 -14
  249. package/dist/src/jsxCode.js +46 -10
  250. package/dist/src/liveErrors.d.ts +30 -4
  251. package/dist/src/liveErrors.js +18 -3
  252. package/dist/src/messages.d.ts +77 -27
  253. package/dist/src/messages.js +58 -100
  254. package/dist/src/namedValues.d.ts +2 -26
  255. package/dist/src/namedValues.js +0 -47
  256. package/dist/src/pageConfig.d.ts +2 -0
  257. package/dist/src/playTrace.d.ts +19 -2
  258. package/dist/src/playTrace.js +10 -5
  259. package/dist/src/plugin.d.ts +10 -3
  260. package/dist/src/previewRelay.js +9 -1
  261. package/dist/src/printable.d.ts +12 -0
  262. package/dist/src/printable.js +22 -0
  263. package/dist/src/propsSignature.d.ts +37 -0
  264. package/dist/src/propsSignature.js +40 -0
  265. package/dist/src/search.d.ts +41 -5
  266. package/dist/src/search.js +93 -23
  267. package/dist/src/searchMatch.d.ts +4 -1
  268. package/dist/src/searchMatch.js +26 -5
  269. package/dist/src/searchTypos.d.ts +88 -0
  270. package/dist/src/searchTypos.js +178 -0
  271. package/dist/src/shapeValues.d.ts +86 -0
  272. package/dist/src/shapeValues.js +295 -0
  273. package/dist/src/shell/ApiReference.js +6 -3
  274. package/dist/src/shell/ApiTableBox.d.ts +15 -0
  275. package/dist/src/shell/ApiTableBox.js +11 -0
  276. package/dist/src/shell/AppearanceMenu.d.ts +4 -1
  277. package/dist/src/shell/AppearanceMenu.js +9 -6
  278. package/dist/src/shell/CodeTab.d.ts +3 -2
  279. package/dist/src/shell/CodeTab.js +3 -2
  280. package/dist/src/shell/CodeText.d.ts +1 -1
  281. package/dist/src/shell/CodeText.js +2 -3
  282. package/dist/src/shell/CompareGrid.js +1 -1
  283. package/dist/src/shell/ComponentPage.d.ts +1 -1
  284. package/dist/src/shell/ComponentPage.js +5 -1
  285. package/dist/src/shell/CustomControl.d.ts +34 -0
  286. package/dist/src/shell/CustomControl.js +132 -0
  287. package/dist/src/shell/DocContainers.js +1 -1
  288. package/dist/src/shell/DocPage.js +2 -2
  289. package/dist/src/shell/DroppedArgsList.d.ts +2 -2
  290. package/dist/src/shell/DroppedArgsList.js +1 -1
  291. package/dist/src/shell/EmbedPage.js +30 -12
  292. package/dist/src/shell/Example.d.ts +5 -1
  293. package/dist/src/shell/Example.js +16 -8
  294. package/dist/src/shell/FrameView.d.ts +6 -3
  295. package/dist/src/shell/FrameView.js +2 -2
  296. package/dist/src/shell/HomePage.d.ts +3 -1
  297. package/dist/src/shell/HomePage.js +16 -6
  298. package/dist/src/shell/InfoTip.js +2 -2
  299. package/dist/src/shell/InteractionsTab.d.ts +11 -4
  300. package/dist/src/shell/InteractionsTab.js +18 -2
  301. package/dist/src/shell/LazyPage.js +1 -1
  302. package/dist/src/shell/PackageHtml.js +3 -1
  303. package/dist/src/shell/PinnedControl.js +14 -62
  304. package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
  305. package/dist/src/shell/PinnedControlMenu.js +72 -0
  306. package/dist/src/shell/PropFields.d.ts +3 -1
  307. package/dist/src/shell/PropFields.js +9 -6
  308. package/dist/src/shell/PropRows.d.ts +23 -2
  309. package/dist/src/shell/PropRows.js +58 -19
  310. package/dist/src/shell/PropsTab.d.ts +12 -5
  311. package/dist/src/shell/PropsTab.js +9 -21
  312. package/dist/src/shell/RefStoryPage.d.ts +33 -0
  313. package/dist/src/shell/RefStoryPage.js +123 -0
  314. package/dist/src/shell/SearchPanel.js +51 -24
  315. package/dist/src/shell/Shell.d.ts +18 -0
  316. package/dist/src/shell/Shell.js +137 -22
  317. package/dist/src/shell/ShortcutHelp.d.ts +22 -0
  318. package/dist/src/shell/ShortcutHelp.js +66 -0
  319. package/dist/src/shell/Sidebar.d.ts +17 -4
  320. package/dist/src/shell/Sidebar.js +92 -41
  321. package/dist/src/shell/SidebarDocs.js +2 -2
  322. package/dist/src/shell/SidebarEntries.js +5 -3
  323. package/dist/src/shell/SidebarHandle.d.ts +3 -5
  324. package/dist/src/shell/SidebarHandle.js +4 -4
  325. package/dist/src/shell/SidebarRefs.d.ts +39 -0
  326. package/dist/src/shell/SidebarRefs.js +99 -0
  327. package/dist/src/shell/SidebarSearch.js +37 -9
  328. package/dist/src/shell/SignatureReference.js +3 -1
  329. package/dist/src/shell/Stage.d.ts +10 -2
  330. package/dist/src/shell/Stage.js +29 -49
  331. package/dist/src/shell/StatusBadges.d.ts +54 -0
  332. package/dist/src/shell/StatusBadges.js +77 -0
  333. package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
  334. package/dist/src/shell/StoryCodeBlock.js +7 -6
  335. package/dist/src/shell/SwitchGallery.d.ts +36 -0
  336. package/dist/src/shell/SwitchGallery.js +17 -0
  337. package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
  338. package/dist/src/shell/SwitchGalleryPanel.js +99 -0
  339. package/dist/src/shell/TagFilter.d.ts +24 -0
  340. package/dist/src/shell/TagFilter.js +45 -0
  341. package/dist/src/shell/TagViews.d.ts +39 -0
  342. package/dist/src/shell/TagViews.js +20 -0
  343. package/dist/src/shell/Toolbar.d.ts +4 -1
  344. package/dist/src/shell/Toolbar.js +17 -7
  345. package/dist/src/shell/ToolbarControl.d.ts +3 -0
  346. package/dist/src/shell/ToolbarControl.js +23 -6
  347. package/dist/src/shell/ViewMenuPanel.js +6 -1
  348. package/dist/src/shell/argChecks.d.ts +22 -0
  349. package/dist/src/shell/argChecks.js +20 -0
  350. package/dist/src/shell/asideStory.js +7 -2
  351. package/dist/src/shell/audienceSections.css +9 -9
  352. package/dist/src/shell/catalogueContext.d.ts +1 -1
  353. package/dist/src/shell/catalogueContext.js +6 -1
  354. package/dist/src/shell/codeSpans.d.ts +27 -0
  355. package/dist/src/shell/codeSpans.js +76 -0
  356. package/dist/src/shell/compareVariants.d.ts +4 -2
  357. package/dist/src/shell/compareVariants.js +16 -8
  358. package/dist/src/shell/composition.d.ts +23 -0
  359. package/dist/src/shell/composition.js +26 -0
  360. package/dist/src/shell/controlCycle.d.ts +1 -1
  361. package/dist/src/shell/controlCycle.js +3 -2
  362. package/dist/src/shell/customControls.d.ts +55 -0
  363. package/dist/src/shell/customControls.js +70 -0
  364. package/dist/src/shell/docPage.css +22 -22
  365. package/dist/src/shell/dockTabs.d.ts +19 -3
  366. package/dist/src/shell/dockTabs.js +28 -20
  367. package/dist/src/shell/embed.css +7 -7
  368. package/dist/src/shell/framesOrigin.d.ts +7 -0
  369. package/dist/src/shell/framesOrigin.js +1 -1
  370. package/dist/src/shell/galleryPlace.d.ts +20 -0
  371. package/dist/src/shell/galleryPlace.js +26 -0
  372. package/dist/src/shell/icons.d.ts +1 -0
  373. package/dist/src/shell/icons.js +1 -0
  374. package/dist/src/shell/keyboard.d.ts +14 -12
  375. package/dist/src/shell/keyboard.js +21 -6
  376. package/dist/src/shell/laterStrings.d.ts +29 -0
  377. package/dist/src/shell/laterStrings.js +42 -3
  378. package/dist/src/shell/mountShell.js +3 -0
  379. package/dist/src/shell/pageStrings.d.ts +4 -0
  380. package/dist/src/shell/pageStrings.js +4 -0
  381. package/dist/src/shell/pageTagView.d.ts +18 -0
  382. package/dist/src/shell/pageTagView.js +10 -0
  383. package/dist/src/shell/playMemory.d.ts +14 -0
  384. package/dist/src/shell/playMemory.js +8 -0
  385. package/dist/src/shell/propNotes.d.ts +23 -0
  386. package/dist/src/shell/propNotes.js +37 -0
  387. package/dist/src/shell/refIndexLoad.d.ts +17 -0
  388. package/dist/src/shell/refIndexLoad.js +38 -0
  389. package/dist/src/shell/refParts.d.ts +34 -0
  390. package/dist/src/shell/refParts.js +9 -0
  391. package/dist/src/shell/refStory.css +21 -0
  392. package/dist/src/shell/refStrings.d.ts +13 -0
  393. package/dist/src/shell/refStrings.js +21 -0
  394. package/dist/src/shell/search.css +11 -11
  395. package/dist/src/shell/shell.css +348 -168
  396. package/dist/src/shell/shellScheme.js +2 -2
  397. package/dist/src/shell/shortcutHelp.css +64 -0
  398. package/dist/src/shell/stageArgs.d.ts +53 -0
  399. package/dist/src/shell/stageArgs.js +64 -0
  400. package/dist/src/shell/statusBadges.css +51 -0
  401. package/dist/src/shell/strings.d.ts +7 -16
  402. package/dist/src/shell/strings.js +12 -17
  403. package/dist/src/shell/switchGallery.css +104 -0
  404. package/dist/src/shell/tagFilter.css +46 -0
  405. package/dist/src/shell/tagView.d.ts +20 -0
  406. package/dist/src/shell/tagView.js +10 -0
  407. package/dist/src/shell/useAddressArgs.d.ts +9 -0
  408. package/dist/src/shell/useAddressArgs.js +56 -11
  409. package/dist/src/shell/useControlKeys.js +2 -2
  410. package/dist/src/shell/useEditedProblems.d.ts +6 -0
  411. package/dist/src/shell/useEditedProblems.js +40 -0
  412. package/dist/src/shell/useFrameMessages.js +3 -0
  413. package/dist/src/shell/useListedTree.d.ts +13 -0
  414. package/dist/src/shell/useListedTree.js +32 -0
  415. package/dist/src/shell/usePageFrames.js +2 -2
  416. package/dist/src/shell/usePopover.d.ts +5 -0
  417. package/dist/src/shell/usePopover.js +7 -1
  418. package/dist/src/shell/useRefIndex.d.ts +22 -0
  419. package/dist/src/shell/useRefIndex.js +36 -0
  420. package/dist/src/shell/useScrollStops.d.ts +20 -0
  421. package/dist/src/shell/useScrollStops.js +41 -0
  422. package/dist/src/shell/useShortcutHelp.d.ts +18 -0
  423. package/dist/src/shell/useShortcutHelp.js +32 -0
  424. package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
  425. package/dist/src/shell/useSidebarOverlay.js +12 -4
  426. package/dist/src/shell/useStoryCode.d.ts +2 -1
  427. package/dist/src/shell/useStoryCode.js +12 -7
  428. package/dist/src/shell/useToolbarLayout.d.ts +5 -1
  429. package/dist/src/shell/useToolbarLayout.js +2 -2
  430. package/dist/src/shell/useWorstCase.d.ts +8 -2
  431. package/dist/src/shell/useWorstCase.js +2 -2
  432. package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
  433. package/dist/src/shell/valueEditors/FileEditor.js +66 -0
  434. package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
  435. package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
  436. package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
  437. package/dist/src/shell/valueEditors/ListEditor.js +82 -0
  438. package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
  439. package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
  440. package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
  441. package/dist/src/shell/valueEditors/PropEditor.js +53 -0
  442. package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
  443. package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
  444. package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
  445. package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
  446. package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
  447. package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
  448. package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
  449. package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
  450. package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
  451. package/dist/src/shell/valueEditors/ValueField.js +147 -0
  452. package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
  453. package/dist/src/shell/valueEditors/editorStrings.js +66 -0
  454. package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
  455. package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
  456. package/dist/src/shell/valueEditors/valueEditors.css +153 -0
  457. package/dist/src/shell/worstArgs.d.ts +8 -5
  458. package/dist/src/shell/worstArgs.js +14 -7
  459. package/dist/src/shellTheme.d.ts +1 -1
  460. package/dist/src/shellTheme.js +15 -1
  461. package/dist/src/shellTheme.types.d.ts +4 -0
  462. package/dist/src/shellWord.d.ts +12 -0
  463. package/dist/src/shellWord.js +15 -0
  464. package/dist/src/sourceFiles.js +2 -1
  465. package/dist/src/storyArgTypes.d.ts +57 -0
  466. package/dist/src/storyArgTypes.js +195 -0
  467. package/dist/src/storyBackground.js +14 -3
  468. package/dist/src/storyCheck.d.ts +85 -3
  469. package/dist/src/storyCheck.js +23 -1
  470. package/dist/src/storyCodeText.d.ts +46 -0
  471. package/dist/src/storyCodeText.js +27 -0
  472. package/dist/src/storyControls.d.ts +100 -0
  473. package/dist/src/storyControls.js +100 -0
  474. package/dist/src/storyStatuses.d.ts +55 -0
  475. package/dist/src/storyStatuses.js +104 -0
  476. package/dist/src/storyTagNames.d.ts +25 -0
  477. package/dist/src/storyTagNames.js +25 -0
  478. package/dist/src/storyTags.d.ts +29 -0
  479. package/dist/src/storyTags.js +85 -0
  480. package/dist/src/storyTree.d.ts +13 -0
  481. package/dist/src/storyTree.js +24 -4
  482. package/dist/src/storybookArgs.d.ts +24 -0
  483. package/dist/src/storybookArgs.js +185 -0
  484. package/dist/src/switches.d.ts +66 -3
  485. package/dist/src/switches.js +42 -1
  486. package/dist/src/valueSchema.d.ts +28 -0
  487. package/dist/src/valueSchema.js +196 -0
  488. package/dist/src/valueShape.d.ts +94 -0
  489. package/dist/src/valueShape.js +25 -0
  490. package/dist/src/viewState.d.ts +8 -3
  491. package/dist/src/viewState.js +27 -10
  492. package/dist/src/vite/adapter.d.ts +40 -2
  493. package/dist/src/vite/adapter.js +1 -0
  494. package/dist/src/vite/agent.types.d.ts +347 -7
  495. package/dist/src/vite/agentApi.d.ts +23 -0
  496. package/dist/src/vite/agentApi.js +90 -17
  497. package/dist/src/vite/agentIndex.d.ts +0 -2
  498. package/dist/src/vite/agentIndex.js +5 -6
  499. package/dist/src/vite/agentRoutes.d.ts +20 -1
  500. package/dist/src/vite/agentRoutes.js +106 -65
  501. package/dist/src/vite/agentStatuses.d.ts +42 -0
  502. package/dist/src/vite/agentStatuses.js +67 -0
  503. package/dist/src/vite/agentStoryCode.d.ts +48 -0
  504. package/dist/src/vite/agentStoryCode.js +38 -0
  505. package/dist/src/vite/agentVisibility.d.ts +47 -0
  506. package/dist/src/vite/agentVisibility.js +174 -0
  507. package/dist/src/vite/appAudit.d.ts +134 -0
  508. package/dist/src/vite/appAudit.js +333 -0
  509. package/dist/src/vite/appBuildOption.d.ts +53 -0
  510. package/dist/src/vite/appBuildOption.js +55 -0
  511. package/dist/src/vite/appTokenFiles.d.ts +92 -0
  512. package/dist/src/vite/appTokenFiles.js +433 -0
  513. package/dist/src/vite/appTokens.d.ts +23 -0
  514. package/dist/src/vite/appTokens.js +275 -0
  515. package/dist/src/vite/builtTexts.d.ts +10 -0
  516. package/dist/src/vite/builtTexts.js +59 -22
  517. package/dist/src/vite/catalogueConfig.d.ts +3 -1
  518. package/dist/src/vite/catalogueConfig.js +15 -3
  519. package/dist/src/vite/changeCoverage.d.ts +74 -0
  520. package/dist/src/vite/changeCoverage.js +120 -0
  521. package/dist/src/vite/changedRoute.d.ts +30 -0
  522. package/dist/src/vite/changedRoute.js +197 -0
  523. package/dist/src/vite/checkCode.d.ts +105 -3
  524. package/dist/src/vite/checkCode.js +323 -36
  525. package/dist/src/vite/checkoutWatch.d.ts +97 -0
  526. package/dist/src/vite/checkoutWatch.js +287 -0
  527. package/dist/src/vite/closeWatch.d.ts +8 -0
  528. package/dist/src/vite/closeWatch.js +1 -1
  529. package/dist/src/vite/componentCache.d.ts +8 -0
  530. package/dist/src/vite/componentCache.js +66 -0
  531. package/dist/src/vite/componentGraph.d.ts +71 -0
  532. package/dist/src/vite/componentGraph.js +133 -0
  533. package/dist/src/vite/componentRules.d.ts +33 -0
  534. package/dist/src/vite/componentRules.js +105 -0
  535. package/dist/src/vite/componentScan.d.ts +69 -0
  536. package/dist/src/vite/componentScan.js +418 -0
  537. package/dist/src/vite/compositionCheck.d.ts +15 -0
  538. package/dist/src/vite/compositionCheck.js +243 -0
  539. package/dist/src/vite/config.d.ts +32 -1
  540. package/dist/src/vite/configFile.d.ts +14 -2
  541. package/dist/src/vite/configFile.js +124 -40
  542. package/dist/src/vite/configKeys.d.ts +15 -0
  543. package/dist/src/vite/configKeys.js +171 -0
  544. package/dist/src/vite/configLoadError.d.ts +23 -0
  545. package/dist/src/vite/configLoadError.js +71 -0
  546. package/dist/src/vite/cssDeclarations.d.ts +71 -0
  547. package/dist/src/vite/cssDeclarations.js +290 -0
  548. package/dist/src/vite/cssImports.d.ts +14 -0
  549. package/dist/src/vite/cssImports.js +48 -0
  550. package/dist/src/vite/cssReferences.d.ts +54 -0
  551. package/dist/src/vite/cssReferences.js +157 -0
  552. package/dist/src/vite/cssTokenValues.d.ts +50 -0
  553. package/dist/src/vite/cssTokenValues.js +233 -0
  554. package/dist/src/vite/designTokens.d.ts +24 -0
  555. package/dist/src/vite/designTokens.js +5 -1
  556. package/dist/src/vite/docsExtractor.d.ts +9 -3
  557. package/dist/src/vite/docsExtractor.js +11 -3
  558. package/dist/src/vite/docsProgram.d.ts +17 -4
  559. package/dist/src/vite/docsProgram.js +52 -11
  560. package/dist/src/vite/docsWorker.js +7 -2
  561. package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
  562. package/dist/src/vite/emptyStoryGlobs.js +52 -0
  563. package/dist/src/vite/fileImports.d.ts +17 -0
  564. package/dist/src/vite/fileImports.js +57 -0
  565. package/dist/src/vite/findComponent.d.ts +10 -2
  566. package/dist/src/vite/findComponent.js +27 -22
  567. package/dist/src/vite/findRoute.js +3 -2
  568. package/dist/src/vite/forcedStates.d.ts +9 -2
  569. package/dist/src/vite/forcedStates.js +12 -3
  570. package/dist/src/vite/forgebookPlugin.d.ts +2 -0
  571. package/dist/src/vite/forgebookPlugin.js +52 -72
  572. package/dist/src/vite/frameErrors.d.ts +19 -0
  573. package/dist/src/vite/frameErrors.js +70 -0
  574. package/dist/src/vite/framesServer.d.ts +12 -0
  575. package/dist/src/vite/framesServer.js +21 -4
  576. package/dist/src/vite/functionComponentDocs.js +81 -12
  577. package/dist/src/vite/generatedModules.js +4 -2
  578. package/dist/src/vite/gitChange.d.ts +38 -5
  579. package/dist/src/vite/gitChange.js +71 -11
  580. package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
  581. package/dist/src/vite/hiddenStoryFiles.js +107 -0
  582. package/dist/src/vite/hotSnippets.d.ts +38 -14
  583. package/dist/src/vite/hotSnippets.js +137 -39
  584. package/dist/src/vite/importedNames.d.ts +37 -0
  585. package/dist/src/vite/importedNames.js +138 -0
  586. package/dist/src/vite/indexFields.d.ts +6 -0
  587. package/dist/src/vite/indexFields.js +21 -0
  588. package/dist/src/vite/indexStoryFile.d.ts +8 -1
  589. package/dist/src/vite/indexStoryFile.js +22 -157
  590. package/dist/src/vite/jsxCallSites.d.ts +33 -0
  591. package/dist/src/vite/jsxCallSites.js +200 -0
  592. package/dist/src/vite/jsxInScripts.d.ts +67 -0
  593. package/dist/src/vite/jsxInScripts.js +138 -0
  594. package/dist/src/vite/jsxTree.d.ts +20 -0
  595. package/dist/src/vite/jsxTree.js +163 -0
  596. package/dist/src/vite/lineAndColumn.d.ts +13 -0
  597. package/dist/src/vite/lineAndColumn.js +18 -0
  598. package/dist/src/vite/lookAlikes.d.ts +65 -0
  599. package/dist/src/vite/lookAlikes.js +228 -0
  600. package/dist/src/vite/nearestToken.d.ts +17 -0
  601. package/dist/src/vite/nearestToken.js +9 -2
  602. package/dist/src/vite/packageEntries.d.ts +42 -0
  603. package/dist/src/vite/packageEntries.js +127 -0
  604. package/dist/src/vite/pages.d.ts +9 -1
  605. package/dist/src/vite/pages.js +108 -4
  606. package/dist/src/vite/pluginConfig.js +4 -0
  607. package/dist/src/vite/pluginIds.d.ts +2 -0
  608. package/dist/src/vite/pluginIds.js +5 -1
  609. package/dist/src/vite/pluginModules.d.ts +81 -11
  610. package/dist/src/vite/pluginModules.js +109 -21
  611. package/dist/src/vite/prebundled.d.ts +57 -15
  612. package/dist/src/vite/prebundled.js +80 -0
  613. package/dist/src/vite/previewTags.d.ts +25 -0
  614. package/dist/src/vite/previewTags.js +56 -0
  615. package/dist/src/vite/projectFiles.d.ts +54 -0
  616. package/dist/src/vite/projectFiles.js +116 -0
  617. package/dist/src/vite/projectPostcss.d.ts +70 -0
  618. package/dist/src/vite/projectPostcss.js +250 -0
  619. package/dist/src/vite/propDocs.d.ts +12 -0
  620. package/dist/src/vite/propDocs.js +130 -58
  621. package/dist/src/vite/propKind.d.ts +40 -0
  622. package/dist/src/vite/propKind.js +71 -0
  623. package/dist/src/vite/propTypeNotes.d.ts +22 -0
  624. package/dist/src/vite/propTypeNotes.js +51 -0
  625. package/dist/src/vite/publishedExports.d.ts +27 -0
  626. package/dist/src/vite/publishedExports.js +298 -0
  627. package/dist/src/vite/realFolder.d.ts +6 -0
  628. package/dist/src/vite/realFolder.js +25 -0
  629. package/dist/src/vite/refsConfig.d.ts +39 -0
  630. package/dist/src/vite/refsConfig.js +54 -0
  631. package/dist/src/vite/reuseCheck.d.ts +45 -0
  632. package/dist/src/vite/reuseCheck.js +260 -0
  633. package/dist/src/vite/runningVersions.d.ts +33 -0
  634. package/dist/src/vite/runningVersions.js +25 -0
  635. package/dist/src/vite/scriptProblems.d.ts +60 -0
  636. package/dist/src/vite/scriptProblems.js +155 -0
  637. package/dist/src/vite/searchModule.js +3 -2
  638. package/dist/src/vite/searchRoute.js +4 -2
  639. package/dist/src/vite/shapeDocs.d.ts +36 -0
  640. package/dist/src/vite/shapeDocs.js +177 -0
  641. package/dist/src/vite/singleFileComponent.d.ts +17 -0
  642. package/dist/src/vite/singleFileComponent.js +83 -0
  643. package/dist/src/vite/sourceText.d.ts +34 -0
  644. package/dist/src/vite/sourceText.js +72 -0
  645. package/dist/src/vite/sourceTokens.d.ts +7 -0
  646. package/dist/src/vite/sourceTokens.js +7 -2
  647. package/dist/src/vite/stackLines.d.ts +49 -0
  648. package/dist/src/vite/stackLines.js +96 -0
  649. package/dist/src/vite/storyCode.d.ts +22 -7
  650. package/dist/src/vite/storyCode.js +263 -37
  651. package/dist/src/vite/storyCoverage.d.ts +48 -0
  652. package/dist/src/vite/storyCoverage.js +179 -0
  653. package/dist/src/vite/storyFilesModule.d.ts +48 -3
  654. package/dist/src/vite/storyFilesModule.js +105 -15
  655. package/dist/src/vite/storyPatterns.d.ts +31 -0
  656. package/dist/src/vite/storyPatterns.js +140 -5
  657. package/dist/src/vite/storyReach.d.ts +10 -2
  658. package/dist/src/vite/storyReach.js +15 -11
  659. package/dist/src/vite/storyTopLevel.d.ts +51 -0
  660. package/dist/src/vite/storyTopLevel.js +146 -0
  661. package/dist/src/vite/storylessRoutes.d.ts +4 -3
  662. package/dist/src/vite/storylessRoutes.js +210 -19
  663. package/dist/src/vite/switchValuesCheck.d.ts +19 -0
  664. package/dist/src/vite/switchValuesCheck.js +164 -0
  665. package/dist/src/vite/switchesDocument.d.ts +15 -0
  666. package/dist/src/vite/switchesDocument.js +47 -0
  667. package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
  668. package/dist/src/vite/tailwindConfigTokens.js +306 -0
  669. package/dist/src/vite/textImports.d.ts +15 -0
  670. package/dist/src/vite/textImports.js +58 -0
  671. package/dist/src/vite/textModules.d.ts +6 -5
  672. package/dist/src/vite/textModules.js +13 -8
  673. package/dist/src/vite/tokenAnswers.d.ts +6 -2
  674. package/dist/src/vite/tokenAnswers.js +11 -7
  675. package/dist/src/vite/typeParameters.d.ts +83 -0
  676. package/dist/src/vite/typeParameters.js +270 -0
  677. package/dist/src/vite/unionProps.d.ts +37 -0
  678. package/dist/src/vite/unionProps.js +121 -0
  679. package/dist/src/vite/unresolvedTokens.d.ts +20 -0
  680. package/dist/src/vite/unresolvedTokens.js +193 -0
  681. package/dist/src/vite/usageGraph.js +10 -52
  682. package/dist/src/vite/usageGuidance.d.ts +9 -2
  683. package/dist/src/vite/usageGuidance.js +36 -8
  684. package/dist/src/vite/usageImports.d.ts +35 -0
  685. package/dist/src/vite/usageImports.js +280 -0
  686. package/dist/src/vite/visibilityRoute.d.ts +16 -0
  687. package/dist/src/vite/visibilityRoute.js +320 -0
  688. package/dist/src/worstCase.d.ts +2 -0
  689. package/dist/src/worstCase.js +2 -0
  690. package/package.json +28 -8
@@ -1,4 +1,18 @@
1
+ import { propsMarkerLine, propsSignature } from "../../src/propsSignature.js";
1
2
  import { WORST_NUMBER, WORST_TEXT } from "../../src/worstCase.js";
3
+ /** The meta's decorators that draw every story inside the wrappers, outermost first; empty with none. */
4
+ const decoratorsCode = (wrappers) => {
5
+ if (wrappers.length === 0)
6
+ return "";
7
+ const open = wrappers.map((wrapper) => `<${wrapper.name}>`).join("");
8
+ const close = [...wrappers]
9
+ .reverse()
10
+ .map((wrapper) => `</${wrapper.name}>`)
11
+ .join("");
12
+ return `, decorators: [(Story) => ${open}<Story />${close}]`;
13
+ };
14
+ /** How many stories the uses add, the most telling first: past these, a file is long and says little more. */
15
+ const MAX_USE_STORIES = 3;
2
16
  /** A prop's name in words, for a text's value (`helperText` → `Helper text`). */
3
17
  const words = (name) => {
4
18
  const spaced = name.replace(/([a-z0-9])([A-Z])/g, "$1 $2").toLowerCase();
@@ -45,12 +59,37 @@ const argsCode = (args) => {
45
59
  const line = `{ ${pairs.join(", ")} }`;
46
60
  return line.length <= LINE_WIDTH ? line : `{\n${pairs.map((pair) => ` ${pair}`).join(",\n")}\n }`;
47
61
  };
48
- /** The required props' args, and the ones the type checker must point at, as comments. */
49
- const requiredArgs = (props) => {
62
+ /** The value the uses give a prop most often, the first met on a tie; none when no use gives it. */
63
+ const mostUsed = (uses, name) => {
64
+ const counts = new Map();
65
+ for (const use of uses) {
66
+ const value = use.args[name];
67
+ if (value !== undefined)
68
+ counts.set(value, (counts.get(value) ?? 0) + 1);
69
+ }
70
+ let best;
71
+ for (const [value, count] of counts)
72
+ if (best === undefined || count > (counts.get(best) ?? 0))
73
+ best = value;
74
+ return best;
75
+ };
76
+ /**
77
+ * The main story's args, and the props the type checker must point at, as comments: each required prop with the value
78
+ * the application gives it most, else one from its kind; and each other prop at least half the uses give, so the story
79
+ * shows the component as most pages draw it.
80
+ */
81
+ const mainArgs = (props, uses) => {
50
82
  const args = [];
51
83
  const todo = [];
52
- for (const prop of props.filter((each) => each.isRequired)) {
53
- const value = requiredCode(prop);
84
+ for (const prop of props) {
85
+ const used = mostUsed(uses, prop.name);
86
+ const given = uses.filter((use) => use.args[prop.name] !== undefined).length;
87
+ if (!prop.isRequired) {
88
+ if (used !== undefined && given * 2 >= uses.length)
89
+ args.push([prop.name, used]);
90
+ continue;
91
+ }
92
+ const value = used ?? requiredCode(prop);
54
93
  if (value === undefined)
55
94
  todo.push(`${prop.name}: ${prop.type}`);
56
95
  else
@@ -58,6 +97,31 @@ const requiredArgs = (props) => {
58
97
  }
59
98
  return { args, todo };
60
99
  };
100
+ /**
101
+ * The args a use gives, only those the component declares, over the main story's required ones: an optional value the
102
+ * main story took from other uses is not this use's.
103
+ */
104
+ const useArgs = (main, use, declared, required) => {
105
+ const given = Object.entries(use.args).filter(([name]) => declared.has(name));
106
+ return [...main.filter(([name]) => required.has(name) && use.args[name] === undefined), ...given];
107
+ };
108
+ /** A set of args as one key, whatever their order. */
109
+ const argsKey = (args) => args
110
+ .map(([name, value]) => `${name}=${value}`)
111
+ .sort()
112
+ .join("\n");
113
+ /** A use's story name, from the file that draws it (`src/pages/Checkout.tsx` → `InCheckout`), unique in the file. */
114
+ const useStoryName = (file, taken) => {
115
+ const base = `In${pascal(file
116
+ .split("/")
117
+ .pop()
118
+ ?.replace(/\.[^.]+$/, "") ?? "") || "Use"}`;
119
+ let name = base;
120
+ for (let index = 2; taken.has(name); index += 1)
121
+ name = `${base}${index}`;
122
+ taken.add(name);
123
+ return name;
124
+ };
61
125
  /**
62
126
  * The story file's text.
63
127
  *
@@ -68,7 +132,8 @@ export const newStories = (input) => {
68
132
  const { docs } = input;
69
133
  const name = docs.name;
70
134
  const type = `Story<typeof ${name}>`;
71
- const { args, todo } = requiredArgs(docs.props);
135
+ const uses = input.uses ?? [];
136
+ const { args, todo } = mainArgs(docs.props, uses);
72
137
  const todoLine = todo.length === 0 ? [] : [` // TODO: give ${todo.join(", ")}`];
73
138
  const story = (exportName, summary, storyArgs, parameters) => [
74
139
  `/** ${summary} */`,
@@ -81,6 +146,27 @@ export const newStories = (input) => {
81
146
  ];
82
147
  const choice = docs.props.find((prop) => prop.kind === "choice" && (prop.choices?.length ?? 0) > 1);
83
148
  const choiceStories = (choice?.choices ?? []).flatMap((value) => story(`${pascal(choice?.name ?? "")}${pascal(String(value))}`, `With ${choice?.name} ${JSON.stringify(value)}.`, [...args.filter(([prop]) => prop !== choice?.name), [choice?.name ?? "", JSON.stringify(value)]]));
149
+ // one story per distinct way the application draws it, the uses that give the most props first
150
+ const declared = new Set(docs.props.map((prop) => prop.name));
151
+ const required = new Set(docs.props.filter((prop) => prop.isRequired).map((prop) => prop.name));
152
+ const seen = new Set([argsKey(args)]);
153
+ const choiceNames = (choice?.choices ?? []).map((value) => `${pascal(choice?.name ?? "")}${pascal(String(value))}`);
154
+ const taken = new Set(["Default", "WorstCase", ...choiceNames]);
155
+ const declaredCount = (use) => Object.keys(use.args).filter((name) => declared.has(name)).length;
156
+ const useStories = [...uses]
157
+ .sort((left, right) => declaredCount(right) - declaredCount(left))
158
+ .flatMap((use) => {
159
+ const storyArgs = useArgs(args, use, declared, required);
160
+ const key = argsKey(storyArgs);
161
+ if (seen.has(key))
162
+ return [];
163
+ seen.add(key);
164
+ return [{ use, storyArgs }];
165
+ })
166
+ .slice(0, MAX_USE_STORIES)
167
+ .flatMap(({ use, storyArgs }) =>
168
+ // the path goes in a comment as a quoted string, so a name with `*/` or a line break in it stays text
169
+ story(useStoryName(use.file, taken), `As ${JSON.stringify(use.file).replaceAll("*/", "*\\/")} draws it.`, storyArgs));
84
170
  const worst = docs.props.flatMap((prop) => {
85
171
  if (prop.kind === "text" || prop.canTakeText === true)
86
172
  return [[prop.name, JSON.stringify(WORST_TEXT)]];
@@ -89,22 +175,26 @@ export const newStories = (input) => {
89
175
  return [];
90
176
  });
91
177
  const worstArgs = [...args.filter(([prop]) => !worst.some(([each]) => each === prop)), ...worst];
92
- return [
178
+ const parts = [
93
179
  "/**",
94
- ` * The stories of ${name}, written by \`forgebook new\` from its props: complete them by hand.`,
180
+ uses.length === 0
181
+ ? ` * The stories of ${name}, written by \`forgebook new\` from its props: complete them by hand.`
182
+ : ` * The stories of ${name}, written by \`forgebook new\` from its props and from where the application draws it: complete them by hand.`,
95
183
  " *",
96
184
  " * @module",
97
185
  " */",
186
+ propsMarkerLine(propsSignature(docs.props)),
98
187
  `import type { Meta, Story } from ${JSON.stringify(input.typesModule)};`,
99
188
  "",
100
189
  input.importStatement,
190
+ ...(input.wrappers ?? []).map((wrapper) => wrapper.importStatement),
101
191
  "",
102
- `export default { title: ${JSON.stringify(input.title)}, component: ${name} } satisfies Meta<typeof ${name}>;`,
192
+ `export default { title: ${JSON.stringify(input.title)}, component: ${name}${decoratorsCode(input.wrappers ?? [])} } satisfies Meta<typeof ${name}>;`,
103
193
  "",
104
194
  ...story("Default", `${name} as most pages use it.`, args, "{ main: true }"),
195
+ ...useStories,
105
196
  ...choiceStories,
106
197
  ...story("WorstCase", `Long texts and huge numbers, to see where ${name} breaks.`, worstArgs, '{ group: "worst-case" }')
107
- ]
108
- .join("\n")
109
- .replace(/\n+$/, "\n");
198
+ ];
199
+ return `${parts.join("\n").trimEnd()}\n`;
110
200
  };
@@ -1,9 +1,14 @@
1
+ import { type StoryWrapper } from "./newStories.ts";
1
2
  /** A component's first stories, ready to write. */
2
3
  export type NewStoriesFile = {
3
4
  /** Where they go: `<Component>.stories.tsx` beside the component, or the framework's own extension. */
4
5
  readonly file: string;
5
6
  /** The file's text. */
6
7
  readonly text: string;
8
+ /** How many places in the application draw the component, whose values the stories took. */
9
+ readonly uses: number;
10
+ /** Why the application's uses could not be read, when they could not: the stories are then written from props alone. */
11
+ readonly usesProblem?: string;
7
12
  };
8
13
  /**
9
14
  * A component's first stories.
@@ -11,7 +16,21 @@ export type NewStoriesFile = {
11
16
  * @param componentFile - the component's file, absolute.
12
17
  * @param exportName - the export to read; the file's only component when none.
13
18
  * @param framework - the framework the stories are written for (`react`); the catalogue's when none.
19
+ * @param wrappers - components every story is drawn inside (`--repair`); none by default.
14
20
  * @throws a `ScriptError` when the file is in no package, the framework cannot read it, or it exports no single
15
21
  * component.
16
22
  */
17
- export declare const newStoriesFile: (componentFile: string, exportName: string | undefined, framework: string | undefined) => Promise<NewStoriesFile>;
23
+ export declare const newStoriesFile: (componentFile: string, exportName: string | undefined, framework: string | undefined, wrappers?: readonly StoryWrapper[]) => Promise<NewStoriesFile>;
24
+ /**
25
+ * What `new --json` answers: the file written, and how many of the application's uses it took values from.
26
+ *
27
+ * @param written - the stories written.
28
+ * @param shown - the file as the command names it.
29
+ */
30
+ export declare const newStoriesDocument: (written: NewStoriesFile, shown: string) => Readonly<Record<string, unknown>>;
31
+ /**
32
+ * The end of the line that says a file was written, when its values came from the application.
33
+ *
34
+ * @param uses - how many places draw the component.
35
+ */
36
+ export declare const usesWords: (uses: number) => string;
@@ -31,16 +31,31 @@ const catalogueFramework = async (packageDir) => {
31
31
  const config = findConfigFile(packageDir);
32
32
  return config === undefined ? "react" : (await loadConfigFile(config)).framework.name;
33
33
  };
34
+ /**
35
+ * Where the application draws a component; why not, when the framework cannot say or reading failed: the stories are then
36
+ * written from its props alone rather than not at all.
37
+ */
38
+ const callSites = (docsModule, file, name) => {
39
+ if (docsModule.extractCallSites === undefined)
40
+ return [];
41
+ try {
42
+ return docsModule.extractCallSites(file, name);
43
+ }
44
+ catch (error) {
45
+ return error instanceof Error ? error.message : String(error);
46
+ }
47
+ };
34
48
  /**
35
49
  * A component's first stories.
36
50
  *
37
51
  * @param componentFile - the component's file, absolute.
38
52
  * @param exportName - the export to read; the file's only component when none.
39
53
  * @param framework - the framework the stories are written for (`react`); the catalogue's when none.
54
+ * @param wrappers - components every story is drawn inside (`--repair`); none by default.
40
55
  * @throws a `ScriptError` when the file is in no package, the framework cannot read it, or it exports no single
41
56
  * component.
42
57
  */
43
- export const newStoriesFile = async (componentFile, exportName, framework) => {
58
+ export const newStoriesFile = async (componentFile, exportName, framework, wrappers = []) => {
44
59
  const manifest = findUp("package.json", dirname(componentFile));
45
60
  if (manifest === undefined)
46
61
  throw new ScriptError(`${componentFile} is in no package`);
@@ -60,16 +75,40 @@ export const newStoriesFile = async (componentFile, exportName, framework) => {
60
75
  const importPath = `./${basename(componentFile).replace(/\.[cm]?[jt]sx?$/, "")}`;
61
76
  const shape = docsModule.storyFileShape?.(name, componentFile) ?? {
62
77
  extension: ".stories.tsx",
63
- importStatement: `import { ${name} } from ${JSON.stringify(importPath)};`
78
+ importStatement: `import ${component.isDefaultExport === true ? name : `{ ${name} }`} from ${JSON.stringify(importPath)};`
64
79
  };
65
80
  const file = join(dirname(componentFile), `${name}${shape.extension}`);
66
81
  // the title is read by `/`, so the path is written with them on Windows too
67
82
  const title = autoTitle(await titleBase(packageDir, file), VITE_PATHS.relative(packageDir, file)) ?? name;
83
+ // where the application draws it gives values a reader recognises, where props alone give their names
84
+ const found = callSites(docsModule, componentFile, exportName ?? (component.isDefaultExport === true ? "default" : name));
85
+ const self = VITE_PATHS.normalize(componentFile);
86
+ const uses = typeof found === "string" ? [] : found.filter((site) => VITE_PATHS.normalize(site.file) !== self);
68
87
  const text = newStories({
69
88
  docs: component.docs,
70
89
  importStatement: shape.importStatement,
71
90
  title,
72
- typesModule: docsModule.storyTypesModule ?? `@forgebook/${frameworkName}`
91
+ typesModule: docsModule.storyTypesModule ?? `@forgebook/${frameworkName}`,
92
+ wrappers,
93
+ uses: uses.map((site) => ({ file: VITE_PATHS.relative(packageDir, site.file), args: site.args }))
73
94
  });
74
- return { file, text };
95
+ return { file, text, uses: uses.length, ...(typeof found === "string" ? { usesProblem: found } : {}) };
75
96
  };
97
+ /**
98
+ * What `new --json` answers: the file written, and how many of the application's uses it took values from.
99
+ *
100
+ * @param written - the stories written.
101
+ * @param shown - the file as the command names it.
102
+ */
103
+ export const newStoriesDocument = (written, shown) => ({
104
+ schema: 1,
105
+ file: VITE_PATHS.normalize(shown),
106
+ uses: written.uses,
107
+ ...(written.usesProblem === undefined ? {} : { usesProblem: written.usesProblem })
108
+ });
109
+ /**
110
+ * The end of the line that says a file was written, when its values came from the application.
111
+ *
112
+ * @param uses - how many places draw the component.
113
+ */
114
+ export const usesWords = (uses) => uses === 0 ? "" : `, with the values of ${uses} place${uses === 1 ? "" : "s"} that draw it`;
@@ -13,7 +13,9 @@ export declare const unresolvedOf: (error: unknown) => string[];
13
13
  * Vite's `optimizeDeps` fails on an import it cannot resolve (stories that import a package not installed), where a
14
14
  * dev server only warns and pre-bundles the rest. So a failure that names such imports is tried once more with them
15
15
  * left out too, kept in a file every later server of the catalogue reads (`unresolvedFile`), which is what the server
16
- * would have done; any other failure is thrown, and the server does the work, as it always could. What an earlier
16
+ * would have done; any other failure is thrown, and the server does the work, as it always could. The first scan is a
17
+ * quick one, which leaves every script but the story files to the scanner (`ScanFindings.isQuick`); when it fails, a
18
+ * careful one reads every script past one that does not parse and names it. What an earlier
17
19
  * pre-bundling left out stays out unless it is forced: it is part of the pre-bundle's hash.
18
20
  *
19
21
  * @param config - the catalogue's configuration, read.
@@ -26,7 +26,9 @@ export const unresolvedOf = (error) => error instanceof Error
26
26
  * Vite's `optimizeDeps` fails on an import it cannot resolve (stories that import a package not installed), where a
27
27
  * dev server only warns and pre-bundles the rest. So a failure that names such imports is tried once more with them
28
28
  * left out too, kept in a file every later server of the catalogue reads (`unresolvedFile`), which is what the server
29
- * would have done; any other failure is thrown, and the server does the work, as it always could. What an earlier
29
+ * would have done; any other failure is thrown, and the server does the work, as it always could. The first scan is a
30
+ * quick one, which leaves every script but the story files to the scanner (`ScanFindings.isQuick`); when it fails, a
31
+ * careful one reads every script past one that does not parse and names it. What an earlier
30
32
  * pre-bundling left out stays out unless it is forced: it is part of the pre-bundle's hash.
31
33
  *
32
34
  * @param config - the catalogue's configuration, read.
@@ -36,14 +38,32 @@ export const prebundle = async (config, isForced) => {
36
38
  const { optimizeDeps, resolveConfig } = await import("vite");
37
39
  if (isForced)
38
40
  rmSync(unresolvedFile(config.dir), { force: true });
41
+ const optimize = async (isQuick) => {
42
+ await optimizeDeps(await resolveConfig(await catalogueVite(config, {}, "serve", false, isQuick), "serve"), isForced);
43
+ };
44
+ // what a failure names as unresolved is left out from then on; whether it named any
45
+ const leavesOut = (error) => {
46
+ const unresolved = unresolvedOf(error);
47
+ if (unresolved.length > 0)
48
+ keepUnresolved(config.dir, [...new Set([...unresolvedImports(config.dir), ...unresolved])]);
49
+ return unresolved.length > 0;
50
+ };
51
+ // once more without what a failure names as unresolved, as the server would have left it out
52
+ const attempt = async (isQuick) => {
53
+ try {
54
+ await optimize(isQuick);
55
+ }
56
+ catch (error) {
57
+ if (!leavesOut(error))
58
+ throw error;
59
+ await optimize(isQuick);
60
+ }
61
+ };
39
62
  try {
40
- await optimizeDeps(await resolveConfig(await catalogueVite(config, {}), "serve"), isForced);
63
+ await attempt(true);
41
64
  }
42
- catch (error) {
43
- const unresolved = unresolvedOf(error);
44
- if (unresolved.length === 0)
45
- throw error;
46
- keepUnresolved(config.dir, [...new Set([...unresolvedImports(config.dir), ...unresolved])]);
47
- await optimizeDeps(await resolveConfig(await catalogueVite(config, {}), "serve"), isForced);
65
+ catch {
66
+ // a script that does not parse stops the quick scan: the careful one reads past it and names it
67
+ await attempt(false);
48
68
  }
49
69
  };
@@ -0,0 +1,15 @@
1
+ import type { CommandNode, CommandScope } from "@ensiria/cli-kit/commands.types";
2
+ import { type ForgebookOptions } from "./catalogueCommands.ts";
3
+ /**
4
+ * Stories named after a changed file first, then the rest, each in the catalogue's order.
5
+ *
6
+ * @param ids - the stories' ids.
7
+ * @param files - the changed files.
8
+ */
9
+ export declare const orderedByName: (ids: readonly string[], files: readonly string[]) => readonly string[];
10
+ /**
11
+ * The command.
12
+ *
13
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
14
+ */
15
+ export declare const proofCommands: (forgebook: CommandScope<ForgebookOptions>) => Readonly<Record<string, CommandNode>>;
@@ -0,0 +1,212 @@
1
+ /**
2
+ * `forgebook proof`: a pull request's states against where it started, drawn in one run, for a comment made by CI.
3
+ *
4
+ * @remarks
5
+ * It exits zero once it has something to say, whatever a picture shows, since a picture that changed is for a person to
6
+ * judge. `--fail-on-verdict` holds it to `verify`'s verdict, so the workflow's check is not green on a failing one.
7
+ *
8
+ * @module
9
+ */
10
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
11
+ import { dirname, join, relative, resolve } from "node:path";
12
+ import { EXIT } from "@ensiria/cli-kit/constants";
13
+ import { formatJson } from "@ensiria/cli-kit/files";
14
+ import { ScriptError } from "@ensiria/cli-kit/script";
15
+ import { isChangedStoriesDocument, isStoriesDocument } from "../../src/vite/agentApi.js";
16
+ import { gitOutput } from "../../src/vite/gitChange.js";
17
+ import { catalogueClient } from "./agentClient.js";
18
+ import { COMMAND, configWithStoriesOf } from "./catalogueCommands.js";
19
+ import { runProof, writeProofFiles } from "./proofRun.js";
20
+ import { proofComment, proofPage } from "./proofText.js";
21
+ import { proofWorkflow, WORKFLOW_FILE } from "./proofWorkflow.js";
22
+ import { runStoriesCheck } from "./storyCheckRun.js";
23
+ import { runVerify } from "./verifyRun.js";
24
+ /** The most stories pictured unless told otherwise: a change to a shared sheet reaches them all. */
25
+ const MAX_STORIES = "30";
26
+ /** Writes the workflow into the repository the catalogue is in. */
27
+ const writeWorkflow = async (dir) => {
28
+ const root = (await gitOutput(dir, "rev-parse", "--show-toplevel")).trim();
29
+ const file = join(root, WORKFLOW_FILE);
30
+ if (existsSync(file))
31
+ throw new ScriptError(`${WORKFLOW_FILE} is already there: delete it to write it again`);
32
+ mkdirSync(dirname(file), { recursive: true });
33
+ writeFileSync(file, proofWorkflow(root, relative(root, dir).replaceAll("\\", "/")));
34
+ };
35
+ /** The catalogue's stories, or why it gave none. */
36
+ const storiesOf = async (client) => {
37
+ const answer = await client.ask("stories", new URLSearchParams());
38
+ return isStoriesDocument(answer.body)
39
+ ? answer.body
40
+ : `The catalogue answered ${answer.status} for its stories`;
41
+ };
42
+ /**
43
+ * Every story a change reaches, or why the catalogue gave none. A sheet every component imports reaches every story, and
44
+ * only the first are pictured, so those named after a changed file come first: they are the ones that show it.
45
+ */
46
+ const changedIdsOf = async (client, since) => {
47
+ const answer = await client.ask("changed", new URLSearchParams({ since }));
48
+ if (!isChangedStoriesDocument(answer.body))
49
+ return `The catalogue answered ${answer.status} for what the change reaches`;
50
+ const ids = answer.body.stories.map((story) => story.id);
51
+ return orderedByName(ids, answer.body.files);
52
+ };
53
+ /**
54
+ * Stories named after a changed file first, then the rest, each in the catalogue's order.
55
+ *
56
+ * @param ids - the stories' ids.
57
+ * @param files - the changed files.
58
+ */
59
+ export const orderedByName = (ids, files) => {
60
+ const plain = (text) => text.replace(/[^A-Za-z0-9]/g, "").toLowerCase();
61
+ const names = files
62
+ .flatMap((file) => {
63
+ const parts = file.split("/");
64
+ const stem = (parts.at(-1) ?? "").split(".")[0] ?? "";
65
+ return [stem === "index" ? "" : stem, parts.at(-2) ?? ""];
66
+ })
67
+ .map(plain)
68
+ .filter((name) => name.length > 2);
69
+ const isNamed = (id) => names.some((name) => plain(id).includes(name));
70
+ return [...ids.filter(isNamed), ...ids.filter((id) => !isNamed(id))];
71
+ };
72
+ /** Stops with a failure when the verdict is one a pipeline stops on and it was asked to. */
73
+ const stopOnVerdict = (document, isAsked) => {
74
+ if (isAsked && (document.verdict === "failed" || document.verdict === "not-verified"))
75
+ throw new ScriptError(document.summary, { exitCode: EXIT.failure, isReported: true });
76
+ };
77
+ /** Writes a proof's files, and gives its comment. */
78
+ const writtenProof = (out, document) => {
79
+ const comment = proofComment(document);
80
+ writeProofFiles(out, {
81
+ "proof.json": formatJson(document),
82
+ "comment.md": comment,
83
+ "index.html": proofPage(document)
84
+ });
85
+ return comment;
86
+ };
87
+ /** A count an option gives. */
88
+ const wholeCount = (text) => {
89
+ const count = Number(text);
90
+ if (!Number.isInteger(count) || count < 1)
91
+ throw new ScriptError("--max-stories takes a whole number from 1");
92
+ return count;
93
+ };
94
+ /** An option's folder, absolute, when it gives one. */
95
+ const resolved = (folder) => folder === undefined ? undefined : resolve(folder);
96
+ /**
97
+ * The command.
98
+ *
99
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
100
+ */
101
+ export const proofCommands = (forgebook) => ({
102
+ proof: forgebook.command({
103
+ summary: "Compare a change's states with where it started, both drawn in this run with nothing stored, and write the pull request's comment and pictures. A changed picture never fails it; --fail-on-verdict stops on verify's verdict.",
104
+ json: true,
105
+ options: {
106
+ base: {
107
+ type: "string",
108
+ valueName: "ref",
109
+ description: "The ref to compare with, from where the branch left it; required unless writing the workflow."
110
+ },
111
+ out: {
112
+ type: "string",
113
+ default: "forgebook-proof",
114
+ valueName: "folder",
115
+ description: "The folder for comment.md, proof.json, index.html and the pictures."
116
+ },
117
+ work: {
118
+ type: "string",
119
+ valueName: "folder",
120
+ description: "Where the base's checkout goes, while it runs; the system's temporary folder by default."
121
+ },
122
+ install: {
123
+ type: "string",
124
+ valueName: "command",
125
+ description: "What installs the base's checkout; the one its lockfile names by default."
126
+ },
127
+ all: {
128
+ type: "boolean",
129
+ description: "Every listed story, not only those the change reaches. With --base HEAD, shows whether two builds of one commit draw the same."
130
+ },
131
+ quick: { type: "boolean", description: "Only the default view of each story; the proof says so." },
132
+ "fail-on-verdict": {
133
+ type: "boolean",
134
+ description: "Exit non-zero, the proof written, when verify's verdict is not-verified or failed."
135
+ },
136
+ "max-stories": {
137
+ type: "string",
138
+ default: MAX_STORIES,
139
+ valueName: "count",
140
+ description: "The most stories pictured; the proof names those past it as not checked."
141
+ },
142
+ "write-workflow": {
143
+ type: "boolean",
144
+ description: `Write ${WORKFLOW_FILE}, for this repository's package manager and this catalogue, and stop.`
145
+ },
146
+ url: {
147
+ type: "string",
148
+ env: "FORGEBOOK_URL",
149
+ valueName: "address",
150
+ description: "Where forgebook dev runs, when not at Vite's default address (http://localhost:5173)."
151
+ }
152
+ },
153
+ examples: [
154
+ { command: `${COMMAND} proof --write-workflow`, description: "Set it up on a repository." },
155
+ {
156
+ command: `${COMMAND} proof --base origin/main --fail-on-verdict`,
157
+ description: "What the workflow runs."
158
+ },
159
+ {
160
+ command: `${COMMAND} proof --base HEAD --all`,
161
+ description: "Whether this project's pictures hold still between two builds."
162
+ }
163
+ ],
164
+ run: async ({ options, io, log, isJson }) => {
165
+ const config = await configWithStoriesOf(options.config);
166
+ if (options["write-workflow"] === true) {
167
+ await writeWorkflow(config.dir);
168
+ log.success(`${WORKFLOW_FILE} written`);
169
+ return;
170
+ }
171
+ const { base } = options;
172
+ if (base === undefined)
173
+ throw new ScriptError("Name the ref to compare with: --base origin/main");
174
+ const maxStories = wholeCount(options["max-stories"]);
175
+ const out = resolve(options.out);
176
+ const isQuick = options.quick === true;
177
+ const client = await catalogueClient(config, options.url);
178
+ try {
179
+ const document = await runProof({
180
+ config,
181
+ configFile: options.config,
182
+ say: (text) => log.info(text),
183
+ verify: (since) => runVerify({
184
+ dir: config.dir,
185
+ ask: client.ask,
186
+ check: (input) => runStoriesCheck(config, options.url, input)
187
+ }, { since, isQuick }),
188
+ stories: () => storiesOf(client),
189
+ changedIds: (since) => changedIdsOf(client, since)
190
+ }, {
191
+ base,
192
+ out,
193
+ work: resolved(options.work),
194
+ install: options.install,
195
+ isAll: options.all === true,
196
+ isQuick,
197
+ maxStories
198
+ });
199
+ if (typeof document === "string")
200
+ throw new ScriptError(document);
201
+ const comment = writtenProof(out, document);
202
+ io.stdout.write(isJson ? formatJson(document) : comment);
203
+ for (const each of isJson ? document.notChecked : [])
204
+ log.warn(each);
205
+ stopOnVerdict(document, options["fail-on-verdict"] === true);
206
+ }
207
+ finally {
208
+ await client.close();
209
+ }
210
+ }
211
+ })
212
+ });
@@ -0,0 +1,63 @@
1
+ import type { ProofDocument, StoriesDocument, VerifyDocument } from "../../src/vite/agent.types.ts";
2
+ import { type ResolvedConfig } from "../../src/vite/configFile.ts";
3
+ /** The files that make the proof, not what it shows: an edit to them is read by a person, whatever the pictures say. */
4
+ export declare const MAKES_THE_PROOF: RegExp;
5
+ /** What `runProof` is asked. */
6
+ export type ProofInput = {
7
+ /** The ref the change is compared with. */
8
+ readonly base: string;
9
+ /** The folder the proof is written in, absolute. */
10
+ readonly out: string;
11
+ /** Where the base's checkout goes, absolute; the system's temporary folder by default. */
12
+ readonly work: string | undefined;
13
+ /** The command that installs the base's checkout; from its lockfile by default. */
14
+ readonly install: string | undefined;
15
+ /** Every story, not only those the change reaches: what shows whether two builds of one commit draw the same. */
16
+ readonly isAll: boolean;
17
+ /** Only the default view of each story. */
18
+ readonly isQuick: boolean;
19
+ /** The most stories pictured; those past it are named as not checked. */
20
+ readonly maxStories: number;
21
+ };
22
+ /** What `runProof` reaches the change's catalogue through. */
23
+ export type ProofReach = {
24
+ /** The catalogue's configuration. */
25
+ readonly config: ResolvedConfig;
26
+ /** The configuration file named on the command line: each side's server is told the same. */
27
+ readonly configFile: string | undefined;
28
+ /** Answers whether the change is verified. */
29
+ readonly verify: (since: string) => Promise<VerifyDocument | string>;
30
+ /** Every story the catalogue lists. */
31
+ readonly stories: () => Promise<StoriesDocument | string>;
32
+ /** Every story a change reaches, by id: `verify` lists only the first of them. */
33
+ readonly changedIds: (since: string) => Promise<readonly string[] | string>;
34
+ /** Writes progress for a person. */
35
+ readonly say: (text: string) => void;
36
+ };
37
+ /**
38
+ * The listed stories' ids in a catalogue's answer.
39
+ *
40
+ * @param document - the answer.
41
+ */
42
+ export declare const listedIds: (document: StoriesDocument) => readonly string[];
43
+ /**
44
+ * Every story's id in a catalogue's answer, those listed nowhere among them.
45
+ *
46
+ * @param document - the answer.
47
+ */
48
+ export declare const allIds: (document: StoriesDocument) => readonly string[];
49
+ /**
50
+ * Compares a change with where it started, and writes the proof.
51
+ *
52
+ * @param reach - the change's catalogue.
53
+ * @param input - what is asked.
54
+ * @returns the proof, or why there can be none.
55
+ */
56
+ export declare const runProof: (reach: ProofReach, input: ProofInput) => Promise<ProofDocument | string>;
57
+ /**
58
+ * Writes a proof's files.
59
+ *
60
+ * @param out - the folder.
61
+ * @param files - each file's name and text.
62
+ */
63
+ export declare const writeProofFiles: (out: string, files: Readonly<Record<string, string>>) => void;