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,98 @@
1
+ /**
2
+ * Whether a story's picture shows one colour and nothing else: what no check of the page can tell, since an input with no
3
+ * look of its own has a size and draws nothing.
4
+ *
5
+ * @remarks
6
+ * Reads PNG as Chromium writes it, 8 bits per channel, with Node's own zlib, so the core adds no decoder. A file it cannot read
7
+ * counts as showing something: this only ever takes a story from "drew" to "try another".
8
+ *
9
+ * @module
10
+ */
11
+ import { inflateSync } from "node:zlib";
12
+ /** A PNG's signature, and where its header's fields sit. */
13
+ const HEADER_START = 8;
14
+ /** The bytes per pixel of the colour types Chromium writes: true colour, and with alpha. */
15
+ const BYTES_PER_PIXEL = { 2: 3, 6: 4 };
16
+ /** The chunks of a PNG: its header's fields, and its image data joined. */
17
+ const readChunks = (file) => {
18
+ const parts = [];
19
+ let position = HEADER_START;
20
+ let width = 0;
21
+ let height = 0;
22
+ let type = -1;
23
+ while (position + 8 <= file.length) {
24
+ const length = file.readUInt32BE(position);
25
+ const name = file.toString("latin1", position + 4, position + 8);
26
+ const start = position + 8;
27
+ if (name === "IHDR") {
28
+ width = file.readUInt32BE(start);
29
+ height = file.readUInt32BE(start + 4);
30
+ type = file.readUInt8(start + 9);
31
+ }
32
+ if (name === "IDAT")
33
+ parts.push(file.subarray(start, start + length));
34
+ position = start + length + 4;
35
+ }
36
+ return { width, height, type, data: inflateSync(Buffer.concat(parts)) };
37
+ };
38
+ /** PNG's Paeth predictor. */
39
+ const paeth = (left, up, corner) => {
40
+ const estimate = left + up - corner;
41
+ const toLeft = Math.abs(estimate - left);
42
+ const toUp = Math.abs(estimate - up);
43
+ const toCorner = Math.abs(estimate - corner);
44
+ if (toLeft <= toUp && toLeft <= toCorner)
45
+ return left;
46
+ return toUp <= toCorner ? up : corner;
47
+ };
48
+ /** A row's byte before its filter: the filter's prediction added back. */
49
+ const predicted = (filter, left, up, corner) => {
50
+ if (filter === 1)
51
+ return left;
52
+ if (filter === 2)
53
+ return up;
54
+ if (filter === 3)
55
+ return Math.floor((left + up) / 2);
56
+ return filter === 4 ? paeth(left, up, corner) : 0;
57
+ };
58
+ /** A row with its filter undone, from the row above and where the row starts in the image data. */
59
+ const unfilteredRow = (data, start, stride, pixel, previous) => {
60
+ const filter = data.readUInt8(start);
61
+ const row = Buffer.alloc(stride);
62
+ for (let index = 0; index < stride; index += 1) {
63
+ const left = index >= pixel ? (row[index - pixel] ?? 0) : 0;
64
+ const corner = index >= pixel ? (previous[index - pixel] ?? 0) : 0;
65
+ const raw = data[start + 1 + index] ?? 0;
66
+ row[index] = (raw + predicted(filter, left, previous[index] ?? 0, corner)) & 255;
67
+ }
68
+ return row;
69
+ };
70
+ /** Whether every pixel of a row is the colour. */
71
+ const isRowOf = (row, colour) => row.every((value, index) => value === colour[index % colour.length]);
72
+ /**
73
+ * Whether a PNG is one colour.
74
+ *
75
+ * @param file - the file's bytes.
76
+ * @returns the answer; `false` for one it cannot read.
77
+ */
78
+ export const isUniformPicture = (file) => {
79
+ try {
80
+ const { width, height, type, data } = readChunks(file);
81
+ const pixel = BYTES_PER_PIXEL[type];
82
+ if (pixel === undefined || width === 0 || height === 0)
83
+ return false;
84
+ const stride = width * pixel;
85
+ let previous = Buffer.alloc(stride);
86
+ let colour;
87
+ for (let row = 0; row < height; row += 1) {
88
+ previous = unfilteredRow(data, row * (stride + 1), stride, pixel, previous);
89
+ colour ??= previous.subarray(0, pixel);
90
+ if (!isRowOf(previous, colour))
91
+ return false;
92
+ }
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The commands a project's coding agents are set up with: `hook`, which an assistant runs when it is about to finish, and
3
+ * `browser`, which installs what the stories' checks run on.
4
+ *
5
+ * @module
6
+ */
7
+ import type { CommandNode, CommandScope } from "@ensiria/cli-kit/commands.types";
8
+ import { type ForgebookOptions } from "./catalogueCommands.ts";
9
+ /**
10
+ * The commands.
11
+ *
12
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
13
+ */
14
+ export declare const agentSetupCommands: (forgebook: CommandScope<ForgebookOptions>) => Readonly<Record<string, CommandNode>>;
@@ -0,0 +1,98 @@
1
+ import { ScriptError } from "@ensiria/cli-kit/script";
2
+ import { emptyStoryGlobsProblems } from "../../src/vite/emptyStoryGlobs.js";
3
+ import { catalogueClient } from "./agentClient.js";
4
+ import { ASSISTANT_NAMES } from "./agentSetup/assistantHooks.js";
5
+ import { allowed, answerToVerdict, isContinuing, isTurnAborted, sayAnswer, touchesUi } from "./agentSetup/stopHook.js";
6
+ import { verifyText } from "./agentText.js";
7
+ import { COMMAND, configOf } from "./catalogueCommands.js";
8
+ import { runStoriesCheck } from "./storyCheckRun.js";
9
+ import { runVerify } from "./verifyRun.js";
10
+ /** What an assistant sent on stdin: empty when nothing is piped in, as when a person runs the command. */
11
+ const hookInput = async () => {
12
+ if (process.stdin.isTTY)
13
+ return "";
14
+ const chunks = [];
15
+ process.stdin.setEncoding("utf8");
16
+ for await (const chunk of process.stdin)
17
+ if (typeof chunk === "string")
18
+ chunks.push(chunk);
19
+ return chunks.join("");
20
+ };
21
+ /** Runs `verify` for a hook; anything but a verdict lets the assistant finish, since it cannot repair a hook. */
22
+ const hookAnswer = async (assistant, input, configFile, url, style) => {
23
+ if (isTurnAborted(input))
24
+ return allowed();
25
+ try {
26
+ // a pattern that matches nothing leaves the verdict not verified, with the rest of it: never no verdict at all
27
+ const config = await configOf(configFile);
28
+ if (!(await touchesUi(config.dir)))
29
+ return allowed();
30
+ const client = await catalogueClient(config, url);
31
+ try {
32
+ const document = await runVerify({ dir: config.dir, ask: client.ask, check: (each) => runStoriesCheck(config, url, each) }, { since: undefined, isQuick: false, configProblems: emptyStoryGlobsProblems(config) });
33
+ if (typeof document === "string")
34
+ return allowed(`forgebook verify could not run: ${document}\n`);
35
+ const text = verifyText(document, style);
36
+ return answerToVerdict(assistant, document, text, config.dir, isContinuing(input));
37
+ }
38
+ finally {
39
+ await client.close();
40
+ }
41
+ }
42
+ catch (error) {
43
+ return allowed(`forgebook verify could not run: ${error instanceof Error ? error.message : String(error)}\n`);
44
+ }
45
+ };
46
+ /**
47
+ * The commands.
48
+ *
49
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
50
+ */
51
+ export const agentSetupCommands = (forgebook) => ({
52
+ hook: forgebook.command({
53
+ header: false,
54
+ summary: "What an assistant's hook runs when it is about to finish: verify on the change, sending the agent back on red. Written by init --agents.",
55
+ options: {
56
+ url: {
57
+ type: "string",
58
+ env: "FORGEBOOK_URL",
59
+ valueName: "address",
60
+ description: "Where forgebook dev runs, when not at Vite's default address (http://localhost:5173)."
61
+ }
62
+ },
63
+ positionals: [
64
+ { name: "assistant", description: `The assistant: ${ASSISTANT_NAMES.join(", ")}.`, required: true }
65
+ ],
66
+ examples: [{ command: `${COMMAND} hook claude`, description: "As Claude Code's Stop hook runs it." }],
67
+ run: async ({ args, options, io, style }) => {
68
+ const assistant = ASSISTANT_NAMES.find((name) => name === args.assistant);
69
+ if (assistant === undefined)
70
+ throw new ScriptError(`No hook format for ${args.assistant}`, {
71
+ hint: `It takes ${ASSISTANT_NAMES.join(", ")}`
72
+ });
73
+ const input = await hookInput();
74
+ // what the server logs (a story's errors, in the project's words) would reach the agent as if the hook said it
75
+ const { write } = process.stderr;
76
+ Object.assign(process.stderr, { write: () => true });
77
+ const answer = await hookAnswer(assistant, input, options.config, options.url, style).finally(() => {
78
+ Object.assign(process.stderr, { write });
79
+ });
80
+ sayAnswer(answer, io);
81
+ }
82
+ }),
83
+ browser: forgebook.command({
84
+ summary: "Install the browser the stories' checks run on, with the Playwright that will open it.",
85
+ options: {
86
+ "with-deps": {
87
+ type: "boolean",
88
+ description: "Also install what the browser needs of the system, as CI does."
89
+ }
90
+ },
91
+ examples: [{ command: `${COMMAND} browser`, description: "Once, after installing @forgebook/testing." }],
92
+ run: async ({ options, io, log }) => {
93
+ const { installBrowser } = await import("./browserRun.js");
94
+ await installBrowser(process.cwd(), options["with-deps"] === true, io);
95
+ log.success("Browser installed");
96
+ }
97
+ })
98
+ });
@@ -1,18 +1,19 @@
1
1
  import type { OutputStyle } from "@ensiria/cli-kit/log.types";
2
2
  import type { StoryCheckReport, StoryDiffReport, StoryShotReport } from "../../src/storyCheck.ts";
3
- import type { CheckedCodeDocument, ErrorsDocument, FoundComponentsDocument, NearestTokensDocument, PageDocument, PagesDocument, PluginsDocument, SearchDocument, StoriesDocument, StoryDocument, TokensDocument } from "../../src/vite/agent.types.ts";
3
+ import type { CheckedCodeDocument, ErrorsDocument, FoundComponentsDocument, NearestTokensDocument, PageDocument, PagesDocument, PluginsDocument, SearchDocument, StoriesDocument, StoryDocument, SwitchesDocument, TokensDocument, VerifyDocument, VisibilityDocument } from "../../src/vite/agent.types.ts";
4
4
  import type { DesignToken } from "../../src/vite/designTokens.ts";
5
5
  import type { TokenClash } from "../../src/vite/tokenClashes.ts";
6
6
  /**
7
7
  * The stories as a table: one row per story, its id first (what `forgebook story` takes, never cut), then its
8
- * component's title and its name.
8
+ * component's title and its name, with its statuses in brackets.
9
9
  *
10
10
  * @param document - the stories document.
11
11
  * @param style - colours, glyphs and width.
12
12
  */
13
13
  export declare const storiesText: (document: StoriesDocument, style: OutputStyle) => string;
14
14
  /**
15
- * One story's facts: where it is, where it opens, its args, its component's props and those every use must set.
15
+ * One story's facts: where it is, where it opens, its args, its component's props and those every use must set, then
16
+ * its code.
16
17
  *
17
18
  * @param document - the story document.
18
19
  * @param style - colours, glyphs and width.
@@ -97,6 +98,19 @@ export declare const foundComponentsText: (document: FoundComponentsDocument) =>
97
98
  * @param document - the answer.
98
99
  */
99
100
  export declare const checkedCodeText: (document: CheckedCodeDocument) => string;
101
+ /**
102
+ * The published components an agent cannot see, what was not looked at, and how many were.
103
+ *
104
+ * @param document - the answer.
105
+ */
106
+ export declare const visibilityText: (document: VisibilityDocument) => string;
107
+ /**
108
+ * What `verify` found, each with its fix, and the verdict in one line, last: what a person reads first at a prompt.
109
+ *
110
+ * @param document - the answer.
111
+ * @param style - colours, glyphs and width.
112
+ */
113
+ export declare const verifyText: (document: VerifyDocument, style: OutputStyle) => string;
100
114
  /**
101
115
  * The catalogue's plugins, one per line.
102
116
  *
@@ -123,3 +137,9 @@ export declare const pageText: (document: PageDocument) => string;
123
137
  * @param document - the search's document.
124
138
  */
125
139
  export declare const searchText: (document: SearchDocument) => string;
140
+ /**
141
+ * The catalogue's switches, one per line, each with its values and what they bring with them.
142
+ *
143
+ * @param document - the answer.
144
+ */
145
+ export declare const switchesText: (document: SwitchesDocument) => string;
@@ -11,19 +11,52 @@ import { formatJson } from "@ensiria/cli-kit/files";
11
11
  import { keyValue, table } from "@ensiria/cli-kit/layout";
12
12
  /** The style with no width to fit, so no cell is cut. */
13
13
  const uncut = (style) => ({ ...style, width: Number.POSITIVE_INFINITY });
14
+ /** Statuses in brackets after a name (` [review]`); nothing for none. */
15
+ const statusMark = (status) => status === undefined ? "" : ` [${status.join(", ")}]`;
16
+ /** The words read as others, as the first line of an answer; none when the query was read as typed. */
17
+ const correctionLines = (corrections) => corrections.length === 0
18
+ ? []
19
+ : [`Read as: ${corrections.map(({ typed, read }) => `"${read}" for "${typed}"`).join(", ")}`];
14
20
  /**
15
21
  * The stories as a table: one row per story, its id first (what `forgebook story` takes, never cut), then its
16
- * component's title and its name.
22
+ * component's title and its name, with its statuses in brackets.
17
23
  *
18
24
  * @param document - the stories document.
19
25
  * @param style - colours, glyphs and width.
20
26
  */
21
27
  export const storiesText = (document, style) => table(document.components.flatMap((component) => component.stories.map((story) => [
22
28
  story.id,
23
- `${component.title} › ${story.name}${story.isUnlisted ? " (unlisted)" : ""}`
29
+ `${component.title} › ${story.name}${story.isUnlisted ? " (unlisted)" : ""}${statusMark(story.statuses)}`
24
30
  ])), { columns: [{ header: "Id" }, { header: "Story", tone: "muted" }] }, uncut(style));
31
+ /** Why a component lists no props, as the `Props` line says it. */
32
+ const PROPS_NOTES = {
33
+ untyped: () => "none: its props are typed any",
34
+ "no-signature": () => "none: its type cannot be called with props",
35
+ "outside-package": (count) => `none: all ${count} come from outside the package`
36
+ };
37
+ /** When a variant's prop applies, as the `Props` line says it (`mode is single, or left out`). */
38
+ const conditionText = ({ prop, values, orOmitted }) => {
39
+ if (values.length === 0)
40
+ return `${prop} is left out`;
41
+ return `${prop} is ${values.map(String).join(" or ")}${orOmitted === true ? ", or left out" : ""}`;
42
+ };
43
+ /**
44
+ * A component's props in one line: each name, a variant's with when it can be passed, or why there are none.
45
+ *
46
+ * @param docs - the component's docs.
47
+ */
48
+ const propsLine = (docs) => {
49
+ const { propsNote } = docs;
50
+ if (docs.props.length === 0 && propsNote !== undefined) {
51
+ return PROPS_NOTES[propsNote.reason](propsNote.reason === "outside-package" ? propsNote.count : 0);
52
+ }
53
+ return docs.props
54
+ .map((prop) => prop.onlyWhen === undefined ? prop.name : `${prop.name} (when ${conditionText(prop.onlyWhen)})`)
55
+ .join(", ");
56
+ };
25
57
  /**
26
- * One story's facts: where it is, where it opens, its args, its component's props and those every use must set.
58
+ * One story's facts: where it is, where it opens, its args, its component's props and those every use must set, then
59
+ * its code.
27
60
  *
28
61
  * @param document - the story document.
29
62
  * @param style - colours, glyphs and width.
@@ -37,14 +70,21 @@ export const storyText = (document, style) => {
37
70
  ["Frame", document.story.links.frame],
38
71
  ["Embed", document.story.links.embed],
39
72
  ["Args", JSON.stringify(document.args)],
40
- ["Props", document.docs === undefined ? "none" : document.docs.props.map((prop) => prop.name).join(", ")],
73
+ ["Props", document.docs === undefined ? "none" : propsLine(document.docs)],
41
74
  ["Required", document.requiredProps.length === 0 ? "none" : document.requiredProps.join(", ")]
42
75
  ];
43
76
  if (document.story.description !== undefined)
44
77
  entries.push(["About", document.story.description]);
78
+ // the story's own, which may take its meta's away, and the deprecation its component's TSDoc adds
79
+ const fromDocs = document.component.statuses?.includes("deprecated") ? ["deprecated"] : [];
80
+ const statuses = [...new Set([...(document.story.statuses ?? []), ...fromDocs])];
81
+ if (statuses.length > 0)
82
+ entries.push(["Status", statuses.join(", ")]);
45
83
  if (document.design !== undefined)
46
84
  entries.push(["Design", document.design.figma]);
47
- return keyValue(entries, uncut(style));
85
+ const fields = keyValue(entries, uncut(style));
86
+ // the code spans lines: under the fields, as it is copied
87
+ return document.code === undefined ? fields : `${fields}\n\n${document.code}`;
48
88
  };
49
89
  /** What a model judged, each line saying it is an opinion. */
50
90
  const judgementLines = (result) => {
@@ -71,8 +111,17 @@ const judgementLines = (result) => {
71
111
  */
72
112
  export const checkText = (report, style) => (report.a11y === "off" ? "Accessibility is not checked: the catalogue sets a11y: false.\n" : "") +
73
113
  table(report.results.flatMap((result) => [
74
- ...(result.problems.length === 0
75
- ? [[result.storyId, result.view || "default", "passes"]]
114
+ ...(result.notVerified === undefined
115
+ ? []
116
+ : [[result.storyId, result.view || "default", `not verified: ${result.notVerified}`]]),
117
+ ...(result.problems.length === 0 && result.notVerified === undefined
118
+ ? [
119
+ [
120
+ result.storyId,
121
+ result.view || "default",
122
+ result.isNotAwaited === true ? "passes, as drawn: parameters.suspense.expected" : "passes"
123
+ ]
124
+ ]
76
125
  : result.problems.map((problem) => [
77
126
  result.storyId,
78
127
  result.view || "default",
@@ -88,7 +137,11 @@ export const checkText = (report, style) => (report.a11y === "off" ? "Accessibil
88
137
  */
89
138
  export const errorsText = (document, style) => document.errors.length === 0
90
139
  ? ""
91
- : table(document.errors.map((error) => [String(error.n), error.storyId, `${error.kind}: ${error.message}`]), { columns: [{ header: "#", tone: "muted" }, { header: "Story" }, { header: "Error" }] }, uncut(style));
140
+ : table(document.errors.map((error) => [
141
+ String(error.n),
142
+ error.storyId,
143
+ `${error.kind}: ${error.place === undefined ? "" : `${error.place}: `}${error.message}`
144
+ ]), { columns: [{ header: "#", tone: "muted" }, { header: "Story" }, { header: "Error" }] }, uncut(style));
92
145
  /**
93
146
  * What `forgebook errors` prints of an answer: its JSON (one line per error while following, so each can be read as it
94
147
  * comes), or its table.
@@ -111,7 +164,19 @@ export const errorsOutput = (document, mode, style) => {
111
164
  * @param shownFile - how a file is written for the reader (relative to where the command runs).
112
165
  * @param style - colours, glyphs and width.
113
166
  */
114
- export const shotText = (report, shownFile, style) => table(report.shots.map((shot) => [shot.storyId, shot.view || "default", shownFile(shot.file)]), { columns: [{ header: "Story" }, { header: "View", tone: "muted" }, { header: "Picture" }] }, uncut(style));
167
+ export const shotText = (report, shownFile, style) => table(report.shots.map((shot) => [
168
+ shot.storyId,
169
+ shot.view || "default",
170
+ shownFile(shot.file),
171
+ shot.status === undefined ? "" : `not of the story: ${shot.status}`
172
+ ]), {
173
+ columns: [
174
+ { header: "Story" },
175
+ { header: "View", tone: "muted" },
176
+ { header: "Picture" },
177
+ { header: "Status" }
178
+ ]
179
+ }, uncut(style));
115
180
  /**
116
181
  * A comparison with the baselines as a person reads it.
117
182
  *
@@ -141,16 +206,29 @@ export const diffText = (report, shownFile, style) => table(report.results.map((
141
206
  */
142
207
  export const tokensText = (document) => {
143
208
  if (!document.isConfigured)
144
- return 'No tokens file: name one in forgebook.config.ts (`tokens: ["tokens.json"]`) or on a source.';
209
+ return 'No tokens file, and none found in the application: name one in forgebook.config.ts (`tokens: ["tokens.json"]`) or on a source.';
145
210
  if (document.total === 0)
146
211
  return "No tokens here.";
147
212
  const lines = document.tokens.map((token) => tokenLine(token));
148
213
  const more = document.total - document.tokens.length;
149
214
  return [
150
215
  ...lines,
151
- ...(more > 0 ? [`… and ${more} more: narrow it with --category, or raise --limit.`] : [])
216
+ ...(more > 0 ? [`… and ${more} more: narrow it with --category, or raise --limit.`] : []),
217
+ ...tokenSourceLines(document.sources ?? [], document.notes ?? [])
152
218
  ].join("\n");
153
219
  };
220
+ /** What tokens were read from, on one line, and what could not be, as a person reads them. */
221
+ const tokenSourceLines = (sources, notes) => {
222
+ const read = sources.filter((source) => source.kind !== "tokens-file");
223
+ return [
224
+ ...(read.length === 0
225
+ ? []
226
+ : [
227
+ `Read from: ${read.map(({ kind, file, tokens }) => `${file} (${kind}, ${tokens ?? 0})`).join(", ")}`
228
+ ]),
229
+ ...notes.map((note) => `Not read: ${note}`)
230
+ ];
231
+ };
154
232
  /** A token on one line, its themes and any deprecation beside it. */
155
233
  const tokenLine = (token) => {
156
234
  const modes = Object.entries(token.modes).map(([mode, value]) => ` ${mode}: ${value}`);
@@ -198,12 +276,13 @@ export const nearestTokensText = (document) => {
198
276
  */
199
277
  export const foundComponentsText = (document) => document.components.length === 0
200
278
  ? `Nothing in this catalogue holds "${document.query}".`
201
- : document.components
202
- .map((each) => {
203
- const missed = each.missed.length === 0 ? "" : ` (no "${each.missed.join('", "')}")`;
204
- return `${each.title}${missed}${each.guidance?.deprecated === undefined ? "" : " deprecated"}`;
205
- })
206
- .join("\n");
279
+ : [
280
+ ...correctionLines(document.corrections),
281
+ ...document.components.map((each) => {
282
+ const missed = each.missed.length === 0 ? "" : ` (no "${each.missed.join('", "')}")`;
283
+ return `${each.title}${missed}${each.guidance?.deprecated === undefined ? "" : " deprecated"}`;
284
+ })
285
+ ].join("\n");
207
286
  /**
208
287
  * What a change broke as a person reads it, a line a problem.
209
288
  *
@@ -212,8 +291,61 @@ export const foundComponentsText = (document) => document.components.length ===
212
291
  export const checkedCodeText = (document) => {
213
292
  const lines = document.problems.map((each) => `${each.file}${each.line === undefined ? "" : `:${each.line}`} ${each.message}`);
214
293
  return [
215
- ...(lines.length === 0 ? ["Nothing to report."] : lines),
216
- ...document.skipped.map((each) => `Not checked: ${each}`)
294
+ ...(lines.length > 0
295
+ ? lines
296
+ : [document.skipped.length > 0 ? "Nothing to report in what was checked." : "Nothing to report."]),
297
+ ...document.skipped,
298
+ ...(document.advice ?? []).map(({ file, line, message }) => `${file}:${line} ${message}`),
299
+ ...(document.excused ?? []).map(({ file, line, rule, reason }) => `${file}:${line} ${rule} excused by a comment: ${reason}`),
300
+ ...tokenSourceLines(document.tokenSources ?? [], document.tokenNotes ?? [])
301
+ ].join("\n");
302
+ };
303
+ /** A published component an agent cannot see, a line for each thing that hides it. */
304
+ const unseenLines = ({ file, reasons }) => reasons.map(({ reason, fix }) => `${file} agents cannot see it: ${reason}. Fix: ${fix}`);
305
+ /**
306
+ * The published components an agent cannot see, what was not looked at, and how many were.
307
+ *
308
+ * @param document - the answer.
309
+ */
310
+ export const visibilityText = (document) => {
311
+ const scope = document.since === undefined ? "" : ` changed since ${document.since}`;
312
+ const count = `${document.checked} published component file${document.checked === 1 ? "" : "s"}${scope}`;
313
+ const ending = document.packages.length === 0 && document.skipped.length === 0
314
+ ? "No package here publishes a component: nothing to hold to this."
315
+ : `${count}, ${document.unseen.length} agents cannot see.`;
316
+ return [...document.unseen.flatMap(unseenLines), ...document.skipped, ending].join("\n");
317
+ };
318
+ /**
319
+ * What `verify` found, each with its fix, and the verdict in one line, last: what a person reads first at a prompt.
320
+ *
321
+ * @param document - the answer.
322
+ * @param style - colours, glyphs and width.
323
+ */
324
+ export const verifyText = (document, style) => {
325
+ const uncovered = document.uiFiles.flatMap((each) => each.coverage === "none"
326
+ ? [
327
+ `${each.file} not verified: ${each.reason ?? ""}${each.fix === undefined ? "" : ` Fix: ${each.fix}`}`
328
+ ]
329
+ : []);
330
+ const unseen = document.unseen.flatMap(unseenLines);
331
+ const code = document.code.problems.map((each) => `${each.file}${each.line === undefined ? "" : `:${each.line}`} ${each.message}`);
332
+ const outdated = (document.outdated ?? []).map((each) => `${each.file} out of date: written for props ${each.written}, now ${each.current}. Fix: ${each.fix}`);
333
+ const notes = document.code.notes.map((each) => `${each.file}${each.line === undefined ? "" : `:${each.line}`} note: ${each.message}`);
334
+ const advice = (document.code.advice ?? []).map((each) => `${each.file}:${each.line} ${each.message}`);
335
+ const results = [
336
+ ...document.failures,
337
+ ...document.notVerified.map((each) => ({ ...each, problems: [] }))
338
+ ].map((each) => ({ ...each, frame: each.links?.frame ?? "" }));
339
+ const stories = results.length === 0 ? [] : [checkText({ schema: 1, results }, style)];
340
+ return [
341
+ ...uncovered,
342
+ ...unseen,
343
+ ...code,
344
+ ...outdated,
345
+ ...notes,
346
+ ...advice,
347
+ ...stories,
348
+ document.summary
217
349
  ].join("\n");
218
350
  };
219
351
  /**
@@ -265,13 +397,28 @@ export const pageText = (document) => [document.page.links.address, "", document
265
397
  */
266
398
  export const searchText = (document) => document.results.length === 0
267
399
  ? `Nothing in the catalogue holds "${document.query}".`
268
- : document.results
269
- .flatMap((result) => [
270
- `${result.name} (${result.place})${result.missed.length === 0 ? "" : `, missing: ${result.missed.join(", ")}`}`,
271
- ` ${result.address}`,
272
- ...result.hits.flatMap((hit) => [
273
- ` ${hit.kind}${hit.name === undefined ? "" : ` ${hit.name}`}: ${hit.text}`,
274
- ` ${hit.address}`
400
+ : [
401
+ ...correctionLines(document.corrections),
402
+ ...document.results.flatMap((result) => [
403
+ `${result.name} (${result.place})${result.missed.length === 0 ? "" : `, missing: ${result.missed.join(", ")}`}`,
404
+ ` ${result.address}`,
405
+ ...result.hits.flatMap((hit) => [
406
+ ` ${hit.kind}${hit.name === undefined ? "" : ` ${hit.name}`}: ${hit.text}`,
407
+ ` ${hit.address}`
408
+ ])
275
409
  ])
276
- ])
277
- .join("\n");
410
+ ].join("\n");
411
+ /**
412
+ * The catalogue's switches, one per line, each with its values and what they bring with them.
413
+ *
414
+ * @param document - the answer.
415
+ */
416
+ export const switchesText = (document) => document.switches
417
+ .map((each) => {
418
+ const values = each.values.map(({ value, implies }) => {
419
+ const implied = Object.entries(implies ?? {}).map(([id, other]) => `${id}=${other}`);
420
+ return implied.length === 0 ? value : `${value} (implies ${implied.join(", ")})`;
421
+ });
422
+ return `${each.id} (${each.control}): ${values.join(", ")}`;
423
+ })
424
+ .join("\n");