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,270 @@
1
+ /**
2
+ * What `forgebook audit` does: reads a project's files, with no catalogue and no configuration, and reports the values and
3
+ * components it actually uses, with what to do next.
4
+ *
5
+ * @remarks
6
+ * Nothing of the project runs and nothing is written. It is meant for a project with no design system: the first question
7
+ * there is what the system already is in practice, and that needs no setup. A report is not a verdict, so it exits 0
8
+ * whatever it finds; `check-code` is what fails.
9
+ *
10
+ * @module
11
+ */
12
+ import { dirname, join } from "node:path";
13
+ import { plural } from "@ensiria/cli-kit/format";
14
+ import { valueAudit, valueSites } from "../../src/vite/appAudit.js";
15
+ import { repositoryOf, smallFileText } from "../../src/vite/appTokenFiles.js";
16
+ import { readAppTokens } from "../../src/vite/appTokens.js";
17
+ import { projectComponents } from "../../src/vite/componentScan.js";
18
+ import { lookAlikes } from "../../src/vite/lookAlikes.js";
19
+ import { projectFiles, projectFilesAndScripts, UI_PATTERNS } from "../../src/vite/projectFiles.js";
20
+ import { storyCoverage } from "../../src/vite/storyCoverage.js";
21
+ /** A value used this often is worth a name. */
22
+ const WORTH_A_NAME = 3;
23
+ /** How many next steps a report gives. */
24
+ const MOST_ACTIONS = 20;
25
+ /** A word as one word of a command, quoted: values come from the project's files. */
26
+ const quoted = (value) => `'${value.replaceAll("'", `'\\''`)}'`;
27
+ /** The step one value written by hand proposes, when it is used enough to act on. */
28
+ const valueAction = (each, what, folder) => {
29
+ const args = ["audit", folder, "--value", each.value, "--json"];
30
+ const reach = { args, command: `forgebook audit ${quoted(folder)} --value ${quoted(each.value)} --json` };
31
+ if (each.token !== undefined) {
32
+ const caution = each.tokenFollowsTheme === true ? " It changes with the theme: use it if the value should too." : "";
33
+ return [
34
+ {
35
+ kind: "use-token",
36
+ message: `Replace ${each.value} with ${each.token}: written by hand ${each.hardCoded} times in ${each.hardCodedFiles} files.${caution}`,
37
+ count: each.hardCoded,
38
+ ...reach
39
+ }
40
+ ];
41
+ }
42
+ return each.hardCoded < WORTH_A_NAME
43
+ ? []
44
+ : [
45
+ {
46
+ kind: "name-value",
47
+ message: `${what} ${each.value} is written by hand ${each.hardCoded} times and no token holds it: give it a name, or use one near it.`,
48
+ count: each.hardCoded,
49
+ ...reach
50
+ }
51
+ ];
52
+ };
53
+ /** The steps a report's values propose. */
54
+ const valueActions = ({ colors, sizes }, folder) => [
55
+ ...colors.handWritten.flatMap((each) => valueAction(each, "The colour", folder)),
56
+ ...sizes.font.handWritten.flatMap((each) => valueAction(each, "The font size", folder)),
57
+ ...sizes.radius.handWritten.flatMap((each) => valueAction(each, "The radius", folder)),
58
+ ...sizes.space.handWritten.flatMap((each) => valueAction(each, "The spacing", folder)),
59
+ ...colors.nearDuplicates.map((values) => ({
60
+ kind: "merge-values",
61
+ message: `Hard to tell apart: ${values.join(", ")}. Keep one.`,
62
+ count: values.length
63
+ }))
64
+ ];
65
+ /** The steps a report's look-alikes propose. */
66
+ const componentActions = (alike) => alike.map(({ members, why }) => ({
67
+ kind: "merge-components",
68
+ message: `${members.map(({ name }) => name).join(", ")}: ${why}. Compare them (\`members\` has where); keep one if they are the same thing.`,
69
+ count: members.length,
70
+ members
71
+ }));
72
+ /** How many components an action's `members` lists at most: the rest are in the report's own lists. */
73
+ const MOST_MEMBERS = 20;
74
+ /** The step components with no story propose: write the first one's stories. */
75
+ const writeStoriesAction = (withoutStories, folder) => {
76
+ const first = withoutStories[0];
77
+ if (first === undefined)
78
+ return [];
79
+ const file = join(folder, first.file);
80
+ return [
81
+ {
82
+ kind: "write-stories",
83
+ message: `No story is about ${plural(withoutStories.length, "exported component")}, so nobody sees what exists before writing it again: start with ${first.name}.`,
84
+ count: withoutStories.length,
85
+ command: `forgebook new -- ${quoted(file)}`,
86
+ args: ["new", "--", file],
87
+ members: withoutStories.slice(0, MOST_MEMBERS)
88
+ }
89
+ ];
90
+ };
91
+ /** The step components with stories and no use propose: look at whether each is still needed. */
92
+ const checkUnusedAction = (storiesUnused) => storiesUnused.length === 0
93
+ ? []
94
+ : [
95
+ {
96
+ kind: "check-unused",
97
+ message: `Nothing but stories and tests uses ${plural(storiesUnused.length, "component")} with stories: check whether each is still needed, and remove it with its stories if not.`,
98
+ count: storiesUnused.length,
99
+ members: storiesUnused.slice(0, MOST_MEMBERS).map(({ name, file, line }) => ({ name, file, line }))
100
+ }
101
+ ];
102
+ /**
103
+ * Whether a manifest is one of a package that goes to a registry: named, and not private. A private package with
104
+ * `exports` is a workspace's own, whose users are in the repository, so the audit judges what it reads of them, as it does
105
+ * an application's components (application templates mark themselves private).
106
+ *
107
+ * @param manifest - the parsed `package.json`.
108
+ */
109
+ const isOnTheRegistry = (manifest) => typeof manifest === "object" &&
110
+ manifest !== null &&
111
+ "name" in manifest &&
112
+ typeof manifest.name === "string" &&
113
+ !("private" in manifest && manifest.private === true);
114
+ /**
115
+ * Whether a file belongs to a package that goes to a registry, by the nearest manifest above it inside the repository.
116
+ *
117
+ * @param dir - the project's folder, which the files are relative to.
118
+ */
119
+ const publishedPackageOf = (dir) => {
120
+ const root = repositoryOf(dir);
121
+ const known = new Map();
122
+ const folderIsPublished = (folder) => {
123
+ const cached = known.get(folder);
124
+ if (cached !== undefined)
125
+ return cached;
126
+ const text = smallFileText(join(folder, "package.json"));
127
+ let answer;
128
+ if (text !== undefined) {
129
+ try {
130
+ answer = isOnTheRegistry(JSON.parse(text));
131
+ }
132
+ catch {
133
+ answer = false;
134
+ }
135
+ }
136
+ else
137
+ answer = folder === root || folder === dirname(folder) ? false : folderIsPublished(dirname(folder));
138
+ known.set(folder, answer);
139
+ return answer;
140
+ };
141
+ return (file) => folderIsPublished(dirname(join(dir, file)));
142
+ };
143
+ /**
144
+ * The report on a project.
145
+ *
146
+ * @param dir - its folder.
147
+ * @param top - how many values a list gives.
148
+ * @param folder - the folder as the command was given it, for the commands an answer proposes.
149
+ */
150
+ export const auditDocument = (dir, top, folder = ".") => {
151
+ const { tokens, sources, unread } = readAppTokens(dir);
152
+ const notes = [...unread];
153
+ const { files, scripts } = projectFilesAndScripts(dir, notes);
154
+ const values = valueAudit(files, tokens, top);
155
+ const components = projectComponents(files);
156
+ const alike = lookAlikes(components);
157
+ const coverage = storyCoverage(components, [...files, ...scripts], publishedPackageOf(dir));
158
+ return {
159
+ schema: 1,
160
+ system: {
161
+ tokens: tokens.length,
162
+ own: tokens.filter((token) => token.origin?.kind !== "tailwind-default").length,
163
+ sources,
164
+ notes
165
+ },
166
+ ...values,
167
+ components: {
168
+ count: components.length,
169
+ lookAlikes: alike,
170
+ storyFileCount: coverage.storyFileCount,
171
+ withStories: coverage.withStories,
172
+ withoutStories: coverage.withoutStories,
173
+ storiesUnused: coverage.storiesUnused,
174
+ publishedWithStories: coverage.published
175
+ },
176
+ actions: [
177
+ ...valueActions(values, folder),
178
+ ...componentActions(alike),
179
+ ...writeStoriesAction(coverage.withoutStories, folder),
180
+ ...checkUnusedAction(coverage.storiesUnused)
181
+ ]
182
+ .toSorted((first, second) => second.count - first.count)
183
+ .slice(0, MOST_ACTIONS)
184
+ };
185
+ };
186
+ /**
187
+ * Where a value is written by hand.
188
+ *
189
+ * @param dir - the project's folder.
190
+ * @param value - the value.
191
+ */
192
+ export const auditSitesDocument = (dir, value) => {
193
+ const notes = [];
194
+ const files = projectFiles(dir, notes);
195
+ return { schema: 1, value, sites: valueSites(files, value), notes };
196
+ };
197
+ /**
198
+ * A text from a project's files as a terminal may show it: a newline or an escape in a file's name could otherwise draw
199
+ * a line of this report.
200
+ *
201
+ * @param text - the text.
202
+ */
203
+ export const printable = (text) => text.replaceAll(/[\p{Cc}\p{Cf}]/gu, (character) => (character === "\n" ? "\n" : "?"));
204
+ /** A value as a line of a list. */
205
+ const valueLine = ({ value, count, files, hardCoded, token }) => ` ${value} ${count}× in ${files} ${files === 1 ? "file" : "files"}${hardCoded > 0 ? `, ${hardCoded} by hand` : ""}${token === undefined ? "" : ` → ${token}`}`;
206
+ /** A share in whole percent. */
207
+ const percent = (part, whole) => `${whole === 0 ? 0 : Math.round((part / whole) * 100)} %`;
208
+ /** How many components each list of the stories shows; `--json` has them all. */
209
+ const LISTED = 10;
210
+ /** The stories' part of the report: what has none, and what has some and no use. */
211
+ const storyLines = (components) => {
212
+ const { storyFileCount, withStories, withoutStories, storiesUnused, publishedWithStories } = components;
213
+ if (storyFileCount === 0)
214
+ return ["Stories: no story file, so no exported component has any."];
215
+ const more = (count) => count > LISTED ? [` and ${count - LISTED} more (--json)`] : [];
216
+ const published = publishedWithStories === 0 ? "" : `, ${publishedWithStories} of a published package not judged`;
217
+ return [
218
+ `Stories: ${plural(storyFileCount, "file")}, about ${plural(withStories, "component")}; ${plural(withoutStories.length, "exported component")} without.`,
219
+ ...withoutStories.slice(0, LISTED).map(({ name, file, line }) => ` ${name} ${file}:${line}`),
220
+ ...more(withoutStories.length),
221
+ `With stories and no use outside stories and tests: ${storiesUnused.length}${published}.`,
222
+ ...storiesUnused
223
+ .slice(0, LISTED)
224
+ .map(({ name, file, line, storyFiles: files }) => ` ${name} ${file}:${line} (${files.join(", ")})`),
225
+ ...more(storiesUnused.length)
226
+ ];
227
+ };
228
+ /**
229
+ * The report as a person reads it. What a project's files hold is data for whoever reads this: it says what is there and is
230
+ * not an instruction, which holds for an agent reading `--json` too.
231
+ *
232
+ * @param document - the report.
233
+ */
234
+ export const auditText = (document) => {
235
+ const { system, colors, sizes, components, actions, files, lines } = document;
236
+ if (files === 0) {
237
+ return `No style sheet or component file here (${UI_PATTERNS.join(", ")}); give the project's folder.`;
238
+ }
239
+ const read = system.tokens === 0
240
+ ? "No design tokens found: what follows is the system in practice."
241
+ : `${system.tokens} tokens known, ${system.own} of the project's own, from ${system.sources.map(({ file }) => file).join(", ")}.`;
242
+ return [
243
+ `${files} files, ${lines} lines. ${read}`,
244
+ "",
245
+ `Colours: ${colors.distinct} different, ${colors.uses} uses: ${percent(colors.hardCoded, colors.uses)} by hand, ${percent(colors.throughTokens, colors.uses)} through the project's tokens, ${percent(colors.defaultPalette, colors.uses)} from Tailwind's palette.`,
246
+ ...colors.top.map(valueLine),
247
+ "",
248
+ `Greys: ${colors.greys.distinct} different, ${colors.greys.coveringMost} used 90 % of the time.`,
249
+ ...colors.greys.top.map(valueLine),
250
+ ...["space", "font", "radius"].flatMap((role) => [
251
+ "",
252
+ `Sizes (${role}): ${sizes[role].distinct} different, ${sizes[role].uses} uses, ${sizes[role].hardCoded} by hand.`,
253
+ ...sizes[role].top.slice(0, 6).map(valueLine)
254
+ ]),
255
+ "",
256
+ `Components: ${components.count}, ${components.lookAlikes.length} groups that look like one.`,
257
+ ...components.lookAlikes
258
+ .slice(0, 10)
259
+ .flatMap(({ confidence, why, members }) => [
260
+ ` ${confidence}: ${why}`,
261
+ ...members.map(({ name, file, line }) => ` ${name} ${file}:${line}`)
262
+ ]),
263
+ "",
264
+ ...storyLines(components),
265
+ "",
266
+ "Next:",
267
+ ...actions.slice(0, 10).map(({ message }) => ` ${message}`),
268
+ ...system.notes.map((note) => `Not read: ${note}`)
269
+ ].join("\n");
270
+ };
@@ -0,0 +1,21 @@
1
+ import type { ScriptIo } from "@ensiria/cli-kit/io.types";
2
+ /**
3
+ * The file of Playwright's command, as `@forgebook/testing` in a folder finds it.
4
+ *
5
+ * @remarks
6
+ * Looked for by folder: neither package need export its `package.json`, and a strict install keeps Playwright beside the
7
+ * testing package, out of the project's reach.
8
+ *
9
+ * @param dir - the project's folder.
10
+ * @returns its path; none when either package is not there.
11
+ */
12
+ export declare const playwrightCommandFile: (dir: string) => string | undefined;
13
+ /**
14
+ * Installs the browser.
15
+ *
16
+ * @param dir - the project's folder.
17
+ * @param shouldInstallSystemPackages - whether to install what the browser needs of the system (`--with-deps`), as CI does.
18
+ * @param io - the run's streams.
19
+ * @throws a `ScriptError` when the testing package is not there, or the install fails.
20
+ */
21
+ export declare const installBrowser: (dir: string, shouldInstallSystemPackages: boolean, io: ScriptIo) => Promise<void>;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * What `forgebook browser` runs: installs the browser the stories' checks run on, with the Playwright that will open it.
3
+ *
4
+ * @remarks
5
+ * Each Playwright version wants its own browser build, and a project may have another Playwright of its own at the top of
6
+ * its `node_modules`, so `playwright install` from the project can fetch a browser the checks never find. The one that
7
+ * counts is the one `@forgebook/testing` loads, found from that package.
8
+ *
9
+ * Playwright's install also deletes every build in the shared browser folder that no project it still knows of uses, so
10
+ * a plain `playwright install` here can remove the browsers of other projects on the machine. `--no-remove` keeps the
11
+ * install to adding the one build the checks need: Forgebook never deletes what it did not install.
12
+ *
13
+ * @module
14
+ */
15
+ import { existsSync, realpathSync } from "node:fs";
16
+ import { dirname, join } from "node:path";
17
+ import { exec } from "@ensiria/cli-kit/exec";
18
+ import { ScriptError } from "@ensiria/cli-kit/script";
19
+ /** A package's folder as Node finds it going up from a folder, links followed; none when it is not there. */
20
+ const nearestPackage = (dir, name) => {
21
+ const folder = join(dir, "node_modules", name);
22
+ if (existsSync(join(folder, "package.json")))
23
+ return realpathSync(folder);
24
+ const parent = dirname(dir);
25
+ return parent === dir ? undefined : nearestPackage(parent, name);
26
+ };
27
+ /**
28
+ * The file of Playwright's command, as `@forgebook/testing` in a folder finds it.
29
+ *
30
+ * @remarks
31
+ * Looked for by folder: neither package need export its `package.json`, and a strict install keeps Playwright beside the
32
+ * testing package, out of the project's reach.
33
+ *
34
+ * @param dir - the project's folder.
35
+ * @returns its path; none when either package is not there.
36
+ */
37
+ export const playwrightCommandFile = (dir) => {
38
+ const testing = nearestPackage(dir, "@forgebook/testing");
39
+ const playwright = testing === undefined ? undefined : nearestPackage(testing, "@playwright/test");
40
+ return playwright === undefined ? undefined : join(playwright, "cli.js");
41
+ };
42
+ /**
43
+ * Installs the browser.
44
+ *
45
+ * @param dir - the project's folder.
46
+ * @param shouldInstallSystemPackages - whether to install what the browser needs of the system (`--with-deps`), as CI does.
47
+ * @param io - the run's streams.
48
+ * @throws a `ScriptError` when the testing package is not there, or the install fails.
49
+ */
50
+ export const installBrowser = async (dir, shouldInstallSystemPackages, io) => {
51
+ const command = playwrightCommandFile(dir);
52
+ if (command === undefined)
53
+ throw new ScriptError("@forgebook/testing and @playwright/test are not installed here", {
54
+ hint: "npm install -D @forgebook/testing @playwright/test, or forgebook init --browser"
55
+ });
56
+ await exec(process.execPath, [command, "install", "--no-remove", "chromium", ...(shouldInstallSystemPackages ? ["--with-deps"] : [])], { cwd: dir, output: "prefix", prefix: "playwright", io });
57
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * What a failed build says.
3
+ *
4
+ * @param error - what the build threw: Vite's bundler lists its errors in `errors`.
5
+ * @returns the text, a line per error.
6
+ */
7
+ export declare const buildFailureText: (error: unknown) => string;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * What `forgebook build` says when the bundler fails: each error on a line, with its file, line and column when they
3
+ * are known. The bundler's own message holds its frames and a code frame in colours, which only `--verbose` shows.
4
+ *
5
+ * @module
6
+ */
7
+ import { stripVTControlCharacters } from "node:util";
8
+ import { bundlerErrorLines } from "../../src/bundlerErrors.js";
9
+ /** Whether a value is an object, whose fields can be read. */
10
+ const isRecord = (value) => typeof value === "object" && value !== null;
11
+ /**
12
+ * What an error says of its place, as far as it holds the right shapes.
13
+ *
14
+ * @param error - the error, as the bundler gives it.
15
+ */
16
+ const placeOf = (error) => {
17
+ const { id, loc } = error;
18
+ const line = isRecord(loc) ? loc["line"] : undefined;
19
+ const column = isRecord(loc) ? loc["column"] : undefined;
20
+ return {
21
+ ...(typeof id === "string" ? { id } : {}),
22
+ ...(typeof line === "number" && typeof column === "number" ? { loc: { line, column } } : {})
23
+ };
24
+ };
25
+ /**
26
+ * The lines of one of the build's errors.
27
+ *
28
+ * @param error - the error, as the bundler gives it.
29
+ */
30
+ const errorLines = (error) => {
31
+ if (!isRecord(error))
32
+ return bundlerErrorLines(String(error));
33
+ const { message } = error;
34
+ return bundlerErrorLines(stripVTControlCharacters(String(message)), placeOf(error));
35
+ };
36
+ /**
37
+ * What a failed build says.
38
+ *
39
+ * @param error - what the build threw: Vite's bundler lists its errors in `errors`.
40
+ * @returns the text, a line per error.
41
+ */
42
+ export const buildFailureText = (error) => {
43
+ const list = isRecord(error) ? error["errors"] : undefined;
44
+ const errors = Array.isArray(list) ? list : [error];
45
+ const lines = errors.flatMap(errorLines);
46
+ return lines.length === 0 ? "The build failed" : lines.join("\n");
47
+ };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `forgebook build --watch`: builds the catalogue, then again each time a file it reads changes, so a folder served
3
+ * elsewhere (a preview host, a second machine, an embed in an app) follows the code without a dev server.
4
+ *
5
+ * @remarks
6
+ * The bundler's watch mode with its incremental option keeps what it can between builds, and the process keeps the
7
+ * catalogue's configuration, which is about a third of a whole build on a large catalogue; it still writes the whole
8
+ * output. It watches the files a build read, so a file nothing read yet cannot wake it: a new story file reaches the list only by a build
9
+ * that starts over, and that is what a changed listing does. The lists are read again on a timer rather than with a
10
+ * folder watch, because a pattern's folder may be the project itself, and watching `node_modules` is what a catalogue
11
+ * must not cost on Linux. A failed build leaves the last good output and waits for the next edit.
12
+ *
13
+ * The files are polled: the operating system's file events go missing on a busy machine, and a watch that silently
14
+ * misses an edit leaves a site out of date with nothing to say so; asking only about the files a build read costs little.
15
+ *
16
+ * @module
17
+ */
18
+ import type { Logger } from "@ensiria/cli-kit/log.types";
19
+ import { type InlineConfig } from "vite";
20
+ /** What each group lists: by the group's text, its files in order, one text a group. */
21
+ export type Listing = ReadonlyMap<string, string>;
22
+ /**
23
+ * What the groups of a build list now.
24
+ *
25
+ * @param moduleIds - the build's module ids; those that are no group are skipped.
26
+ * @param listFiles - lists a group's files; the disk by default.
27
+ */
28
+ export declare const listingOf: (moduleIds: Iterable<string>, listFiles?: (group: string) => readonly string[]) => Listing;
29
+ /**
30
+ * Whether two listings differ: a file added to a group or taken from it.
31
+ *
32
+ * @param before - what the last build listed.
33
+ * @param now - what the groups list now.
34
+ */
35
+ export declare const isListingChanged: (before: Listing, now: Listing) => boolean;
36
+ /** What a watch reports. */
37
+ export type BuildWatchOptions = {
38
+ /** The Vite configuration of the build, `build.outDir` set. */
39
+ readonly vite: InlineConfig;
40
+ /** Where it says what each build did. */
41
+ readonly log: Logger;
42
+ /** Called after each build that succeeded, before it is announced: what must follow the output. */
43
+ readonly onBuilt: () => Promise<void>;
44
+ /** Ends the watch when it aborts; the watch runs until then. */
45
+ readonly signal: AbortSignal;
46
+ };
47
+ /**
48
+ * Builds, then builds again on every change, until the signal aborts.
49
+ *
50
+ * @param options - what to build and report.
51
+ */
52
+ export declare const watchBuild: (options: BuildWatchOptions) => Promise<void>;
@@ -0,0 +1,137 @@
1
+ import { build, createLogger } from "vite";
2
+ import { DOCS_PAGES_SPECIFIER_PREFIX, FILES_SPECIFIER_PREFIX, storyFileKeys, storyFilesGroupOf } from "../../src/vite/storyFilesModule.js";
3
+ import { buildFailureText } from "./buildFailure.js";
4
+ /** How often the lists of story files and docs pages are read again, in ms. */
5
+ const LISTING_PERIOD = 1000;
6
+ /** How often the files a build read are asked for changes, in ms. */
7
+ const FILE_PERIOD = 300;
8
+ /** The watch's polling: `watcher` is the bundler's own option, and Vite builds it from `chokidar`, which it reads. */
9
+ const POLLED_WATCH = {
10
+ chokidar: { usePolling: true, interval: FILE_PERIOD },
11
+ watcher: { usePolling: true, pollInterval: FILE_PERIOD }
12
+ };
13
+ /** The groups' module ids a build reads, each holding a group after its prefix. */
14
+ const GROUP_PREFIXES = [FILES_SPECIFIER_PREFIX, DOCS_PAGES_SPECIFIER_PREFIX].map((prefix) => `\0${prefix}`);
15
+ /**
16
+ * Vite's logger for a watch: its warnings, without its errors, whose bundler stack this command says on one line.
17
+ */
18
+ const quietLogger = () => ({ ...createLogger("warn"), error: () => undefined });
19
+ /**
20
+ * What the groups of a build list now.
21
+ *
22
+ * @param moduleIds - the build's module ids; those that are no group are skipped.
23
+ * @param listFiles - lists a group's files; the disk by default.
24
+ */
25
+ export const listingOf = (moduleIds, listFiles = (group) => {
26
+ const { root, patterns } = storyFilesGroupOf(group);
27
+ return storyFileKeys(root, patterns);
28
+ }) => {
29
+ const listing = new Map();
30
+ for (const id of moduleIds) {
31
+ const prefix = GROUP_PREFIXES.find((each) => id.startsWith(each));
32
+ if (prefix === undefined)
33
+ continue;
34
+ const group = id.slice(prefix.length);
35
+ listing.set(id, listFiles(group).join("\n"));
36
+ }
37
+ return listing;
38
+ };
39
+ /**
40
+ * Whether two listings differ: a file added to a group or taken from it.
41
+ *
42
+ * @param before - what the last build listed.
43
+ * @param now - what the groups list now.
44
+ */
45
+ export const isListingChanged = (before, now) => before.size !== now.size || [...before].some(([id, files]) => now.get(id) !== files);
46
+ /**
47
+ * One run of the bundler's watch mode: resolves when the list of files changes, so a new one starts, or the signal
48
+ * aborts.
49
+ *
50
+ * @param options - what to build and report.
51
+ * @returns whether a new run must start.
52
+ */
53
+ const watchUntilListed = async ({ vite, log, onBuilt, signal }) => {
54
+ let moduleIds = [];
55
+ const noteModules = {
56
+ name: "forgebook:build-watch",
57
+ buildEnd() {
58
+ moduleIds = [...this.getModuleIds()];
59
+ }
60
+ };
61
+ const output = await build({
62
+ ...vite,
63
+ logLevel: "warn",
64
+ customLogger: quietLogger(),
65
+ plugins: [...(vite.plugins ?? []), noteModules],
66
+ build: {
67
+ ...vite.build,
68
+ watch: POLLED_WATCH,
69
+ rolldownOptions: {
70
+ ...vite.build?.rolldownOptions,
71
+ experimental: { ...vite.build?.rolldownOptions?.experimental, incrementalBuild: true }
72
+ }
73
+ }
74
+ });
75
+ if (!("on" in output))
76
+ return false;
77
+ const watcher = output;
78
+ let changes = [];
79
+ let listed;
80
+ let isBuilding = true;
81
+ // one after another: a slow index after a build must never land over the next build's
82
+ let settling = Promise.resolve();
83
+ watcher.on("change", (file) => {
84
+ changes = [...changes, file];
85
+ });
86
+ watcher.on("event", (event) => {
87
+ if (event.code === "START")
88
+ isBuilding = true;
89
+ if (event.code === "ERROR") {
90
+ isBuilding = false;
91
+ log.error(buildFailureText(event.error));
92
+ log.info("Waiting for the next edit");
93
+ }
94
+ if (event.code !== "BUNDLE_END")
95
+ return;
96
+ const touched = changes;
97
+ changes = [];
98
+ listed = listingOf(moduleIds);
99
+ settling = settling.then(onBuilt).then(() => {
100
+ isBuilding = false;
101
+ const note = touched.length === 0 ? "" : ` after ${touched.length} changed`;
102
+ log.success(`Built in ${event.duration} ms${note}; watching for changes`);
103
+ }, (error) => {
104
+ isBuilding = false;
105
+ log.error(error instanceof Error ? error.message : String(error));
106
+ });
107
+ });
108
+ try {
109
+ return await new Promise((resolve) => {
110
+ signal.addEventListener("abort", () => resolve(false), { once: true });
111
+ const timer = setInterval(() => {
112
+ // a list read while a build runs would be compared with the build before it
113
+ if (isBuilding || listed === undefined)
114
+ return;
115
+ if (!isListingChanged(listed, listingOf(listed.keys())))
116
+ return;
117
+ clearInterval(timer);
118
+ log.info("The list of files changed: building from the start");
119
+ resolve(true);
120
+ }, LISTING_PERIOD);
121
+ signal.addEventListener("abort", () => clearInterval(timer), { once: true });
122
+ });
123
+ }
124
+ finally {
125
+ await watcher.close();
126
+ }
127
+ };
128
+ /**
129
+ * Builds, then builds again on every change, until the signal aborts.
130
+ *
131
+ * @param options - what to build and report.
132
+ */
133
+ export const watchBuild = async (options) => {
134
+ while (await watchUntilListed(options)) {
135
+ // each run is a watch of its own; a list changing again starts another
136
+ }
137
+ };
@@ -8,7 +8,8 @@ import { rm, writeFile } from "node:fs/promises";
8
8
  import { join } from "node:path";
9
9
  import { createInterface } from "node:readline";
10
10
  import { ScriptError } from "@ensiria/cli-kit/script";
11
- import { AGENT_INDEX_FILE, indexProblems, isAgentIndex } from "../../src/vite/agentIndex.js";
11
+ import { AGENT_INDEX_FILE } from "../../src/agentIndexFile.js";
12
+ import { indexProblems, isAgentIndex } from "../../src/vite/agentIndex.js";
12
13
  import { answerMcpMessage, NEW_SESSION } from "../../src/vite/mcpProtocol.js";
13
14
  import { pluginsDocument } from "../../src/vite/pluginConfig.js";
14
15
  import { catalogueClient, indexClient } from "./agentClient.js";
@@ -29,8 +30,8 @@ export const settleAgentIndex = async (config, outDir, isWanted, log) => {
29
30
  return;
30
31
  }
31
32
  const client = await catalogueClient(config, undefined);
32
- const answer = await client.ask("agent-index", new URLSearchParams());
33
- await client.close();
33
+ // its server closes whatever the answer: a watch asks again after every build
34
+ const answer = await client.ask("agent-index", new URLSearchParams()).finally(() => client.close());
34
35
  if (answer.status !== 200 || !isAgentIndex(answer.body)) {
35
36
  throw new ScriptError(`The catalogue's index could not be read: ${JSON.stringify(answer.body)}`);
36
37
  }
@@ -65,11 +66,14 @@ export const builtCatalogueServer = async (from, version) => {
65
66
  ask,
66
67
  writeNew: unreachable,
67
68
  check: unreachable,
69
+ stress: unreachable,
68
70
  checkPage: unreachable,
69
71
  shot: unreachable,
72
+ verify: unreachable,
70
73
  servePreview: unreachable,
71
- // a built index keeps no configuration, so it lists no plugins; list_plugins is not among its tools
72
- plugins: pluginsDocument([])
74
+ // a built index keeps no configuration, so it lists no plugins or switches; neither tool is among its tools
75
+ plugins: pluginsDocument([]),
76
+ switches: { schema: 1, switches: [] }
73
77
  }).filter((tool) => READ_ONLY_TOOLS.has(tool.name));
74
78
  return {
75
79
  info: { name: "forgebook", version },
@@ -29,6 +29,15 @@ export declare const configPathOf: (file: string | undefined) => string | undefi
29
29
  * @throws a `ScriptError` when there is none, or it cannot be used.
30
30
  */
31
31
  export declare const configOf: (file: string | undefined) => Promise<ResolvedConfig>;
32
+ /**
33
+ * The catalogue's configuration, for a command that reads its stories: a pattern that matches nothing is a mistake there,
34
+ * and answering "no stories" with success hides it from a person and from CI alike. `forgebook dev` only warns, since
35
+ * whoever runs it may be about to write the first story.
36
+ *
37
+ * @param file - the configuration file given; none to look in the current folder.
38
+ * @throws a `ScriptError` when there is none, it cannot be used, or one of its story patterns matches nothing.
39
+ */
40
+ export declare const configWithStoriesOf: (file: string | undefined) => Promise<ResolvedConfig>;
32
41
  /**
33
42
  * Asks the catalogue one of its answers, from its running dev server or one started for the answer.
34
43
  *