nodefony 7.0.2 → 10.0.0-alpha.2

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 (903) hide show
  1. package/.ai/symbols.json +36135 -0
  2. package/LICENSE +544 -0
  3. package/README.md +316 -694
  4. package/bin/nodefony +2183 -85
  5. package/dist/client/Container.js +367 -0
  6. package/dist/client/Event.js +198 -0
  7. package/dist/client/Service.js +344 -0
  8. package/dist/client/Tools.js +162 -0
  9. package/dist/client/client/ClientKernel.js +276 -0
  10. package/dist/client/client/angular/index.js +352 -0
  11. package/dist/client/client/announce.js +212 -0
  12. package/dist/client/client/debugbar/DebugBar.js +1624 -0
  13. package/dist/client/client/debugbar/format.js +103 -0
  14. package/dist/client/client/debugbar/hmr.js +37 -0
  15. package/dist/client/client/debugbar/index.js +29 -0
  16. package/dist/client/client/debugbar/model.js +133 -0
  17. package/dist/client/client/debugbar/network.js +173 -0
  18. package/dist/client/client/debugbar/profile.js +114 -0
  19. package/dist/client/client/index.js +34 -0
  20. package/dist/client/client/react/index.js +268 -0
  21. package/dist/client/client/realtime/AdaptiveRate.js +240 -0
  22. package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
  23. package/dist/client/client/realtime/RealtimeClient.js +898 -0
  24. package/dist/client/client/realtime/localEvents.js +56 -0
  25. package/dist/client/client/realtime/notice.js +125 -0
  26. package/dist/client/client/realtime/observe.js +280 -0
  27. package/dist/client/client/roles/index.js +3 -0
  28. package/dist/client/client/roles/registry.js +97 -0
  29. package/dist/client/client/roles/roles.js +91 -0
  30. package/dist/client/client/shim/events.js +88 -0
  31. package/dist/client/client/shim/util.js +20 -0
  32. package/dist/client/client/svelte/index.js +319 -0
  33. package/dist/client/client/syslog/context.js +122 -0
  34. package/dist/client/client/syslog/errors.js +49 -0
  35. package/dist/client/client/syslog/uplink.js +106 -0
  36. package/dist/client/client/vue/index.js +321 -0
  37. package/dist/client/colors.js +63 -0
  38. package/dist/client/debugbar.standalone.js +4274 -0
  39. package/dist/client/realtime/IRealtimeTransport.js +32 -0
  40. package/dist/client/realtime/JsonRpcPeer.js +251 -0
  41. package/dist/client/realtime/channelRate.js +39 -0
  42. package/dist/client/realtime/platformChannels.js +155 -0
  43. package/dist/client/syslog/Pdu.js +224 -0
  44. package/dist/client/syslog/Syslog.js +1159 -0
  45. package/dist/client/syslog/drivers/pduFlow.js +106 -0
  46. package/dist/client/syslog/drivers/pduProtocol.js +28 -0
  47. package/dist/client/syslog/logColor.js +80 -0
  48. package/dist/client/types/src/Container.d.ts +221 -0
  49. package/dist/client/types/src/Event.d.ts +171 -0
  50. package/dist/client/types/src/FileClass.d.ts +184 -0
  51. package/dist/client/types/src/Service.d.ts +165 -0
  52. package/dist/client/types/src/Tools.d.ts +116 -0
  53. package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
  54. package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
  55. package/dist/client/types/src/client/angular/index.d.ts +273 -0
  56. package/dist/client/types/src/client/announce.d.ts +74 -0
  57. package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
  58. package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
  59. package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
  60. package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
  61. package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
  62. package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
  63. package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
  64. package/dist/client/types/src/client/index.d.ts +47 -0
  65. package/dist/client/types/src/client/react/index.d.ts +207 -0
  66. package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
  67. package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
  68. package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
  69. package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
  70. package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
  71. package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
  72. package/dist/client/types/src/client/roles/index.d.ts +15 -0
  73. package/dist/client/types/src/client/roles/registry.d.ts +72 -0
  74. package/dist/client/types/src/client/roles/roles.d.ts +68 -0
  75. package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
  76. package/dist/client/types/src/client/shim/events.d.ts +39 -0
  77. package/dist/client/types/src/client/shim/util.d.ts +14 -0
  78. package/dist/client/types/src/client/svelte/index.d.ts +216 -0
  79. package/dist/client/types/src/client/syslog/context.d.ts +76 -0
  80. package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
  81. package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
  82. package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
  83. package/dist/client/types/src/client/vue/index.d.ts +234 -0
  84. package/dist/client/types/src/colors.d.ts +32 -0
  85. package/dist/client/types/src/config/infra.d.ts +171 -0
  86. package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
  87. package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
  88. package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
  89. package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
  90. package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
  91. package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
  92. package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
  93. package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
  94. package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
  95. package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
  96. package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
  97. package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
  98. package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
  99. package/dist/client/types/src/syslog/logColor.d.ts +59 -0
  100. package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
  101. package/dist/client/types/src/types/ICommand.d.ts +14 -0
  102. package/dist/client/types/src/types/IContainer.d.ts +35 -0
  103. package/dist/client/types/src/types/IKernel.d.ts +138 -0
  104. package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
  105. package/dist/client/types/src/types/IModule.d.ts +73 -0
  106. package/dist/client/types/src/types/IPage.d.ts +119 -0
  107. package/dist/client/types/src/types/IService.d.ts +62 -0
  108. package/dist/client/types/src/types/ISyslog.d.ts +58 -0
  109. package/dist/client/types/src/types/ITransport.d.ts +5 -0
  110. package/dist/client/types/src/types/globals.d.ts +47 -0
  111. package/dist/node/Cli.js +750 -0
  112. package/dist/node/Container.js +367 -0
  113. package/dist/node/Error.js +309 -0
  114. package/dist/node/Event.js +198 -0
  115. package/dist/node/FileClass.js +308 -0
  116. package/dist/node/Nodefony.js +78 -0
  117. package/dist/node/Service.js +344 -0
  118. package/dist/node/Tools.js +205 -0
  119. package/dist/node/bin/resolveLocalCli.js +10 -0
  120. package/dist/node/bundler/index.js +103 -0
  121. package/dist/node/cli/agentTargets.js +461 -0
  122. package/dist/node/cli/aiMcp.js +553 -0
  123. package/dist/node/cli/aiMcpReport.js +129 -0
  124. package/dist/node/cli/aiSync.js +323 -0
  125. package/dist/node/cli/aiSyncReport.js +142 -0
  126. package/dist/node/cli/card.js +186 -0
  127. package/dist/node/cli/cardReport.js +110 -0
  128. package/dist/node/cli/completion.js +415 -0
  129. package/dist/node/cli/create.js +805 -0
  130. package/dist/node/cli/env.js +332 -0
  131. package/dist/node/cli/envReport.js +159 -0
  132. package/dist/node/cli/execPortable.js +60 -0
  133. package/dist/node/cli/gitHooks.js +191 -0
  134. package/dist/node/cli/gitHooksReport.js +119 -0
  135. package/dist/node/cli/globalFlags.js +67 -0
  136. package/dist/node/cli/helpReport.js +288 -0
  137. package/dist/node/cli/manPage.js +165 -0
  138. package/dist/node/cli/nodefonyBin.js +61 -0
  139. package/dist/node/cli/outdated.js +144 -0
  140. package/dist/node/cli/progress.js +555 -0
  141. package/dist/node/cli/projectRoot.js +32 -0
  142. package/dist/node/cli/promptPassword.js +44 -0
  143. package/dist/node/cli/prompts.js +86 -0
  144. package/dist/node/cli/scaffold/destination.js +92 -0
  145. package/dist/node/cli/scaffold/engine.js +2156 -0
  146. package/dist/node/cli/scaffold/entityFields.js +589 -0
  147. package/dist/node/cli/scaffold/format.js +243 -0
  148. package/dist/node/cli/scaffold/interactive.js +124 -0
  149. package/dist/node/cli/scaffold/moduleLayout.js +38 -0
  150. package/dist/node/cli/scaffold/reservedEntities.js +74 -0
  151. package/dist/node/cli/scaffold/spec.js +704 -0
  152. package/dist/node/cli/scaffold/steps.js +40 -0
  153. package/dist/node/cli/scaffold/userContractSource.js +133 -0
  154. package/dist/node/cli/scaffold/versions.js +57 -0
  155. package/dist/node/cli/scaffold/writer.js +172 -0
  156. package/dist/node/cli/startMenu.js +496 -0
  157. package/dist/node/cli/symbols.js +205 -0
  158. package/dist/node/cli/sysexits.js +34 -0
  159. package/dist/node/cli/tableReport.js +184 -0
  160. package/dist/node/cli/usageReport.js +144 -0
  161. package/dist/node/colors.js +63 -0
  162. package/dist/node/command/Builder.js +153 -0
  163. package/dist/node/command/Command.js +348 -0
  164. package/dist/node/config/configProvenance.js +101 -0
  165. package/dist/node/config/defaults.js +39 -0
  166. package/dist/node/config/defineConfig.js +129 -0
  167. package/dist/node/config/defineEnv.js +264 -0
  168. package/dist/node/config/envExample.js +41 -0
  169. package/dist/node/config/envOverride.js +423 -0
  170. package/dist/node/config/infra.js +163 -0
  171. package/dist/node/config/reactivity.js +23 -0
  172. package/dist/node/config/reservedEnv.js +118 -0
  173. package/dist/node/config/schema.js +134 -0
  174. package/dist/node/config/use.js +24 -0
  175. package/dist/node/finder/File.js +49 -0
  176. package/dist/node/finder/FileResult.js +86 -0
  177. package/dist/node/finder/Finder.js +201 -0
  178. package/dist/node/finder/Result.js +45 -0
  179. package/dist/node/index.js +121 -0
  180. package/dist/node/kernel/BootConfigurationError.js +54 -0
  181. package/dist/node/kernel/CliKernel.js +630 -0
  182. package/dist/node/kernel/Kernel.js +2198 -0
  183. package/dist/node/kernel/Module.js +453 -0
  184. package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
  185. package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
  186. package/dist/node/kernel/adminPlane/catalog.js +158 -0
  187. package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
  188. package/dist/node/kernel/checks/deep.js +335 -0
  189. package/dist/node/kernel/checks/freshness.js +139 -0
  190. package/dist/node/kernel/checks/gating.js +231 -0
  191. package/dist/node/kernel/checks/guards.js +232 -0
  192. package/dist/node/kernel/checks/lastBoot.js +136 -0
  193. package/dist/node/kernel/checks/live.js +330 -0
  194. package/dist/node/kernel/checks/packageDeps.js +292 -0
  195. package/dist/node/kernel/checks/readiness.js +153 -0
  196. package/dist/node/kernel/checks/renderReport.js +780 -0
  197. package/dist/node/kernel/checks/report.js +421 -0
  198. package/dist/node/kernel/checks/runDoctor.js +731 -0
  199. package/dist/node/kernel/checks/surface.js +364 -0
  200. package/dist/node/kernel/checks/walk.js +100 -0
  201. package/dist/node/kernel/checks/wiring.js +450 -0
  202. package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
  203. package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
  204. package/dist/node/kernel/commands/BuildCommand.js +49 -0
  205. package/dist/node/kernel/commands/CardCommand.js +50 -0
  206. package/dist/node/kernel/commands/ClusterCommand.js +58 -0
  207. package/dist/node/kernel/commands/CompletionCommand.js +31 -0
  208. package/dist/node/kernel/commands/CreateCommand.js +45 -0
  209. package/dist/node/kernel/commands/DevCommand.js +99 -0
  210. package/dist/node/kernel/commands/DoctorCommand.js +115 -0
  211. package/dist/node/kernel/commands/EnvCommand.js +52 -0
  212. package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
  213. package/dist/node/kernel/commands/InspectCommand.js +153 -0
  214. package/dist/node/kernel/commands/InstallCommand.js +20 -0
  215. package/dist/node/kernel/commands/MenuCommand.js +261 -0
  216. package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
  217. package/dist/node/kernel/commands/ProdCommand.js +60 -0
  218. package/dist/node/kernel/commands/StatusCommand.js +30 -0
  219. package/dist/node/kernel/commands/StopCommand.js +35 -0
  220. package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
  221. package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
  222. package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
  223. package/dist/node/kernel/injector/injector.js +137 -0
  224. package/dist/node/kernel/injector/serviceOrder.js +106 -0
  225. package/dist/node/kernel/inspect/adminSubjects.js +194 -0
  226. package/dist/node/kernel/inspect/docOutline.js +86 -0
  227. package/dist/node/kernel/lifecycleTags.js +76 -0
  228. package/dist/node/kernel/moduleConfig.js +75 -0
  229. package/dist/node/kernel/moduleGating.js +68 -0
  230. package/dist/node/kernel/readinessRegistry.js +98 -0
  231. package/dist/node/kernel/resolveModuleEntry.js +61 -0
  232. package/dist/node/mcp/caller.js +40 -0
  233. package/dist/node/mcp/guard.js +51 -0
  234. package/dist/node/mcp/protocol.js +157 -0
  235. package/dist/node/mcp/server.js +216 -0
  236. package/dist/node/mcp/tools.js +861 -0
  237. package/dist/node/oauth/authorizationServer.js +221 -0
  238. package/dist/node/oauth/protectedResource.js +293 -0
  239. package/dist/node/package.js +4 -0
  240. package/dist/node/realtime/IRealtimeTransport.js +32 -0
  241. package/dist/node/realtime/JsonRpcPeer.js +251 -0
  242. package/dist/node/realtime/RealtimeEventMap.js +15 -0
  243. package/dist/node/realtime/channelRate.js +39 -0
  244. package/dist/node/realtime/platformChannels.js +155 -0
  245. package/dist/node/runtime/GcScheduler.js +92 -0
  246. package/dist/node/runtime/RequestContext.js +76 -0
  247. package/dist/node/runtime/bearer.js +84 -0
  248. package/dist/node/runtime/engineEnvironment.js +79 -0
  249. package/dist/node/runtime/loadEnv.js +105 -0
  250. package/dist/node/runtime/pageFacets.js +85 -0
  251. package/dist/node/runtime/pageFilters.js +103 -0
  252. package/dist/node/runtime/pageGuard.js +84 -0
  253. package/dist/node/runtime/pageQuery.js +160 -0
  254. package/dist/node/runtime/pageSort.js +114 -0
  255. package/dist/node/runtime/redact.js +43 -0
  256. package/dist/node/runtime/withTimeout.js +71 -0
  257. package/dist/node/service/cluster/ClusterManager.js +202 -0
  258. package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
  259. package/dist/node/service/cluster/ClusterRelay.js +74 -0
  260. package/dist/node/service/cluster/clusterMaster.js +65 -0
  261. package/dist/node/service/cluster/clusterMessage.js +70 -0
  262. package/dist/node/service/cluster/cpuQuota.js +59 -0
  263. package/dist/node/service/cluster/instanceProbe.js +52 -0
  264. package/dist/node/service/cluster/podEnvironment.js +48 -0
  265. package/dist/node/service/cluster/processProbe.js +70 -0
  266. package/dist/node/service/cluster/richProcessProbe.js +115 -0
  267. package/dist/node/service/cluster/topology.js +71 -0
  268. package/dist/node/service/dev/BootReporter.js +490 -0
  269. package/dist/node/service/dev/DevSupervisor.js +1004 -0
  270. package/dist/node/service/dev/bootVerdict.js +158 -0
  271. package/dist/node/service/dev/detachedStart.js +372 -0
  272. package/dist/node/service/dev/devProcess.js +1137 -0
  273. package/dist/node/service/dev/devProjects.js +138 -0
  274. package/dist/node/service/dev/devStatusReport.js +395 -0
  275. package/dist/node/service/dev/devStop.js +263 -0
  276. package/dist/node/service/fetchService.js +35 -0
  277. package/dist/node/service/gitService.js +62 -0
  278. package/dist/node/syslog/Pdu.js +224 -0
  279. package/dist/node/syslog/Syslog.js +1159 -0
  280. package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
  281. package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
  282. package/dist/node/syslog/drivers/ILogDriver.js +26 -0
  283. package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
  284. package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
  285. package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
  286. package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
  287. package/dist/node/syslog/drivers/filterPdus.js +71 -0
  288. package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
  289. package/dist/node/syslog/drivers/opensearchShared.js +17 -0
  290. package/dist/node/syslog/drivers/pduFlow.js +106 -0
  291. package/dist/node/syslog/drivers/pduProtocol.js +28 -0
  292. package/dist/node/syslog/httpFetch.js +43 -0
  293. package/dist/node/syslog/logColor.js +80 -0
  294. package/dist/node/syslog/sinks/FileSink.js +142 -0
  295. package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
  296. package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
  297. package/dist/node/syslog/transports/FileTransport.js +17 -0
  298. package/dist/node/syslog/transports/HttpTransport.js +44 -0
  299. package/dist/node/syslog/transports/LokiTransport.js +80 -0
  300. package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
  301. package/dist/node/syslog/transports/SyslogTransport.js +13 -0
  302. package/dist/node/syslog/transports/index.js +8 -0
  303. package/dist/node/testing/index.js +190 -0
  304. package/dist/types/Cli.d.ts +177 -0
  305. package/dist/types/Container.d.ts +221 -0
  306. package/dist/types/Error.d.ts +162 -0
  307. package/dist/types/Event.d.ts +171 -0
  308. package/dist/types/FileClass.d.ts +184 -0
  309. package/dist/types/Nodefony.d.ts +66 -0
  310. package/dist/types/Service.d.ts +165 -0
  311. package/dist/types/Tools.d.ts +116 -0
  312. package/dist/types/bin/resolveLocalCli.d.ts +49 -0
  313. package/dist/types/bundler/index.d.ts +66 -0
  314. package/dist/types/cli/agentTargets.d.ts +378 -0
  315. package/dist/types/cli/aiMcp.d.ts +239 -0
  316. package/dist/types/cli/aiMcpReport.d.ts +113 -0
  317. package/dist/types/cli/aiSync.d.ts +68 -0
  318. package/dist/types/cli/aiSyncReport.d.ts +149 -0
  319. package/dist/types/cli/card.d.ts +49 -0
  320. package/dist/types/cli/cardReport.d.ts +127 -0
  321. package/dist/types/cli/completion.d.ts +154 -0
  322. package/dist/types/cli/create.d.ts +177 -0
  323. package/dist/types/cli/env.d.ts +103 -0
  324. package/dist/types/cli/envReport.d.ts +153 -0
  325. package/dist/types/cli/execPortable.d.ts +54 -0
  326. package/dist/types/cli/gitHooks.d.ts +48 -0
  327. package/dist/types/cli/gitHooksReport.d.ts +101 -0
  328. package/dist/types/cli/globalFlags.d.ts +48 -0
  329. package/dist/types/cli/helpReport.d.ts +110 -0
  330. package/dist/types/cli/manPage.d.ts +21 -0
  331. package/dist/types/cli/nodefonyBin.d.ts +45 -0
  332. package/dist/types/cli/outdated.d.ts +119 -0
  333. package/dist/types/cli/progress.d.ts +349 -0
  334. package/dist/types/cli/projectRoot.d.ts +19 -0
  335. package/dist/types/cli/promptPassword.d.ts +22 -0
  336. package/dist/types/cli/prompts.d.ts +102 -0
  337. package/dist/types/cli/scaffold/destination.d.ts +70 -0
  338. package/dist/types/cli/scaffold/engine.d.ts +545 -0
  339. package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
  340. package/dist/types/cli/scaffold/format.d.ts +78 -0
  341. package/dist/types/cli/scaffold/interactive.d.ts +11 -0
  342. package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
  343. package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
  344. package/dist/types/cli/scaffold/spec.d.ts +159 -0
  345. package/dist/types/cli/scaffold/steps.d.ts +24 -0
  346. package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
  347. package/dist/types/cli/scaffold/versions.d.ts +14 -0
  348. package/dist/types/cli/scaffold/writer.d.ts +100 -0
  349. package/dist/types/cli/startMenu.d.ts +195 -0
  350. package/dist/types/cli/symbols.d.ts +84 -0
  351. package/dist/types/cli/sysexits.d.ts +31 -0
  352. package/dist/types/cli/tableReport.d.ts +44 -0
  353. package/dist/types/cli/usageReport.d.ts +108 -0
  354. package/dist/types/client/ClientKernel.d.ts +90 -0
  355. package/dist/types/client/IClientKernel.d.ts +195 -0
  356. package/dist/types/client/angular/index.d.ts +273 -0
  357. package/dist/types/client/announce.d.ts +74 -0
  358. package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
  359. package/dist/types/client/debugbar/format.d.ts +48 -0
  360. package/dist/types/client/debugbar/hmr.d.ts +16 -0
  361. package/dist/types/client/debugbar/index.d.ts +30 -0
  362. package/dist/types/client/debugbar/model.d.ts +158 -0
  363. package/dist/types/client/debugbar/network.d.ts +55 -0
  364. package/dist/types/client/debugbar/profile.d.ts +99 -0
  365. package/dist/types/client/index.d.ts +47 -0
  366. package/dist/types/client/react/index.d.ts +207 -0
  367. package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
  368. package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
  369. package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
  370. package/dist/types/client/realtime/localEvents.d.ts +53 -0
  371. package/dist/types/client/realtime/notice.d.ts +70 -0
  372. package/dist/types/client/realtime/observe.d.ts +284 -0
  373. package/dist/types/client/roles/index.d.ts +15 -0
  374. package/dist/types/client/roles/registry.d.ts +72 -0
  375. package/dist/types/client/roles/roles.d.ts +68 -0
  376. package/dist/types/client/shim/cli-color.d.ts +2 -0
  377. package/dist/types/client/shim/events.d.ts +39 -0
  378. package/dist/types/client/shim/util.d.ts +14 -0
  379. package/dist/types/client/svelte/index.d.ts +216 -0
  380. package/dist/types/client/syslog/context.d.ts +76 -0
  381. package/dist/types/client/syslog/errors.d.ts +46 -0
  382. package/dist/types/client/syslog/uplink.d.ts +89 -0
  383. package/dist/types/client/transport/websocket.d.ts +5 -0
  384. package/dist/types/client/vue/index.d.ts +234 -0
  385. package/dist/types/colors.d.ts +32 -0
  386. package/dist/types/command/Builder.d.ts +47 -0
  387. package/dist/types/command/Command.d.ts +268 -0
  388. package/dist/types/config/configMeta.d.ts +53 -0
  389. package/dist/types/config/configProvenance.d.ts +58 -0
  390. package/dist/types/config/defaults.d.ts +33 -0
  391. package/dist/types/config/defineConfig.d.ts +70 -0
  392. package/dist/types/config/defineEnv.d.ts +170 -0
  393. package/dist/types/config/envExample.d.ts +23 -0
  394. package/dist/types/config/envOverride.d.ts +236 -0
  395. package/dist/types/config/index.d.ts +23 -0
  396. package/dist/types/config/infra.d.ts +171 -0
  397. package/dist/types/config/reactivity.d.ts +36 -0
  398. package/dist/types/config/reservedEnv.d.ts +145 -0
  399. package/dist/types/config/schema.d.ts +113 -0
  400. package/dist/types/config/types.d.ts +374 -0
  401. package/dist/types/config/use.d.ts +80 -0
  402. package/dist/types/finder/File.d.ts +26 -0
  403. package/dist/types/finder/FileResult.d.ts +14 -0
  404. package/dist/types/finder/Finder.d.ts +51 -0
  405. package/dist/types/finder/Result.d.ts +10 -0
  406. package/dist/types/index.d.ts +205 -0
  407. package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
  408. package/dist/types/kernel/CliKernel.d.ts +289 -0
  409. package/dist/types/kernel/Kernel.d.ts +1255 -0
  410. package/dist/types/kernel/Module.d.ts +326 -0
  411. package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
  412. package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
  413. package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
  414. package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
  415. package/dist/types/kernel/bootReport.d.ts +112 -0
  416. package/dist/types/kernel/checks/deep.d.ts +122 -0
  417. package/dist/types/kernel/checks/freshness.d.ts +49 -0
  418. package/dist/types/kernel/checks/gating.d.ts +134 -0
  419. package/dist/types/kernel/checks/guards.d.ts +57 -0
  420. package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
  421. package/dist/types/kernel/checks/live.d.ts +110 -0
  422. package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
  423. package/dist/types/kernel/checks/readiness.d.ts +97 -0
  424. package/dist/types/kernel/checks/renderReport.d.ts +107 -0
  425. package/dist/types/kernel/checks/report.d.ts +414 -0
  426. package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
  427. package/dist/types/kernel/checks/surface.d.ts +148 -0
  428. package/dist/types/kernel/checks/walk.d.ts +45 -0
  429. package/dist/types/kernel/checks/wiring.d.ts +54 -0
  430. package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
  431. package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
  432. package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
  433. package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
  434. package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
  435. package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
  436. package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
  437. package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
  438. package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
  439. package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
  440. package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
  441. package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
  442. package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
  443. package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
  444. package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
  445. package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
  446. package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
  447. package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
  448. package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
  449. package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
  450. package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
  451. package/dist/types/kernel/injector/injector.d.ts +47 -0
  452. package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
  453. package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
  454. package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
  455. package/dist/types/kernel/lifecycleTags.d.ts +79 -0
  456. package/dist/types/kernel/moduleConfig.d.ts +35 -0
  457. package/dist/types/kernel/moduleGating.d.ts +78 -0
  458. package/dist/types/kernel/readinessRegistry.d.ts +104 -0
  459. package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
  460. package/dist/types/mcp/caller.d.ts +55 -0
  461. package/dist/types/mcp/guard.d.ts +66 -0
  462. package/dist/types/mcp/protocol.d.ts +163 -0
  463. package/dist/types/mcp/server.d.ts +70 -0
  464. package/dist/types/mcp/tools.d.ts +209 -0
  465. package/dist/types/oauth/authorizationServer.d.ts +204 -0
  466. package/dist/types/oauth/protectedResource.d.ts +339 -0
  467. package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
  468. package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
  469. package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
  470. package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
  471. package/dist/types/realtime/channelRate.d.ts +55 -0
  472. package/dist/types/realtime/platformChannels.d.ts +147 -0
  473. package/dist/types/runtime/GcScheduler.d.ts +96 -0
  474. package/dist/types/runtime/RequestContext.d.ts +152 -0
  475. package/dist/types/runtime/bearer.d.ts +88 -0
  476. package/dist/types/runtime/engineEnvironment.d.ts +115 -0
  477. package/dist/types/runtime/loadEnv.d.ts +86 -0
  478. package/dist/types/runtime/pageFacets.d.ts +104 -0
  479. package/dist/types/runtime/pageFilters.d.ts +139 -0
  480. package/dist/types/runtime/pageGuard.d.ts +78 -0
  481. package/dist/types/runtime/pageQuery.d.ts +138 -0
  482. package/dist/types/runtime/pageSort.d.ts +86 -0
  483. package/dist/types/runtime/redact.d.ts +27 -0
  484. package/dist/types/runtime/withTimeout.d.ts +51 -0
  485. package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
  486. package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
  487. package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
  488. package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
  489. package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
  490. package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
  491. package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
  492. package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
  493. package/dist/types/service/cluster/processProbe.d.ts +53 -0
  494. package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
  495. package/dist/types/service/cluster/topology.d.ts +64 -0
  496. package/dist/types/service/dev/BootReporter.d.ts +67 -0
  497. package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
  498. package/dist/types/service/dev/bootVerdict.d.ts +99 -0
  499. package/dist/types/service/dev/detachedStart.d.ts +164 -0
  500. package/dist/types/service/dev/devProcess.d.ts +638 -0
  501. package/dist/types/service/dev/devProjects.d.ts +121 -0
  502. package/dist/types/service/dev/devStatusReport.d.ts +141 -0
  503. package/dist/types/service/dev/devStop.d.ts +57 -0
  504. package/dist/types/service/fetchService.d.ts +29 -0
  505. package/dist/types/service/gitService.d.ts +24 -0
  506. package/dist/types/syslog/Pdu.d.ts +134 -0
  507. package/dist/types/syslog/Syslog.d.ts +482 -0
  508. package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
  509. package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
  510. package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
  511. package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
  512. package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
  513. package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
  514. package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
  515. package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
  516. package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
  517. package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
  518. package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
  519. package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
  520. package/dist/types/syslog/httpFetch.d.ts +48 -0
  521. package/dist/types/syslog/logColor.d.ts +59 -0
  522. package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
  523. package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
  524. package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
  525. package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
  526. package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
  527. package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
  528. package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
  529. package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
  530. package/dist/types/syslog/transports/index.d.ts +12 -0
  531. package/dist/types/testing/index.d.ts +197 -0
  532. package/dist/types/types/IAdminApi.d.ts +246 -0
  533. package/dist/types/types/ICliKernel.d.ts +28 -0
  534. package/dist/types/types/ICommand.d.ts +14 -0
  535. package/dist/types/types/IContainer.d.ts +35 -0
  536. package/dist/types/types/IIdempotencyStore.d.ts +159 -0
  537. package/dist/types/types/IKernel.d.ts +138 -0
  538. package/dist/types/types/IMcpTool.d.ts +157 -0
  539. package/dist/types/types/IModule.d.ts +73 -0
  540. package/dist/types/types/IModuleManifest.d.ts +49 -0
  541. package/dist/types/types/IPage.d.ts +119 -0
  542. package/dist/types/types/IService.d.ts +62 -0
  543. package/dist/types/types/ISyslog.d.ts +58 -0
  544. package/dist/types/types/ITransport.d.ts +5 -0
  545. package/dist/types/types/globals.d.ts +47 -0
  546. package/docs/angular-services.md +318 -0
  547. package/docs/catalogue.md +184 -0
  548. package/docs/cli.md +369 -0
  549. package/docs/client.md +616 -0
  550. package/docs/debugbar.md +218 -0
  551. package/docs/environnement.md +308 -0
  552. package/docs/index.md +388 -0
  553. package/docs/kernel.md +670 -0
  554. package/docs/progression.md +228 -0
  555. package/docs/react-hooks.md +686 -0
  556. package/docs/request-context.md +507 -0
  557. package/docs/service.md +590 -0
  558. package/docs/svelte-reactivite.md +293 -0
  559. package/docs/syslog.md +848 -0
  560. package/docs/testing.md +203 -0
  561. package/docs/vue-composables.md +255 -0
  562. package/man/nodefony.1 +152 -0
  563. package/package.json +163 -83
  564. package/templates/app/agents/AGENTS.md.tpl +967 -0
  565. package/templates/app/agents/POINTEUR.md.tpl +12 -0
  566. package/templates/app/base/Dockerfile.tpl +104 -0
  567. package/templates/app/base/README.md.tpl +314 -0
  568. package/templates/app/base/dockerignore.tpl +28 -0
  569. package/templates/app/base/env.ts.tpl +130 -0
  570. package/templates/app/base/gitattributes.tpl +28 -0
  571. package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
  572. package/templates/app/base/gitignore.tpl +46 -0
  573. package/templates/app/base/gitlab-ci.yml.tpl +42 -0
  574. package/templates/app/base/index.ts.tpl +69 -0
  575. package/templates/app/base/nodefony.config.ts.tpl +342 -0
  576. package/templates/app/base/oxlintrc.json.tpl +127 -0
  577. package/templates/app/base/package.json.tpl +75 -0
  578. package/templates/app/base/prettierignore.tpl +24 -0
  579. package/templates/app/base/prettierrc.json.tpl +12 -0
  580. package/templates/app/base/rolldown.config.ts.tpl +8 -0
  581. package/templates/app/base/tests/config.test.ts.tpl +29 -0
  582. package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
  583. package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
  584. package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
  585. package/templates/app/base/tsconfig.json.tpl +47 -0
  586. package/templates/app/base/vitest.config.ts.tpl +88 -0
  587. package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
  588. package/templates/app/complete/compose.yaml.tpl +328 -0
  589. package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
  590. package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
  591. package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
  592. package/templates/app/complete/env.local.tpl +11 -0
  593. package/templates/app/complete/env.tpl +53 -0
  594. package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
  595. package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
  596. package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
  597. package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
  598. package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
  599. package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
  600. package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
  601. package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
  602. package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
  603. package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
  604. package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
  605. package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
  606. package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
  607. package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
  608. package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
  609. package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
  610. package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
  611. package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
  612. package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
  613. package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
  614. package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
  615. package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
  616. package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
  617. package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
  618. package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
  619. package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
  620. package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
  621. package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
  622. package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
  623. package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
  624. package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
  625. package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
  626. package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
  627. package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
  628. package/templates/module/ai/AGENTS.md.tpl +71 -0
  629. package/templates/module/base/README.md.tpl +62 -0
  630. package/templates/module/base/docs/index.md.tpl +55 -0
  631. package/templates/module/base/index.ts.tpl +50 -0
  632. package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
  633. package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
  634. package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
  635. package/templates/module/base/package.json.tpl +53 -0
  636. package/templates/module/base/rolldown.config.ts.tpl +14 -0
  637. package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
  638. package/templates/module/base/tsconfig.json.tpl +42 -0
  639. package/templates/module/base/vitest.config.ts.tpl +27 -0
  640. package/templates/module/packages/CLAUDE.md.tpl +51 -0
  641. package/templates/module/packages/MEMORY.md.tpl +39 -0
  642. package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
  643. package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
  644. package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
  645. package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
  646. package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
  647. package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
  648. package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
  649. package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
  650. package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
  651. package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
  652. package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
  653. package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
  654. package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
  655. package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
  656. package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
  657. package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
  658. package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
  659. package/.yarnclean +0 -45
  660. package/CHANGELOG.md +0 -406
  661. package/autoloader.es6 +0 -253
  662. package/builder.es6 +0 -366
  663. package/cli/builder/bundles/bundle.js +0 -328
  664. package/cli/builder/bundles/controller.js +0 -73
  665. package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
  666. package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
  667. package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
  668. package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
  669. package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
  670. package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
  671. package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
  672. package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
  673. package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
  674. package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
  675. package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
  676. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
  677. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
  678. package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
  679. package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
  680. package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
  681. package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
  682. package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
  683. package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
  684. package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
  685. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
  686. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
  687. package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
  688. package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
  689. package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
  690. package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
  691. package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
  692. package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
  693. package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
  694. package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
  695. package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
  696. package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
  697. package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
  698. package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
  699. package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
  700. package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
  701. package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
  702. package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
  703. package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
  704. package/cli/builder/bundles/users-bundle/package.json +0 -58
  705. package/cli/builder/bundles/users-bundle/readme.md +0 -360
  706. package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
  707. package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
  708. package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
  709. package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
  710. package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
  711. package/cli/builder/microService/microService.js +0 -261
  712. package/cli/builder/microService/skeletons/.editorconfig +0 -18
  713. package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
  714. package/cli/builder/microService/skeletons/.jshintrc +0 -37
  715. package/cli/builder/microService/skeletons/README.md +0 -117
  716. package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
  717. package/cli/builder/microService/skeletons/bin/cli +0 -13
  718. package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
  719. package/cli/builder/microService/skeletons/config/config.js +0 -29
  720. package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
  721. package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
  722. package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
  723. package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
  724. package/cli/builder/microService/skeletons/package.json +0 -76
  725. package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
  726. package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
  727. package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
  728. package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
  729. package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
  730. package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
  731. package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
  732. package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
  733. package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
  734. package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
  735. package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
  736. package/cli/builder/microService/skeletons/src/node/index.js +0 -102
  737. package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
  738. package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
  739. package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
  740. package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
  741. package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
  742. package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
  743. package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
  744. package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
  745. package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
  746. package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
  747. package/cli/builder/project/project.js +0 -474
  748. package/cli/builder/project/skeletons/README.md +0 -778
  749. package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
  750. package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
  751. package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
  752. package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
  753. package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
  754. package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
  755. package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
  756. package/cli/builder/project/skeletons/documentation.html.twig +0 -24
  757. package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
  758. package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
  759. package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
  760. package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
  761. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
  762. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
  763. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
  764. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
  765. package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
  766. package/cli/builder/project/skeletons/package.json.twig +0 -71
  767. package/cli/builder/react/reactBuilder.js +0 -224
  768. package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
  769. package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
  770. package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
  771. package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
  772. package/cli/builder/react/skeletons/app/config/config.js +0 -392
  773. package/cli/builder/react/skeletons/app/config/routing.js +0 -10
  774. package/cli/builder/react/skeletons/app/config/security.js +0 -74
  775. package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
  776. package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
  777. package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
  778. package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
  779. package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
  780. package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
  781. package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  782. package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
  783. package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
  784. package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
  785. package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
  786. package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
  787. package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
  788. package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
  789. package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
  790. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
  791. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
  792. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
  793. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
  794. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
  795. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
  796. package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
  797. package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
  798. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
  799. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
  800. package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
  801. package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
  802. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
  803. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
  804. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
  805. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
  806. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
  807. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
  808. package/cli/builder/skeletons/app/appKernel.js +0 -133
  809. package/cli/builder/skeletons/binding/binding.cc +0 -26
  810. package/cli/builder/skeletons/binding/binding.skeleton +0 -8
  811. package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
  812. package/cli/builder/skeletons/command/commandClass.js +0 -11
  813. package/cli/builder/skeletons/command/taskClass.js +0 -20
  814. package/cli/builder/skeletons/config/config.js +0 -138
  815. package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
  816. package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
  817. package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
  818. package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
  819. package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
  820. package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
  821. package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
  822. package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
  823. package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
  824. package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
  825. package/cli/builder/skeletons/config/routing.js +0 -55
  826. package/cli/builder/skeletons/config/security.js +0 -102
  827. package/cli/builder/skeletons/config/services.js +0 -1
  828. package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
  829. package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
  830. package/cli/builder/skeletons/config/webpack.config.js +0 -148
  831. package/cli/builder/skeletons/controller/controllerClass.js +0 -75
  832. package/cli/builder/skeletons/package.json.twig +0 -57
  833. package/cli/builder/skeletons/unittest/testFile.js +0 -46
  834. package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
  835. package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
  836. package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  837. package/cli/builder/vue/skeletons/vue.config.js +0 -129
  838. package/cli/builder/vue/vueBuilder.js +0 -410
  839. package/cli/generate/generate.es6 +0 -103
  840. package/cli/install/install.js +0 -190
  841. package/cli/sequelize/sequelize.js +0 -94
  842. package/cli/start.js +0 -702
  843. package/cli/tools/pm2.es6 +0 -112
  844. package/cli/tools/tools.es6 +0 -97
  845. package/cli.es6 +0 -925
  846. package/container.es6 +0 -272
  847. package/error.es6 +0 -293
  848. package/fileClass.es6 +0 -242
  849. package/finder/file.es6 +0 -33
  850. package/finder/fileResult.es6 +0 -138
  851. package/finder/finder2.es6 +0 -275
  852. package/finder.es6 +0 -427
  853. package/kernel/annotations/annotations.es6 +0 -286
  854. package/kernel/api/api.es6 +0 -61
  855. package/kernel/api/graphqlApi.es6 +0 -107
  856. package/kernel/api/jsonApi.es6 +0 -177
  857. package/kernel/api/openApi.es6 +0 -139
  858. package/kernel/api/schemas/openApiSchema.js +0 -394
  859. package/kernel/babylon.es6 +0 -162
  860. package/kernel/bundle.es6 +0 -1200
  861. package/kernel/cliKernel.es6 +0 -869
  862. package/kernel/command.es6 +0 -78
  863. package/kernel/commands/nodefonyCommand.es6 +0 -247
  864. package/kernel/commands/tasks/bundlesTask.es6 +0 -59
  865. package/kernel/controllers/controller.es6 +0 -791
  866. package/kernel/fixture.es6 +0 -19
  867. package/kernel/injections/injections.es6 +0 -424
  868. package/kernel/kernel.es6 +0 -1960
  869. package/kernel/kernelWatcher.es6 +0 -387
  870. package/kernel/orm/entity.es6 +0 -59
  871. package/kernel/orm/orm.es6 +0 -139
  872. package/kernel/reader.es6 +0 -290
  873. package/kernel/security/encoder.es6 +0 -17
  874. package/kernel/security/factories/factory.es6 +0 -111
  875. package/kernel/security/factories/passeportFactory.es6 +0 -61
  876. package/kernel/security/provider.es6 +0 -58
  877. package/kernel/security/providers/chainProvider.es6 +0 -99
  878. package/kernel/security/providers/memoryProvider.es6 +0 -55
  879. package/kernel/security/providers/providerManager.es6 +0 -67
  880. package/kernel/security/providers/userEntityProvider.es6 +0 -50
  881. package/kernel/security/role.es6 +0 -12
  882. package/kernel/security/secureArea.es6 +0 -431
  883. package/kernel/security/tokens/token.es6 +0 -171
  884. package/kernel/security/user.es6 +0 -106
  885. package/kernel/serviceRealTime.es6 +0 -21
  886. package/kernel/services/connectionsService.es6 +0 -93
  887. package/kernel/services/cron/cronService.es6 +0 -123
  888. package/kernel/task.es6 +0 -80
  889. package/kernel/templates.es6 +0 -22
  890. package/kernel/templating/twig.es6 +0 -218
  891. package/kernel/tests/cliTest.js +0 -59
  892. package/kernel/tests/containerTest.js +0 -232
  893. package/kernel/tests/kernelTest.js +0 -39
  894. package/nodefony.es6 +0 -1084
  895. package/notificationsCenter.es6 +0 -118
  896. package/protocol.es6 +0 -86
  897. package/protocols/bayeux.es6 +0 -174
  898. package/protocols/jsonRpc/jsonrpc.es6 +0 -56
  899. package/result.es6 +0 -99
  900. package/service.es6 +0 -288
  901. package/syslog/pdu.es6 +0 -141
  902. package/syslog/syslog.es6 +0 -754
  903. package/watcher.es6 +0 -113
@@ -0,0 +1,805 @@
1
+ import { version } from "../package.js";
2
+ import "./sysexits.js";
3
+ import { chargePrompts } from "./prompts.js";
4
+ import { printUsage, printUsageError } from "./usageReport.js";
5
+ import { needsShell } from "./execPortable.js";
6
+ import { findProjectRoot } from "./projectRoot.js";
7
+ import { stripGlobalCliFlags } from "./globalFlags.js";
8
+ import { syncSkillPointers } from "./aiSync.js";
9
+ import { AGENT_TARGETS } from "./agentTargets.js";
10
+ import { formatFilesOnDisk } from "./scaffold/format.js";
11
+ import { diffLines } from "./scaffold/writer.js";
12
+ import { COMMAND_PHASE_CHOICES, CONTROLLER_KIND_CHOICES, DATABASE_CHOICES, ENTITY_ID_CHOICES, FRONTEND_CHOICES, MODULE_CONTROLLER_CHOICES, PRESET_CHOICES, getScaffoldSpec } from "./scaffold/spec.js";
13
+ import { findPackageRoot, getScaffoldContext, listTargets, resolveLocalWorkspaces, runScaffold } from "./scaffold/engine.js";
14
+ import { runAiMcpCommand } from "./aiMcp.js";
15
+ import { GIT_HOOKS_DIR } from "./gitHooksReport.js";
16
+ import { installGitHooks } from "./gitHooks.js";
17
+ import { askMissing, confirm } from "./scaffold/interactive.js";
18
+ import { existsSync, readFileSync } from "node:fs";
19
+ import path from "node:path";
20
+ import { spawnSync } from "node:child_process";
21
+ //#region src/cli/create.ts
22
+ /**
23
+ * Adaptateur CLI du scaffold `nodefony create <type> [name]` — front n°1 et n°2
24
+ * du moteur (`scaffold/engine.ts`, partagé avec Studio) :
25
+ *
26
+ * - **CLI rapide** : tout est dit en flags (`create app x --preset minimal
27
+ * --frontend react --link`) → zéro question, scriptable.
28
+ * - **CLI interactif** (défaut en TTY) : les questions de la spec NON couvertes
29
+ * par les flags sont posées en readline natif, récap + confirmation.
30
+ * - Hors TTY (CI, spawn de test) : les défauts de la spec s'appliquent —
31
+ * comportement stable pour les scripts, `--yes` force la même chose en TTY.
32
+ *
33
+ * Pur outillage standalone (même famille que status/stop/completion) : AUCUN
34
+ * boot kernel — cas nominal HORS projet : `npx nodefony create app mon-app`.
35
+ */
36
+ /** Types de scaffold disponibles. */
37
+ const CREATE_TYPES = [
38
+ "app",
39
+ "module",
40
+ "controller",
41
+ "service",
42
+ "front",
43
+ "entity",
44
+ "command"
45
+ ];
46
+ /**
47
+ * Parse l'argv complet du process après le mot `create`. Ne valide QUE la forme
48
+ * des flags — les valeurs (nom, preset…) sont jugées par la spec du moteur.
49
+ *
50
+ * @returns la requête, ou un message d'usage si invalide
51
+ */
52
+ function parseCreateArgv(argv) {
53
+ const at = argv.indexOf("create");
54
+ const rest = stripGlobalCliFlags(at === -1 ? [] : argv.slice(at + 1));
55
+ const positionals = [];
56
+ const answers = {};
57
+ let dir;
58
+ let force = false;
59
+ let yes = false;
60
+ let install = true;
61
+ let git = true;
62
+ let dryRun = false;
63
+ let describeJson = false;
64
+ let answersJson;
65
+ let help = false;
66
+ for (let i = 0; i < rest.length; i++) {
67
+ const word = rest[i];
68
+ if (word === "--help" || word === "-h") help = true;
69
+ else if (word === "--force" || word === "-f") force = true;
70
+ else if (word === "--yes" || word === "-y") yes = true;
71
+ else if (word === "--dry-run" || word === "-n") dryRun = true;
72
+ else if (word === "--describe-json") describeJson = true;
73
+ else if (word === "--answers-json") answersJson = rest[++i];
74
+ else if (word === "--no-install") install = false;
75
+ else if (word === "--no-git") git = false;
76
+ else if (word === "--git-hooks") answers.gitHooks = true;
77
+ else if (word === "--link") answers.link = true;
78
+ else if (word === "--no-link") answers.link = false;
79
+ else if (word === "--agents") answers.agents = (rest[++i] ?? "").split(/[\s,]+/u).map((c) => c.trim().toLowerCase()).filter((c) => c.length > 0 && c !== "none");
80
+ else if (word === "--preset") answers.preset = rest[++i];
81
+ else if (word === "--frontend") answers.frontend = rest[++i];
82
+ else if (word === "--database") answers.database = rest[++i];
83
+ else if (word === "--kind") answers.kind = rest[++i];
84
+ else if (word === "--controller") answers.controller = rest[++i];
85
+ else if (word === "--description") answers.description = rest[++i];
86
+ else if (word === "--service") {
87
+ const next = rest[i + 1];
88
+ answers.service = true;
89
+ if (next !== void 0 && !next.startsWith("-")) answers.serviceName = rest[++i];
90
+ } else if (word === "--no-service") answers.service = false;
91
+ else if (word === "--command") answers.command = true;
92
+ else if (word === "--no-command") answers.command = false;
93
+ else if (word === "--phase") answers.phase = rest[++i];
94
+ else if (word === "--route") answers.route = rest[++i];
95
+ else if (word === "--module") answers.module = rest[++i];
96
+ else if (word === "--role") answers.role = rest[++i];
97
+ else if (word === "--inject") answers.inject = rest[++i];
98
+ else if (word === "--no-controller") answers.controller = false;
99
+ else if (word === "--fields") answers.fields = rest[++i];
100
+ else if (word === "--id") answers.id = rest[++i];
101
+ else if (word === "--connector") answers.connector = rest[++i];
102
+ else if (word === "--dialect") answers.dialect = rest[++i];
103
+ else if (word === "--table") answers.table = rest[++i];
104
+ else if (word === "--column-case") answers.columnCase = rest[++i];
105
+ else if (word === "--id-name") answers.idName = rest[++i];
106
+ else if (word === "--index" || word === "--unique") {
107
+ const value = rest[++i];
108
+ if (value !== void 0) {
109
+ const key = word === "--index" ? "index" : "uniqueIndex";
110
+ const current = answers[key];
111
+ answers[key] = [...Array.isArray(current) ? current : [], value];
112
+ }
113
+ } else if (word === "--soft-delete") answers.softDelete = true;
114
+ else if (word === "--no-timestamps") answers.timestamps = false;
115
+ else if (word === "--no-tests") answers.tests = false;
116
+ else if (word === "--dir") dir = rest[++i];
117
+ else if (word.startsWith("-")) return { error: `option inconnue : ${word}` };
118
+ else positionals.push(word);
119
+ }
120
+ const [type, name, ...extra] = positionals;
121
+ if (help) return {
122
+ help,
123
+ answers,
124
+ force,
125
+ yes,
126
+ install,
127
+ git,
128
+ dryRun,
129
+ describeJson
130
+ };
131
+ if (type !== void 0 && !CREATE_TYPES.includes(type)) return { error: `type requis : ${CREATE_TYPES.join(" | ")} (reçu : ${type})` };
132
+ if (type === void 0 && !describeJson) return { error: `type requis : ${CREATE_TYPES.join(" | ")} (reçu : rien)` };
133
+ if (answersJson === void 0 && rest.includes("--answers-json")) return { error: "--answers-json attend un fichier, ou - pour l'entrée standard" };
134
+ if (name !== void 0) answers.name = name;
135
+ if (type === "entity" && extra.length > 0) answers.fields = extra.join(" ");
136
+ return {
137
+ help,
138
+ type,
139
+ answers,
140
+ dir,
141
+ force,
142
+ yes,
143
+ install,
144
+ git,
145
+ dryRun,
146
+ describeJson,
147
+ answersJson
148
+ };
149
+ }
150
+ const PAR_TYPE = ` app : [--preset <${PRESET_CHOICES.join("|")}>] [--frontend <${FRONTEND_CHOICES.join("|")}>]\n [--agents <liste|none>] — agents de dev à câbler (défaut : aucun)\n [--database <${DATABASE_CHOICES.join("|")}>] — le compose ne porte QUE ce service\n [--link|--no-link] [--no-install] [--no-git] [--git-hooks]\n module : [--controller <${MODULE_CONTROLLER_CHOICES.join("|")}>] [--no-service] [--command]\n [--frontend <${FRONTEND_CHOICES.join("|")}>] [--description "…"] [--no-install]\n controller : [--kind <${CONTROLLER_KIND_CHOICES.join("|")}>] [--route </api/x>] [--module <nom>]\n [--role ROLE_X] — réserve TOUT le controller à cette habilitation\n (@IsGranted de classe) et déclare le rôle dans roleHierarchy :\n l'administrateur en hérite, sans qu'on ait à le lui attribuer\n service : [--inject <AutreService>] [--description "…"] [--module <nom>]\n classe @injectable, sans dépendance à un config.ts — pour la découvrir, imite-la\n --inject : dépendance déclarée au CONSTRUCTEUR (@inject + appel), pas container.get\n front : [--frontend <react|vue|angular|svelte>] [--route </page>] [--module <nom>]\n entity : [champs…] [--id <${ENTITY_ID_CHOICES.join("|")}>] [--soft-delete] [--no-timestamps]\n [--no-controller] [--no-service] [--no-tests] [--route </api/x>] [--module <nom>]\n [--connector <nom>] [--dialect <sqlite|postgres|mysql>]\n [--index "colA,colB"] [--unique "colA,colB"] — répétables, un par index\n [--table <nom_sql>] [--column-case <camel|snake>] [--id-name <colonne>]\n — pour épouser une table EXISTANTE ; les propriétés TS ne changent pas\n ex : nodefony create entity Website name:string domain:string \\\n --table website --column-case snake --id-name website_id\n champs : nom:type[?|!][:index] — types : string(n) text int float bool json date uuid char(n) decimal(p,s) ref:<Entité>\n ex : nodefony create entity Post title:string! content:text views:int author:ref:User\n ex : nodefony create entity Event siteId:uuid path:string --index "siteId,createdAt"\n command : [--phase <${COMMAND_PHASE_CHOICES.join("|")}>] [--description "…"] [--service] [--module <nom>]\n nom = l'ACTION ; la commande vaut <module>:<action> (ex : blog:publish)\n (types controller/service/front/entity/command : dans un projet existant — app racine ou module)\n Sans flags dans un terminal → mode interactif (questions + récap).\n Mode machine (agents, scripts) :\n --describe-json types, questions, valeurs permises et cibles du projet, en JSON\n --answers-json <fichier|-> réponses en JSON (- = entrée standard) ; les flags l'emportent\n --dry-run le plan (fichiers créés + diff des réécritures), sans rien écrire\n`;
151
+ /** La page d'aide — `nodefony create --help`, et le rappel après un refus. */
152
+ const PAGE = {
153
+ command: "nodefony create",
154
+ tagline: "engendre du code conforme au framework : une application, un module, un controller, un service, un front, une entité, une commande",
155
+ synopsis: [`nodefony create <${CREATE_TYPES.join("|")}> [nom] [options]`, "nodefony create --describe-json"],
156
+ sections: [{
157
+ title: "CE QUE CHAQUE TYPE ACCEPTE",
158
+ lines: PAR_TYPE.split("\n").filter((l) => l !== "")
159
+ }],
160
+ options: [
161
+ {
162
+ term: "--dir <chemin>",
163
+ text: "dossier cible (défaut : ./<nom>)"
164
+ },
165
+ {
166
+ term: "-f, --force",
167
+ text: "accepte un dossier cible non vide"
168
+ },
169
+ {
170
+ term: "-y, --yes",
171
+ text: "prend les défauts de la spec (saute l'interactif)"
172
+ },
173
+ {
174
+ term: "-n, --dry-run",
175
+ text: "le plan, sans rien écrire"
176
+ },
177
+ {
178
+ term: "--describe-json",
179
+ text: "types, questions, valeurs permises et cibles du projet, en JSON — la porte MACHINE, pour un agent ou un script"
180
+ },
181
+ {
182
+ term: "--answers-json <f>",
183
+ text: "réponses en JSON (`-` = entrée standard) ; les drapeaux l'emportent"
184
+ }
185
+ ],
186
+ examples: [
187
+ {
188
+ term: "nodefony create app mon-app",
189
+ text: "une application neuve, hors de tout projet"
190
+ },
191
+ {
192
+ term: "nodefony create entity Post title:string content:text",
193
+ text: "une entité, son repository, son controller et ses tests"
194
+ },
195
+ {
196
+ term: "nodefony create --describe-json | jq .",
197
+ text: "ce que le générateur sait faire, pour un agent"
198
+ }
199
+ ],
200
+ exitCodes: [{
201
+ term: "73",
202
+ text: "le dossier cible ne peut pas être créé (EX_CANTCREAT)"
203
+ }],
204
+ footer: "Sans drapeau dans un terminal, elle passe en mode interactif : les questions de la spec, puis un récapitulatif avant d'écrire."
205
+ };
206
+ /**
207
+ * Décrit le scaffold en JSON — la porte MACHINE de `nodefony create`.
208
+ *
209
+ * POURQUOI : un agent qui développe dans une app Nodefony n'a que deux façons
210
+ * d'obtenir du code conforme — imiter des fichiers existants (et se tromper dès
211
+ * que l'exemple vieillit), ou APPELER le générateur. La seconde n'est possible
212
+ * que si l'outil sait dire ce qu'il attend : types disponibles, questions,
213
+ * valeurs permises, défauts. C'est exactement ce que la spec déclarative
214
+ * contient déjà ; il ne manquait que la porte.
215
+ *
216
+ * Le format est additif : `types` décrit les questions, `project` décrit où l'on
217
+ * se trouve — et son `context` porte ce que seul le projet sait (connecteurs
218
+ * déclarés, entités déjà créées, traduction des types par moteur). Une question
219
+ * marquée `optionsFrom` s'y réfère : ses réponses valides sont là, pas dans la
220
+ * spec, parce qu'elles changent d'un projet à l'autre.
221
+ */
222
+ function describeScaffold(type) {
223
+ const projectRoot = findProjectRoot(process.cwd());
224
+ return `${JSON.stringify({
225
+ nodefony: version,
226
+ types: getScaffoldSpec(type),
227
+ caps: { hasCheckout: resolveLocalWorkspaces(findPackageRoot()) !== null },
228
+ project: projectRoot ? {
229
+ root: projectRoot,
230
+ targets: listTargets(projectRoot).map((t) => ({
231
+ kind: t.kind,
232
+ name: t.name
233
+ })),
234
+ context: getScaffoldContext(projectRoot)
235
+ } : null,
236
+ usage: {
237
+ run: "nodefony create <type> <name> [flags]",
238
+ answers: "nodefony create <type> --answers-json - (réponses JSON sur l'entrée standard ; les flags l'emportent)",
239
+ preview: "ajouter --dry-run pour obtenir le plan sans rien écrire"
240
+ }
241
+ }, null, 2)}\n`;
242
+ }
243
+ /**
244
+ * Réponses lues depuis `--answers-json` (fichier, ou `-` = entrée standard).
245
+ *
246
+ * Une clé hors spec est REFUSÉE plutôt qu'ignorée : `resolveAnswers` ne
247
+ * conserve que les clés déclarées, si bien qu'un `"preset"` mal orthographié
248
+ * produirait un scaffold silencieusement différent de celui demandé — le pire
249
+ * retour possible pour un appelant automatique, qui n'a pas d'yeux pour
250
+ * relire le résultat.
251
+ *
252
+ * @throws Error si la source est illisible, le JSON invalide, ou une clé inconnue
253
+ */
254
+ function readAnswersJson(source, type) {
255
+ const raw = source === "-" ? readFileSync(0, "utf8") : readFileSync(source, "utf8");
256
+ let parsed;
257
+ try {
258
+ parsed = JSON.parse(raw);
259
+ } catch (e) {
260
+ throw new Error(`--answers-json : JSON invalide (${e.message})`, { cause: e });
261
+ }
262
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("--answers-json : un objet de réponses est attendu");
263
+ const [spec] = getScaffoldSpec(type);
264
+ const known = new Set(spec.questions.map((q) => q.key));
265
+ const answers = {};
266
+ for (const [key, value] of Object.entries(parsed)) {
267
+ if (!known.has(key)) throw new Error(`--answers-json : clé inconnue « ${key} » pour ${type} — attendues : ${[...known].join(", ")}`);
268
+ if (typeof value !== "string" && typeof value !== "boolean") throw new Error(`--answers-json : « ${key} » doit être une chaîne ou un booléen`);
269
+ answers[key] = value;
270
+ }
271
+ return answers;
272
+ }
273
+ /** Lignes de diff affichées par fichier réécrit, avant troncature annoncée. */
274
+ const DRY_RUN_DIFF_LINES = 20;
275
+ /**
276
+ * Rend le plan d'un `--dry-run` : ce qui serait créé, et surtout le DIFF de ce
277
+ * qui serait réécrit.
278
+ *
279
+ * Les créations sont listées à plat (leur contenu n'écrase rien, l'inventaire
280
+ * suffit) ; les réécritures sont les seules opérations qui touchent au travail
281
+ * existant — c'est là que la simulation a une valeur, donc c'est là qu'on
282
+ * dépense de la place.
283
+ */
284
+ function renderDryRun(changes, notes) {
285
+ const rel = (file) => path.relative(process.cwd(), file) || ".";
286
+ const created = changes.filter((c) => c.kind === "create");
287
+ const rewritten = changes.filter((c) => c.kind === "overwrite");
288
+ let out = `\n🔍 simulation (--dry-run) — RIEN n'a été écrit\n\n ${created.length} fichier(s) à créer, ${rewritten.length} à réécrire\n`;
289
+ if (created.length > 0) out += `\nCréés :\n${created.map((c) => ` + ${rel(c.path)}`).join("\n")}\n`;
290
+ for (const change of rewritten) {
291
+ const lines = diffLines(change.previous ?? "", change.content).filter((l) => l.kind !== "keep");
292
+ const shown = lines.slice(0, DRY_RUN_DIFF_LINES);
293
+ out += `\nRéécrit : ${rel(change.path)}\n` + shown.map((l) => ` ${l.kind === "add" ? "+" : "-"} ${l.text}`).join("\n") + (lines.length > shown.length ? `\n … ${lines.length - shown.length} ligne(s) de plus\n` : "\n");
294
+ }
295
+ if (notes && notes.length > 0) out += `\nCe que l'exécution dirait :\n${notes.map((n) => ` ${n}`).join("\n")}\n`;
296
+ return out;
297
+ }
298
+ /**
299
+ * `npm install` dans l'app générée (sortie streamée — le dev voit npm
300
+ * travailler, pas un silence de 60 s). Échec = code retourné, l'appelant
301
+ * décide (l'app EST générée : on n'échoue pas tout le create pour un réseau).
302
+ */
303
+ function runInstall(dest) {
304
+ process.stdout.write(`\n⏳ npm install (${path.basename(dest)})…\n`);
305
+ return spawnSync("npm", ["install"], {
306
+ cwd: dest,
307
+ stdio: "inherit",
308
+ shell: needsShell("npm")
309
+ }).status === 0;
310
+ }
311
+ /**
312
+ * Met en forme les fichiers que le scaffold vient d'écrire, après l'installation.
313
+ *
314
+ * Le formatage de la transaction ({@link formatScaffoldOutput}) ne peut rien
315
+ * pour une app NEUVE : à l'instant où ses fichiers sont rendus, `npm install`
316
+ * n'a pas encore tourné et le projet n'a aucun prettier à emprunter. C'est
317
+ * pourtant le cas qui compte le plus — l'application qu'un utilisateur reçoit.
318
+ *
319
+ * 🔴 **Bornée aux fichiers ÉCRITS.** La première version passait `--write .` au
320
+ * binaire du projet : sur `create module`, cela reformatait le dépôt ENTIER de
321
+ * l'utilisateur, code écrit à la main compris. Un générateur met en forme ce
322
+ * qu'il produit, jamais ce qu'il trouve.
323
+ *
324
+ * Silencieux et non bloquant : une app non formatée reste une app qui marche.
325
+ *
326
+ * @param dest - racine du projet (recherche de prettier).
327
+ * @param files - chemins RELATIFS rendus par le scaffold.
328
+ */
329
+ function runFormat(dest, files) {
330
+ formatFilesOnDisk(files.map((f) => path.join(dest, f)), dest);
331
+ }
332
+ /**
333
+ * Le code de sortie de `create`, décidé à part — parce qu'il se teste.
334
+ *
335
+ * Le défaut qu'il ferme : la commande affichait « npm run build a échoué »
336
+ * puis rendait **0**. L'application existait bien, c'est vrai — mais elle
337
+ * n'était PAS utilisable, et aucun automate ne pouvait le savoir : ni une
338
+ * chaîne d'intégration continue, ni un banc, ni un agent qui enchaîne. C'est
339
+ * exactement ce qui a laissé le front d'une application générée ne pas se
340
+ * bâtir sans que rien ne tombe, le message se noyant dans la sortie.
341
+ *
342
+ * La règle : **ce qui est ÉCRIT reste écrit** (les fichiers ne sont pas
343
+ * retirés, les prochaines étapes sont affichées, `npm run build` y figure),
344
+ * mais le code de sortie DIT qu'il reste quelque chose à faire.
345
+ *
346
+ * L'installation sautée (`--no-install`) ne compte pas comme un échec : rien
347
+ * n'a été tenté, et la commande l'annonce dans ses prochaines étapes.
348
+ *
349
+ * 🔴 **Sautée et ratée sont deux états, pas un booléen.** Les deux étapes
350
+ * étaient rendues par `boolean`, où `false` disait à la fois « on ne l'a pas
351
+ * lancée » et « on l'a lancée et elle a échoué ». Une installation ratée
352
+ * tombait donc du bon côté : code 0. Or elle emporte TOUT ce qui la suit — le
353
+ * formatage, le build, la migration initiale — et l'utilisateur reçoit une
354
+ * application qui ne peut pas démarrer, sous un succès. Constaté sur le décor
355
+ * du banc de découvrabilité, dont l'application témoin n'avait jamais eu de
356
+ * `dist/` ni de `migrations/` : le manifeste pointait encore vers un registre
357
+ * où aucun paquet `@nodefony/*` n'est publié.
358
+ *
359
+ * @param install - l'installation des dépendances : sautée, réussie, échouée.
360
+ * @param build - `npm run build` : sauté (l'install n'a pas eu lieu), réussi,
361
+ * échoué.
362
+ * @returns `OK`, ou `SOFTWARE` dès qu'une étape TENTÉE a échoué.
363
+ */
364
+ function createExitCode(install, build) {
365
+ return install === "failed" || build === "failed" ? 70 : 0;
366
+ }
367
+ /**
368
+ * `npm run build` dans l'app générée — le runtime charge `dist/index.js`
369
+ * (garde fail-loud « NON CONSTRUIT » au boot) : sans ce build, le premier
370
+ * `npm run dev` échoue. Suit l'install (pas de node_modules = pas de build) ;
371
+ * `dist/` est gitignoré → n'entre pas dans le premier commit.
372
+ */
373
+ function runBuild(dest) {
374
+ process.stdout.write(`\n⏳ npm run build (${path.basename(dest)})…\n`);
375
+ return spawnSync("npm", ["run", "build"], {
376
+ cwd: dest,
377
+ stdio: "inherit",
378
+ shell: needsShell("npm")
379
+ }).status === 0;
380
+ }
381
+ /**
382
+ * Le paquet qui porte les migrations SQL.
383
+ *
384
+ * Nommé UNE seule fois : deux endroits demandent « cette application a-t-elle
385
+ * un ORM ? » — celui qui ÉCRIT la migration, et celui qui l'ANNONCE quand elle
386
+ * n'a pas pu l'être. Écrit deux fois, il divergerait au premier renommage.
387
+ */
388
+ const ORM_PACKAGE = "@nodefony/drizzle";
389
+ /**
390
+ * L'application générée DÉCLARE-t-elle un ORM SQL ?
391
+ *
392
+ * Se lit dans le MANIFESTE, jamais dans `node_modules` : la question se pose
393
+ * précisément quand rien n'est installé — `--no-install`, ou un build en
394
+ * échec. C'est là que la migration manque, et c'est là que personne ne le
395
+ * disait.
396
+ *
397
+ * @param dest - racine de l'application générée.
398
+ * @returns `true` si le manifeste déclare le paquet d'ORM.
399
+ */
400
+ function appDeclareUnOrm(dest) {
401
+ try {
402
+ return JSON.parse(readFileSync(path.join(dest, "package.json"), "utf8")).dependencies?.[ORM_PACKAGE] !== void 0;
403
+ } catch {
404
+ return false;
405
+ }
406
+ }
407
+ /**
408
+ * Écrit la PREMIÈRE migration de l'application — celle de son entité `User`.
409
+ *
410
+ * ## Pourquoi une application doit naître avec sa migration
411
+ *
412
+ * L'identité appartient à l'application : c'est elle qui déclare la table
413
+ * `User`, donc elle qui en porte la migration. En développement, le schéma est
414
+ * dérivé du code et rien ne manque — c'est en PRODUCTION que le trou apparaît,
415
+ * là où personne ne crée la table : le premier déploiement s'arrête sur
416
+ * « table absente : User », pour un geste que rien n'imposait. Livrer l'entité
417
+ * sans sa migration, c'est livrer la moitié qui se voit.
418
+ *
419
+ * ## Pourquoi la migration est GÉNÉRÉE, jamais recopiée dans un gabarit
420
+ *
421
+ * Un gabarit SQL figé dirait ce que l'entité disait le jour où on l'a écrit. Le
422
+ * générateur, lui, lit l'entité qui vient d'être rendue — avec le dialecte figé
423
+ * à la création, et les champs que l'utilisateur a demandés. Une source unique,
424
+ * celle qui écrira aussi les migrations suivantes.
425
+ *
426
+ * ## Écrite, puis APPLIQUÉE
427
+ *
428
+ * Les deux, et dans la foulée : une application dont les fichiers de migration
429
+ * existent mais dont la base ne les a jamais vus est à mi-chemin, et c'est le
430
+ * pire des deux états. Son premier démarrage en développement dérive le schéma
431
+ * du code, les tables apparaissent sans historique, et tout ce qui interroge
432
+ * cet état ensuite accuse à juste titre — `doctor --live` en tête.
433
+ *
434
+ * ## Quand elle ne peut pas être écrite
435
+ *
436
+ * La commande démarre l'application, et le démarrage OUVRE la connexion : sans
437
+ * base joignable, elle s'arrête avant d'exécuter le verbe. C'est le cas d'un
438
+ * profil qui déclare un serveur qui n'existe pas encore. L'échec est alors DIT,
439
+ * avec le geste exact — jamais avalé : une application qui croit avoir sa
440
+ * migration et ne l'a pas est exactement le défaut qu'on répare ici.
441
+ *
442
+ * @param dest - racine de l'application générée.
443
+ * @returns le verdict et sa ligne d'affichage, ou `null` si l'application n'a
444
+ * pas d'ORM. Le booléen n'est pas décoratif : c'est lui qui décide si
445
+ * les prochaines étapes doivent réclamer le geste — le lire dans le
446
+ * texte de la note le rendrait dépendant de sa formulation.
447
+ */
448
+ function runInitialMigration(dest) {
449
+ if (!existsSync(path.join(dest, "node_modules", ORM_PACKAGE))) return null;
450
+ process.stdout.write(`\n⏳ migration initiale (orm:generate)…\n`);
451
+ const r = spawnSync("npm", [
452
+ "exec",
453
+ "--",
454
+ "nodefony",
455
+ "orm:generate",
456
+ "--name",
457
+ "init"
458
+ ], {
459
+ cwd: dest,
460
+ encoding: "utf8",
461
+ shell: needsShell("npm"),
462
+ env: {
463
+ ...process.env,
464
+ NODE_ENV: "production",
465
+ NF_STORE: "memory"
466
+ }
467
+ });
468
+ if (r.status === 0) {
469
+ if (spawnSync("npm", [
470
+ "exec",
471
+ "--",
472
+ "nodefony",
473
+ "orm:migrate"
474
+ ], {
475
+ cwd: dest,
476
+ encoding: "utf8",
477
+ shell: needsShell("npm"),
478
+ env: {
479
+ ...process.env,
480
+ NODE_ENV: "production",
481
+ NF_STORE: "memory"
482
+ }
483
+ }).status === 0) return {
484
+ written: true,
485
+ note: "écrite et appliquée (migrations/)"
486
+ };
487
+ return {
488
+ written: true,
489
+ note: "écrite (migrations/), NON appliquée — lance « nodefony orm:migrate » quand ta base répond"
490
+ };
491
+ }
492
+ return {
493
+ written: false,
494
+ note: `NON écrite (${`${r.stdout ?? ""}${r.stderr ?? ""}`.includes("ECONNREFUSED") ? "base injoignable" : `code ${String(r.status)}`}) — lance « nodefony orm:generate --name init » puis « nodefony orm:migrate » quand ta base répond`
495
+ };
496
+ }
497
+ /**
498
+ * Pose les pointeurs vers les skills d'agent livrés par les paquets installés.
499
+ *
500
+ * **Pourquoi ici, et pas par un `postinstall`** : `--ignore-scripts` est courant
501
+ * (intégration continue, politiques d'entreprise), les scripts d'installation
502
+ * sont un vecteur d'attaque connu de l'écosystème npm, et écrire dans un dossier
503
+ * VERSIONNÉ à chaque installation produirait des différences surprises. Le
504
+ * scaffold pose une fois, `npx nodefony ai:sync` remet à jour quand on le
505
+ * demande.
506
+ *
507
+ * **Pourquoi APRÈS l'install et AVANT le premier commit** : les skills vivent
508
+ * dans `node_modules`, il n'y a rien à découvrir tant qu'il n'existe pas ; et
509
+ * ces pointeurs sont faits pour être VERSIONNÉS — l'équipe et l'intégration
510
+ * continue disposent alors des mêmes skills que celui qui a créé l'app.
511
+ *
512
+ * Sans ce geste, le lot ne servirait qu'à celui qui connaît déjà `ai:sync` — or
513
+ * personne n'apprend un verbe absent.
514
+ *
515
+ * @param dest - racine de l'app générée.
516
+ * @returns la note à afficher. Ne lève JAMAIS : une application entièrement
517
+ * générée ne s'annule pas parce qu'un dossier de skills est illisible.
518
+ */
519
+ function poseSkillPointers(dest) {
520
+ try {
521
+ const plan = syncSkillPointers(dest);
522
+ if (plan.skills.length === 0) return `aucun skill livré par les paquets installés → npx nodefony ai:sync après un npm install`;
523
+ return `${plan.skills.length} dans ${plan.directory}/ (${plan.skills.map((s) => s.name).join(", ")}) — commite-les`;
524
+ } catch (e) {
525
+ return `non posés (${e.message}) → npx nodefony ai:sync`;
526
+ }
527
+ }
528
+ /**
529
+ * Un type manquant se DEMANDE-t-il, ou l'usage est-il la bonne réponse ? PURE.
530
+ *
531
+ * Trois conditions, et chacune dit quelque chose de différent :
532
+ * - l'erreur est bien « aucun type » — un type FAUTIF (`create ap`) se corrige,
533
+ * il ne se remplace pas par une question qui masquerait la faute de frappe ;
534
+ * - un terminal répond en face — sans lui, une question est un blocage muet ;
535
+ * - `--yes` n'a pas été demandé : il dit « ne me demande rien », et le
536
+ * respecter vaut mieux que de rendre service.
537
+ *
538
+ * @param error - le motif rendu par l'analyse de la ligne de commande.
539
+ * @param ctx - terminal disponible, et présence de `--yes`.
540
+ */
541
+ function shouldAskForType(error, ctx) {
542
+ return error.includes("reçu : rien") && ctx.isTTY && !ctx.yes;
543
+ }
544
+ /**
545
+ * Description courte d'un type de scaffold — celle de la SPEC, jamais une
546
+ * seconde version : deux listes de types divergeraient au premier ajout.
547
+ */
548
+ function descriptionType(type) {
549
+ const [spec] = getScaffoldSpec(type);
550
+ return spec?.description ?? type;
551
+ }
552
+ /**
553
+ * Décide si `create app` CÂBLE la porte MCP chez les agents choisis. PURE.
554
+ *
555
+ * Deux refus, deux raisons qui n'ont rien à voir :
556
+ * - **aucun agent choisi** — et c'est le DÉFAUT (la question de la spec part
557
+ * vide). Déclarer une porte chez un agent ÉCRIT dans la configuration d'un
558
+ * autre outil : rien de coché, rien d'écrit, en terminal comme ailleurs.
559
+ * C'est le choix explicite qui autorise, pas la présence d'un humain — ce
560
+ * qui rend le geste servable par Studio, qui n'est pas un terminal.
561
+ * - **app ni installée ni construite** (`--no-install`, ou une install en
562
+ * échec) : `ai:mcp` enchaîne sur l'émission du jeton, qui DÉMARRE le kernel.
563
+ * Sans `node_modules` ni `dist`, on provoquerait soi-même l'échec — le geste
564
+ * est alors NOMMÉ plutôt que joué.
565
+ *
566
+ * @param ctx - nombre d'agents choisis, et état réel de l'app générée.
567
+ * @returns la proposition, ou le motif du refus (affiché tel quel).
568
+ */
569
+ function mcpWiringPlan(ctx) {
570
+ if (ctx.chosen === 0) return {
571
+ propose: false,
572
+ pattern: "aucun agent choisi"
573
+ };
574
+ if (!ctx.installed || !ctx.built) return {
575
+ propose: false,
576
+ pattern: "agents choisis mais app ni installée ni construite — l'émission du jeton démarre le kernel ; à rejouer : npx nodefony ai:mcp"
577
+ };
578
+ return { propose: true };
579
+ }
580
+ /**
581
+ * Traduit le choix d'agents de développement en appel `ai:mcp` — PURE.
582
+ *
583
+ * ⭐ **Ce qui se choisit, c'est l'AGENT ; la porte MCP vient AVEC.** Demander
584
+ * « veux-tu déclarer une porte MCP ? » posait la question à l'envers : personne
585
+ * n'installe un protocole, on se sert d'un assistant — et c'est lui qui a besoin
586
+ * de la porte. Une seule question, dans les mots de celui qui répond.
587
+ *
588
+ * Deux familles d'agents, une seule liste : ceux qui se déclarent par LEUR CLI
589
+ * (`--agent <clés>`) et ceux qui lisent le `.mcp.json` du projet — pour ces
590
+ * derniers, écrire le fichier EST la déclaration, d'où `none` plutôt que rien :
591
+ * `--agent none` dit « n'appelle aucune CLI », pas « ne fais rien ».
592
+ *
593
+ * `--auth` : l'en-tête porte `${NF_MCP_TOKEN}`, jamais le jeton lui-même. Une
594
+ * app neuve naît avec sa porte fermée ; l'ouvrir sans authentification serait un
595
+ * défaut par défaut.
596
+ *
597
+ * @param chosen - clés cochées par l'utilisateur.
598
+ * @param detected - agents présents sur ce poste (source unique `AGENT_TARGETS`).
599
+ * @param dest - racine de l'app générée.
600
+ * @returns l'argv à passer à `ai:mcp`, ou `null` quand aucun agent n'est choisi
601
+ * — coder seul est un choix, et rien ne doit alors être écrit.
602
+ */
603
+ function argvMcpWiring(chosen, detected, dest) {
604
+ if (chosen.length === 0) return null;
605
+ const parCli = detected.filter((c) => c.declaration === "cli" && chosen.includes(c.key)).map((c) => c.key);
606
+ return [
607
+ "ai:mcp",
608
+ "--cwd",
609
+ dest,
610
+ "--auth",
611
+ "--agent",
612
+ parCli.length > 0 ? parCli.join(",") : "none"
613
+ ];
614
+ }
615
+ /**
616
+ * `git init` + first commit dans l'app générée — SEULEMENT si git est
617
+ * disponible ET que le dossier n'est pas déjà couvert par un repo (une app de
618
+ * banc dans le checkout du framework ne doit pas créer un repo imbriqué).
619
+ * Le `.gitignore` généré exclut `*.local` AVANT ce commit : les secrets de
620
+ * `.env.local` ne peuvent pas y entrer.
621
+ *
622
+ * `--git-hooks` : les hooks se posent ENTRE `git init` et le premier commit —
623
+ * `.githooks/` entre ainsi dans le commit initial, comme les pointeurs de
624
+ * skills. Une app déjà couverte par un repo (init sauté) les reçoit AUSSI :
625
+ * `installGitHooks` calcule alors le chemin vu du toplevel, c'est son cas
626
+ * monorepo. Le geste est celui de `nodefony git:hooks` — MÊME implémentation,
627
+ * jamais recopiée.
628
+ *
629
+ * @returns note affichable (fait / sauté et pourquoi)
630
+ */
631
+ function runGitInit(dest, appName, withHooks) {
632
+ const git = (...args) => spawnSync("git", args, {
633
+ cwd: dest,
634
+ stdio: "ignore"
635
+ });
636
+ const hooksNote = () => {
637
+ if (!withHooks) return "";
638
+ try {
639
+ const plan = installGitHooks(dest);
640
+ if (plan === null) return " · hooks non posés (hors dépôt git)";
641
+ return plan.refused ? " · hooks REFUSÉS (existant préservé — npx nodefony git:hooks pour le détail)" : ` · hooks natifs posés (${GIT_HOOKS_DIR}/ + core.hooksPath)`;
642
+ } catch (e) {
643
+ return ` · hooks non posés (${e.message})`;
644
+ }
645
+ };
646
+ if (spawnSync("git", ["--version"], { stdio: "ignore" }).error) return "git indisponible → repo non initialisé (git init à la main plus tard)";
647
+ if (git("rev-parse", "--is-inside-work-tree").status === 0) return `déjà dans un repo git → init sauté (pas de repo imbriqué)${hooksNote()}`;
648
+ if (git("init").status !== 0) return "git init a échoué → repo non initialisé";
649
+ const hooks = hooksNote();
650
+ git("add", "-A");
651
+ return (spawnSync("git", [
652
+ "commit",
653
+ "--no-verify",
654
+ "-m",
655
+ `chore: bootstrap ${appName} (nodefony create app)`
656
+ ], {
657
+ cwd: dest,
658
+ stdio: "ignore"
659
+ }).status === 0 ? "repo git initialisé + premier commit" : "repo git initialisé (commit initial à faire : identité git non configurée ?)") + hooks;
660
+ }
661
+ /**
662
+ * Commande `nodefony create` — orchestre l'adaptateur : parse argv, complète en
663
+ * interactif si TTY, délègue au moteur, rend le récap.
664
+ *
665
+ * @returns exit code sémantique (`OK`, `USAGE`, `CANTCREAT`, `SOFTWARE`)
666
+ */
667
+ async function runCreateCommand(argv) {
668
+ let parsed = parseCreateArgv(argv);
669
+ if ("error" in parsed && shouldAskForType(parsed.error, {
670
+ isTTY: process.stdin.isTTY === true,
671
+ yes: argv.includes("--yes")
672
+ })) {
673
+ const { select } = await chargePrompts();
674
+ const type = await select({
675
+ message: "Que veux-tu créer ?",
676
+ default: "app",
677
+ choices: CREATE_TYPES.map((t) => ({
678
+ name: `${t} — ${descriptionType(t)}`,
679
+ value: t
680
+ }))
681
+ });
682
+ const at = argv.indexOf("create");
683
+ const fullName = [...argv];
684
+ fullName.splice(at === -1 ? argv.length : at + 1, 0, type);
685
+ parsed = parseCreateArgv(fullName);
686
+ }
687
+ if ("error" in parsed) return printUsageError(PAGE, parsed.error);
688
+ if (parsed.help) return printUsage(PAGE);
689
+ if (parsed.describeJson) {
690
+ process.stdout.write(describeScaffold(parsed.type));
691
+ return 0;
692
+ }
693
+ const type = parsed.type;
694
+ const caps = { hasCheckout: resolveLocalWorkspaces(findPackageRoot()) !== null };
695
+ let answers = parsed.answers;
696
+ if (parsed.answersJson !== void 0) try {
697
+ answers = {
698
+ ...readAnswersJson(parsed.answersJson, type),
699
+ ...answers
700
+ };
701
+ } catch (e) {
702
+ process.stderr.write(`create: ${e.message}\n`);
703
+ return 64;
704
+ }
705
+ if (process.stdin.isTTY === true && !parsed.yes) {
706
+ const [spec] = getScaffoldSpec(type);
707
+ answers = await askMissing(spec, answers, caps, process.stdin, process.stdout, getScaffoldContext(process.cwd()));
708
+ const effective = new Map(spec.questions.map((q) => [q.key, answers[q.key] ?? q.default]));
709
+ const lines = spec.questions.filter((q) => !q.askWhen || String(effective.get(q.askWhen.key)) === q.askWhen.equals).map((q) => {
710
+ const value = answers[q.key] ?? q.default;
711
+ const shown = q.type === "boolean" ? value === true ? "oui" : "non" : String(value ?? "") || "(auto)";
712
+ return ` ${q.key.padEnd(10)} : ${shown}`;
713
+ }).join("\n");
714
+ process.stdout.write(`\nRécapitulatif :\n${lines}\n`);
715
+ if (!await confirm(parsed.dryRun ? "Simuler ?" : "Générer ?")) {
716
+ process.stdout.write("create: annulé\n");
717
+ return 0;
718
+ }
719
+ } else if (answers.link === void 0) answers.link = false;
720
+ if (answers.name === void 0 || answers.name === "") return printUsageError(PAGE, "nom requis");
721
+ const dir = parsed.dir ?? (type === "app" ? String(answers.name) : process.cwd());
722
+ let result;
723
+ try {
724
+ result = runScaffold({
725
+ type,
726
+ answers,
727
+ dir,
728
+ force: parsed.force
729
+ }, version, { dryRun: parsed.dryRun });
730
+ } catch (e) {
731
+ const message = e.message;
732
+ process.stderr.write(`create: ${message}\n`);
733
+ if (message.includes("n'est pas vide")) return 73;
734
+ if (message.includes("invalide")) return printUsageError(PAGE, message);
735
+ return 70;
736
+ }
737
+ const relDest = path.relative(process.cwd(), result.dest) || ".";
738
+ if (parsed.dryRun) {
739
+ process.stdout.write(`✔ ${type} « ${String(answers.name)} » — cible : ${relDest}/\n` + renderDryRun(result.changes ?? [], result.notes) + `\nRelance sans --dry-run pour écrire.\n`);
740
+ return 0;
741
+ }
742
+ if (type === "module") {
743
+ process.stdout.write(`✔ module « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n\nCâblage :\n` + (result.notes ?? []).map((n) => ` ${n}`).join("\n") + `\n`);
744
+ const projectRoot = findProjectRoot(process.cwd());
745
+ if (!parsed.install) {
746
+ const where = projectRoot ? path.relative(projectRoot, result.dest).split(path.sep).join("/") : String(answers.name);
747
+ process.stdout.write(`\nProchaines étapes (--no-install) :\n npm install # symlinke ${where} (workspace)\n npm run build\n`);
748
+ return 0;
749
+ }
750
+ if (!(projectRoot !== null && runInstall(projectRoot)) || projectRoot === null) {
751
+ process.stdout.write(`⚠ npm install a échoué — relance-le à la racine de l'app (le module ne sera pas chargeable avant)\n`);
752
+ return 0;
753
+ }
754
+ runFormat(projectRoot, result.files);
755
+ const built = runBuild(projectRoot);
756
+ process.stdout.write(built ? `\n✔ module installé (workspace), module et application construits — un serveur dev le rechargera au prochain redémarrage\n` : `\n⚠ npm run build a échoué à la racine — corrige puis relance-le (le runtime charge le dist de l'app)\n`);
757
+ return 0;
758
+ }
759
+ if (type !== "app") {
760
+ const addedDeps = result.depsAdded ?? [];
761
+ if (parsed.install && addedDeps.length > 0) {
762
+ const root = findProjectRoot(process.cwd());
763
+ const pose = root !== null && runInstall(root);
764
+ process.stdout.write(pose ? `\n✔ dépendance(s) installée(s) : ${addedDeps.join(", ")}\n` : `\n⚠ npm install a échoué — relance-le à la racine du projet (${addedDeps.join(", ")} est déclaré mais absent de node_modules)\n`);
765
+ } else if (addedDeps.length > 0) process.stdout.write(`\n⚠ ${addedDeps.join(", ")} ajouté(s) au package.json et NON installé(s) (--no-install) → lance \`npm install\`\n`);
766
+ process.stdout.write(`✔ ${type} « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n\n${type === "command" ? "Câblage" : "Endpoints"} :\n` + (result.notes ?? []).map((n) => ` ${n}`).join("\n") + `\n\nServeur dev lancé → rebuild automatique ; sinon : npm run build\n`);
767
+ return 0;
768
+ }
769
+ const linkNote = result.linked.length ? `\n🔗 link : ${result.linked.length} paquets nodefony câblés en file: sur le checkout local (dev framework — ne pas publier ce package.json tel quel)\n` : "";
770
+ process.stdout.write(`✔ ${type} « ${String(answers.name)} » généré dans ${relDest}/\n\n` + result.files.map((f) => ` ${f}`).join("\n") + `\n${linkNote}`);
771
+ const installed = parsed.install ? runInstall(result.dest) : false;
772
+ if (parsed.install && !installed) process.stdout.write(`⚠ npm install a échoué — relance-le à la main dans ${relDest}/\n`);
773
+ if (installed) runFormat(result.dest, result.files);
774
+ const built = installed ? runBuild(result.dest) : false;
775
+ if (installed && !built) process.stdout.write(`⚠ npm run build a échoué — relance-le à la main dans ${relDest}/\n`);
776
+ let migrationWritten = false;
777
+ if (built) {
778
+ const migration = runInitialMigration(result.dest);
779
+ if (migration !== null) {
780
+ migrationWritten = migration.written;
781
+ process.stdout.write(`\n🗄️ migration initiale : ${migration.note}\n`);
782
+ }
783
+ }
784
+ process.stdout.write(`\n🤖 skills d'agent : ${poseSkillPointers(result.dest)}\n`);
785
+ const chosen = Array.isArray(answers.agents) ? answers.agents : [];
786
+ const wiring = mcpWiringPlan({
787
+ chosen: chosen.length,
788
+ installed,
789
+ built
790
+ });
791
+ let mcpNote = wiring.propose ? "" : wiring.pattern;
792
+ if (wiring.propose) {
793
+ const mcpCall = argvMcpWiring(chosen, AGENT_TARGETS, result.dest);
794
+ if (mcpCall === null) mcpNote = "aucun agent choisi";
795
+ else await runAiMcpCommand(mcpCall);
796
+ }
797
+ if (mcpNote !== "") process.stdout.write(`🔌 agents IA : ${mcpNote}\n`);
798
+ const gitNote = parsed.git ? runGitInit(result.dest, String(answers.name), answers.gitHooks === true) : "sauté (--no-git)";
799
+ process.stdout.write(`🌱 git : ${gitNote}\n`);
800
+ const needsInfra = answers.preset !== "minimal" && answers.database !== void 0 && answers.database !== "sqlite";
801
+ process.stdout.write(`\nProchaines étapes :\n cd ${relDest}\n` + (installed ? "" : ` npm install\n`) + (built ? "" : ` npm run build\n`) + (needsInfra ? ` npm run infra:up # docker : ${String(answers.database)} + Redis (NF_DATABASE_URL pointe dessus)\n` : "") + (!migrationWritten && appDeclareUnOrm(result.dest) ? ` npx nodefony orm:generate --name init # écrit la migration de ta table User\n` : "") + ` npm run dev # → https://127.0.0.1:5152 (ou le port libre suivant, annoncé au démarrage)\n` + (answers.preset === "complete" ? ` # console d'administration : /nodefony — admin/admin en dev\n` : "") + (mcpNote !== "" ? ` npx nodefony ai:mcp # câbler ton agent IA (porte MCP + jeton)\n` : ""));
802
+ return createExitCode(parsed.install ? installed ? "succeeded" : "failed" : "skipped", installed ? built ? "succeeded" : "failed" : "skipped");
803
+ }
804
+ //#endregion
805
+ export { CREATE_TYPES, argvMcpWiring, createExitCode, mcpWiringPlan, parseCreateArgv, renderDryRun, runCreateCommand, shouldAskForType };