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.
- package/.ai/symbols.json +36135 -0
- package/LICENSE +544 -0
- package/README.md +316 -694
- package/bin/nodefony +2183 -85
- package/dist/client/Container.js +367 -0
- package/dist/client/Event.js +198 -0
- package/dist/client/Service.js +344 -0
- package/dist/client/Tools.js +162 -0
- package/dist/client/client/ClientKernel.js +276 -0
- package/dist/client/client/angular/index.js +352 -0
- package/dist/client/client/announce.js +212 -0
- package/dist/client/client/debugbar/DebugBar.js +1624 -0
- package/dist/client/client/debugbar/format.js +103 -0
- package/dist/client/client/debugbar/hmr.js +37 -0
- package/dist/client/client/debugbar/index.js +29 -0
- package/dist/client/client/debugbar/model.js +133 -0
- package/dist/client/client/debugbar/network.js +173 -0
- package/dist/client/client/debugbar/profile.js +114 -0
- package/dist/client/client/index.js +34 -0
- package/dist/client/client/react/index.js +268 -0
- package/dist/client/client/realtime/AdaptiveRate.js +240 -0
- package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
- package/dist/client/client/realtime/RealtimeClient.js +898 -0
- package/dist/client/client/realtime/localEvents.js +56 -0
- package/dist/client/client/realtime/notice.js +125 -0
- package/dist/client/client/realtime/observe.js +280 -0
- package/dist/client/client/roles/index.js +3 -0
- package/dist/client/client/roles/registry.js +97 -0
- package/dist/client/client/roles/roles.js +91 -0
- package/dist/client/client/shim/events.js +88 -0
- package/dist/client/client/shim/util.js +20 -0
- package/dist/client/client/svelte/index.js +319 -0
- package/dist/client/client/syslog/context.js +122 -0
- package/dist/client/client/syslog/errors.js +49 -0
- package/dist/client/client/syslog/uplink.js +106 -0
- package/dist/client/client/vue/index.js +321 -0
- package/dist/client/colors.js +63 -0
- package/dist/client/debugbar.standalone.js +4274 -0
- package/dist/client/realtime/IRealtimeTransport.js +32 -0
- package/dist/client/realtime/JsonRpcPeer.js +251 -0
- package/dist/client/realtime/channelRate.js +39 -0
- package/dist/client/realtime/platformChannels.js +155 -0
- package/dist/client/syslog/Pdu.js +224 -0
- package/dist/client/syslog/Syslog.js +1159 -0
- package/dist/client/syslog/drivers/pduFlow.js +106 -0
- package/dist/client/syslog/drivers/pduProtocol.js +28 -0
- package/dist/client/syslog/logColor.js +80 -0
- package/dist/client/types/src/Container.d.ts +221 -0
- package/dist/client/types/src/Event.d.ts +171 -0
- package/dist/client/types/src/FileClass.d.ts +184 -0
- package/dist/client/types/src/Service.d.ts +165 -0
- package/dist/client/types/src/Tools.d.ts +116 -0
- package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
- package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
- package/dist/client/types/src/client/angular/index.d.ts +273 -0
- package/dist/client/types/src/client/announce.d.ts +74 -0
- package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
- package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
- package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
- package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
- package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
- package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
- package/dist/client/types/src/client/index.d.ts +47 -0
- package/dist/client/types/src/client/react/index.d.ts +207 -0
- package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
- package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
- package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
- package/dist/client/types/src/client/roles/index.d.ts +15 -0
- package/dist/client/types/src/client/roles/registry.d.ts +72 -0
- package/dist/client/types/src/client/roles/roles.d.ts +68 -0
- package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
- package/dist/client/types/src/client/shim/events.d.ts +39 -0
- package/dist/client/types/src/client/shim/util.d.ts +14 -0
- package/dist/client/types/src/client/svelte/index.d.ts +216 -0
- package/dist/client/types/src/client/syslog/context.d.ts +76 -0
- package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
- package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
- package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
- package/dist/client/types/src/client/vue/index.d.ts +234 -0
- package/dist/client/types/src/colors.d.ts +32 -0
- package/dist/client/types/src/config/infra.d.ts +171 -0
- package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
- package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
- package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
- package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
- package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
- package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
- package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/client/types/src/syslog/logColor.d.ts +59 -0
- package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
- package/dist/client/types/src/types/ICommand.d.ts +14 -0
- package/dist/client/types/src/types/IContainer.d.ts +35 -0
- package/dist/client/types/src/types/IKernel.d.ts +138 -0
- package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
- package/dist/client/types/src/types/IModule.d.ts +73 -0
- package/dist/client/types/src/types/IPage.d.ts +119 -0
- package/dist/client/types/src/types/IService.d.ts +62 -0
- package/dist/client/types/src/types/ISyslog.d.ts +58 -0
- package/dist/client/types/src/types/ITransport.d.ts +5 -0
- package/dist/client/types/src/types/globals.d.ts +47 -0
- package/dist/node/Cli.js +750 -0
- package/dist/node/Container.js +367 -0
- package/dist/node/Error.js +309 -0
- package/dist/node/Event.js +198 -0
- package/dist/node/FileClass.js +308 -0
- package/dist/node/Nodefony.js +78 -0
- package/dist/node/Service.js +344 -0
- package/dist/node/Tools.js +205 -0
- package/dist/node/bin/resolveLocalCli.js +10 -0
- package/dist/node/bundler/index.js +103 -0
- package/dist/node/cli/agentTargets.js +461 -0
- package/dist/node/cli/aiMcp.js +553 -0
- package/dist/node/cli/aiMcpReport.js +129 -0
- package/dist/node/cli/aiSync.js +323 -0
- package/dist/node/cli/aiSyncReport.js +142 -0
- package/dist/node/cli/card.js +186 -0
- package/dist/node/cli/cardReport.js +110 -0
- package/dist/node/cli/completion.js +415 -0
- package/dist/node/cli/create.js +805 -0
- package/dist/node/cli/env.js +332 -0
- package/dist/node/cli/envReport.js +159 -0
- package/dist/node/cli/execPortable.js +60 -0
- package/dist/node/cli/gitHooks.js +191 -0
- package/dist/node/cli/gitHooksReport.js +119 -0
- package/dist/node/cli/globalFlags.js +67 -0
- package/dist/node/cli/helpReport.js +288 -0
- package/dist/node/cli/manPage.js +165 -0
- package/dist/node/cli/nodefonyBin.js +61 -0
- package/dist/node/cli/outdated.js +144 -0
- package/dist/node/cli/progress.js +555 -0
- package/dist/node/cli/projectRoot.js +32 -0
- package/dist/node/cli/promptPassword.js +44 -0
- package/dist/node/cli/prompts.js +86 -0
- package/dist/node/cli/scaffold/destination.js +92 -0
- package/dist/node/cli/scaffold/engine.js +2156 -0
- package/dist/node/cli/scaffold/entityFields.js +589 -0
- package/dist/node/cli/scaffold/format.js +243 -0
- package/dist/node/cli/scaffold/interactive.js +124 -0
- package/dist/node/cli/scaffold/moduleLayout.js +38 -0
- package/dist/node/cli/scaffold/reservedEntities.js +74 -0
- package/dist/node/cli/scaffold/spec.js +704 -0
- package/dist/node/cli/scaffold/steps.js +40 -0
- package/dist/node/cli/scaffold/userContractSource.js +133 -0
- package/dist/node/cli/scaffold/versions.js +57 -0
- package/dist/node/cli/scaffold/writer.js +172 -0
- package/dist/node/cli/startMenu.js +496 -0
- package/dist/node/cli/symbols.js +205 -0
- package/dist/node/cli/sysexits.js +34 -0
- package/dist/node/cli/tableReport.js +184 -0
- package/dist/node/cli/usageReport.js +144 -0
- package/dist/node/colors.js +63 -0
- package/dist/node/command/Builder.js +153 -0
- package/dist/node/command/Command.js +348 -0
- package/dist/node/config/configProvenance.js +101 -0
- package/dist/node/config/defaults.js +39 -0
- package/dist/node/config/defineConfig.js +129 -0
- package/dist/node/config/defineEnv.js +264 -0
- package/dist/node/config/envExample.js +41 -0
- package/dist/node/config/envOverride.js +423 -0
- package/dist/node/config/infra.js +163 -0
- package/dist/node/config/reactivity.js +23 -0
- package/dist/node/config/reservedEnv.js +118 -0
- package/dist/node/config/schema.js +134 -0
- package/dist/node/config/use.js +24 -0
- package/dist/node/finder/File.js +49 -0
- package/dist/node/finder/FileResult.js +86 -0
- package/dist/node/finder/Finder.js +201 -0
- package/dist/node/finder/Result.js +45 -0
- package/dist/node/index.js +121 -0
- package/dist/node/kernel/BootConfigurationError.js +54 -0
- package/dist/node/kernel/CliKernel.js +630 -0
- package/dist/node/kernel/Kernel.js +2198 -0
- package/dist/node/kernel/Module.js +453 -0
- package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
- package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
- package/dist/node/kernel/adminPlane/catalog.js +158 -0
- package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
- package/dist/node/kernel/checks/deep.js +335 -0
- package/dist/node/kernel/checks/freshness.js +139 -0
- package/dist/node/kernel/checks/gating.js +231 -0
- package/dist/node/kernel/checks/guards.js +232 -0
- package/dist/node/kernel/checks/lastBoot.js +136 -0
- package/dist/node/kernel/checks/live.js +330 -0
- package/dist/node/kernel/checks/packageDeps.js +292 -0
- package/dist/node/kernel/checks/readiness.js +153 -0
- package/dist/node/kernel/checks/renderReport.js +780 -0
- package/dist/node/kernel/checks/report.js +421 -0
- package/dist/node/kernel/checks/runDoctor.js +731 -0
- package/dist/node/kernel/checks/surface.js +364 -0
- package/dist/node/kernel/checks/walk.js +100 -0
- package/dist/node/kernel/checks/wiring.js +450 -0
- package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
- package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
- package/dist/node/kernel/commands/BuildCommand.js +49 -0
- package/dist/node/kernel/commands/CardCommand.js +50 -0
- package/dist/node/kernel/commands/ClusterCommand.js +58 -0
- package/dist/node/kernel/commands/CompletionCommand.js +31 -0
- package/dist/node/kernel/commands/CreateCommand.js +45 -0
- package/dist/node/kernel/commands/DevCommand.js +99 -0
- package/dist/node/kernel/commands/DoctorCommand.js +115 -0
- package/dist/node/kernel/commands/EnvCommand.js +52 -0
- package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
- package/dist/node/kernel/commands/InspectCommand.js +153 -0
- package/dist/node/kernel/commands/InstallCommand.js +20 -0
- package/dist/node/kernel/commands/MenuCommand.js +261 -0
- package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
- package/dist/node/kernel/commands/ProdCommand.js +60 -0
- package/dist/node/kernel/commands/StatusCommand.js +30 -0
- package/dist/node/kernel/commands/StopCommand.js +35 -0
- package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
- package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
- package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
- package/dist/node/kernel/injector/injector.js +137 -0
- package/dist/node/kernel/injector/serviceOrder.js +106 -0
- package/dist/node/kernel/inspect/adminSubjects.js +194 -0
- package/dist/node/kernel/inspect/docOutline.js +86 -0
- package/dist/node/kernel/lifecycleTags.js +76 -0
- package/dist/node/kernel/moduleConfig.js +75 -0
- package/dist/node/kernel/moduleGating.js +68 -0
- package/dist/node/kernel/readinessRegistry.js +98 -0
- package/dist/node/kernel/resolveModuleEntry.js +61 -0
- package/dist/node/mcp/caller.js +40 -0
- package/dist/node/mcp/guard.js +51 -0
- package/dist/node/mcp/protocol.js +157 -0
- package/dist/node/mcp/server.js +216 -0
- package/dist/node/mcp/tools.js +861 -0
- package/dist/node/oauth/authorizationServer.js +221 -0
- package/dist/node/oauth/protectedResource.js +293 -0
- package/dist/node/package.js +4 -0
- package/dist/node/realtime/IRealtimeTransport.js +32 -0
- package/dist/node/realtime/JsonRpcPeer.js +251 -0
- package/dist/node/realtime/RealtimeEventMap.js +15 -0
- package/dist/node/realtime/channelRate.js +39 -0
- package/dist/node/realtime/platformChannels.js +155 -0
- package/dist/node/runtime/GcScheduler.js +92 -0
- package/dist/node/runtime/RequestContext.js +76 -0
- package/dist/node/runtime/bearer.js +84 -0
- package/dist/node/runtime/engineEnvironment.js +79 -0
- package/dist/node/runtime/loadEnv.js +105 -0
- package/dist/node/runtime/pageFacets.js +85 -0
- package/dist/node/runtime/pageFilters.js +103 -0
- package/dist/node/runtime/pageGuard.js +84 -0
- package/dist/node/runtime/pageQuery.js +160 -0
- package/dist/node/runtime/pageSort.js +114 -0
- package/dist/node/runtime/redact.js +43 -0
- package/dist/node/runtime/withTimeout.js +71 -0
- package/dist/node/service/cluster/ClusterManager.js +202 -0
- package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
- package/dist/node/service/cluster/ClusterRelay.js +74 -0
- package/dist/node/service/cluster/clusterMaster.js +65 -0
- package/dist/node/service/cluster/clusterMessage.js +70 -0
- package/dist/node/service/cluster/cpuQuota.js +59 -0
- package/dist/node/service/cluster/instanceProbe.js +52 -0
- package/dist/node/service/cluster/podEnvironment.js +48 -0
- package/dist/node/service/cluster/processProbe.js +70 -0
- package/dist/node/service/cluster/richProcessProbe.js +115 -0
- package/dist/node/service/cluster/topology.js +71 -0
- package/dist/node/service/dev/BootReporter.js +490 -0
- package/dist/node/service/dev/DevSupervisor.js +1004 -0
- package/dist/node/service/dev/bootVerdict.js +158 -0
- package/dist/node/service/dev/detachedStart.js +372 -0
- package/dist/node/service/dev/devProcess.js +1137 -0
- package/dist/node/service/dev/devProjects.js +138 -0
- package/dist/node/service/dev/devStatusReport.js +395 -0
- package/dist/node/service/dev/devStop.js +263 -0
- package/dist/node/service/fetchService.js +35 -0
- package/dist/node/service/gitService.js +62 -0
- package/dist/node/syslog/Pdu.js +224 -0
- package/dist/node/syslog/Syslog.js +1159 -0
- package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
- package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
- package/dist/node/syslog/drivers/ILogDriver.js +26 -0
- package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
- package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
- package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
- package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
- package/dist/node/syslog/drivers/filterPdus.js +71 -0
- package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
- package/dist/node/syslog/drivers/opensearchShared.js +17 -0
- package/dist/node/syslog/drivers/pduFlow.js +106 -0
- package/dist/node/syslog/drivers/pduProtocol.js +28 -0
- package/dist/node/syslog/httpFetch.js +43 -0
- package/dist/node/syslog/logColor.js +80 -0
- package/dist/node/syslog/sinks/FileSink.js +142 -0
- package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
- package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
- package/dist/node/syslog/transports/FileTransport.js +17 -0
- package/dist/node/syslog/transports/HttpTransport.js +44 -0
- package/dist/node/syslog/transports/LokiTransport.js +80 -0
- package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
- package/dist/node/syslog/transports/SyslogTransport.js +13 -0
- package/dist/node/syslog/transports/index.js +8 -0
- package/dist/node/testing/index.js +190 -0
- package/dist/types/Cli.d.ts +177 -0
- package/dist/types/Container.d.ts +221 -0
- package/dist/types/Error.d.ts +162 -0
- package/dist/types/Event.d.ts +171 -0
- package/dist/types/FileClass.d.ts +184 -0
- package/dist/types/Nodefony.d.ts +66 -0
- package/dist/types/Service.d.ts +165 -0
- package/dist/types/Tools.d.ts +116 -0
- package/dist/types/bin/resolveLocalCli.d.ts +49 -0
- package/dist/types/bundler/index.d.ts +66 -0
- package/dist/types/cli/agentTargets.d.ts +378 -0
- package/dist/types/cli/aiMcp.d.ts +239 -0
- package/dist/types/cli/aiMcpReport.d.ts +113 -0
- package/dist/types/cli/aiSync.d.ts +68 -0
- package/dist/types/cli/aiSyncReport.d.ts +149 -0
- package/dist/types/cli/card.d.ts +49 -0
- package/dist/types/cli/cardReport.d.ts +127 -0
- package/dist/types/cli/completion.d.ts +154 -0
- package/dist/types/cli/create.d.ts +177 -0
- package/dist/types/cli/env.d.ts +103 -0
- package/dist/types/cli/envReport.d.ts +153 -0
- package/dist/types/cli/execPortable.d.ts +54 -0
- package/dist/types/cli/gitHooks.d.ts +48 -0
- package/dist/types/cli/gitHooksReport.d.ts +101 -0
- package/dist/types/cli/globalFlags.d.ts +48 -0
- package/dist/types/cli/helpReport.d.ts +110 -0
- package/dist/types/cli/manPage.d.ts +21 -0
- package/dist/types/cli/nodefonyBin.d.ts +45 -0
- package/dist/types/cli/outdated.d.ts +119 -0
- package/dist/types/cli/progress.d.ts +349 -0
- package/dist/types/cli/projectRoot.d.ts +19 -0
- package/dist/types/cli/promptPassword.d.ts +22 -0
- package/dist/types/cli/prompts.d.ts +102 -0
- package/dist/types/cli/scaffold/destination.d.ts +70 -0
- package/dist/types/cli/scaffold/engine.d.ts +545 -0
- package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
- package/dist/types/cli/scaffold/format.d.ts +78 -0
- package/dist/types/cli/scaffold/interactive.d.ts +11 -0
- package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
- package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
- package/dist/types/cli/scaffold/spec.d.ts +159 -0
- package/dist/types/cli/scaffold/steps.d.ts +24 -0
- package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
- package/dist/types/cli/scaffold/versions.d.ts +14 -0
- package/dist/types/cli/scaffold/writer.d.ts +100 -0
- package/dist/types/cli/startMenu.d.ts +195 -0
- package/dist/types/cli/symbols.d.ts +84 -0
- package/dist/types/cli/sysexits.d.ts +31 -0
- package/dist/types/cli/tableReport.d.ts +44 -0
- package/dist/types/cli/usageReport.d.ts +108 -0
- package/dist/types/client/ClientKernel.d.ts +90 -0
- package/dist/types/client/IClientKernel.d.ts +195 -0
- package/dist/types/client/angular/index.d.ts +273 -0
- package/dist/types/client/announce.d.ts +74 -0
- package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/types/client/debugbar/format.d.ts +48 -0
- package/dist/types/client/debugbar/hmr.d.ts +16 -0
- package/dist/types/client/debugbar/index.d.ts +30 -0
- package/dist/types/client/debugbar/model.d.ts +158 -0
- package/dist/types/client/debugbar/network.d.ts +55 -0
- package/dist/types/client/debugbar/profile.d.ts +99 -0
- package/dist/types/client/index.d.ts +47 -0
- package/dist/types/client/react/index.d.ts +207 -0
- package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/types/client/realtime/localEvents.d.ts +53 -0
- package/dist/types/client/realtime/notice.d.ts +70 -0
- package/dist/types/client/realtime/observe.d.ts +284 -0
- package/dist/types/client/roles/index.d.ts +15 -0
- package/dist/types/client/roles/registry.d.ts +72 -0
- package/dist/types/client/roles/roles.d.ts +68 -0
- package/dist/types/client/shim/cli-color.d.ts +2 -0
- package/dist/types/client/shim/events.d.ts +39 -0
- package/dist/types/client/shim/util.d.ts +14 -0
- package/dist/types/client/svelte/index.d.ts +216 -0
- package/dist/types/client/syslog/context.d.ts +76 -0
- package/dist/types/client/syslog/errors.d.ts +46 -0
- package/dist/types/client/syslog/uplink.d.ts +89 -0
- package/dist/types/client/transport/websocket.d.ts +5 -0
- package/dist/types/client/vue/index.d.ts +234 -0
- package/dist/types/colors.d.ts +32 -0
- package/dist/types/command/Builder.d.ts +47 -0
- package/dist/types/command/Command.d.ts +268 -0
- package/dist/types/config/configMeta.d.ts +53 -0
- package/dist/types/config/configProvenance.d.ts +58 -0
- package/dist/types/config/defaults.d.ts +33 -0
- package/dist/types/config/defineConfig.d.ts +70 -0
- package/dist/types/config/defineEnv.d.ts +170 -0
- package/dist/types/config/envExample.d.ts +23 -0
- package/dist/types/config/envOverride.d.ts +236 -0
- package/dist/types/config/index.d.ts +23 -0
- package/dist/types/config/infra.d.ts +171 -0
- package/dist/types/config/reactivity.d.ts +36 -0
- package/dist/types/config/reservedEnv.d.ts +145 -0
- package/dist/types/config/schema.d.ts +113 -0
- package/dist/types/config/types.d.ts +374 -0
- package/dist/types/config/use.d.ts +80 -0
- package/dist/types/finder/File.d.ts +26 -0
- package/dist/types/finder/FileResult.d.ts +14 -0
- package/dist/types/finder/Finder.d.ts +51 -0
- package/dist/types/finder/Result.d.ts +10 -0
- package/dist/types/index.d.ts +205 -0
- package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
- package/dist/types/kernel/CliKernel.d.ts +289 -0
- package/dist/types/kernel/Kernel.d.ts +1255 -0
- package/dist/types/kernel/Module.d.ts +326 -0
- package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
- package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
- package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
- package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
- package/dist/types/kernel/bootReport.d.ts +112 -0
- package/dist/types/kernel/checks/deep.d.ts +122 -0
- package/dist/types/kernel/checks/freshness.d.ts +49 -0
- package/dist/types/kernel/checks/gating.d.ts +134 -0
- package/dist/types/kernel/checks/guards.d.ts +57 -0
- package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
- package/dist/types/kernel/checks/live.d.ts +110 -0
- package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
- package/dist/types/kernel/checks/readiness.d.ts +97 -0
- package/dist/types/kernel/checks/renderReport.d.ts +107 -0
- package/dist/types/kernel/checks/report.d.ts +414 -0
- package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
- package/dist/types/kernel/checks/surface.d.ts +148 -0
- package/dist/types/kernel/checks/walk.d.ts +45 -0
- package/dist/types/kernel/checks/wiring.d.ts +54 -0
- package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
- package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
- package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
- package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
- package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
- package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
- package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
- package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
- package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
- package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
- package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
- package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
- package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
- package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
- package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
- package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
- package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
- package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
- package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
- package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
- package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
- package/dist/types/kernel/injector/injector.d.ts +47 -0
- package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
- package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
- package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
- package/dist/types/kernel/lifecycleTags.d.ts +79 -0
- package/dist/types/kernel/moduleConfig.d.ts +35 -0
- package/dist/types/kernel/moduleGating.d.ts +78 -0
- package/dist/types/kernel/readinessRegistry.d.ts +104 -0
- package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
- package/dist/types/mcp/caller.d.ts +55 -0
- package/dist/types/mcp/guard.d.ts +66 -0
- package/dist/types/mcp/protocol.d.ts +163 -0
- package/dist/types/mcp/server.d.ts +70 -0
- package/dist/types/mcp/tools.d.ts +209 -0
- package/dist/types/oauth/authorizationServer.d.ts +204 -0
- package/dist/types/oauth/protectedResource.d.ts +339 -0
- package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/types/realtime/channelRate.d.ts +55 -0
- package/dist/types/realtime/platformChannels.d.ts +147 -0
- package/dist/types/runtime/GcScheduler.d.ts +96 -0
- package/dist/types/runtime/RequestContext.d.ts +152 -0
- package/dist/types/runtime/bearer.d.ts +88 -0
- package/dist/types/runtime/engineEnvironment.d.ts +115 -0
- package/dist/types/runtime/loadEnv.d.ts +86 -0
- package/dist/types/runtime/pageFacets.d.ts +104 -0
- package/dist/types/runtime/pageFilters.d.ts +139 -0
- package/dist/types/runtime/pageGuard.d.ts +78 -0
- package/dist/types/runtime/pageQuery.d.ts +138 -0
- package/dist/types/runtime/pageSort.d.ts +86 -0
- package/dist/types/runtime/redact.d.ts +27 -0
- package/dist/types/runtime/withTimeout.d.ts +51 -0
- package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
- package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
- package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
- package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
- package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
- package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
- package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
- package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
- package/dist/types/service/cluster/processProbe.d.ts +53 -0
- package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
- package/dist/types/service/cluster/topology.d.ts +64 -0
- package/dist/types/service/dev/BootReporter.d.ts +67 -0
- package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
- package/dist/types/service/dev/bootVerdict.d.ts +99 -0
- package/dist/types/service/dev/detachedStart.d.ts +164 -0
- package/dist/types/service/dev/devProcess.d.ts +638 -0
- package/dist/types/service/dev/devProjects.d.ts +121 -0
- package/dist/types/service/dev/devStatusReport.d.ts +141 -0
- package/dist/types/service/dev/devStop.d.ts +57 -0
- package/dist/types/service/fetchService.d.ts +29 -0
- package/dist/types/service/gitService.d.ts +24 -0
- package/dist/types/syslog/Pdu.d.ts +134 -0
- package/dist/types/syslog/Syslog.d.ts +482 -0
- package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
- package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
- package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
- package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
- package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
- package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
- package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
- package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/types/syslog/httpFetch.d.ts +48 -0
- package/dist/types/syslog/logColor.d.ts +59 -0
- package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
- package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
- package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
- package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
- package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
- package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
- package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
- package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
- package/dist/types/syslog/transports/index.d.ts +12 -0
- package/dist/types/testing/index.d.ts +197 -0
- package/dist/types/types/IAdminApi.d.ts +246 -0
- package/dist/types/types/ICliKernel.d.ts +28 -0
- package/dist/types/types/ICommand.d.ts +14 -0
- package/dist/types/types/IContainer.d.ts +35 -0
- package/dist/types/types/IIdempotencyStore.d.ts +159 -0
- package/dist/types/types/IKernel.d.ts +138 -0
- package/dist/types/types/IMcpTool.d.ts +157 -0
- package/dist/types/types/IModule.d.ts +73 -0
- package/dist/types/types/IModuleManifest.d.ts +49 -0
- package/dist/types/types/IPage.d.ts +119 -0
- package/dist/types/types/IService.d.ts +62 -0
- package/dist/types/types/ISyslog.d.ts +58 -0
- package/dist/types/types/ITransport.d.ts +5 -0
- package/dist/types/types/globals.d.ts +47 -0
- package/docs/angular-services.md +318 -0
- package/docs/catalogue.md +184 -0
- package/docs/cli.md +369 -0
- package/docs/client.md +616 -0
- package/docs/debugbar.md +218 -0
- package/docs/environnement.md +308 -0
- package/docs/index.md +388 -0
- package/docs/kernel.md +670 -0
- package/docs/progression.md +228 -0
- package/docs/react-hooks.md +686 -0
- package/docs/request-context.md +507 -0
- package/docs/service.md +590 -0
- package/docs/svelte-reactivite.md +293 -0
- package/docs/syslog.md +848 -0
- package/docs/testing.md +203 -0
- package/docs/vue-composables.md +255 -0
- package/man/nodefony.1 +152 -0
- package/package.json +163 -83
- package/templates/app/agents/AGENTS.md.tpl +967 -0
- package/templates/app/agents/POINTEUR.md.tpl +12 -0
- package/templates/app/base/Dockerfile.tpl +104 -0
- package/templates/app/base/README.md.tpl +314 -0
- package/templates/app/base/dockerignore.tpl +28 -0
- package/templates/app/base/env.ts.tpl +130 -0
- package/templates/app/base/gitattributes.tpl +28 -0
- package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
- package/templates/app/base/gitignore.tpl +46 -0
- package/templates/app/base/gitlab-ci.yml.tpl +42 -0
- package/templates/app/base/index.ts.tpl +69 -0
- package/templates/app/base/nodefony.config.ts.tpl +342 -0
- package/templates/app/base/oxlintrc.json.tpl +127 -0
- package/templates/app/base/package.json.tpl +75 -0
- package/templates/app/base/prettierignore.tpl +24 -0
- package/templates/app/base/prettierrc.json.tpl +12 -0
- package/templates/app/base/rolldown.config.ts.tpl +8 -0
- package/templates/app/base/tests/config.test.ts.tpl +29 -0
- package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
- package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
- package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
- package/templates/app/base/tsconfig.json.tpl +47 -0
- package/templates/app/base/vitest.config.ts.tpl +88 -0
- package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
- package/templates/app/complete/compose.yaml.tpl +328 -0
- package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
- package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
- package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
- package/templates/app/complete/env.local.tpl +11 -0
- package/templates/app/complete/env.tpl +53 -0
- package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
- package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
- package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
- package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
- package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
- package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
- package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
- package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
- package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
- package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
- package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
- package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
- package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
- package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
- package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
- package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
- package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
- package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
- package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
- package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
- package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
- package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
- package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
- package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
- package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
- package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
- package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
- package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
- package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
- package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
- package/templates/module/ai/AGENTS.md.tpl +71 -0
- package/templates/module/base/README.md.tpl +62 -0
- package/templates/module/base/docs/index.md.tpl +55 -0
- package/templates/module/base/index.ts.tpl +50 -0
- package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
- package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
- package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
- package/templates/module/base/package.json.tpl +53 -0
- package/templates/module/base/rolldown.config.ts.tpl +14 -0
- package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
- package/templates/module/base/tsconfig.json.tpl +42 -0
- package/templates/module/base/vitest.config.ts.tpl +27 -0
- package/templates/module/packages/CLAUDE.md.tpl +51 -0
- package/templates/module/packages/MEMORY.md.tpl +39 -0
- package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
- package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
- package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
- package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
- package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
- package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
- package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
- package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
- package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
- package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
- package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
- package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
- package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
- package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
- package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
- package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
- package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
- package/.yarnclean +0 -45
- package/CHANGELOG.md +0 -406
- package/autoloader.es6 +0 -253
- package/builder.es6 +0 -366
- package/cli/builder/bundles/bundle.js +0 -328
- package/cli/builder/bundles/controller.js +0 -73
- package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
- package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
- package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
- package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
- package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
- package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
- package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
- package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
- package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
- package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
- package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
- package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
- package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
- package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
- package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
- package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
- package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
- package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
- package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
- package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
- package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
- package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
- package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
- package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
- package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
- package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
- package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
- package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
- package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
- package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
- package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
- package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
- package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
- package/cli/builder/bundles/users-bundle/package.json +0 -58
- package/cli/builder/bundles/users-bundle/readme.md +0 -360
- package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
- package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
- package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
- package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
- package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
- package/cli/builder/microService/microService.js +0 -261
- package/cli/builder/microService/skeletons/.editorconfig +0 -18
- package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
- package/cli/builder/microService/skeletons/.jshintrc +0 -37
- package/cli/builder/microService/skeletons/README.md +0 -117
- package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
- package/cli/builder/microService/skeletons/bin/cli +0 -13
- package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
- package/cli/builder/microService/skeletons/config/config.js +0 -29
- package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
- package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
- package/cli/builder/microService/skeletons/package.json +0 -76
- package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
- package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
- package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
- package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
- package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
- package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
- package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
- package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
- package/cli/builder/microService/skeletons/src/node/index.js +0 -102
- package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
- package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
- package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
- package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
- package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
- package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
- package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
- package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
- package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
- package/cli/builder/project/project.js +0 -474
- package/cli/builder/project/skeletons/README.md +0 -778
- package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
- package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
- package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
- package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
- package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
- package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
- package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
- package/cli/builder/project/skeletons/documentation.html.twig +0 -24
- package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
- package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
- package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
- package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
- package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
- package/cli/builder/project/skeletons/package.json.twig +0 -71
- package/cli/builder/react/reactBuilder.js +0 -224
- package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
- package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
- package/cli/builder/react/skeletons/app/config/config.js +0 -392
- package/cli/builder/react/skeletons/app/config/routing.js +0 -10
- package/cli/builder/react/skeletons/app/config/security.js +0 -74
- package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
- package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
- package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
- package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
- package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
- package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
- package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
- package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
- package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
- package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
- package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
- package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
- package/cli/builder/skeletons/app/appKernel.js +0 -133
- package/cli/builder/skeletons/binding/binding.cc +0 -26
- package/cli/builder/skeletons/binding/binding.skeleton +0 -8
- package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
- package/cli/builder/skeletons/command/commandClass.js +0 -11
- package/cli/builder/skeletons/command/taskClass.js +0 -20
- package/cli/builder/skeletons/config/config.js +0 -138
- package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
- package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
- package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
- package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
- package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
- package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
- package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
- package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
- package/cli/builder/skeletons/config/routing.js +0 -55
- package/cli/builder/skeletons/config/security.js +0 -102
- package/cli/builder/skeletons/config/services.js +0 -1
- package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
- package/cli/builder/skeletons/config/webpack.config.js +0 -148
- package/cli/builder/skeletons/controller/controllerClass.js +0 -75
- package/cli/builder/skeletons/package.json.twig +0 -57
- package/cli/builder/skeletons/unittest/testFile.js +0 -46
- package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/vue/skeletons/vue.config.js +0 -129
- package/cli/builder/vue/vueBuilder.js +0 -410
- package/cli/generate/generate.es6 +0 -103
- package/cli/install/install.js +0 -190
- package/cli/sequelize/sequelize.js +0 -94
- package/cli/start.js +0 -702
- package/cli/tools/pm2.es6 +0 -112
- package/cli/tools/tools.es6 +0 -97
- package/cli.es6 +0 -925
- package/container.es6 +0 -272
- package/error.es6 +0 -293
- package/fileClass.es6 +0 -242
- package/finder/file.es6 +0 -33
- package/finder/fileResult.es6 +0 -138
- package/finder/finder2.es6 +0 -275
- package/finder.es6 +0 -427
- package/kernel/annotations/annotations.es6 +0 -286
- package/kernel/api/api.es6 +0 -61
- package/kernel/api/graphqlApi.es6 +0 -107
- package/kernel/api/jsonApi.es6 +0 -177
- package/kernel/api/openApi.es6 +0 -139
- package/kernel/api/schemas/openApiSchema.js +0 -394
- package/kernel/babylon.es6 +0 -162
- package/kernel/bundle.es6 +0 -1200
- package/kernel/cliKernel.es6 +0 -869
- package/kernel/command.es6 +0 -78
- package/kernel/commands/nodefonyCommand.es6 +0 -247
- package/kernel/commands/tasks/bundlesTask.es6 +0 -59
- package/kernel/controllers/controller.es6 +0 -791
- package/kernel/fixture.es6 +0 -19
- package/kernel/injections/injections.es6 +0 -424
- package/kernel/kernel.es6 +0 -1960
- package/kernel/kernelWatcher.es6 +0 -387
- package/kernel/orm/entity.es6 +0 -59
- package/kernel/orm/orm.es6 +0 -139
- package/kernel/reader.es6 +0 -290
- package/kernel/security/encoder.es6 +0 -17
- package/kernel/security/factories/factory.es6 +0 -111
- package/kernel/security/factories/passeportFactory.es6 +0 -61
- package/kernel/security/provider.es6 +0 -58
- package/kernel/security/providers/chainProvider.es6 +0 -99
- package/kernel/security/providers/memoryProvider.es6 +0 -55
- package/kernel/security/providers/providerManager.es6 +0 -67
- package/kernel/security/providers/userEntityProvider.es6 +0 -50
- package/kernel/security/role.es6 +0 -12
- package/kernel/security/secureArea.es6 +0 -431
- package/kernel/security/tokens/token.es6 +0 -171
- package/kernel/security/user.es6 +0 -106
- package/kernel/serviceRealTime.es6 +0 -21
- package/kernel/services/connectionsService.es6 +0 -93
- package/kernel/services/cron/cronService.es6 +0 -123
- package/kernel/task.es6 +0 -80
- package/kernel/templates.es6 +0 -22
- package/kernel/templating/twig.es6 +0 -218
- package/kernel/tests/cliTest.js +0 -59
- package/kernel/tests/containerTest.js +0 -232
- package/kernel/tests/kernelTest.js +0 -39
- package/nodefony.es6 +0 -1084
- package/notificationsCenter.es6 +0 -118
- package/protocol.es6 +0 -86
- package/protocols/bayeux.es6 +0 -174
- package/protocols/jsonRpc/jsonrpc.es6 +0 -56
- package/result.es6 +0 -99
- package/service.es6 +0 -288
- package/syslog/pdu.es6 +0 -141
- package/syslog/syslog.es6 +0 -754
- package/watcher.es6 +0 -113
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import "./sysexits.js";
|
|
2
|
+
import { chargePrompts } from "./prompts.js";
|
|
3
|
+
import { printUsage, printUsageError } from "./usageReport.js";
|
|
4
|
+
import { defaultDevPorts } from "../service/dev/devProcess.js";
|
|
5
|
+
import { findProjectRoot } from "./projectRoot.js";
|
|
6
|
+
import { ADMIN_SCOPE_READ, ADMIN_SCOPE_WRITE } from "../kernel/adminPlane/adminCaller.js";
|
|
7
|
+
import { MCP_CONFIG_FILE, MCP_SERVER_KEY, MCP_TOKEN_ENV, buildMcpUrl, planMcpConfig, renderMcpPlan } from "./aiMcpReport.js";
|
|
8
|
+
import { AGENT_TARGETS, agentRoot, agentsPresents, litVariable, planAgentDeclaration, renderPlanShell, requestedAgents } from "./agentTargets.js";
|
|
9
|
+
import { writeAgentPointers } from "./scaffold/engine.js";
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
//#region src/cli/aiMcp.ts
|
|
13
|
+
/**
|
|
14
|
+
* `nodefony ai:mcp` — déclare le serveur MCP de cette application à ton agent.
|
|
15
|
+
*
|
|
16
|
+
* ## Ce que cette commande fait, et ce qu'elle NE fait pas
|
|
17
|
+
*
|
|
18
|
+
* Elle **écrit un fichier de câblage** (`.mcp.json`) et rend la main. Elle ne
|
|
19
|
+
* démarre aucun process : depuis la révision `2026-07-28` du transport, un
|
|
20
|
+
* serveur MCP est un simple endpoint `POST` sans session — chez Nodefony,
|
|
21
|
+
* c'est une **route de l'application** (`POST /nodefony/mcp`, module
|
|
22
|
+
* `@nodefony/devkit`). Il n'y a donc rien à lancer en plus de l'application,
|
|
23
|
+
* et rien à relancer quand le superviseur la recharge.
|
|
24
|
+
*
|
|
25
|
+
* ## Pourquoi standalone (aucun boot)
|
|
26
|
+
*
|
|
27
|
+
* Même raison que `card` et `ai:sync` : écrire un fichier de configuration ne
|
|
28
|
+
* dépend d'aucun service, et la commande doit répondre dans un terminal qui n'a
|
|
29
|
+
* pas posé `NODE_ENV` — le module qui sert la route est `policy: "dev"`, il
|
|
30
|
+
* n'existerait pas ici.
|
|
31
|
+
*
|
|
32
|
+
* ## Le port n'est pas deviné
|
|
33
|
+
*
|
|
34
|
+
* Il est lu du fichier d'état que le runtime publie une fois ses serveurs en
|
|
35
|
+
* écoute (`defaultDevPorts`), et retombe sur la convention `5151` seulement
|
|
36
|
+
* quand rien n'a jamais tourné. C'est la même source que `nodefony status` :
|
|
37
|
+
* deux lectures indépendantes finiraient par annoncer un port où personne
|
|
38
|
+
* n'écoute.
|
|
39
|
+
*/
|
|
40
|
+
/** Chemin de la route MCP — dupliqué NULLE PART ailleurs dans le cœur. */
|
|
41
|
+
const MCP_PATH = "/nodefony/mcp";
|
|
42
|
+
/** La page d'aide — `nodefony ai:mcp --help`, et le rappel après un refus. */
|
|
43
|
+
const PAGE = {
|
|
44
|
+
command: "nodefony ai:mcp",
|
|
45
|
+
tagline: "déclare le serveur MCP de cette application à ton agent, et si tu veux chez les agents installés",
|
|
46
|
+
synopsis: ["nodefony ai:mcp [--auth|--no-auth] [--url <origine>] [options]", "nodefony ai:mcp --agent <liste> [--remove] [--global] [options]"],
|
|
47
|
+
sections: [{
|
|
48
|
+
title: "CE QU'ELLE ÉCRIT",
|
|
49
|
+
paragraph: `Le fichier ${MCP_CONFIG_FILE} du projet, et — si --agent est donné — la déclaration chez les agents nommés, par LEUR propre outil en ligne de commande. Elle ne DÉMARRE rien : le serveur MCP est une route de l'application, pas un process.`
|
|
50
|
+
}, {
|
|
51
|
+
title: "AGENTS RECONNUS",
|
|
52
|
+
lines: [`${AGENT_TARGETS.map((c) => c.key).join(" · ")} · all · none`],
|
|
53
|
+
paragraph: "« none » — ou aucune case cochée en mode interactif — ne touche à aucun agent : coder seul est un choix, pas un oubli."
|
|
54
|
+
}],
|
|
55
|
+
options: [
|
|
56
|
+
{
|
|
57
|
+
term: "-a, --auth",
|
|
58
|
+
text: `mode authentifié : l'en-tête porte \${${MCP_TOKEN_ENV}}, jamais le jeton lui-même. Sans option, le mode déjà en place est CONSERVÉ`
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
term: "--no-auth",
|
|
62
|
+
text: "retire l'en-tête d'autorisation"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
term: "-u, --url <origine>",
|
|
66
|
+
text: "origine forcée (ex. https://localhost:5152)"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
term: "--agent <liste>",
|
|
70
|
+
text: "déclare AUSSI la porte chez ces agents, via leur propre CLI"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
term: "--remove",
|
|
74
|
+
text: "avec --agent : retire la déclaration au lieu de la poser"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
term: "--global",
|
|
78
|
+
text: "avec --agent : déclare dans TON foyer au lieu du projet (une seule application servie)"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
term: "-n, --dry-run",
|
|
82
|
+
text: "le plan, sans rien écrire"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
term: "-j, --json",
|
|
86
|
+
text: "le même plan, exploitable par un script"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
term: "--cwd <chemin>",
|
|
90
|
+
text: "point de départ (la racine de l'app est résolue en remontant)"
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
examples: [
|
|
94
|
+
{
|
|
95
|
+
term: "nodefony ai:mcp",
|
|
96
|
+
text: "déclare la porte dans le projet"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
term: "nodefony ai:mcp --auth",
|
|
100
|
+
text: "en mode authentifié — le jeton s'obtient par `nodefony security:token --write`"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
term: "nodefony ai:mcp --agent all",
|
|
104
|
+
text: "et chez tous les agents installés sur ce poste"
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
exitCodes: [{
|
|
108
|
+
term: "66",
|
|
109
|
+
text: "aucune application ici (EX_NOINPUT)"
|
|
110
|
+
}]
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Parse l'argv après le mot `ai:mcp`.
|
|
114
|
+
*
|
|
115
|
+
* @param argv - `process.argv` complet
|
|
116
|
+
* @returns la demande, ou le motif du refus
|
|
117
|
+
*/
|
|
118
|
+
function parseAiMcpArgv(argv) {
|
|
119
|
+
const at = argv.indexOf("ai:mcp");
|
|
120
|
+
const rest = at === -1 ? [] : argv.slice(at + 1);
|
|
121
|
+
const req = {
|
|
122
|
+
url: null,
|
|
123
|
+
auth: null,
|
|
124
|
+
agent: void 0,
|
|
125
|
+
remove: false,
|
|
126
|
+
global: false,
|
|
127
|
+
dryRun: false,
|
|
128
|
+
json: false,
|
|
129
|
+
cwd: process.cwd(),
|
|
130
|
+
help: false
|
|
131
|
+
};
|
|
132
|
+
for (let i = 0; i < rest.length; i++) {
|
|
133
|
+
const word = rest[i];
|
|
134
|
+
if (word === "--help" || word === "-h") req.help = true;
|
|
135
|
+
else if (word === "--auth" || word === "-a") req.auth = true;
|
|
136
|
+
else if (word === "--no-auth") req.auth = false;
|
|
137
|
+
else if (word === "--dry-run" || word === "-n") req.dryRun = true;
|
|
138
|
+
else if (word === "--json" || word === "-j") req.json = true;
|
|
139
|
+
else if (word === "--agent") req.agent = rest[++i] ?? "";
|
|
140
|
+
else if (word === "--global") req.global = true;
|
|
141
|
+
else if (word === "--remove") req.remove = true;
|
|
142
|
+
else if (word === "--url" || word === "-u") req.url = rest[++i] ?? null;
|
|
143
|
+
else if (word === "--cwd") req.cwd = path.resolve(rest[++i] ?? "");
|
|
144
|
+
else return { error: `argument inconnu : ${word}` };
|
|
145
|
+
}
|
|
146
|
+
return req;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Déduit l'origine du serveur de développement.
|
|
150
|
+
*
|
|
151
|
+
* ⚠️ **Le port en clair est préféré au port TLS**, et ce n'est pas une
|
|
152
|
+
* négligence : en développement le certificat est auto-signé, et un client MCP
|
|
153
|
+
* qui le refuse ne dit pas pourquoi — il rend « serveur injoignable ». L'appel
|
|
154
|
+
* est purement local ; `--url` reste là pour qui veut le TLS.
|
|
155
|
+
*
|
|
156
|
+
* @param cwd - racine du projet
|
|
157
|
+
*/
|
|
158
|
+
function guessOrigin(cwd) {
|
|
159
|
+
return `http://localhost:${defaultDevPorts(cwd)[0] ?? 5151}`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Lit l'échéance et les scopes d'un JWT, sans le valider ni le divulguer.
|
|
163
|
+
*
|
|
164
|
+
* @param token - le jeton compact (`en-tête.charge.signature`).
|
|
165
|
+
* @param nowSeconds - l'instant de référence, INJECTÉ pour que le banc
|
|
166
|
+
* n'ait pas à attendre le temps qui passe.
|
|
167
|
+
* @returns l'état lisible, ou `null` si ce n'est pas un JWT exploitable.
|
|
168
|
+
*/
|
|
169
|
+
function tokenState(token, nowSeconds) {
|
|
170
|
+
const parts = token.split(".");
|
|
171
|
+
if (parts.length !== 3 || !parts[1]) return null;
|
|
172
|
+
try {
|
|
173
|
+
const charge = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
|
|
174
|
+
const scope = typeof charge.scope === "string" ? charge.scope : "";
|
|
175
|
+
return {
|
|
176
|
+
remainingSeconds: typeof charge.exp === "number" ? charge.exp - nowSeconds : null,
|
|
177
|
+
scopes: scope.split(/\s+/u).filter((s) => s !== "")
|
|
178
|
+
};
|
|
179
|
+
} catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Phrase d'état d'un jeton, pour un humain devant une question.
|
|
185
|
+
*
|
|
186
|
+
* @param state - ce que {@link tokenState} a lu, ou `null` s'il n'y en a pas.
|
|
187
|
+
* @returns la ligne à afficher.
|
|
188
|
+
*/
|
|
189
|
+
function renderTokenState(state) {
|
|
190
|
+
if (state === null) return "aucun jeton lisible n'est posé chez tes agents";
|
|
191
|
+
const scopes = state.scopes.length > 0 ? state.scopes.join(" ") : "aucun scope déclaré";
|
|
192
|
+
if (state.remainingSeconds === null) return `jeton sans échéance (${scopes})`;
|
|
193
|
+
if (state.remainingSeconds <= 0) return `jeton EXPIRÉ depuis ${Math.round(-state.remainingSeconds / 60)} min (${scopes}) — c'est lui qui provoque les 401`;
|
|
194
|
+
const hours = state.remainingSeconds / 3600;
|
|
195
|
+
return `jeton valide encore ${hours >= 48 ? `${Math.round(hours / 24)} jours` : hours >= 2 ? `${Math.round(hours)} heures` : `${Math.round(state.remainingSeconds / 60)} min`} (${scopes})`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* État du jeton posé chez CHAQUE agent détecté — l'échéance et la portée, pas
|
|
199
|
+
* le secret.
|
|
200
|
+
*
|
|
201
|
+
* ⭐ Par agent, et non « le » jeton : rien ne garantit qu'ils portent le même.
|
|
202
|
+
* Un agent servi il y a trois semaines a le sien, périmé, pendant qu'un autre
|
|
203
|
+
* vient d'être rafraîchi — et c'est précisément l'écart qu'on ne voit jamais,
|
|
204
|
+
* parce qu'il se manifeste par un `401` chez un seul outil.
|
|
205
|
+
*
|
|
206
|
+
* @param targets - agents détectés sur ce poste.
|
|
207
|
+
* @param projectRoot - racine du projet, pour résoudre leurs fichiers.
|
|
208
|
+
* @param nowSeconds - instant de référence, injecté pour le banc.
|
|
209
|
+
* @returns pour chaque agent, sa phrase d'état.
|
|
210
|
+
*/
|
|
211
|
+
function agentTokenStates(targets, projectRoot, nowSeconds) {
|
|
212
|
+
const states = /* @__PURE__ */ new Map();
|
|
213
|
+
for (const target of targets) {
|
|
214
|
+
const file = path.resolve(agentRoot(target, { projectRoot }), target.file);
|
|
215
|
+
let content = "";
|
|
216
|
+
try {
|
|
217
|
+
content = readFileSync(file, "utf8");
|
|
218
|
+
} catch (e) {
|
|
219
|
+
if (e.code !== "ENOENT") {
|
|
220
|
+
states.set(target.key, "état du jeton illisible");
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const token = litVariable(target.forme, content, MCP_TOKEN_ENV);
|
|
225
|
+
states.set(target.key, token === null ? "pas de jeton posé" : renderTokenState(tokenState(token, nowSeconds)));
|
|
226
|
+
}
|
|
227
|
+
return states;
|
|
228
|
+
}
|
|
229
|
+
function planTokenChaining(request, context) {
|
|
230
|
+
if (request.auth !== true) return null;
|
|
231
|
+
if (request.dryRun || request.json) return null;
|
|
232
|
+
if (!context.isTTY) return null;
|
|
233
|
+
const argv = ["security:token", "--write"];
|
|
234
|
+
if (context.ttlMinutes !== void 0) argv.push("--ttl", String(context.ttlMinutes));
|
|
235
|
+
if (context.scopes !== void 0 && context.scopes.trim() !== "") argv.push("--scope", context.scopes);
|
|
236
|
+
return {
|
|
237
|
+
argv,
|
|
238
|
+
env: {
|
|
239
|
+
...context.env ?? process.env,
|
|
240
|
+
NODE_ENV: "development"
|
|
241
|
+
},
|
|
242
|
+
cwd: context.projectRoot
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Déclare (ou retire) la porte MCP chez chaque agent, **par SA propre CLI**.
|
|
247
|
+
*
|
|
248
|
+
* ⭐ La règle qui gouverne cette fonction : **on n'écrit pas le fichier de
|
|
249
|
+
* configuration d'un outil tiers.** Son format lui appartient, il change avec
|
|
250
|
+
* ses versions, et une écriture faite « à la main » se découvre le jour où
|
|
251
|
+
* l'agent ne voit plus rien — sans rien dire. Sa CLI, elle, connaît son format
|
|
252
|
+
* et le suit.
|
|
253
|
+
*
|
|
254
|
+
* La sortie des CLI est CAPTURÉE plutôt qu'héritée, et n'est montrée qu'en cas
|
|
255
|
+
* d'échec : l'une d'elles écrit des avertissements d'interpréteur sur la sortie
|
|
256
|
+
* d'erreur à chaque appel, et les laisser passer ferait lire un succès comme
|
|
257
|
+
* une panne.
|
|
258
|
+
*
|
|
259
|
+
* @param targets - agents à servir
|
|
260
|
+
* @param ctx - l'URL de la porte, et le sens du geste
|
|
261
|
+
* @returns un verdict par agent — jamais une exception : un agent qui refuse
|
|
262
|
+
* n'empêche pas de servir les suivants
|
|
263
|
+
*/
|
|
264
|
+
async function declareToAgents(targets, ctx) {
|
|
265
|
+
const { spawnSync } = await import("node:child_process");
|
|
266
|
+
const { mkdirSync } = await import("node:fs");
|
|
267
|
+
const results = [];
|
|
268
|
+
for (const target of targets) {
|
|
269
|
+
const plan = planAgentDeclaration(target, {
|
|
270
|
+
url: ctx.url,
|
|
271
|
+
tokenEnv: MCP_TOKEN_ENV
|
|
272
|
+
}, ctx.remove);
|
|
273
|
+
if (plan.voie !== "cli") {
|
|
274
|
+
results.push({
|
|
275
|
+
target,
|
|
276
|
+
state: "fichier-projet",
|
|
277
|
+
command: ""
|
|
278
|
+
});
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const command = renderPlanShell(plan);
|
|
282
|
+
const projectRoot = target.home ? path.join(ctx.projectRoot, target.marker) : void 0;
|
|
283
|
+
const inProject = projectRoot !== void 0 && !ctx.global;
|
|
284
|
+
if (inProject && projectRoot) try {
|
|
285
|
+
mkdirSync(projectRoot, { recursive: true });
|
|
286
|
+
} catch {}
|
|
287
|
+
const envAgent = inProject && projectRoot && target.home ? {
|
|
288
|
+
...process.env,
|
|
289
|
+
[target.home]: projectRoot
|
|
290
|
+
} : process.env;
|
|
291
|
+
const argvListBefore = target.argvList?.();
|
|
292
|
+
let replacesOtherUrl = false;
|
|
293
|
+
if (argvListBefore && !ctx.remove) {
|
|
294
|
+
const before = spawnSync(plan.bin, argvListBefore, {
|
|
295
|
+
encoding: "utf8",
|
|
296
|
+
shell: false,
|
|
297
|
+
cwd: ctx.projectRoot,
|
|
298
|
+
env: envAgent
|
|
299
|
+
});
|
|
300
|
+
const vu = `${before.stdout ?? ""}${before.stderr ?? ""}`;
|
|
301
|
+
replacesOtherUrl = !before.error && before.status === 0 && vu.includes("nodefony") && !vu.includes(ctx.url);
|
|
302
|
+
}
|
|
303
|
+
const r = spawnSync(plan.bin, plan.argv, {
|
|
304
|
+
encoding: "utf8",
|
|
305
|
+
shell: false,
|
|
306
|
+
cwd: ctx.projectRoot,
|
|
307
|
+
env: envAgent
|
|
308
|
+
});
|
|
309
|
+
if (r.error && r.error.code === "ENOENT") {
|
|
310
|
+
results.push({
|
|
311
|
+
target,
|
|
312
|
+
state: "cli-absente",
|
|
313
|
+
command
|
|
314
|
+
});
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (r.status !== 0) {
|
|
318
|
+
results.push({
|
|
319
|
+
target,
|
|
320
|
+
state: "echec",
|
|
321
|
+
command,
|
|
322
|
+
detail: `${r.stderr ?? ""}${r.stdout ?? ""}`.trim().split("\n").slice(-6).join("\n")
|
|
323
|
+
});
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
const argvList = target.argvList?.();
|
|
327
|
+
if (argvList) {
|
|
328
|
+
const vue = spawnSync(plan.bin, argvList, {
|
|
329
|
+
encoding: "utf8",
|
|
330
|
+
shell: false,
|
|
331
|
+
cwd: ctx.projectRoot,
|
|
332
|
+
env: envAgent
|
|
333
|
+
});
|
|
334
|
+
const output = `${vue.stdout ?? ""}${vue.stderr ?? ""}`;
|
|
335
|
+
const lisible = !vue.error && vue.status === 0;
|
|
336
|
+
const present = output.includes(MCP_SERVER_KEY);
|
|
337
|
+
if (lisible && present === ctx.remove) {
|
|
338
|
+
results.push({
|
|
339
|
+
target,
|
|
340
|
+
state: "sans-effet",
|
|
341
|
+
command,
|
|
342
|
+
detail: output.trim().split("\n").slice(-4).join("\n")
|
|
343
|
+
});
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
results.push({
|
|
348
|
+
target,
|
|
349
|
+
inProject,
|
|
350
|
+
state: ctx.remove ? "retire" : "declare",
|
|
351
|
+
command,
|
|
352
|
+
...replacesOtherUrl ? { replacesOtherUrl: true } : {}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return results;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Rend le compte rendu des déclarations.
|
|
359
|
+
*
|
|
360
|
+
* PURE : c'est le texte que l'utilisateur lit, et il doit pouvoir être éprouvé
|
|
361
|
+
* sans lancer la moindre CLI.
|
|
362
|
+
*
|
|
363
|
+
* @param results - un verdict par agent
|
|
364
|
+
* @param remove - le sens du geste, pour accorder les phrases
|
|
365
|
+
*/
|
|
366
|
+
function renderDeclarations(results, remove) {
|
|
367
|
+
if (results.length === 0) return "\n Aucun agent : tu codes seul, c'est un choix.\n Quand tu voudras : nodefony ai:mcp --agent all\n";
|
|
368
|
+
let out = "\n";
|
|
369
|
+
for (const r of results) if (r.state === "fichier-projet") out += ` • ${r.target.name} — rien à faire : il lit ${MCP_CONFIG_FILE}, ${remove ? "retiré par --no-auth ou à la main" : "déjà à jour"}.\n`;
|
|
370
|
+
else if (r.state === "declare") {
|
|
371
|
+
const scope = r.inProject || r.target.scope === "projet" ? "dans ce projet" : "GLOBALE — elle vaut pour tous tes projets";
|
|
372
|
+
out += ` ✓ ${r.target.name} — porte déclarée, ${scope}. RELANCE-le.\n`;
|
|
373
|
+
if (r.state === "declare" && r.replacesOtherUrl) out += ` ⚠ elle a REMPLACÉ une déclaration « ${MCP_SERVER_KEY} » qui visait ailleurs — une autre application ?\n`;
|
|
374
|
+
if (r.target.noteAfter) out += ` ⓘ ${r.target.noteAfter}\n`;
|
|
375
|
+
} else if (r.state === "retire") out += ` ✓ ${r.target.name} — déclaration retirée.\n`;
|
|
376
|
+
else if (r.state === "sans-effet") out += ` ⚠ ${r.target.name} — sa CLI a répondu « ok », mais la porte est ${remove ? "TOUJOURS déclarée" : "INTROUVABLE"} chez lui.\n Ce qu'elle liste :\n${(r.detail ?? "").split("\n").map((l) => ` ${l}`).join("\n")}\n La commande jouée : ${r.command}\n Son outil ne l'a pas honorée — reprends depuis SA configuration.\n`;
|
|
377
|
+
else if (r.state === "cli-absente") out += ` ⚠ ${r.target.name} — sa commande « ${r.target.bin} » est introuvable ici.\n Le jour où tu l'installes :\n ${r.command}\n`;
|
|
378
|
+
else out += ` ⚠ ${r.target.name} — sa CLI a refusé :\n${(r.detail ?? "").split("\n").map((l) => ` ${l}`).join("\n")}\n La commande jouée était :\n ${r.command}\n`;
|
|
379
|
+
return out;
|
|
380
|
+
}
|
|
381
|
+
/** Lit le `.mcp.json` du projet, ou `null` s'il est absent ou illisible. */
|
|
382
|
+
function readMcpConfig(file) {
|
|
383
|
+
if (!existsSync(file)) return null;
|
|
384
|
+
try {
|
|
385
|
+
const parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
386
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
387
|
+
} catch {
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Point d'entrée de la commande.
|
|
393
|
+
*
|
|
394
|
+
* @param argv - `process.argv` complet
|
|
395
|
+
* @returns code de sortie sémantique (`OK`, `USAGE`, `NOINPUT` hors projet,
|
|
396
|
+
* `CANTCREAT` si l'écriture échoue)
|
|
397
|
+
*/
|
|
398
|
+
async function runAiMcpCommand(argv) {
|
|
399
|
+
const parsed = parseAiMcpArgv(argv);
|
|
400
|
+
if ("error" in parsed) return printUsageError(PAGE, parsed.error);
|
|
401
|
+
if (parsed.help) return printUsage(PAGE);
|
|
402
|
+
const projectRoot = findProjectRoot(parsed.cwd);
|
|
403
|
+
if (projectRoot === null) {
|
|
404
|
+
process.stderr.write(`ai:mcp: aucun projet Nodefony ici (pas de nodefony.config.ts en remontant depuis ${parsed.cwd}).\n`);
|
|
405
|
+
return 66;
|
|
406
|
+
}
|
|
407
|
+
if (parsed.auth === null && !parsed.dryRun && !parsed.json && parsed.url === null && process.stdin.isTTY) {
|
|
408
|
+
const alreadyAuth = Boolean(readMcpConfig(path.join(projectRoot, MCP_CONFIG_FILE))?.mcpServers?.["nodefony"]?.headers?.Authorization);
|
|
409
|
+
const { confirm } = await chargePrompts();
|
|
410
|
+
parsed.auth = await confirm({
|
|
411
|
+
message: `Mode authentifié ? (en-tête \${${MCP_TOKEN_ENV}}${alreadyAuth ? " — répondre non le RETIRE" : ""})`,
|
|
412
|
+
default: alreadyAuth
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
const origin = parsed.url ?? guessOrigin(projectRoot);
|
|
416
|
+
const mcpUrl = buildMcpUrl(origin, MCP_PATH);
|
|
417
|
+
const file = path.join(projectRoot, MCP_CONFIG_FILE);
|
|
418
|
+
const plan = planMcpConfig(readMcpConfig(file), mcpUrl, parsed.auth === null ? {} : { auth: parsed.auth });
|
|
419
|
+
if (!parsed.dryRun && plan.action !== "inchange") try {
|
|
420
|
+
writeFileSync(file, `${JSON.stringify(plan.document, null, 2)}\n`);
|
|
421
|
+
} catch (error) {
|
|
422
|
+
process.stderr.write(`ai:mcp: écriture impossible (${error.message}).\n`);
|
|
423
|
+
return 73;
|
|
424
|
+
}
|
|
425
|
+
const requests = requestedAgents(parsed.agent);
|
|
426
|
+
if (requests instanceof Error) {
|
|
427
|
+
process.stderr.write(`ai:mcp: ${requests.message}\n`);
|
|
428
|
+
return 64;
|
|
429
|
+
}
|
|
430
|
+
let targets = requests ?? [];
|
|
431
|
+
if (requests === void 0 && !parsed.dryRun && !parsed.json) {
|
|
432
|
+
const detected = agentsPresents({
|
|
433
|
+
projectRoot,
|
|
434
|
+
exists: existsSync
|
|
435
|
+
});
|
|
436
|
+
const presents = detected.filter((c) => c.declaration === "cli");
|
|
437
|
+
const byFile = detected.filter((c) => c.declaration === "fichier-projet");
|
|
438
|
+
if (detected.length > 0 && process.stdin.isTTY) {
|
|
439
|
+
const { checkbox } = await chargePrompts();
|
|
440
|
+
const chosen = await checkbox({
|
|
441
|
+
message: `Déclarer la porte chez quels agents ? (espace pour cocher — ENTRÉE sans rien cocher : aucun, je code seul)`,
|
|
442
|
+
choices: [...byFile.map((c) => ({
|
|
443
|
+
name: `${c.name} — servi par le ${path.basename(file)} de ce projet`,
|
|
444
|
+
value: c.key,
|
|
445
|
+
checked: true,
|
|
446
|
+
disabled: "déjà à jour, rien à lancer"
|
|
447
|
+
})), ...presents.map((c) => ({
|
|
448
|
+
name: `${c.name} — ${c.bin} mcp ${parsed.remove ? "remove" : "add"}`,
|
|
449
|
+
value: c.key,
|
|
450
|
+
checked: false
|
|
451
|
+
}))]
|
|
452
|
+
});
|
|
453
|
+
targets = presents.filter((c) => chosen.includes(c.key));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (parsed.json) {
|
|
457
|
+
process.stdout.write(`${JSON.stringify({
|
|
458
|
+
file,
|
|
459
|
+
...plan,
|
|
460
|
+
dryRun: parsed.dryRun,
|
|
461
|
+
agents: targets.map((c) => c.key)
|
|
462
|
+
}, null, 2)}\n`);
|
|
463
|
+
return 0;
|
|
464
|
+
}
|
|
465
|
+
process.stdout.write(renderMcpPlan(plan, file, parsed.dryRun));
|
|
466
|
+
if (parsed.dryRun) {
|
|
467
|
+
if (targets.length > 0) process.stdout.write(`\n À lancer (non joué — --dry-run) :\n` + targets.map((c) => {
|
|
468
|
+
const p = planAgentDeclaration(c, {
|
|
469
|
+
url: mcpUrl,
|
|
470
|
+
tokenEnv: MCP_TOKEN_ENV
|
|
471
|
+
}, parsed.remove);
|
|
472
|
+
return p.voie === "cli" ? ` ${renderPlanShell(p)}\n` : ` (${c.name} : rien — il lit ${MCP_CONFIG_FILE})\n`;
|
|
473
|
+
}).join(""));
|
|
474
|
+
} else if (requests !== void 0 || targets.length > 0) {
|
|
475
|
+
process.stdout.write(renderDeclarations(await declareToAgents(targets, {
|
|
476
|
+
url: mcpUrl,
|
|
477
|
+
remove: parsed.remove,
|
|
478
|
+
projectRoot,
|
|
479
|
+
global: parsed.global
|
|
480
|
+
}), parsed.remove));
|
|
481
|
+
if (!parsed.remove) {
|
|
482
|
+
const poses = writeAgentPointers(projectRoot, targets.map((c) => c.key), path.basename(projectRoot));
|
|
483
|
+
if (poses.length > 0) process.stdout.write(`\n instructions : ${poses.join(", ")} — pointeur(s) vers AGENTS.md\n`);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
const chainage = planTokenChaining(parsed, {
|
|
487
|
+
projectRoot,
|
|
488
|
+
isTTY: Boolean(process.stdin.isTTY)
|
|
489
|
+
});
|
|
490
|
+
if (chainage) {
|
|
491
|
+
const { confirm, select } = await chargePrompts();
|
|
492
|
+
const detectedForToken = agentsPresents({
|
|
493
|
+
projectRoot,
|
|
494
|
+
exists: existsSync
|
|
495
|
+
});
|
|
496
|
+
const states = agentTokenStates(detectedForToken, projectRoot, Math.floor(Date.now() / 1e3));
|
|
497
|
+
for (const target of detectedForToken) process.stdout.write(` ${target.name} : ${states.get(target.key)}\n`);
|
|
498
|
+
const perime = detectedForToken.length === 0 || [...states.values()].some((phrase) => phrase.includes("EXPIRÉ") || phrase.includes("pas de jeton"));
|
|
499
|
+
const now = await confirm({
|
|
500
|
+
message: `${perime ? "Obtenir" : "Réémettre"} un jeton maintenant (${MCP_TOKEN_ENV}) ?`,
|
|
501
|
+
default: perime
|
|
502
|
+
});
|
|
503
|
+
const bin = process.argv[1];
|
|
504
|
+
if (now && bin) {
|
|
505
|
+
const withDuration = planTokenChaining(parsed, {
|
|
506
|
+
projectRoot,
|
|
507
|
+
isTTY: true,
|
|
508
|
+
ttlMinutes: await select({
|
|
509
|
+
message: "Durée de validité du jeton",
|
|
510
|
+
default: 10080,
|
|
511
|
+
choices: [
|
|
512
|
+
{
|
|
513
|
+
name: "7 jours (recommandé pour un agent local)",
|
|
514
|
+
value: 10080
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
name: "30 jours (maximum)",
|
|
518
|
+
value: 43200
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
name: "12 heures",
|
|
522
|
+
value: 720
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
name: "15 minutes (le défaut de la configuration)",
|
|
526
|
+
value: 15
|
|
527
|
+
}
|
|
528
|
+
]
|
|
529
|
+
}),
|
|
530
|
+
scopes: await select({
|
|
531
|
+
message: "Ce que le jeton autorise",
|
|
532
|
+
default: ADMIN_SCOPE_READ,
|
|
533
|
+
choices: [{
|
|
534
|
+
name: `Lecture seule (${ADMIN_SCOPE_READ}) — recommandé`,
|
|
535
|
+
value: ADMIN_SCOPE_READ
|
|
536
|
+
}, {
|
|
537
|
+
name: `Lecture et mutations (${ADMIN_SCOPE_READ} ${ADMIN_SCOPE_WRITE})`,
|
|
538
|
+
value: `${ADMIN_SCOPE_READ} ${ADMIN_SCOPE_WRITE}`
|
|
539
|
+
}]
|
|
540
|
+
})
|
|
541
|
+
});
|
|
542
|
+
const { spawnSync } = await import("node:child_process");
|
|
543
|
+
spawnSync(process.execPath, [bin, ...(withDuration ?? chainage).argv], {
|
|
544
|
+
stdio: "inherit",
|
|
545
|
+
cwd: chainage.cwd,
|
|
546
|
+
env: chainage.env
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return 0;
|
|
551
|
+
}
|
|
552
|
+
//#endregion
|
|
553
|
+
export { agentTokenStates, declareToAgents, guessOrigin, parseAiMcpArgv, planTokenChaining, readMcpConfig, renderDeclarations, renderTokenState, runAiMcpCommand, tokenState };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { stripTrailingSlashes } from "../Tools.js";
|
|
2
|
+
//#region src/cli/aiMcpReport.ts
|
|
3
|
+
/**
|
|
4
|
+
* Composition PURE de la configuration MCP d'un projet — `.mcp.json`.
|
|
5
|
+
*
|
|
6
|
+
* Séparée de l'écriture pour la même raison que `env`, `card` et `ai:sync` :
|
|
7
|
+
* ce qui décide (que faut-il écrire ? est-ce déjà bon ?) s'éprouve sans toucher
|
|
8
|
+
* au disque, donc se teste vraiment.
|
|
9
|
+
*
|
|
10
|
+
* ## Ce que ce fichier NE fait pas
|
|
11
|
+
*
|
|
12
|
+
* Il ne lance aucun serveur et n'en décrit aucun : le serveur MCP de Nodefony
|
|
13
|
+
* est une **route** de l'application (`POST /nodefony/mcp`), servie par le
|
|
14
|
+
* module `@nodefony/devkit`. Ce fichier ne produit que le **câblage** — le
|
|
15
|
+
* papier qui dit à un agent où taper.
|
|
16
|
+
*/
|
|
17
|
+
/** Nom de la clé sous laquelle notre serveur est déclaré. */
|
|
18
|
+
const MCP_SERVER_KEY = "nodefony";
|
|
19
|
+
/** Fichier de configuration, à la racine du projet. */
|
|
20
|
+
const MCP_CONFIG_FILE = ".mcp.json";
|
|
21
|
+
/**
|
|
22
|
+
* Nom de la variable d'environnement qui porte le jeton de la porte MCP.
|
|
23
|
+
*
|
|
24
|
+
* 🔴 C'est la VARIABLE qui s'écrit dans `.mcp.json`, jamais le jeton : ce
|
|
25
|
+
* fichier est un fichier de projet, suivi par git. Les clients MCP développent
|
|
26
|
+
* `${VAR}` à la lecture, donc le porteur reste dans l'environnement du poste et
|
|
27
|
+
* ne peut pas partir dans un commit.
|
|
28
|
+
*/
|
|
29
|
+
const MCP_TOKEN_ENV = "NF_MCP_TOKEN";
|
|
30
|
+
/**
|
|
31
|
+
* Compose l'URL de l'endpoint MCP.
|
|
32
|
+
*
|
|
33
|
+
* @param origin - origine du serveur (`http://localhost:5151`)
|
|
34
|
+
* @param endpointPath - chemin de l'endpoint, tel que le module le monte
|
|
35
|
+
*/
|
|
36
|
+
function buildMcpUrl(origin, endpointPath) {
|
|
37
|
+
return `${stripTrailingSlashes(origin)}${endpointPath}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Décide ce qu'il faut écrire dans `.mcp.json`.
|
|
41
|
+
*
|
|
42
|
+
* ⭐ **Le document existant est PRÉSERVÉ**, et pas seulement par politesse :
|
|
43
|
+
* un projet y déclare ses autres serveurs MCP, et une commande de câblage qui
|
|
44
|
+
* les emporterait serait une commande qu'on n'ose plus lancer. Seule la clé
|
|
45
|
+
* `nodefony` est posée ou mise à jour.
|
|
46
|
+
*
|
|
47
|
+
* L'idempotence est au sens FORT : une URL déjà correcte rend `inchange`, donc
|
|
48
|
+
* l'appelant n'écrit pas — l'horodatage du fichier ne bouge pas, et l'arbre
|
|
49
|
+
* reste propre.
|
|
50
|
+
*
|
|
51
|
+
* @param existing - document déjà présent, ou `null`
|
|
52
|
+
* @param url - URL de l'endpoint à déclarer
|
|
53
|
+
*/
|
|
54
|
+
function planMcpConfig(existing, url, options = {}) {
|
|
55
|
+
const base = existing ? {
|
|
56
|
+
...existing,
|
|
57
|
+
mcpServers: { ...existing.mcpServers }
|
|
58
|
+
} : { mcpServers: {} };
|
|
59
|
+
const previous = base.mcpServers[MCP_SERVER_KEY];
|
|
60
|
+
const auth = options.auth === true ? true : options.auth === false ? false : Boolean(previous?.headers?.Authorization);
|
|
61
|
+
const entry = auth ? {
|
|
62
|
+
type: "http",
|
|
63
|
+
url,
|
|
64
|
+
headers: { Authorization: `Bearer \${${MCP_TOKEN_ENV}}` }
|
|
65
|
+
} : {
|
|
66
|
+
type: "http",
|
|
67
|
+
url
|
|
68
|
+
};
|
|
69
|
+
base.mcpServers[MCP_SERVER_KEY] = entry;
|
|
70
|
+
const authRemoved = Boolean(previous?.headers?.Authorization) && !entry.headers?.Authorization;
|
|
71
|
+
if (!previous) return {
|
|
72
|
+
action: "pose",
|
|
73
|
+
document: base,
|
|
74
|
+
url,
|
|
75
|
+
auth
|
|
76
|
+
};
|
|
77
|
+
const memeAuth = (previous.headers?.Authorization ?? null) === (entry.headers?.Authorization ?? null);
|
|
78
|
+
if (previous.url === url && previous.type === "http" && memeAuth) return {
|
|
79
|
+
action: "inchange",
|
|
80
|
+
document: base,
|
|
81
|
+
url,
|
|
82
|
+
auth
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
action: "remplace",
|
|
86
|
+
document: base,
|
|
87
|
+
url,
|
|
88
|
+
auth,
|
|
89
|
+
previousUrl: previous.url,
|
|
90
|
+
...authRemoved ? { authRemoved: true } : {}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* URL des métadonnées de la porte protégée (RFC 9728) : le chemin bien connu
|
|
95
|
+
* s'INSÈRE entre l'hôte et le chemin de la ressource, il ne s'y ajoute pas.
|
|
96
|
+
*
|
|
97
|
+
* @param url - URL de l'endpoint MCP
|
|
98
|
+
* @returns l'URL du document de métadonnées
|
|
99
|
+
*/
|
|
100
|
+
function metadataUrlOf(url) {
|
|
101
|
+
try {
|
|
102
|
+
const u = new URL(url);
|
|
103
|
+
return `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;
|
|
104
|
+
} catch {
|
|
105
|
+
return `/.well-known/oauth-protected-resource`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Rend le plan pour un lecteur humain.
|
|
110
|
+
*
|
|
111
|
+
* Dit surtout **ce qui reste à faire** : écrire le fichier ne branche rien tant
|
|
112
|
+
* que l'application ne tourne pas, et un agent déjà lancé ne relit pas sa
|
|
113
|
+
* configuration. Taire ces deux conditions produirait le pire des retours — un
|
|
114
|
+
* succès annoncé, suivi d'un outil introuvable.
|
|
115
|
+
*/
|
|
116
|
+
function renderMcpPlan(plan, file, dryRun) {
|
|
117
|
+
const verbe = plan.action === "pose" ? "posé" : plan.action === "remplace" ? "mis à jour" : "déjà à jour";
|
|
118
|
+
const lines = [dryRun ? `${file} — ${plan.action} (simulation, rien n'est écrit)` : `${file} — ${verbe}`, ` serveur « ${MCP_SERVER_KEY} » → ${plan.url}`];
|
|
119
|
+
if (plan.previousUrl && plan.previousUrl !== plan.url) lines.push(` (remplaçait ${plan.previousUrl})`);
|
|
120
|
+
if (plan.authRemoved) lines.push(` ⚠ l'en-tête Authorization a été RETIRÉ — la porte est redevenue anonyme.`, ` (le remettre : nodefony ai:mcp --auth)`);
|
|
121
|
+
lines.push("", "Pour que ça réponde :", " 1. l'application doit TOURNER (npm run dev) — le serveur MCP est une de ses routes ;", " 2. redémarre ton agent, il ne relit pas sa configuration en cours de route.");
|
|
122
|
+
if (plan.auth === true) {
|
|
123
|
+
const metadata = metadataUrlOf(plan.url);
|
|
124
|
+
lines.push("", `Mode AUTHENTIFIÉ — l'en-tête envoie \${${MCP_TOKEN_ENV}}, jamais un jeton écrit ici.`, ` 1. la porte publie où prendre un jeton : curl ${metadata}`, " (champ `authorization_servers` — RFC 9728) ;", " 2. obtiens-en un, sans serveur ni mot de passe — l'application le SIGNE :", ` nodefony security:token --write → pose NF_MCP_TOKEN chez tes agents`, " nodefony security:token (l'affiche, pour un export manuel)", " Elle vise l'audience de la porte d'elle-même (RFC 8707) : un jeton", " d'audience différente serait refusé, à juste titre ;", ` 3. ou exporte-le à la main : export ${MCP_TOKEN_ENV}=<access_token>`, " 4. un jeton d'accès EXPIRE — pose une durée qui tienne la journée :", " nodefony security:token --write --ttl 10080 (7 jours)", "", "Sans jeton, la porte sert quand même ses outils publics — l'authentification", "ajoute les outils réservés, elle n'est pas un péage.");
|
|
125
|
+
}
|
|
126
|
+
return `${lines.join("\n")}\n`;
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { MCP_CONFIG_FILE, MCP_SERVER_KEY, MCP_TOKEN_ENV, buildMcpUrl, metadataUrlOf, planMcpConfig, renderMcpPlan };
|