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
@@ -0,0 +1,205 @@
1
+ /**
2
+ * The GitHub workflow `forgebook proof --write-workflow` writes: the comparison in one job, the comment in another.
3
+ *
4
+ * @remarks
5
+ * The job that runs the branch's code holds no write token, and its checkout keeps no credential, so code under review
6
+ * has nothing to write with. It can still write what it likes in its result, so the job that posts, which runs nothing of
7
+ * the branch, trusts no text of it: it writes the comment itself from `proof.json`, every name in a code span or a fenced
8
+ * block with its backticks taken out, so nothing there is a mention, a link or an image, and it asks GitHub itself which
9
+ * files the pull request edits. `pull_request_target`, which would give a fork's code a write token, is never used. A
10
+ * fork's run has a read-only token, so the posting step cannot post: the proof stays in the run's summary and artefact.
11
+ *
12
+ * @module
13
+ */
14
+ import { existsSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { CHECKOUT, DOWNLOAD, SETUP_BUN, SETUP_NODE, SETUP_PNPM, UPLOAD } from "./workflowActions.js";
17
+ /** Where the workflow is written, from the repository's folder. */
18
+ export const WORKFLOW_FILE = ".github/workflows/forgebook-proof.yml";
19
+ /** Which of a pull request's files shape the run, as grep reads it; `proofRun.ts` holds the same for what it says itself. */
20
+ const MAKES_THE_PROOF_TEXT = String.raw `^(\.github/|patches/)|(^|/)(forgebook\.(config|preview)\.[^/]+|vite\.config\.[^/]+|package\.json|package-lock\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|yarn\.lock|bun\.lock|\.npmrc|\.yarnrc\.yml|\.pnpmfile\.c?js)$`;
21
+ /** What finds the comment again, so a new push replaces it. */
22
+ export const COMMENT_MARKER = "<!-- forgebook-proof -->";
23
+ /** A package manager, by the lockfile that names it, and how it installs exactly what is locked. */
24
+ const MANAGERS = [
25
+ {
26
+ lockfile: "pnpm-lock.yaml",
27
+ install: "pnpm install --frozen-lockfile",
28
+ setup: [` - uses: ${SETUP_PNPM}`],
29
+ run: "pnpm exec"
30
+ },
31
+ {
32
+ lockfile: "yarn.lock",
33
+ install: "yarn install --immutable",
34
+ setup: [" - run: corepack enable"],
35
+ run: "yarn exec"
36
+ },
37
+ {
38
+ lockfile: "bun.lock",
39
+ install: "bun install --frozen-lockfile",
40
+ setup: [` - uses: ${SETUP_BUN}`],
41
+ run: "bunx"
42
+ },
43
+ { lockfile: "package-lock.json", install: "npm ci", setup: [], run: "npx" }
44
+ ];
45
+ /**
46
+ * The command that installs what a checkout locks; none when no lockfile says.
47
+ *
48
+ * @param root - the checkout's folder.
49
+ */
50
+ export const installCommandOf = (root) => MANAGERS.find(({ lockfile }) => existsSync(join(root, lockfile)))?.install;
51
+ /**
52
+ * The comment, written from the proof by a job that trusts none of it, as jq reads it: `$files` are the edits GitHub names,
53
+ * `$run` the run's address, `$pictures` the pictures' address once checked. Backticks are written `\u0060` so this stays
54
+ * one template literal.
55
+ */
56
+ export const COMMENT_FILTER = String.raw `def word: tostring | gsub("[\u0060\r\n\t|]"; " ") | .[0:120];
57
+ def line: tostring | gsub("\u0060"; "'") | gsub("\r"; " ") | .[0:600];
58
+ def fence($lines): "\u0060\u0060\u0060text\n" + ($lines | map(line) | join("\n")) + "\n\u0060\u0060\u0060";
59
+ def row: "| \u0060 " + (.storyId | word) + " \u0060 | \u0060 " + ((if .view == "" then "default" else .view end) | word) + " \u0060 | "
60
+ + (if (.status | IN("changed","resized","new","broken","removed","unstable")) then .status else "unknown" end)
61
+ + " | " + ((.percent | tonumber? // 0) * 100 | round / 100 | tostring) + " % |";
62
+ [
63
+ "### Forgebook proof",
64
+ "",
65
+ "Made by this branch's own run, so a hostile branch could forge what follows. Files it edits that shape the run, as GitHub lists them:",
66
+ "",
67
+ (if ($files | length) == 0 then "None." else fence($files[:100]) end),
68
+ "",
69
+ (if $pictures == "" then "[The run](" + $run + ")" else "[Before and after pictures](" + $pictures + "): open index.html in the download." end),
70
+ "",
71
+ "#### States touched",
72
+ "",
73
+ ((.states | length | tostring) + " differ, " + (.same | tonumber? // 0 | tostring) + " the same."),
74
+ "",
75
+ (if (.states | length) == 0 then "" else "| Story | View | Compared with the base | Pixels |\n|---|---|---|---|\n" + (.states[:40] | map(row) | join("\n")) end),
76
+ "",
77
+ "#### Checked",
78
+ "",
79
+ fence(["verdict: " + (.verdict | tostring), .summary] + .checked),
80
+ "",
81
+ "#### Not checked",
82
+ "",
83
+ (if (.notChecked | length) == 0 then "Nothing this run knows of." else fence(.notChecked[:60]) end)
84
+ ] | join("\n")`;
85
+ /** What posts the comment, as the workflow's step runs it: with no proof, it says the run did not finish. */
86
+ const POST_SCRIPT = String.raw `marker='${COMMENT_MARKER}'
87
+ run_url="$GITHUB_SERVER_URL/$REPOSITORY/actions/runs/$RUN"
88
+ if gh api "repos/$REPOSITORY/pulls/$PULL/files" --paginate --jq '.[].filename' > files.txt; then
89
+ grep -E "$OWN_FILES" files.txt | jq -R . | jq -s . > own.json || echo '[]' > own.json
90
+ else
91
+ echo '["GitHub did not list the files: read them in the pull request"]' > own.json
92
+ fi
93
+ pictures=""
94
+ artifact_id=$(basename "$ARTIFACT")
95
+ case "$ARTIFACT" in
96
+ "$run_url/artifacts/$artifact_id")
97
+ if [ -n "$artifact_id" ] && [ -z "$(printf '%s' "$artifact_id" | tr -d 0-9)" ]; then pictures="$ARTIFACT"; fi
98
+ ;;
99
+ esac
100
+ if [ -s proof.json ] && text=$(jq -r --slurpfile own own.json --arg run "$run_url" --arg pictures "$pictures" "\$own[0] as \$files | $COMMENT_FILTER" proof.json); then
101
+ body="$marker"$'\n'"$text"
102
+ else
103
+ body="$marker"$'\n'"### Forgebook proof"$'\n\n'"This run did not finish, so nothing is proved for this commit: [read the run]($run_url)."
104
+ fi
105
+ found=$(gh api "repos/$REPOSITORY/issues/$PULL/comments" --paginate --jq ".[] | select(.user.login == \"github-actions[bot]\" and (.body | startswith(\"$marker\"))) | .id" | head -n 1)
106
+ if [ -n "$found" ]; then
107
+ gh api --method PATCH "repos/$REPOSITORY/issues/comments/$found" -f body="$body" > /dev/null
108
+ else
109
+ gh api --method POST "repos/$REPOSITORY/issues/$PULL/comments" -f body="$body" > /dev/null
110
+ fi`;
111
+ /** A block of text at a YAML block's indent. */
112
+ const indented = (text, spaces) => text
113
+ .split("\n")
114
+ .map((line) => (line === "" ? "" : `${" ".repeat(spaces)}${line}`))
115
+ .join("\n");
116
+ /**
117
+ * The job that posts, the same for every project.
118
+ *
119
+ * @param download - the action that fetches the proof, as `uses` writes it.
120
+ */
121
+ export const commentJob = (download) => ` comment:
122
+ needs: proof
123
+ if: \${{ !cancelled() }}
124
+ runs-on: ubuntu-latest
125
+ # runs nothing of the branch; a fork's token stays read-only whatever this asks
126
+ permissions:
127
+ pull-requests: write
128
+ steps:
129
+ - uses: ${download}
130
+ continue-on-error: true
131
+ with:
132
+ name: forgebook-proof
133
+ - name: Post one comment
134
+ continue-on-error: true
135
+ env:
136
+ GH_TOKEN: \${{ github.token }}
137
+ ARTIFACT: \${{ needs.proof.outputs.artifact }}
138
+ PULL: \${{ github.event.pull_request.number }}
139
+ REPOSITORY: \${{ github.repository }}
140
+ RUN: \${{ github.run_id }}
141
+ OWN_FILES: ${JSON.stringify(MAKES_THE_PROOF_TEXT)}
142
+ COMMENT_FILTER: |
143
+ ${indented(COMMENT_FILTER, 12)}
144
+ run: |
145
+ ${indented(POST_SCRIPT, 10)}
146
+ `;
147
+ /**
148
+ * The workflow's text.
149
+ *
150
+ * @param root - the repository's folder, whose lockfile names the package manager.
151
+ * @param catalogue - the catalogue's folder, relative to it; empty when it is the repository's.
152
+ */
153
+ export const proofWorkflow = (root, catalogue) => {
154
+ const manager = MANAGERS.find(({ lockfile }) => existsSync(join(root, lockfile))) ?? {
155
+ install: "npm install",
156
+ setup: [],
157
+ run: "npx"
158
+ };
159
+ const folder = catalogue === "" ? [] : [` working-directory: ${JSON.stringify(catalogue)}`];
160
+ return `# A picture of every state a pull request touches, against its base, drawn in this run with nothing stored.
161
+ name: forgebook proof
162
+ on:
163
+ pull_request:
164
+
165
+ # a newer push replaces the run, so an older one cannot overwrite its comment
166
+ concurrency:
167
+ group: forgebook-proof-\${{ github.event.pull_request.number }}
168
+ cancel-in-progress: true
169
+
170
+ jobs:
171
+ proof:
172
+ runs-on: ubuntu-latest
173
+ # what runs here is the branch's code: no write token, and no credential left in its checkout
174
+ permissions:
175
+ contents: read
176
+ outputs:
177
+ artifact: \${{ steps.pictures.outputs.artifact-url }}
178
+ steps:
179
+ - uses: ${CHECKOUT}
180
+ with:
181
+ fetch-depth: 0
182
+ persist-credentials: false
183
+ ${[...manager.setup, ""].join("\n")} - uses: ${SETUP_NODE}
184
+ with:
185
+ node-version: 24
186
+ - run: ${manager.install}
187
+ - run: ${manager.run} playwright install --with-deps chromium
188
+ - name: Compare the base and this branch
189
+ ${[...folder, ""].join("\n")} run: ${manager.run} forgebook proof --base "origin/$BASE_REF" --out "$RUNNER_TEMP/forgebook-proof" --fail-on-verdict
190
+ env:
191
+ BASE_REF: \${{ github.base_ref }}
192
+ - name: Keep the proof in the run's summary
193
+ if: \${{ !cancelled() }}
194
+ run: cat "$RUNNER_TEMP/forgebook-proof/comment.md" >> "$GITHUB_STEP_SUMMARY" || true
195
+ - id: pictures
196
+ if: \${{ !cancelled() }}
197
+ uses: ${UPLOAD}
198
+ with:
199
+ name: forgebook-proof
200
+ path: \${{ runner.temp }}/forgebook-proof
201
+ if-no-files-found: ignore
202
+ retention-days: 14
203
+
204
+ ${commentJob(DOWNLOAD)}`;
205
+ };
@@ -0,0 +1,8 @@
1
+ import type { McpTool } from "../../src/vite/mcpProtocol.ts";
2
+ import { type Ask } from "./mcpToolParts.ts";
3
+ /**
4
+ * The tool that gives a story's links, with values when it is given some.
5
+ *
6
+ * @param ask - asks the catalogue.
7
+ */
8
+ export declare const storyAddressTool: (ask: Ask) => McpTool;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `story_address`: a story's links; given values, those that open it with the ones it takes, and what it left out, checked
3
+ * by the catalogue as a link's values are.
4
+ *
5
+ * @module
6
+ */
7
+ import { isStoriesDocument, isStoryDocument } from "../../src/vite/agentApi.js";
8
+ import { namedStory } from "../../src/vite/agentIds.js";
9
+ import { resultOf, textOf, VIEW } from "./mcpToolParts.js";
10
+ /** The tool's `args`, as an agent is told of them. */
11
+ const SET_ARGS_PROPERTY = {
12
+ type: "object",
13
+ description: 'Values to set, by prop, as plain JSON: nested objects and lists as their shape says, `{ "of": type, "named": name }` for a named value, `{ "forgebookUnset": true }` for no value over the story\'s own.'
14
+ };
15
+ /**
16
+ * The answer.
17
+ *
18
+ * @param ask - asks the catalogue.
19
+ * @param id - the story's id.
20
+ * @param view - the view the links open in.
21
+ * @param values - the values, as the tool received them.
22
+ */
23
+ const setArgsResult = async (ask, id, view, values) => {
24
+ const params = new URLSearchParams({ id, view: view ?? "", args: JSON.stringify(values) });
25
+ const answer = await ask("story", params);
26
+ if (answer.status !== 200 || !isStoryDocument(answer.body))
27
+ return resultOf(answer);
28
+ const { story, setArgs, problems } = answer.body;
29
+ return {
30
+ structured: {
31
+ id: story.id,
32
+ links: story.links,
33
+ accepted: setArgs?.accepted ?? {},
34
+ dropped: setArgs?.dropped ?? [],
35
+ problems
36
+ },
37
+ isError: false
38
+ };
39
+ };
40
+ /**
41
+ * The tool that gives a story's links, with values when it is given some.
42
+ *
43
+ * @param ask - asks the catalogue.
44
+ */
45
+ export const storyAddressTool = (ask) => ({
46
+ name: "story_address",
47
+ description: "The links that open a story in the catalogue, in its frame alone, and with no chrome for a wiki or Notion (embed), in the view asked for: give them to a person to look at what you describe. With args, the links open the story with those values, once checked as a link's are against the controls get_story lists; what it takes and what it leaves out are in the answer.",
48
+ inputSchema: {
49
+ type: "object",
50
+ properties: {
51
+ id: { type: "string", description: "The story's id, as list_stories gives it." },
52
+ view: VIEW,
53
+ args: SET_ARGS_PROPERTY
54
+ },
55
+ required: ["id"],
56
+ additionalProperties: false
57
+ },
58
+ call: async (args) => {
59
+ const id = textOf(args, "id") ?? "";
60
+ if (args["args"] !== undefined)
61
+ return setArgsResult(ask, id, textOf(args, "view"), args["args"]);
62
+ const answer = await ask("stories", new URLSearchParams({ view: textOf(args, "view") ?? "" }));
63
+ if (answer.status !== 200 || !isStoriesDocument(answer.body))
64
+ return resultOf(answer);
65
+ const named = namedStory(answer.body, id);
66
+ return named === undefined
67
+ ? { structured: { error: `No story "${id}"` }, isError: true }
68
+ : { structured: { id: named.story.id, links: named.story.links }, isError: false };
69
+ }
70
+ });
@@ -2,9 +2,32 @@ import { EXIT } from "@ensiria/cli-kit/constants";
2
2
  import { formatJson } from "@ensiria/cli-kit/files";
3
3
  import { ScriptError } from "@ensiria/cli-kit/script";
4
4
  import { checkText } from "./agentText.js";
5
- import { COMMAND, configOf } from "./catalogueCommands.js";
5
+ import { COMMAND, configWithStoriesOf } from "./catalogueCommands.js";
6
6
  import { SEMANTIC_OPTIONS, semanticModelOf } from "./semanticOptions.js";
7
7
  import { runStoryCheck } from "./storyCheckRun.js";
8
+ import { runStoryStress } from "./stressRun.js";
9
+ import { isStressFailure, stressText } from "./stressText.js";
10
+ /** Refuses what `--stress` does not take: it chooses its own values and views. */
11
+ const refuseWithStress = (options) => {
12
+ if ((options.view ?? []).length > 0 || options["all-variants"] === true || options.semantic === true)
13
+ throw new ScriptError("--stress chooses its own values and views: leave out --view, --all-variants and --semantic", {
14
+ exitCode: EXIT.usage
15
+ });
16
+ };
17
+ /** Runs the stress matrix and prints it, failing when a case breaks what the plain story does not. */
18
+ const stressRun = async ({ config, url, id, io, log, isJson }) => {
19
+ const stressed = await runStoryStress(config, url, id);
20
+ if (typeof stressed === "string")
21
+ throw new ScriptError(stressed);
22
+ io.stdout.write(isJson ? formatJson(stressed) : `${stressText(stressed)}\n`);
23
+ for (const each of isJson ? (stressed.skipped ?? []) : [])
24
+ log.warn(each);
25
+ if (isStressFailure(stressed))
26
+ throw new ScriptError("A case breaks what the plain story does not", {
27
+ exitCode: EXIT.failure,
28
+ isReported: true
29
+ });
30
+ };
8
31
  /**
9
32
  * The command.
10
33
  *
@@ -29,6 +52,10 @@ export const storyCheckCommands = (forgebook) => ({
29
52
  type: "boolean",
30
53
  description: "Also ask the configured model, sending it each story's tree and picture."
31
54
  },
55
+ stress: {
56
+ type: "boolean",
57
+ description: "Draw it with worst-case values and views it never declared (long text, unbreakable words, huge numbers, empty, right to left, 200 % zoom, narrow, dark, more contrast), with no story written, and report what each breaks that the plain story does not."
58
+ },
32
59
  ...SEMANTIC_OPTIONS,
33
60
  url: {
34
61
  type: "string",
@@ -48,10 +75,19 @@ export const storyCheckCommands = (forgebook) => ({
48
75
  {
49
76
  command: `${COMMAND} check kit:inputs-select --view "theme=dark" --json`,
50
77
  description: "Every story of a component, in the dark theme, as JSON."
78
+ },
79
+ {
80
+ command: `${COMMAND} check kit:inputs-select--overview --stress --json`,
81
+ description: "The states nobody wrote a story for."
51
82
  }
52
83
  ],
53
- run: async ({ args, options, io, isJson, style }) => {
54
- const config = await configOf(options.config);
84
+ run: async ({ args, options, io, log, isJson, style }) => {
85
+ const config = await configWithStoriesOf(options.config);
86
+ if (options.stress === true) {
87
+ refuseWithStress(options);
88
+ await stressRun({ config, url: options.url, id: args.id, io, log, isJson });
89
+ return;
90
+ }
55
91
  const report = await runStoryCheck(config, options.url, {
56
92
  id: args.id,
57
93
  views: options.view ?? [],
@@ -64,6 +100,9 @@ export const storyCheckCommands = (forgebook) => ({
64
100
  const problems = report.results.reduce((count, result) => count + result.problems.length, 0);
65
101
  if (problems > 0)
66
102
  throw new ScriptError(`${problems} problems`, { exitCode: EXIT.failure, isReported: true });
103
+ const notVerified = report.results.filter((result) => result.notVerified !== undefined).length;
104
+ if (notVerified > 0)
105
+ throw new ScriptError(`${notVerified} not verified`, { exitCode: EXIT.failure, isReported: true });
67
106
  }
68
107
  })
69
108
  });
@@ -2,6 +2,17 @@ import { type DeviceDefault } from "../../src/deviceView.ts";
2
2
  import { type SemanticModel, type StoryCheckReport, type StoryCheckStory, type StoryDiffReport, type StoryDiffRequest, type StoryShotReport } from "../../src/storyCheck.ts";
3
3
  import type { StoriesDocument } from "../../src/vite/agent.types.ts";
4
4
  import type { ResolvedConfig } from "../../src/vite/configFile.ts";
5
+ /** What a run on several stories is asked: their ids, and whether to run every variant. */
6
+ export type StoriesCheckInput = {
7
+ /** The stories' ids. */
8
+ readonly ids: readonly string[];
9
+ /** Story files, absolute, whose stories run too: a file just written has no id a caller knows yet. */
10
+ readonly files?: readonly string[];
11
+ /** Serve the catalogue for the run even when a dev server runs: a file just written must be read as it is now. */
12
+ readonly isOwnServer?: boolean;
13
+ /** Run every variant the catalogue's browser tests check; else the default view. */
14
+ readonly isAllVariants: boolean;
15
+ };
5
16
  /** What a run is asked: the id, the views and whether to run every variant. */
6
17
  export type StoryCheckInput = {
7
18
  /** A story's id, or a component's for its listed stories. */
@@ -32,6 +43,12 @@ export declare const storiesNamed: (document: StoriesDocument, id: string, catal
32
43
  * @returns the function, or why it cannot be had.
33
44
  */
34
45
  export declare const testingFunction: (dir: string, specifier: string, name: string) => Promise<((request: unknown) => Promise<unknown>) | string>;
46
+ /**
47
+ * The catalogue's stories, asked of its served address.
48
+ *
49
+ * @param origin - where it is served.
50
+ */
51
+ export declare const storiesAt: (origin: string) => Promise<StoriesDocument | string>;
35
52
  /**
36
53
  * Runs the catalogue's checks.
37
54
  *
@@ -42,6 +59,15 @@ export declare const testingFunction: (dir: string, specifier: string, name: str
42
59
  * @returns the report, or why the check could not run.
43
60
  */
44
61
  export declare const runStoryCheck: (config: ResolvedConfig, url: string | undefined, input: StoryCheckInput, model?: SemanticModel | string) => Promise<StoryCheckReport | string>;
62
+ /**
63
+ * Runs the catalogue's checks on several stories, on one browser and one server: what `verify` asks.
64
+ *
65
+ * @param config - the catalogue's configuration.
66
+ * @param url - where `forgebook dev` runs, when not at Vite's default address.
67
+ * @param input - the stories, and whether to check every variant.
68
+ * @returns the report, or why the check could not run.
69
+ */
70
+ export declare const runStoriesCheck: (config: ResolvedConfig, url: string | undefined, input: StoriesCheckInput) => Promise<StoryCheckReport | string>;
45
71
  /**
46
72
  * Takes the stories' pictures.
47
73
  *
@@ -73,6 +99,30 @@ export declare const runStoryDiff: (config: ResolvedConfig, url: string | undefi
73
99
  readonly baselines: string;
74
100
  readonly outDir: string;
75
101
  }) => Promise<StoryDiffReport | string>;
102
+ /**
103
+ * Takes several stories' pictures from one server and no other: what `proof` asks of each side.
104
+ *
105
+ * @param config - the catalogue's configuration, whose testing package and switches both sides are drawn with.
106
+ * @param origin - the server.
107
+ * @param input - the stories, and whether to picture every variant.
108
+ * @param outDir - the folder the pictures go in, absolute.
109
+ * @returns the pictures, or why they could not be taken.
110
+ */
111
+ export declare const runStoriesShot: (config: ResolvedConfig, origin: string, input: StoriesCheckInput, outDir: string) => Promise<StoryShotReport | string>;
112
+ /**
113
+ * Compares several stories' pictures with a folder of pictures, from one server and no other: what `proof` asks of the
114
+ * change.
115
+ *
116
+ * @param config - the catalogue's configuration.
117
+ * @param origin - the server.
118
+ * @param input - the stories, and whether to compare every variant.
119
+ * @param folders - the pictures to compare with and the folder the new ones go in, absolute.
120
+ * @returns the results, or why they could not be had.
121
+ */
122
+ export declare const runStoriesDiff: (config: ResolvedConfig, origin: string, input: StoriesCheckInput, folders: {
123
+ readonly baselines: string;
124
+ readonly outDir: string;
125
+ }) => Promise<StoryDiffReport | string>;
76
126
  /**
77
127
  * Checks pages of an application.
78
128
  *
@@ -31,8 +31,11 @@ import { isStoriesDocument } from "../../src/vite/agentApi.js";
31
31
  import { formerIdOf, namedComponent, namedStory } from "../../src/vite/agentIds.js";
32
32
  import { AGENT_API } from "../../src/vite/agentRoutes.js";
33
33
  import { servedCatalogue } from "./agentClient.js";
34
+ import { idsOfFiles } from "./storyFileIds.js";
34
35
  /** What the project installs to run the stories in a browser, and how. */
35
- const INSTALL = "Stories run in a browser with @forgebook/testing: npm install -D @forgebook/testing @playwright/test, then npx playwright install chromium";
36
+ const INSTALL = "Stories run in a browser with @forgebook/testing: npm install -D @forgebook/testing @playwright/test, then forgebook browser";
37
+ /** How many pages a run on several stories opens at once: enough to matter, few enough for a laptop or a CI runner. */
38
+ const STORIES_AT_ONCE = 4;
36
39
  /**
37
40
  * A story of the document as a check reads it.
38
41
  *
@@ -44,6 +47,7 @@ const checkedStory = (component, story, catalogueDevice) => {
44
47
  const formerId = formerIdOf(component, story);
45
48
  return {
46
49
  id: story.id,
50
+ file: story.file,
47
51
  ...(formerId === undefined ? {} : { formerId }),
48
52
  ...(story.height === undefined ? {} : { height: story.height }),
49
53
  ...(story.isLogic ? { isLogic: true } : {}),
@@ -97,8 +101,12 @@ export const testingFunction = async (dir, specifier, name) => {
97
101
  try {
98
102
  resolved = createRequire(join(dir, "package.json")).resolve(specifier);
99
103
  }
100
- catch {
101
- return INSTALL;
104
+ catch (error) {
105
+ // installed, and older than the function asked for
106
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
107
+ return code === "ERR_PACKAGE_PATH_NOT_EXPORTED"
108
+ ? `${specifier} is not in this @forgebook/testing: update it`
109
+ : INSTALL;
102
110
  }
103
111
  const module = await import(__rewriteRelativeImportExtension(pathToFileURL(resolved).href));
104
112
  if (typeof module !== "object" || module === null || !(name in module))
@@ -116,7 +124,7 @@ export const testingFunction = async (dir, specifier, name) => {
116
124
  *
117
125
  * @param origin - where it is served.
118
126
  */
119
- const storiesAt = async (origin) => {
127
+ export const storiesAt = async (origin) => {
120
128
  const response = await fetch(`${origin}${AGENT_API}stories`);
121
129
  const body = await response.json();
122
130
  return isStoriesDocument(body) ? body : `The catalogue answered ${response.status} for its stories`;
@@ -135,17 +143,20 @@ const runOnStories = async (config, url, input, run) => {
135
143
  if (typeof call === "string")
136
144
  return call;
137
145
  const switches = catalogueSwitches(config.switches, config.languages, config.lists.controls);
138
- const views = queriesOf(input.views, switches);
146
+ const views = queriesOf(input.views ?? [], switches);
139
147
  if (typeof views === "string")
140
148
  return views;
141
- const served = await servedCatalogue(config, url);
149
+ const served = run.exactOrigin === undefined
150
+ ? await servedCatalogue(config, url, "ids" in input && input.isOwnServer === true)
151
+ : { origin: run.exactOrigin, close: async () => undefined };
142
152
  try {
143
153
  const document = await storiesAt(served.origin);
144
154
  if (typeof document === "string")
145
155
  return document;
146
- const stories = storiesNamed(document, input.id, deviceDefaultOf(NO_DEVICE, config.lists.device));
156
+ const ids = "ids" in input ? [...input.ids, ...idsOfFiles(document, config.dir, input.files ?? [])] : [input.id];
157
+ const stories = ids.flatMap((id) => storiesNamed(document, id, deviceDefaultOf(NO_DEVICE, config.lists.device)));
147
158
  if (stories.length === 0)
148
- return `No story or component "${input.id}"`;
159
+ return `No story or component "${ids.join(", ")}"`;
149
160
  const request = {
150
161
  frameUrl: `${served.origin}/frame.html`,
151
162
  stories,
@@ -154,7 +165,11 @@ const runOnStories = async (config, url, input, run) => {
154
165
  views,
155
166
  isAllVariants: input.isAllVariants
156
167
  };
157
- return await call({ ...request, ...run.extra(document) });
168
+ return await call({
169
+ ...request,
170
+ ...("ids" in input ? { concurrency: STORIES_AT_ONCE } : {}),
171
+ ...run.extra(document)
172
+ });
158
173
  }
159
174
  finally {
160
175
  await served.close();
@@ -182,6 +197,24 @@ export const runStoryCheck = async (config, url, input, model) => {
182
197
  return answer;
183
198
  return "@forgebook/testing/check answered something that is not a check's report";
184
199
  };
200
+ /**
201
+ * Runs the catalogue's checks on several stories, on one browser and one server: what `verify` asks.
202
+ *
203
+ * @param config - the catalogue's configuration.
204
+ * @param url - where `forgebook dev` runs, when not at Vite's default address.
205
+ * @param input - the stories, and whether to check every variant.
206
+ * @returns the report, or why the check could not run.
207
+ */
208
+ export const runStoriesCheck = async (config, url, input) => {
209
+ const answer = await runOnStories(config, url, input, {
210
+ specifier: "@forgebook/testing/check",
211
+ name: "checkStories",
212
+ extra: () => ({})
213
+ });
214
+ if (typeof answer === "string" || isStoryCheckReport(answer))
215
+ return answer;
216
+ return "@forgebook/testing/check answered something that is not a check's report";
217
+ };
185
218
  /**
186
219
  * Takes the stories' pictures.
187
220
  *
@@ -234,6 +267,47 @@ export const runStoryDiff = async (config, url, input, folders) => {
234
267
  return answer;
235
268
  return "@forgebook/testing/diff answered something that is not a comparison's report";
236
269
  };
270
+ /**
271
+ * Takes several stories' pictures from one server and no other: what `proof` asks of each side.
272
+ *
273
+ * @param config - the catalogue's configuration, whose testing package and switches both sides are drawn with.
274
+ * @param origin - the server.
275
+ * @param input - the stories, and whether to picture every variant.
276
+ * @param outDir - the folder the pictures go in, absolute.
277
+ * @returns the pictures, or why they could not be taken.
278
+ */
279
+ export const runStoriesShot = async (config, origin, input, outDir) => {
280
+ const answer = await runOnStories(config, origin, input, {
281
+ specifier: "@forgebook/testing/shot",
282
+ name: "shotStories",
283
+ exactOrigin: origin,
284
+ extra: () => ({ outDir })
285
+ });
286
+ if (typeof answer === "string" || isStoryShotReport(answer))
287
+ return answer;
288
+ return "@forgebook/testing/shot answered something that is not a picture run's report";
289
+ };
290
+ /**
291
+ * Compares several stories' pictures with a folder of pictures, from one server and no other: what `proof` asks of the
292
+ * change.
293
+ *
294
+ * @param config - the catalogue's configuration.
295
+ * @param origin - the server.
296
+ * @param input - the stories, and whether to compare every variant.
297
+ * @param folders - the pictures to compare with and the folder the new ones go in, absolute.
298
+ * @returns the results, or why they could not be had.
299
+ */
300
+ export const runStoriesDiff = async (config, origin, input, folders) => {
301
+ const answer = await runOnStories(config, origin, input, {
302
+ specifier: "@forgebook/testing/diff",
303
+ name: "diffStories",
304
+ exactOrigin: origin,
305
+ extra: () => folders
306
+ });
307
+ if (typeof answer === "string" || isStoryDiffReport(answer))
308
+ return answer;
309
+ return "@forgebook/testing/diff answered something that is not a comparison's report";
310
+ };
237
311
  /**
238
312
  * Checks pages of an application.
239
313
  *
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The ids of the stories a catalogue lists for some story files: `forgebook new --repair` checks the file it just
3
+ * wrote, whose ids no caller knows yet.
4
+ *
5
+ * @module
6
+ */
7
+ import type { StoriesDocument } from "../../src/vite/agent.types.ts";
8
+ /**
9
+ * The ids of the listed stories of some story files.
10
+ *
11
+ * @param document - the catalogue's stories.
12
+ * @param dir - the catalogue's folder, which the document's files are relative to.
13
+ * @param files - the files, absolute.
14
+ */
15
+ export declare const idsOfFiles: (document: StoriesDocument, dir: string, files: readonly string[]) => string[];
@@ -0,0 +1,14 @@
1
+ import { VITE_PATHS } from "../../src/vite/vitePaths.js";
2
+ /**
3
+ * The ids of the listed stories of some story files.
4
+ *
5
+ * @param document - the catalogue's stories.
6
+ * @param dir - the catalogue's folder, which the document's files are relative to.
7
+ * @param files - the files, absolute.
8
+ */
9
+ export const idsOfFiles = (document, dir, files) => {
10
+ const wanted = new Set(files.map((file) => VITE_PATHS.normalize(file)));
11
+ return document.components.flatMap((component) => component.stories
12
+ .filter((story) => story.file !== undefined && wanted.has(VITE_PATHS.resolve(dir, story.file)))
13
+ .map((story) => story.id));
14
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The cases of a stress run, from a story's props and the catalogue's switches: what `forgebook check --stress` asks the
3
+ * testing package to draw, with no story written.
4
+ *
5
+ * @remarks
6
+ * Pure. Only text a person reads is filled: a prop that names something (an id, a class, an address) is left alone. A text case needs a prop that takes text, a number case one that takes a number: a case with nothing to set is
7
+ * named as not run, never counted as passed. The values are the ones `forgebook new` writes in a story's worst case
8
+ * (`worstCase.ts`), so both test the same edges. Right to left uses the catalogue's direction switch when it has one,
9
+ * with text in a right-to-left script; dark and contrast use its scheme and contrast switches, and are not run without them.
10
+ *
11
+ * @module
12
+ */
13
+ import type { StressCaseRequest } from "../../src/storyCheck.ts";
14
+ import type { StoryControl } from "../../src/storyControls.ts";
15
+ import { type ViewSwitch } from "../../src/switches.ts";
16
+ /** Text in a right-to-left script, with a number and a Latin word in it, as real content mixes them. */
17
+ export declare const RTL_TEXT = "\u0645\u0631\u062D\u0628\u0627 \u0628\u0627\u0644\u0639\u0627\u0644\u0645\u060C \u0647\u0630\u0627 \u0646\u0635 \u0637\u0648\u064A\u0644 \u0628\u0639\u0636 \u0627\u0644\u0634\u064A\u0621 12345 Forgebook";
18
+ /** The cases a run asks for, and those it could not. */
19
+ export type StressPlan = {
20
+ /** The cases to draw. */
21
+ readonly cases: readonly StressCaseRequest[];
22
+ /** The cases not run, and why. */
23
+ readonly skipped: readonly string[];
24
+ };
25
+ /**
26
+ * The cases for one story.
27
+ *
28
+ * @param controls - the props its values can set, as `forgebook story` lists them.
29
+ * @param switches - the catalogue's switches.
30
+ */
31
+ export declare const stressPlan: (controls: readonly StoryControl[], switches: readonly ViewSwitch[]) => StressPlan;