forgebook 0.3.2 → 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 (693) hide show
  1. package/README.md +917 -74
  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 +54 -6
  187. package/dist/src/addressArgs.js +72 -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 +58 -14
  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/PluginBlockHost.js +2 -1
  307. package/dist/src/shell/PluginTabHost.js +19 -2
  308. package/dist/src/shell/PropFields.d.ts +3 -1
  309. package/dist/src/shell/PropFields.js +9 -6
  310. package/dist/src/shell/PropRows.d.ts +23 -2
  311. package/dist/src/shell/PropRows.js +58 -19
  312. package/dist/src/shell/PropsTab.d.ts +12 -5
  313. package/dist/src/shell/PropsTab.js +9 -21
  314. package/dist/src/shell/RefStoryPage.d.ts +33 -0
  315. package/dist/src/shell/RefStoryPage.js +123 -0
  316. package/dist/src/shell/SearchPanel.js +51 -24
  317. package/dist/src/shell/Shell.d.ts +18 -0
  318. package/dist/src/shell/Shell.js +137 -22
  319. package/dist/src/shell/ShortcutHelp.d.ts +22 -0
  320. package/dist/src/shell/ShortcutHelp.js +66 -0
  321. package/dist/src/shell/Sidebar.d.ts +17 -4
  322. package/dist/src/shell/Sidebar.js +92 -41
  323. package/dist/src/shell/SidebarDocs.js +2 -2
  324. package/dist/src/shell/SidebarEntries.js +5 -3
  325. package/dist/src/shell/SidebarHandle.d.ts +3 -5
  326. package/dist/src/shell/SidebarHandle.js +4 -4
  327. package/dist/src/shell/SidebarRefs.d.ts +39 -0
  328. package/dist/src/shell/SidebarRefs.js +99 -0
  329. package/dist/src/shell/SidebarSearch.js +37 -9
  330. package/dist/src/shell/SignatureReference.js +3 -1
  331. package/dist/src/shell/Stage.d.ts +10 -2
  332. package/dist/src/shell/Stage.js +35 -60
  333. package/dist/src/shell/StatusBadges.d.ts +54 -0
  334. package/dist/src/shell/StatusBadges.js +77 -0
  335. package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
  336. package/dist/src/shell/StoryCodeBlock.js +7 -6
  337. package/dist/src/shell/SwitchGallery.d.ts +36 -0
  338. package/dist/src/shell/SwitchGallery.js +17 -0
  339. package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
  340. package/dist/src/shell/SwitchGalleryPanel.js +99 -0
  341. package/dist/src/shell/TagFilter.d.ts +24 -0
  342. package/dist/src/shell/TagFilter.js +45 -0
  343. package/dist/src/shell/TagViews.d.ts +39 -0
  344. package/dist/src/shell/TagViews.js +20 -0
  345. package/dist/src/shell/Toolbar.d.ts +4 -1
  346. package/dist/src/shell/Toolbar.js +17 -7
  347. package/dist/src/shell/ToolbarControl.d.ts +3 -0
  348. package/dist/src/shell/ToolbarControl.js +23 -6
  349. package/dist/src/shell/ViewMenuPanel.js +6 -1
  350. package/dist/src/shell/argChecks.d.ts +22 -0
  351. package/dist/src/shell/argChecks.js +20 -0
  352. package/dist/src/shell/asideStory.d.ts +17 -4
  353. package/dist/src/shell/asideStory.js +21 -4
  354. package/dist/src/shell/audienceSections.css +9 -9
  355. package/dist/src/shell/catalogueContext.d.ts +1 -1
  356. package/dist/src/shell/catalogueContext.js +6 -1
  357. package/dist/src/shell/codeSpans.d.ts +27 -0
  358. package/dist/src/shell/codeSpans.js +76 -0
  359. package/dist/src/shell/compareVariants.d.ts +4 -2
  360. package/dist/src/shell/compareVariants.js +16 -8
  361. package/dist/src/shell/composition.d.ts +23 -0
  362. package/dist/src/shell/composition.js +26 -0
  363. package/dist/src/shell/controlCycle.d.ts +1 -1
  364. package/dist/src/shell/controlCycle.js +3 -2
  365. package/dist/src/shell/customControls.d.ts +55 -0
  366. package/dist/src/shell/customControls.js +70 -0
  367. package/dist/src/shell/docPage.css +22 -22
  368. package/dist/src/shell/dockTabs.d.ts +19 -3
  369. package/dist/src/shell/dockTabs.js +28 -20
  370. package/dist/src/shell/embed.css +7 -7
  371. package/dist/src/shell/framesOrigin.d.ts +7 -0
  372. package/dist/src/shell/framesOrigin.js +1 -1
  373. package/dist/src/shell/galleryPlace.d.ts +20 -0
  374. package/dist/src/shell/galleryPlace.js +26 -0
  375. package/dist/src/shell/icons.d.ts +1 -0
  376. package/dist/src/shell/icons.js +1 -0
  377. package/dist/src/shell/keyboard.d.ts +14 -12
  378. package/dist/src/shell/keyboard.js +21 -6
  379. package/dist/src/shell/laterStrings.d.ts +29 -0
  380. package/dist/src/shell/laterStrings.js +42 -3
  381. package/dist/src/shell/mountShell.js +3 -0
  382. package/dist/src/shell/pageStrings.d.ts +4 -0
  383. package/dist/src/shell/pageStrings.js +4 -0
  384. package/dist/src/shell/pageTagView.d.ts +18 -0
  385. package/dist/src/shell/pageTagView.js +10 -0
  386. package/dist/src/shell/playMemory.d.ts +14 -0
  387. package/dist/src/shell/playMemory.js +8 -0
  388. package/dist/src/shell/propNotes.d.ts +23 -0
  389. package/dist/src/shell/propNotes.js +37 -0
  390. package/dist/src/shell/refIndexLoad.d.ts +17 -0
  391. package/dist/src/shell/refIndexLoad.js +38 -0
  392. package/dist/src/shell/refParts.d.ts +34 -0
  393. package/dist/src/shell/refParts.js +9 -0
  394. package/dist/src/shell/refStory.css +21 -0
  395. package/dist/src/shell/refStrings.d.ts +13 -0
  396. package/dist/src/shell/refStrings.js +21 -0
  397. package/dist/src/shell/search.css +11 -11
  398. package/dist/src/shell/shell.css +348 -168
  399. package/dist/src/shell/shellScheme.js +2 -2
  400. package/dist/src/shell/shortcutHelp.css +64 -0
  401. package/dist/src/shell/stageArgs.d.ts +53 -0
  402. package/dist/src/shell/stageArgs.js +64 -0
  403. package/dist/src/shell/statusBadges.css +51 -0
  404. package/dist/src/shell/strings.d.ts +7 -16
  405. package/dist/src/shell/strings.js +12 -17
  406. package/dist/src/shell/switchGallery.css +104 -0
  407. package/dist/src/shell/tagFilter.css +46 -0
  408. package/dist/src/shell/tagView.d.ts +20 -0
  409. package/dist/src/shell/tagView.js +10 -0
  410. package/dist/src/shell/useAddressArgs.d.ts +27 -2
  411. package/dist/src/shell/useAddressArgs.js +71 -14
  412. package/dist/src/shell/useControlKeys.js +2 -2
  413. package/dist/src/shell/useEditedProblems.d.ts +6 -0
  414. package/dist/src/shell/useEditedProblems.js +40 -0
  415. package/dist/src/shell/useFrameMessages.js +3 -0
  416. package/dist/src/shell/useListedTree.d.ts +13 -0
  417. package/dist/src/shell/useListedTree.js +32 -0
  418. package/dist/src/shell/usePageFrames.js +2 -2
  419. package/dist/src/shell/usePopover.d.ts +5 -0
  420. package/dist/src/shell/usePopover.js +7 -1
  421. package/dist/src/shell/useRefIndex.d.ts +22 -0
  422. package/dist/src/shell/useRefIndex.js +36 -0
  423. package/dist/src/shell/useScrollStops.d.ts +20 -0
  424. package/dist/src/shell/useScrollStops.js +41 -0
  425. package/dist/src/shell/useShortcutHelp.d.ts +18 -0
  426. package/dist/src/shell/useShortcutHelp.js +32 -0
  427. package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
  428. package/dist/src/shell/useSidebarOverlay.js +12 -4
  429. package/dist/src/shell/useStoryCode.d.ts +2 -1
  430. package/dist/src/shell/useStoryCode.js +12 -7
  431. package/dist/src/shell/useToolbarLayout.d.ts +5 -1
  432. package/dist/src/shell/useToolbarLayout.js +2 -2
  433. package/dist/src/shell/useWorstCase.d.ts +8 -2
  434. package/dist/src/shell/useWorstCase.js +2 -2
  435. package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
  436. package/dist/src/shell/valueEditors/FileEditor.js +66 -0
  437. package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
  438. package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
  439. package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
  440. package/dist/src/shell/valueEditors/ListEditor.js +82 -0
  441. package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
  442. package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
  443. package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
  444. package/dist/src/shell/valueEditors/PropEditor.js +53 -0
  445. package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
  446. package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
  447. package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
  448. package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
  449. package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
  450. package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
  451. package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
  452. package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
  453. package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
  454. package/dist/src/shell/valueEditors/ValueField.js +147 -0
  455. package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
  456. package/dist/src/shell/valueEditors/editorStrings.js +66 -0
  457. package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
  458. package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
  459. package/dist/src/shell/valueEditors/valueEditors.css +153 -0
  460. package/dist/src/shell/worstArgs.d.ts +8 -5
  461. package/dist/src/shell/worstArgs.js +14 -7
  462. package/dist/src/shellTheme.d.ts +1 -1
  463. package/dist/src/shellTheme.js +15 -1
  464. package/dist/src/shellTheme.types.d.ts +4 -0
  465. package/dist/src/shellWord.d.ts +12 -0
  466. package/dist/src/shellWord.js +15 -0
  467. package/dist/src/sourceFiles.js +2 -1
  468. package/dist/src/storyArgTypes.d.ts +57 -0
  469. package/dist/src/storyArgTypes.js +195 -0
  470. package/dist/src/storyBackground.js +14 -3
  471. package/dist/src/storyCheck.d.ts +85 -3
  472. package/dist/src/storyCheck.js +23 -1
  473. package/dist/src/storyCodeText.d.ts +46 -0
  474. package/dist/src/storyCodeText.js +27 -0
  475. package/dist/src/storyControls.d.ts +100 -0
  476. package/dist/src/storyControls.js +100 -0
  477. package/dist/src/storyStatuses.d.ts +55 -0
  478. package/dist/src/storyStatuses.js +104 -0
  479. package/dist/src/storyTagNames.d.ts +25 -0
  480. package/dist/src/storyTagNames.js +25 -0
  481. package/dist/src/storyTags.d.ts +29 -0
  482. package/dist/src/storyTags.js +85 -0
  483. package/dist/src/storyTree.d.ts +13 -0
  484. package/dist/src/storyTree.js +24 -4
  485. package/dist/src/storybookArgs.d.ts +24 -0
  486. package/dist/src/storybookArgs.js +185 -0
  487. package/dist/src/switches.d.ts +66 -3
  488. package/dist/src/switches.js +42 -1
  489. package/dist/src/valueSchema.d.ts +28 -0
  490. package/dist/src/valueSchema.js +196 -0
  491. package/dist/src/valueShape.d.ts +94 -0
  492. package/dist/src/valueShape.js +25 -0
  493. package/dist/src/viewState.d.ts +8 -3
  494. package/dist/src/viewState.js +27 -10
  495. package/dist/src/vite/adapter.d.ts +40 -2
  496. package/dist/src/vite/adapter.js +1 -0
  497. package/dist/src/vite/agent.types.d.ts +347 -7
  498. package/dist/src/vite/agentApi.d.ts +23 -0
  499. package/dist/src/vite/agentApi.js +90 -17
  500. package/dist/src/vite/agentIndex.d.ts +0 -2
  501. package/dist/src/vite/agentIndex.js +5 -6
  502. package/dist/src/vite/agentRoutes.d.ts +20 -1
  503. package/dist/src/vite/agentRoutes.js +106 -65
  504. package/dist/src/vite/agentStatuses.d.ts +42 -0
  505. package/dist/src/vite/agentStatuses.js +67 -0
  506. package/dist/src/vite/agentStoryCode.d.ts +48 -0
  507. package/dist/src/vite/agentStoryCode.js +38 -0
  508. package/dist/src/vite/agentVisibility.d.ts +47 -0
  509. package/dist/src/vite/agentVisibility.js +174 -0
  510. package/dist/src/vite/appAudit.d.ts +134 -0
  511. package/dist/src/vite/appAudit.js +333 -0
  512. package/dist/src/vite/appBuildOption.d.ts +53 -0
  513. package/dist/src/vite/appBuildOption.js +55 -0
  514. package/dist/src/vite/appTokenFiles.d.ts +92 -0
  515. package/dist/src/vite/appTokenFiles.js +433 -0
  516. package/dist/src/vite/appTokens.d.ts +23 -0
  517. package/dist/src/vite/appTokens.js +275 -0
  518. package/dist/src/vite/builtTexts.d.ts +10 -0
  519. package/dist/src/vite/builtTexts.js +59 -22
  520. package/dist/src/vite/catalogueConfig.d.ts +3 -1
  521. package/dist/src/vite/catalogueConfig.js +15 -3
  522. package/dist/src/vite/changeCoverage.d.ts +74 -0
  523. package/dist/src/vite/changeCoverage.js +120 -0
  524. package/dist/src/vite/changedRoute.d.ts +30 -0
  525. package/dist/src/vite/changedRoute.js +197 -0
  526. package/dist/src/vite/checkCode.d.ts +105 -3
  527. package/dist/src/vite/checkCode.js +323 -36
  528. package/dist/src/vite/checkoutWatch.d.ts +97 -0
  529. package/dist/src/vite/checkoutWatch.js +287 -0
  530. package/dist/src/vite/closeWatch.d.ts +8 -0
  531. package/dist/src/vite/closeWatch.js +1 -1
  532. package/dist/src/vite/componentCache.d.ts +8 -0
  533. package/dist/src/vite/componentCache.js +66 -0
  534. package/dist/src/vite/componentGraph.d.ts +71 -0
  535. package/dist/src/vite/componentGraph.js +133 -0
  536. package/dist/src/vite/componentRules.d.ts +33 -0
  537. package/dist/src/vite/componentRules.js +105 -0
  538. package/dist/src/vite/componentScan.d.ts +69 -0
  539. package/dist/src/vite/componentScan.js +418 -0
  540. package/dist/src/vite/compositionCheck.d.ts +15 -0
  541. package/dist/src/vite/compositionCheck.js +243 -0
  542. package/dist/src/vite/config.d.ts +32 -1
  543. package/dist/src/vite/configFile.d.ts +14 -2
  544. package/dist/src/vite/configFile.js +124 -40
  545. package/dist/src/vite/configKeys.d.ts +15 -0
  546. package/dist/src/vite/configKeys.js +171 -0
  547. package/dist/src/vite/configLoadError.d.ts +23 -0
  548. package/dist/src/vite/configLoadError.js +71 -0
  549. package/dist/src/vite/cssDeclarations.d.ts +71 -0
  550. package/dist/src/vite/cssDeclarations.js +290 -0
  551. package/dist/src/vite/cssImports.d.ts +14 -0
  552. package/dist/src/vite/cssImports.js +48 -0
  553. package/dist/src/vite/cssReferences.d.ts +54 -0
  554. package/dist/src/vite/cssReferences.js +157 -0
  555. package/dist/src/vite/cssTokenValues.d.ts +50 -0
  556. package/dist/src/vite/cssTokenValues.js +233 -0
  557. package/dist/src/vite/designTokens.d.ts +24 -0
  558. package/dist/src/vite/designTokens.js +5 -1
  559. package/dist/src/vite/docsExtractor.d.ts +9 -3
  560. package/dist/src/vite/docsExtractor.js +11 -3
  561. package/dist/src/vite/docsProgram.d.ts +17 -4
  562. package/dist/src/vite/docsProgram.js +52 -11
  563. package/dist/src/vite/docsWorker.js +7 -2
  564. package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
  565. package/dist/src/vite/emptyStoryGlobs.js +52 -0
  566. package/dist/src/vite/fileImports.d.ts +17 -0
  567. package/dist/src/vite/fileImports.js +57 -0
  568. package/dist/src/vite/findComponent.d.ts +10 -2
  569. package/dist/src/vite/findComponent.js +27 -22
  570. package/dist/src/vite/findRoute.js +3 -2
  571. package/dist/src/vite/forcedStates.d.ts +9 -2
  572. package/dist/src/vite/forcedStates.js +12 -3
  573. package/dist/src/vite/forgebookPlugin.d.ts +2 -0
  574. package/dist/src/vite/forgebookPlugin.js +52 -72
  575. package/dist/src/vite/frameErrors.d.ts +19 -0
  576. package/dist/src/vite/frameErrors.js +70 -0
  577. package/dist/src/vite/framesServer.d.ts +12 -0
  578. package/dist/src/vite/framesServer.js +21 -4
  579. package/dist/src/vite/functionComponentDocs.js +81 -12
  580. package/dist/src/vite/generatedModules.js +4 -2
  581. package/dist/src/vite/gitChange.d.ts +38 -5
  582. package/dist/src/vite/gitChange.js +71 -11
  583. package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
  584. package/dist/src/vite/hiddenStoryFiles.js +107 -0
  585. package/dist/src/vite/hotSnippets.d.ts +38 -14
  586. package/dist/src/vite/hotSnippets.js +137 -39
  587. package/dist/src/vite/importedNames.d.ts +37 -0
  588. package/dist/src/vite/importedNames.js +138 -0
  589. package/dist/src/vite/indexFields.d.ts +6 -0
  590. package/dist/src/vite/indexFields.js +21 -0
  591. package/dist/src/vite/indexStoryFile.d.ts +8 -1
  592. package/dist/src/vite/indexStoryFile.js +22 -157
  593. package/dist/src/vite/jsxCallSites.d.ts +33 -0
  594. package/dist/src/vite/jsxCallSites.js +200 -0
  595. package/dist/src/vite/jsxInScripts.d.ts +67 -0
  596. package/dist/src/vite/jsxInScripts.js +138 -0
  597. package/dist/src/vite/jsxTree.d.ts +20 -0
  598. package/dist/src/vite/jsxTree.js +163 -0
  599. package/dist/src/vite/lineAndColumn.d.ts +13 -0
  600. package/dist/src/vite/lineAndColumn.js +18 -0
  601. package/dist/src/vite/lookAlikes.d.ts +65 -0
  602. package/dist/src/vite/lookAlikes.js +228 -0
  603. package/dist/src/vite/nearestToken.d.ts +17 -0
  604. package/dist/src/vite/nearestToken.js +9 -2
  605. package/dist/src/vite/packageEntries.d.ts +42 -0
  606. package/dist/src/vite/packageEntries.js +127 -0
  607. package/dist/src/vite/pages.d.ts +9 -1
  608. package/dist/src/vite/pages.js +108 -4
  609. package/dist/src/vite/pluginConfig.js +4 -0
  610. package/dist/src/vite/pluginIds.d.ts +2 -0
  611. package/dist/src/vite/pluginIds.js +5 -1
  612. package/dist/src/vite/pluginModules.d.ts +81 -11
  613. package/dist/src/vite/pluginModules.js +109 -21
  614. package/dist/src/vite/prebundled.d.ts +57 -15
  615. package/dist/src/vite/prebundled.js +80 -0
  616. package/dist/src/vite/previewTags.d.ts +25 -0
  617. package/dist/src/vite/previewTags.js +56 -0
  618. package/dist/src/vite/projectFiles.d.ts +54 -0
  619. package/dist/src/vite/projectFiles.js +116 -0
  620. package/dist/src/vite/projectPostcss.d.ts +70 -0
  621. package/dist/src/vite/projectPostcss.js +250 -0
  622. package/dist/src/vite/propDocs.d.ts +12 -0
  623. package/dist/src/vite/propDocs.js +130 -58
  624. package/dist/src/vite/propKind.d.ts +40 -0
  625. package/dist/src/vite/propKind.js +71 -0
  626. package/dist/src/vite/propTypeNotes.d.ts +22 -0
  627. package/dist/src/vite/propTypeNotes.js +51 -0
  628. package/dist/src/vite/publishedExports.d.ts +27 -0
  629. package/dist/src/vite/publishedExports.js +298 -0
  630. package/dist/src/vite/realFolder.d.ts +6 -0
  631. package/dist/src/vite/realFolder.js +25 -0
  632. package/dist/src/vite/refsConfig.d.ts +39 -0
  633. package/dist/src/vite/refsConfig.js +54 -0
  634. package/dist/src/vite/reuseCheck.d.ts +45 -0
  635. package/dist/src/vite/reuseCheck.js +260 -0
  636. package/dist/src/vite/runningVersions.d.ts +33 -0
  637. package/dist/src/vite/runningVersions.js +25 -0
  638. package/dist/src/vite/scriptProblems.d.ts +60 -0
  639. package/dist/src/vite/scriptProblems.js +155 -0
  640. package/dist/src/vite/searchModule.js +3 -2
  641. package/dist/src/vite/searchRoute.js +4 -2
  642. package/dist/src/vite/shapeDocs.d.ts +36 -0
  643. package/dist/src/vite/shapeDocs.js +177 -0
  644. package/dist/src/vite/singleFileComponent.d.ts +17 -0
  645. package/dist/src/vite/singleFileComponent.js +83 -0
  646. package/dist/src/vite/sourceText.d.ts +34 -0
  647. package/dist/src/vite/sourceText.js +72 -0
  648. package/dist/src/vite/sourceTokens.d.ts +7 -0
  649. package/dist/src/vite/sourceTokens.js +7 -2
  650. package/dist/src/vite/stackLines.d.ts +49 -0
  651. package/dist/src/vite/stackLines.js +96 -0
  652. package/dist/src/vite/storyCode.d.ts +22 -7
  653. package/dist/src/vite/storyCode.js +263 -37
  654. package/dist/src/vite/storyCoverage.d.ts +48 -0
  655. package/dist/src/vite/storyCoverage.js +179 -0
  656. package/dist/src/vite/storyFilesModule.d.ts +48 -3
  657. package/dist/src/vite/storyFilesModule.js +105 -15
  658. package/dist/src/vite/storyPatterns.d.ts +31 -0
  659. package/dist/src/vite/storyPatterns.js +140 -5
  660. package/dist/src/vite/storyReach.d.ts +10 -2
  661. package/dist/src/vite/storyReach.js +15 -11
  662. package/dist/src/vite/storyTopLevel.d.ts +51 -0
  663. package/dist/src/vite/storyTopLevel.js +146 -0
  664. package/dist/src/vite/storylessRoutes.d.ts +4 -3
  665. package/dist/src/vite/storylessRoutes.js +210 -19
  666. package/dist/src/vite/switchValuesCheck.d.ts +19 -0
  667. package/dist/src/vite/switchValuesCheck.js +164 -0
  668. package/dist/src/vite/switchesDocument.d.ts +15 -0
  669. package/dist/src/vite/switchesDocument.js +47 -0
  670. package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
  671. package/dist/src/vite/tailwindConfigTokens.js +306 -0
  672. package/dist/src/vite/textImports.d.ts +15 -0
  673. package/dist/src/vite/textImports.js +58 -0
  674. package/dist/src/vite/textModules.d.ts +6 -5
  675. package/dist/src/vite/textModules.js +13 -8
  676. package/dist/src/vite/tokenAnswers.d.ts +6 -2
  677. package/dist/src/vite/tokenAnswers.js +11 -7
  678. package/dist/src/vite/typeParameters.d.ts +83 -0
  679. package/dist/src/vite/typeParameters.js +270 -0
  680. package/dist/src/vite/unionProps.d.ts +37 -0
  681. package/dist/src/vite/unionProps.js +121 -0
  682. package/dist/src/vite/unresolvedTokens.d.ts +20 -0
  683. package/dist/src/vite/unresolvedTokens.js +193 -0
  684. package/dist/src/vite/usageGraph.js +10 -52
  685. package/dist/src/vite/usageGuidance.d.ts +9 -2
  686. package/dist/src/vite/usageGuidance.js +36 -8
  687. package/dist/src/vite/usageImports.d.ts +35 -0
  688. package/dist/src/vite/usageImports.js +280 -0
  689. package/dist/src/vite/visibilityRoute.d.ts +16 -0
  690. package/dist/src/vite/visibilityRoute.js +320 -0
  691. package/dist/src/worstCase.d.ts +2 -0
  692. package/dist/src/worstCase.js +2 -0
  693. package/package.json +28 -8
@@ -0,0 +1,43 @@
1
+ # Switches, galleries and themes
2
+
3
+ `forgebook switches --json` (`list_switches`) lists what a catalogue offers: each switch's id, its `control` and its
4
+ values, each with the `view` to write (`--view look=night`), what it `implies`, its `sheet` and its `preview`.
5
+
6
+ A catalogue declares them in `forgebook.config.ts`:
7
+
8
+ ```ts
9
+ switches: [
10
+ { id: "theme", label: "Appearance", role: "colorScheme", default: "light",
11
+ apply: { kind: "attribute", name: "data-theme" },
12
+ values: [{ value: "light", label: "Light", scheme: "light" }, { value: "dark", label: "Dark", scheme: "dark" }] },
13
+ { id: "look", label: "Theme", control: "gallery", default: "plain",
14
+ apply: { kind: "attribute", name: "data-look" },
15
+ values: [
16
+ { value: "plain", label: "Plain", isUnset: true },
17
+ { value: "paper", label: "Paper", preview: { image: "previews/paper.png" }, sheet: "looks/paper.css" },
18
+ { value: "night", label: "Night", preview: { swatches: ["#0b1020", "#7c8cff"], font: "Harbor Sans" },
19
+ implies: { theme: "dark" }, sheet: "looks/night.css" }
20
+ ] }
21
+ ]
22
+ ```
23
+
24
+ - **`control: "gallery"`** is a menu whose items show each value's `preview`. Its code and pictures load only when it
25
+ first opens. A value with no preview shows its label's first letter. The control's name comes from the switch and each
26
+ item's from the value's `label`, never from the picture.
27
+ - **`preview`** is `{ image }`, a file by its path, or `{ swatches, font }`, 1 to 8 plain colours and a font's name.
28
+ A font is only a name: drawn in it where the reader has it installed, never fetched. An address is refused, in `image`
29
+ and in `sheet`, as are `url()` in a colour and a preview on a switch that is no gallery: the configuration's check
30
+ stops every command with the value's name.
31
+ - **`implies`** sets other switches while the value is drawn. The implied switch's control is off and says what sets it;
32
+ its key does nothing. The address keeps the reader's own value, which returns when the value is left, so
33
+ `look=night&theme=light` draws dark. It wins over the address and over a story's `globals`. Between two values that imply
34
+ different values of one switch, the switch declared first wins. An implied value may imply nothing further. Compare
35
+ leaves out a cell it contradicts: `look,theme` shows Night only at dark, and Compare cannot pick a switch implied now.
36
+ - **`sheet`** is a style sheet of that value alone, in dev and in a build, loaded with Styles › Full only, after the source's
37
+ sheets, the switches' in the order declared. Its path may not be an address; its contents are the author's own CSS. On a change the old sheet stays until the new one has loaded, and the root's
38
+ attributes move with it, so no frame is drawn with neither.
39
+ - **A source's page colour** can follow a switch, so a story's box waits on the right colour:
40
+ `background: { light, dark, bySwitch: { look: { night: { dark: "#0b1020" } } } }`. The first declared switch whose
41
+ value gives the scheme's colour wins; otherwise `light` and `dark`.
42
+ - The reader's own **Interface** menu, at the sidebar's foot, colours the catalogue around the stories and never the
43
+ stories themselves. `strings: { appearance: "…" }` renames it; the `appearance` setting keeps its name.
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `forgebook guide`: the rest of what `forgebook agents` leaves out of a project's files, printed a topic at a time.
3
+ *
4
+ * @module
5
+ */
6
+ import type { CommandNode, CommandScope } from "@ensiria/cli-kit/commands.types";
7
+ import { type ForgebookOptions } from "./catalogueCommands.ts";
8
+ /**
9
+ * The commands.
10
+ *
11
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
12
+ */
13
+ export declare const guideCommands: (forgebook: CommandScope<ForgebookOptions>) => Readonly<Record<string, CommandNode>>;
@@ -0,0 +1,37 @@
1
+ import { formatJson } from "@ensiria/cli-kit/files";
2
+ import { table } from "@ensiria/cli-kit/layout";
3
+ import { ScriptError } from "@ensiria/cli-kit/script";
4
+ import { guideList, guideTopic, projectFrameworks } from "./agentGuide.js";
5
+ import { COMMAND, configPathOf } from "./catalogueCommands.js";
6
+ /**
7
+ * The commands.
8
+ *
9
+ * @param forgebook - the scope of the `forgebook` command, whose options every command takes.
10
+ */
11
+ export const guideCommands = (forgebook) => ({
12
+ guide: forgebook.command({
13
+ summary: "Print Forgebook's guide for coding agents: a framework's or a topic's full text, on demand.",
14
+ json: true,
15
+ positionals: [{ name: "topic", description: "The topic or the framework; none lists them." }],
16
+ examples: [
17
+ { command: `${COMMAND} guide`, description: "The topics, and this project's framework." },
18
+ { command: `${COMMAND} guide vue`, description: "Stories in Vue." },
19
+ { command: `${COMMAND} guide docs-pages`, description: "Writing a docs page." }
20
+ ],
21
+ run: ({ args, options, io, isJson, style }) => {
22
+ if (args.topic === undefined) {
23
+ const frameworks = projectFrameworks(configPathOf(options.config), process.cwd());
24
+ const list = guideList(frameworks);
25
+ const about = table(list.topics.map((each) => [each.topic, each.about]), { columns: [{ header: "Topic" }, { header: "What it holds" }] }, style);
26
+ const found = frameworks.length === 0 ? "" : `\n\nThis project: ${frameworks.join(", ")}`;
27
+ io.stdout.write(isJson ? formatJson(list) : `${about}${found}\n`);
28
+ return;
29
+ }
30
+ const topic = guideTopic(args.topic);
31
+ if (topic === undefined) {
32
+ throw new ScriptError(`No topic ${args.topic}`, { hint: `${COMMAND} guide lists them` });
33
+ }
34
+ io.stdout.write(isJson ? formatJson(topic) : `${topic.text}\n`);
35
+ }
36
+ })
37
+ });
@@ -18,6 +18,8 @@ export type ImportedConfig = {
18
18
  /** What was not read, each a sentence for the person who runs the command. */
19
19
  readonly notes: readonly string[];
20
20
  };
21
+ /** Whether a value is a plain object. */
22
+ export declare const isRecord: (value: unknown) => value is Readonly<Record<string, unknown>>;
21
23
  /**
22
24
  * Every glob a glob with alternatives stands for: `@(a|b)`, `?(a|b)` and `{a,b}` written out, nested ones too, so the
23
25
  * configuration lists plain globs a person reads at a glance.
@@ -50,6 +52,25 @@ export declare const previewSwitches: (text: string, file: string) => {
50
52
  readonly switches: ViewSwitch[] | undefined;
51
53
  readonly notes: string[];
52
54
  };
55
+ /**
56
+ * The project's name: its package's, or its folder's.
57
+ *
58
+ * @param dir - the project's folder.
59
+ */
60
+ export declare const projectTitle: (dir: string) => string;
61
+ /**
62
+ * The project's `package.json`, parsed; empty when it has none.
63
+ *
64
+ * @param dir - the project's folder.
65
+ */
66
+ export declare const projectManifest: (dir: string) => Readonly<Record<string, unknown>>;
67
+ /**
68
+ * The Storybook folder of a project: the first of Storybook's folders that holds a `main`.
69
+ *
70
+ * @param projectDir - the project's folder, absolute.
71
+ * @returns its path, or none for a project without one.
72
+ */
73
+ export declare const findStorybookDir: (projectDir: string) => string | undefined;
53
74
  /**
54
75
  * Reads a project's Storybook configuration.
55
76
  *
@@ -36,7 +36,7 @@ const DEFAULT_FILES = "**/*.@(mdx|stories.@(js|jsx|mjs|ts|tsx))";
36
36
  /** The names `main` and the preview may have, in the order Storybook looks for them. */
37
37
  const SCRIPT_EXTENSIONS = ["ts", "mts", "tsx", "js", "mjs", "cjs", "jsx"];
38
38
  /** Whether a value is a plain object. */
39
- const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
39
+ export const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
40
40
  /**
41
41
  * The first file of a name that exists in a folder, whatever its script extension.
42
42
  *
@@ -283,7 +283,7 @@ export const previewSwitches = (text, file) => {
283
283
  *
284
284
  * @param dir - the project's folder.
285
285
  */
286
- const projectTitle = (dir) => {
286
+ export const projectTitle = (dir) => {
287
287
  const manifest = projectManifest(dir);
288
288
  return typeof manifest["name"] === "string" && manifest["name"] !== "" ? manifest["name"] : basename(dir);
289
289
  };
@@ -292,7 +292,7 @@ const projectTitle = (dir) => {
292
292
  *
293
293
  * @param dir - the project's folder.
294
294
  */
295
- const projectManifest = (dir) => {
295
+ export const projectManifest = (dir) => {
296
296
  const file = join(dir, "package.json");
297
297
  const parsed = existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : {};
298
298
  return isRecord(parsed) ? parsed : {};
@@ -333,6 +333,13 @@ const loadedMain = async (mainFile, projectDir) => {
333
333
  const main = isRecord(loaded) && isRecord(loaded["default"]) ? loaded["default"] : loaded;
334
334
  return isRecord(main) ? main : `${relative(projectDir, mainFile)} exports no configuration`;
335
335
  };
336
+ /**
337
+ * The Storybook folder of a project: the first of Storybook's folders that holds a `main`.
338
+ *
339
+ * @param projectDir - the project's folder, absolute.
340
+ * @returns its path, or none for a project without one.
341
+ */
342
+ export const findStorybookDir = (projectDir) => STORYBOOK_DIRS.map((name) => join(projectDir, name)).find((dir) => scriptFile(dir, "main") !== undefined);
336
343
  /**
337
344
  * Reads a project's Storybook configuration.
338
345
  *
@@ -340,8 +347,7 @@ const loadedMain = async (mainFile, projectDir) => {
340
347
  * @returns what a Forgebook configuration takes from it, or why it cannot be read.
341
348
  */
342
349
  export const importStorybook = async (projectDir) => {
343
- const found = STORYBOOK_DIRS.map((name) => join(projectDir, name)).find((dir) => scriptFile(dir, "main") !== undefined);
344
- const storybookDir = found ?? join(projectDir, STORYBOOK_DIRS[0] ?? ".storybook");
350
+ const storybookDir = findStorybookDir(projectDir) ?? join(projectDir, STORYBOOK_DIRS[0] ?? ".storybook");
345
351
  const mainFile = scriptFile(storybookDir, "main");
346
352
  if (mainFile === undefined)
347
353
  return `No .storybook/main (or .rnstorybook/main) file in ${projectDir}`;
@@ -61,7 +61,7 @@ const STORYBOOK_FRAMEWORKS = {
61
61
  export const STORYBOOK_PACKAGES = Object.keys(STORYBOOK_FRAMEWORKS);
62
62
  /** What a Nuxt project's stories get differently once moved, said once the configuration is written. */
63
63
  const NUXT_NOTES = [
64
- "Nuxt's modules and plugins are not run: a component that needs what one provides (a store, i18n) gets it from a decorator",
64
+ "Nuxt's modules are loaded for their plugins, styles and components, but what they and the app's plugins set up at run time is not: a component that needs one (a store, i18n) gets it from a decorator",
65
65
  "A story's route, data, state and cookies are set with parameters.nuxt (route, data, state, cookies), not by a decorator that drives the router"
66
66
  ];
67
67
  /** Whether a value is a plain object. */
@@ -1,3 +1,14 @@
1
+ /**
2
+ * The command that starts a catalogue: `init` writes `forgebook.config.ts` from what a project's files say, so a new user
3
+ * or an agent gets a catalogue that draws in one command, with no question asked.
4
+ *
5
+ * @remarks
6
+ * Defined here, on the scope `forgebookCommands.mts` hands it, so the commands module stays a list of commands; what it
7
+ * does is `initRun.ts`'s. The run loads the compiler to read the project's files, so only this command loads it. A file
8
+ * already there is never replaced unless asked (`--force`): it may hold a person's work.
9
+ *
10
+ * @module
11
+ */
1
12
  import type { CommandNode, CommandScope } from "@ensiria/cli-kit/commands.types";
2
13
  import { type ForgebookOptions } from "./catalogueCommands.ts";
3
14
  /**
@@ -1,54 +1,7 @@
1
- /**
2
- * The command that starts a catalogue: `init --from storybook` writes `forgebook.config.ts` from a project's Storybook
3
- * files, so a project on Storybook tries Forgebook in one command, its stories read as they are.
4
- *
5
- * @remarks
6
- * Defined here, on the scope `forgebookCommands.mts` hands it, so the commands module stays a list of commands; the reading is the
7
- * importer's (`importers/storybook.ts`), the writing `initConfig.ts`'s. A configuration already there is never
8
- * replaced unless asked (`--force`): it may hold a person's work.
9
- *
10
- * @module
11
- */
12
- import { existsSync, writeFileSync } from "node:fs";
13
- import { createRequire } from "node:module";
14
- import { join, resolve } from "node:path";
15
- import { ScriptError } from "@ensiria/cli-kit/script";
16
- import { CONFIG_FILES } from "../../src/vite/configFile.js";
1
+ import { HOOK_NAMES } from "./agentSetup/hookNames.js";
17
2
  import { COMMAND } from "./catalogueCommands.js";
18
- import { frameworkPeers } from "./importers/storybookFrameworks.js";
19
- import { CONFIG_FILE, initConfigText } from "./initConfig.js";
20
- /**
21
- * The modules the written configuration needs, by the package that has each: what it imports, and the framework's
22
- * peers.
23
- *
24
- * @param imported - what the importer read: the framework and its options.
25
- */
26
- const configImports = (imported) => ({
27
- forgebook: "forgebook",
28
- [`@forgebook/${imported.framework}`]: `@forgebook/${imported.framework}/vite`,
29
- ...Object.fromEntries(frameworkPeers(imported.framework, imported.frameworkOptions).map((peer) => [
30
- peer,
31
- `${peer}/package.json`
32
- ]))
33
- });
34
- /**
35
- * The packages the written configuration needs that the project cannot load yet.
36
- *
37
- * @param dir - the project's folder.
38
- * @param imported - what the importer read: the framework and its options.
39
- */
40
- const missingPackages = (dir, imported) => {
41
- const require = createRequire(join(dir, "package.json"));
42
- return Object.entries(configImports(imported)).flatMap(([name, specifier]) => {
43
- try {
44
- require.resolve(specifier);
45
- return [];
46
- }
47
- catch {
48
- return [name];
49
- }
50
- });
51
- };
3
+ import { CONFIG_FILE } from "./initConfig.js";
4
+ import { FRAMEWORK_NAMES } from "./newProject/projectFrameworks.js";
52
5
  /**
53
6
  * The commands.
54
7
  *
@@ -56,45 +9,65 @@ const missingPackages = (dir, imported) => {
56
9
  */
57
10
  export const initCommands = (forgebook) => ({
58
11
  init: forgebook.command({
59
- summary: "Write forgebook.config.ts from another tool's files: Storybook's story globs, preview and globals.",
12
+ summary: "Write forgebook.config.ts, and a preview with the app's global style sheets, from the project's files; with --agents, what a project's coding agents need too.",
13
+ json: true,
60
14
  options: {
61
15
  from: {
62
16
  type: "string",
63
- required: true,
64
17
  choices: ["storybook"],
65
18
  valueName: "tool",
66
- description: "The tool whose files are read (its folder in the current one: .storybook, or on-device Storybook's .rnstorybook)."
19
+ description: "Read this tool's files (its folder in the current one: .storybook, or on-device Storybook's .rnstorybook). Loading its main runs the project's code."
20
+ },
21
+ framework: {
22
+ type: "string",
23
+ valueName: "name",
24
+ choices: [...FRAMEWORK_NAMES],
25
+ description: "The framework the stories are written for, when package.json does not settle it (html for none); starts from the dependencies even on Storybook."
26
+ },
27
+ install: {
28
+ type: "boolean",
29
+ description: "Run the package manager's install of what the configuration imports; as any install, it runs what the project's package manager settings and the packages' scripts say."
67
30
  },
68
- force: { type: "boolean", description: `Replace a ${CONFIG_FILE} that is already there.` }
31
+ force: { type: "boolean", description: `Replace a ${CONFIG_FILE} or a preview that is already there.` },
32
+ agents: {
33
+ type: "boolean",
34
+ description: "Also set up the project's coding agents: .mcp.json, AGENTS.md and the skill, a CI workflow for verify, and a hook that runs verify. Merges, and never replaces; keeps a catalogue already there, and starts beside a Storybook."
35
+ },
36
+ hooks: {
37
+ type: "string",
38
+ valueName: "list",
39
+ description: `With --agents, the hooks to write, by commas: ${HOOK_NAMES.join(", ")}. By default those of the assistants the repository shows signs of, otherwise pre-commit.`
40
+ },
41
+ browser: {
42
+ type: "boolean",
43
+ description: "Install the testing package and its browser, which downloads about 200 MB; implies --install."
44
+ },
45
+ draw: {
46
+ type: "boolean",
47
+ description: "Then draw a story in the browser, trying components until one draws, and say why each that did not; exits 1 if none does. Runs the project's code (its vite.config, its components), and keeps the story that drew."
48
+ }
69
49
  },
70
50
  examples: [
51
+ { command: `${COMMAND} init`, description: "Read the project and write the files." },
52
+ { command: `${COMMAND} init --json`, description: "The same, as a document, for an agent." },
53
+ { command: `${COMMAND} init --from storybook`, description: "Read .storybook." },
71
54
  {
72
- command: `${COMMAND} init --from storybook`,
73
- description: "Read .storybook and write the configuration."
55
+ command: `${COMMAND} init --agents --browser --draw --json`,
56
+ description: "All of it, unattended, for an agent: ends with a story drawn, or why none was."
74
57
  }
75
58
  ],
76
- run: async ({ options, log }) => {
77
- const file = resolve(CONFIG_FILE);
78
- // any configuration the catalogue would read, not only the file written: a new .ts would win over a .mts
79
- const existing = CONFIG_FILES.find((name) => existsSync(resolve(name)));
80
- if (existing !== undefined && options.force !== true)
81
- throw new ScriptError(`${existing} is already there`, {
82
- hint: "Give --force to replace it with the one read from Storybook"
83
- });
84
- // the importer reads Storybook's files with the compiler: only this command loads it
85
- const { importStorybook } = await import("./importers/storybook.js");
86
- const imported = await importStorybook(process.cwd());
87
- if (typeof imported === "string")
88
- throw new ScriptError(imported);
89
- writeFileSync(file, initConfigText(imported, "Storybook"));
90
- log.success(`${CONFIG_FILE} written: ${imported.stories.length} story globs`);
91
- for (const note of imported.notes)
92
- log.warn(note);
93
- const missing = missingPackages(process.cwd(), imported);
94
- if (missing.length > 0)
95
- log.info(`Install what it imports first: npm install --save-dev ${missing.join(" ")}`);
96
- log.info(`Next: ${COMMAND} dev to open the catalogue, ${COMMAND} stories to list what did not read, ` +
97
- `${COMMAND} agents for the project's coding agents`);
59
+ run: async ({ options, io, log, isJson }) => {
60
+ const { runInit } = await import("./initRun.js");
61
+ await runInit({
62
+ from: options.from,
63
+ framework: options.framework,
64
+ isForced: options.force === true,
65
+ shouldInstall: options.install === true || options.browser === true,
66
+ isForAgents: options.agents === true,
67
+ hooks: options.hooks?.split(",").map((name) => name.trim()),
68
+ shouldInstallBrowser: options.browser === true,
69
+ shouldDraw: options.draw === true
70
+ }, { io, log, isJson });
98
71
  }
99
72
  })
100
73
  });
@@ -1,5 +1,6 @@
1
1
  /**
2
- * The `forgebook.config.ts` that `forgebook init` writes, from what an importer read of another tool's files.
2
+ * The `forgebook.config.ts` that `forgebook init` writes, from what an importer read of another tool's files or from a
3
+ * project's dependencies.
3
4
  *
4
5
  * @remarks
5
6
  * Pure: the configuration in, the file's text out. The file is written as a person would write it (the `defineConfig`
@@ -16,6 +17,7 @@ export declare const CONFIG_FILE = "forgebook.config.ts";
16
17
  * The configuration file's text.
17
18
  *
18
19
  * @param imported - what the importer read.
19
- * @param tool - the tool's name, for the file's comment (`Storybook`).
20
+ * @param tool - the tool's name, for the file's comment (`Storybook`); none for a configuration read from the project's
21
+ * dependencies.
20
22
  */
21
- export declare const initConfigText: (imported: ImportedConfig, tool: string) => string;
23
+ export declare const initConfigText: (imported: ImportedConfig, tool: string | undefined) => string;
@@ -29,7 +29,8 @@ const adapterArgument = (options) => {
29
29
  * The configuration file's text.
30
30
  *
31
31
  * @param imported - what the importer read.
32
- * @param tool - the tool's name, for the file's comment (`Storybook`).
32
+ * @param tool - the tool's name, for the file's comment (`Storybook`); none for a configuration read from the project's
33
+ * dependencies.
33
34
  */
34
35
  export const initConfigText = (imported, tool) => {
35
36
  const adapter = ADAPTER_FUNCTIONS[imported.framework];
@@ -41,7 +42,7 @@ export const initConfigText = (imported, tool) => {
41
42
  ...(imported.switches === undefined
42
43
  ? []
43
44
  : [
44
- ` // from the preview's globalTypes: applied by code, as ${tool}'s decorators read them`,
45
+ ` // from the preview's globalTypes: applied by code, as ${tool ?? "the app"}'s decorators read them`,
45
46
  ` switches: ${sourceOf(imported.switches, " ")},`
46
47
  ])
47
48
  ];
@@ -50,7 +51,9 @@ export const initConfigText = (imported, tool) => {
50
51
  fields[last] = fields[last]?.replace(/,$/, "") ?? "";
51
52
  return [
52
53
  "/**",
53
- ` * The catalogue's configuration, written by \`forgebook init --from ${tool.toLowerCase()}\` from ${tool}'s files.`,
54
+ tool === undefined
55
+ ? " * The catalogue's configuration, written by `forgebook init` from the project's dependencies."
56
+ : ` * The catalogue's configuration, written by \`forgebook init --from ${tool.toLowerCase()}\` from ${tool}'s files.`,
54
57
  " *",
55
58
  " * @module",
56
59
  " */",
@@ -0,0 +1,15 @@
1
+ import type { ScriptIo } from "@ensiria/cli-kit/io.types";
2
+ import type { InitInstall } from "./newProject/newProject.types.ts";
3
+ import { type DetectedPackageManager } from "./newProject/packageManagers.ts";
4
+ import { type PackageState } from "./newProject/projectPackages.ts";
5
+ /**
6
+ * What the configuration needs installed: the command, run when asked.
7
+ *
8
+ * @param projectDir - the project's folder.
9
+ * @param manager - its package manager.
10
+ * @param state - what it has of the packages.
11
+ * @param declared - what it declares.
12
+ * @param shouldInstall - whether to run the command.
13
+ * @param io - the run's streams.
14
+ */
15
+ export declare const settleInstall: (projectDir: string, manager: DetectedPackageManager, state: PackageState, declared: ReadonlyMap<string, string>, shouldInstall: boolean, io: ScriptIo) => Promise<InitInstall>;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * What `forgebook init` needs installed, and the install when it is asked for: what a failed one said, and a second try
3
+ * on the peer conflicts npm stops on.
4
+ *
5
+ * @module
6
+ */
7
+ import { exec } from "@ensiria/cli-kit/exec";
8
+ import { ScriptError } from "@ensiria/cli-kit/script";
9
+ import { printable } from "../../src/printable.js";
10
+ import { installArguments, spawnedCommand, workspaceRootFlags } from "./newProject/packageManagers.js";
11
+ import { installSpecifier } from "./newProject/projectPackages.js";
12
+ /** How much of a failed install's end is kept: enough for its reason, not to flood an agent's context. */
13
+ const INSTALL_LINES = 12;
14
+ /** The same, in characters. */
15
+ const INSTALL_TEXT = 360;
16
+ /** The end of what an install said: why it failed is in its last lines, not in its exit code. */
17
+ const installFailure = (command, code, said) => {
18
+ const lines = said.split("\n").filter((line) => /\S/.test(line));
19
+ const errorCode = said.match(/\bE[A-Z]{5,}\b/)?.[0];
20
+ return `${command} exited with code ${code ?? "none"}${errorCode === undefined ? "" : ` (${errorCode})`}: ${lines.slice(-INSTALL_LINES).join("\n").slice(-INSTALL_TEXT)}`;
21
+ };
22
+ /** Runs the install command, the program's lines on stderr so stdout stays the result's. */
23
+ const runInstall = async (projectDir, manager, args, io) => {
24
+ const { program, args: spawnArgs, env } = spawnedCommand(manager.name, args, io.env);
25
+ try {
26
+ const { code, stdout, stderr } = await exec(program, spawnArgs, {
27
+ cwd: projectDir,
28
+ env,
29
+ output: "prefix",
30
+ prefix: manager.name,
31
+ io,
32
+ check: false
33
+ });
34
+ return code === 0
35
+ ? undefined
36
+ : installFailure(`${manager.name} ${args.join(" ")}`, code, `${stdout}\n${stderr}`);
37
+ }
38
+ catch (error) {
39
+ if (error instanceof ScriptError)
40
+ return error.message;
41
+ throw error;
42
+ }
43
+ };
44
+ /** The install's state, from what is needed, what was asked and how it went. */
45
+ const installStatus = (needsInstall, shouldInstall, failure) => {
46
+ if (!needsInstall)
47
+ return "not-needed";
48
+ if (!shouldInstall)
49
+ return "to-run";
50
+ return failure === undefined ? "ran" : "failed";
51
+ };
52
+ /**
53
+ * What the configuration needs installed: the command, run when asked.
54
+ *
55
+ * @param projectDir - the project's folder.
56
+ * @param manager - its package manager.
57
+ * @param state - what it has of the packages.
58
+ * @param declared - what it declares.
59
+ * @param shouldInstall - whether to run the command.
60
+ * @param io - the run's streams.
61
+ */
62
+ export const settleInstall = async (projectDir, manager, state, declared, shouldInstall, io) => {
63
+ const needsInstall = state.missing.length > 0 || state.hasUninstalled;
64
+ const args = installArguments(manager.name, state.missing.map((name) => installSpecifier(name, declared)), workspaceRootFlags(manager.name, projectDir));
65
+ const first = needsInstall && shouldInstall ? await runInstall(projectDir, manager, args, io) : undefined;
66
+ // npm stops on any peer conflict in the whole tree, often the project's own and older than this run: these packages
67
+ // install beside it either way, and the conflict stays the project's to settle
68
+ const isPeerConflict = manager.name === "npm" && first?.includes("ERESOLVE") === true;
69
+ const finalArgs = isPeerConflict ? [...args, "--legacy-peer-deps"] : args;
70
+ const failure = isPeerConflict ? await runInstall(projectDir, manager, finalArgs, io) : first;
71
+ return {
72
+ missing: state.missing,
73
+ command: needsInstall ? [manager.name, ...finalArgs].join(" ") : undefined,
74
+ status: installStatus(needsInstall, shouldInstall, failure),
75
+ error: failure === undefined ? undefined : printable(failure)
76
+ };
77
+ };
@@ -0,0 +1,9 @@
1
+ import type { ScriptIo } from "@ensiria/cli-kit/io.types";
2
+ import type { Logger } from "@ensiria/cli-kit/log.types";
3
+ import type { InitDocument } from "./newProject/newProject.types.ts";
4
+ /** Prints the outcome: the document under `--json`, sentences for a person otherwise. */
5
+ export declare const printInit: (document: InitDocument, { io, log, isJson }: {
6
+ readonly io: ScriptIo;
7
+ readonly log: Logger;
8
+ readonly isJson: boolean;
9
+ }) => void;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * How `forgebook init` says what it did: its document under `--json`, sentences for a person otherwise.
3
+ *
4
+ * @module
5
+ */
6
+ import { formatJson } from "@ensiria/cli-kit/files";
7
+ import { CONFIG_FILE } from "./initConfig.js";
8
+ import { PROJECT_FRAMEWORKS } from "./newProject/projectFrameworks.js";
9
+ /** Says what of the project's own code will run when the catalogue starts, since nothing else tells a person. */
10
+ const sayAppBuild = ({ viteConfig, tsconfigPaths, postcss, runsCode }, log) => {
11
+ const read = [
12
+ ...(viteConfig === undefined ? [] : [viteConfig]),
13
+ ...(postcss === undefined ? [] : [postcss]),
14
+ ...(tsconfigPaths ? ["tsconfig paths"] : [])
15
+ ];
16
+ if (read.length === 0)
17
+ return;
18
+ const running = runsCode.length === 0 ? "" : `; starting it runs ${runsCode.join(" and ")}, as the app's build does`;
19
+ log.info(`The catalogue will read ${read.join(", ")}${running} (appBuild: false turns it off)`);
20
+ };
21
+ /** Says what was written for the project's coding agents. */
22
+ const sayAgentFiles = ({ agents }, log) => {
23
+ for (const file of agents?.written ?? [])
24
+ log.success(`${file} written`);
25
+ for (const hook of agents?.hooks ?? [])
26
+ log.info(`Hook: ${hook.name} (${hook.effect})`);
27
+ };
28
+ /** Says what came of drawing: what did not draw, each with what to do. */
29
+ const sayDraw = ({ draw }, log) => {
30
+ if (draw === undefined)
31
+ return;
32
+ for (const { file, diagnosis } of draw.attempts)
33
+ log.warn(`${file}: ${diagnosis.kind}: ${diagnosis.message}\n ${diagnosis.nextStep}`);
34
+ if (draw.status === "drawn")
35
+ log.success(`${draw.story ?? ""} drew: ${draw.picture ?? ""}`);
36
+ };
37
+ /** Prints the outcome: the document under `--json`, sentences for a person otherwise. */
38
+ export const printInit = (document, { io, log, isJson }) => {
39
+ if (isJson) {
40
+ io.stdout.write(formatJson(document));
41
+ return;
42
+ }
43
+ const { detectedFrom, name } = document.packageManager;
44
+ if (document.route === "new-project") {
45
+ const from = detectedFrom === undefined ? "no lock file: assumed" : detectedFrom;
46
+ log.success(`${PROJECT_FRAMEWORKS[document.framework].label} project, ${name} (${from})`);
47
+ }
48
+ const count = document.stories.length;
49
+ if (document.written.includes(CONFIG_FILE))
50
+ log.success(`${CONFIG_FILE} written: ${count} story ${count === 1 ? "glob" : "globs"}`);
51
+ for (const file of document.written.filter((name) => name !== CONFIG_FILE))
52
+ log.success(`${file} written`);
53
+ sayAppBuild(document.appBuild, log);
54
+ sayAgentFiles(document, log);
55
+ for (const step of document.nextSteps)
56
+ log.warn(step.message);
57
+ sayDraw(document, log);
58
+ for (const { command, description } of document.commands)
59
+ log.info(`${command}: ${description}`);
60
+ };
@@ -0,0 +1,45 @@
1
+ import type { ScriptIo } from "@ensiria/cli-kit/io.types";
2
+ import type { Logger } from "@ensiria/cli-kit/log.types";
3
+ import type { InitRefusal } from "./newProject/newProject.types.ts";
4
+ import type { PackageState } from "./newProject/projectPackages.ts";
5
+ /** Where the command prints. */
6
+ export type InitContext = {
7
+ /** The run's streams. */
8
+ readonly io: ScriptIo;
9
+ /** The run's logger. */
10
+ readonly log: Logger;
11
+ /** Whether stdout carries JSON. */
12
+ readonly isJson: boolean;
13
+ };
14
+ /** A refusal's document without what is always the same. */
15
+ type Refusal = Pick<InitRefusal, "refused" | "message"> & Partial<InitRefusal>;
16
+ /**
17
+ * Stops the command: its document on stdout under `--json`, the error otherwise. Never returns.
18
+ *
19
+ * @param refusal - why.
20
+ * @param context - where it prints.
21
+ */
22
+ export declare const refuse: (refusal: Refusal, context: InitContext) => never;
23
+ /** Whether a path holds anything, a dangling link included. */
24
+ export declare const isThere: (path: string) => boolean;
25
+ /**
26
+ * Refuses a file the catalogue reads that is there already, unless asked to replace it, and a link at any time.
27
+ *
28
+ * @param projectDir - the project's folder.
29
+ * @param name - the file found; none when there is none.
30
+ * @param isForced - `--force`.
31
+ * @param context - where a refusal prints.
32
+ */
33
+ export declare const refuseExisting: (projectDir: string, name: string | undefined, isForced: boolean, context: InitContext) => void;
34
+ /**
35
+ * Stops on a `package.json` that cannot be parsed: everything after this reads it.
36
+ *
37
+ * @param projectDir - the project's folder.
38
+ * @param context - where a refusal prints.
39
+ */
40
+ export declare const refuseBrokenManifest: (projectDir: string, context: InitContext) => void;
41
+ /** The sentence and the document's entry for packages too old, on the route that goes on regardless. */
42
+ export declare const tooOldText: ({ tooOld }: PackageState) => string;
43
+ /** Refuses what the project has too old for a new catalogue to draw. */
44
+ export declare const refuseTooOld: (state: PackageState, context: InitContext) => void;
45
+ export {};