threadforge 0.1.1 → 0.2.1

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 (358) hide show
  1. package/README.md +52 -20
  2. package/bin/forge.js +2 -1058
  3. package/bin/host-commands.d.ts +2 -0
  4. package/bin/host-commands.d.ts.map +1 -0
  5. package/bin/host-commands.js +7 -8
  6. package/bin/platform-commands.d.ts +2 -0
  7. package/bin/platform-commands.d.ts.map +1 -0
  8. package/bin/platform-commands.js +118 -36
  9. package/dist/cli/base-command.d.ts +12 -0
  10. package/dist/cli/base-command.d.ts.map +1 -0
  11. package/dist/cli/base-command.js +25 -0
  12. package/dist/cli/base-command.js.map +1 -0
  13. package/dist/cli/commands/build.d.ts +10 -0
  14. package/dist/cli/commands/build.d.ts.map +1 -0
  15. package/dist/cli/commands/build.js +110 -0
  16. package/dist/cli/commands/build.js.map +1 -0
  17. package/dist/cli/commands/deploy.d.ts +12 -0
  18. package/dist/cli/commands/deploy.d.ts.map +1 -0
  19. package/dist/cli/commands/deploy.js +143 -0
  20. package/dist/cli/commands/deploy.js.map +1 -0
  21. package/dist/cli/commands/dev.d.ts +10 -0
  22. package/dist/cli/commands/dev.d.ts.map +1 -0
  23. package/dist/cli/commands/dev.js +138 -0
  24. package/dist/cli/commands/dev.js.map +1 -0
  25. package/dist/cli/commands/generate.d.ts +10 -0
  26. package/dist/cli/commands/generate.d.ts.map +1 -0
  27. package/dist/cli/commands/generate.js +76 -0
  28. package/dist/cli/commands/generate.js.map +1 -0
  29. package/dist/cli/commands/host.d.ts +8 -0
  30. package/dist/cli/commands/host.d.ts.map +1 -0
  31. package/dist/cli/commands/host.js +20 -0
  32. package/dist/cli/commands/host.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +16 -0
  34. package/dist/cli/commands/init.d.ts.map +1 -0
  35. package/dist/cli/commands/init.js +246 -0
  36. package/dist/cli/commands/init.js.map +1 -0
  37. package/dist/cli/commands/platform.d.ts +8 -0
  38. package/dist/cli/commands/platform.d.ts.map +1 -0
  39. package/dist/cli/commands/platform.js +20 -0
  40. package/dist/cli/commands/platform.js.map +1 -0
  41. package/dist/cli/commands/restart.d.ts +8 -0
  42. package/dist/cli/commands/restart.d.ts.map +1 -0
  43. package/dist/cli/commands/restart.js +13 -0
  44. package/dist/cli/commands/restart.js.map +1 -0
  45. package/dist/cli/commands/scaffold/frontend.d.ts +10 -0
  46. package/dist/cli/commands/scaffold/frontend.d.ts.map +1 -0
  47. package/dist/cli/commands/scaffold/frontend.js +130 -0
  48. package/dist/cli/commands/scaffold/frontend.js.map +1 -0
  49. package/dist/cli/commands/scaffold/react.d.ts +7 -0
  50. package/dist/cli/commands/scaffold/react.d.ts.map +1 -0
  51. package/dist/cli/commands/scaffold/react.js +12 -0
  52. package/dist/cli/commands/scaffold/react.js.map +1 -0
  53. package/dist/cli/commands/scale.d.ts +8 -0
  54. package/dist/cli/commands/scale.d.ts.map +1 -0
  55. package/dist/cli/commands/scale.js +13 -0
  56. package/dist/cli/commands/scale.js.map +1 -0
  57. package/dist/cli/commands/start.d.ts +10 -0
  58. package/dist/cli/commands/start.d.ts.map +1 -0
  59. package/dist/cli/commands/start.js +71 -0
  60. package/dist/cli/commands/start.js.map +1 -0
  61. package/dist/cli/commands/status.d.ts +11 -0
  62. package/dist/cli/commands/status.d.ts.map +1 -0
  63. package/dist/cli/commands/status.js +60 -0
  64. package/dist/cli/commands/status.js.map +1 -0
  65. package/dist/cli/commands/stop.d.ts +10 -0
  66. package/dist/cli/commands/stop.d.ts.map +1 -0
  67. package/dist/cli/commands/stop.js +89 -0
  68. package/dist/cli/commands/stop.js.map +1 -0
  69. package/dist/cli/util/config-discovery.d.ts +8 -0
  70. package/dist/cli/util/config-discovery.d.ts.map +1 -0
  71. package/dist/cli/util/config-discovery.js +70 -0
  72. package/dist/cli/util/config-discovery.js.map +1 -0
  73. package/dist/cli/util/config-patcher.d.ts +17 -0
  74. package/dist/cli/util/config-patcher.d.ts.map +1 -0
  75. package/dist/cli/util/config-patcher.js +439 -0
  76. package/dist/cli/util/config-patcher.js.map +1 -0
  77. package/dist/cli/util/frontend-dev.d.ts +8 -0
  78. package/dist/cli/util/frontend-dev.d.ts.map +1 -0
  79. package/dist/cli/util/frontend-dev.js +117 -0
  80. package/dist/cli/util/frontend-dev.js.map +1 -0
  81. package/dist/cli/util/process.d.ts +5 -0
  82. package/dist/cli/util/process.d.ts.map +1 -0
  83. package/dist/cli/util/process.js +17 -0
  84. package/dist/cli/util/process.js.map +1 -0
  85. package/dist/cli/util/templates.d.ts +10 -0
  86. package/dist/cli/util/templates.d.ts.map +1 -0
  87. package/dist/cli/util/templates.js +157 -0
  88. package/dist/cli/util/templates.js.map +1 -0
  89. package/dist/core/AlertSink.d.ts +83 -0
  90. package/dist/core/AlertSink.d.ts.map +1 -0
  91. package/dist/core/AlertSink.js +126 -0
  92. package/dist/core/AlertSink.js.map +1 -0
  93. package/dist/core/DirectMessageBus.d.ts +88 -0
  94. package/dist/core/DirectMessageBus.d.ts.map +1 -0
  95. package/dist/core/DirectMessageBus.js +352 -0
  96. package/dist/core/DirectMessageBus.js.map +1 -0
  97. package/dist/core/EndpointResolver.d.ts +111 -0
  98. package/dist/core/EndpointResolver.d.ts.map +1 -0
  99. package/dist/core/EndpointResolver.js +336 -0
  100. package/dist/core/EndpointResolver.js.map +1 -0
  101. package/dist/core/ForgeContext.d.ts +221 -0
  102. package/dist/core/ForgeContext.d.ts.map +1 -0
  103. package/dist/core/ForgeContext.js +1169 -0
  104. package/dist/core/ForgeContext.js.map +1 -0
  105. package/dist/core/ForgeEndpoints.d.ts +71 -0
  106. package/dist/core/ForgeEndpoints.d.ts.map +1 -0
  107. package/dist/core/ForgeEndpoints.js +442 -0
  108. package/dist/core/ForgeEndpoints.js.map +1 -0
  109. package/dist/core/ForgeHost.d.ts +82 -0
  110. package/dist/core/ForgeHost.d.ts.map +1 -0
  111. package/dist/core/ForgeHost.js +107 -0
  112. package/dist/core/ForgeHost.js.map +1 -0
  113. package/dist/core/ForgePlatform.d.ts +96 -0
  114. package/dist/core/ForgePlatform.d.ts.map +1 -0
  115. package/dist/core/ForgePlatform.js +136 -0
  116. package/dist/core/ForgePlatform.js.map +1 -0
  117. package/dist/core/ForgeWebSocket.d.ts +56 -0
  118. package/dist/core/ForgeWebSocket.d.ts.map +1 -0
  119. package/dist/core/ForgeWebSocket.js +415 -0
  120. package/dist/core/ForgeWebSocket.js.map +1 -0
  121. package/dist/core/Ingress.d.ts +329 -0
  122. package/dist/core/Ingress.d.ts.map +1 -0
  123. package/dist/core/Ingress.js +694 -0
  124. package/dist/core/Ingress.js.map +1 -0
  125. package/dist/core/Interceptors.d.ts +134 -0
  126. package/dist/core/Interceptors.d.ts.map +1 -0
  127. package/dist/core/Interceptors.js +416 -0
  128. package/dist/core/Interceptors.js.map +1 -0
  129. package/dist/core/Logger.d.ts +20 -0
  130. package/dist/core/Logger.d.ts.map +1 -0
  131. package/dist/core/Logger.js +77 -0
  132. package/dist/core/Logger.js.map +1 -0
  133. package/dist/core/MessageBus.d.ts +15 -0
  134. package/dist/core/MessageBus.d.ts.map +1 -0
  135. package/dist/core/MessageBus.js +18 -0
  136. package/dist/core/MessageBus.js.map +1 -0
  137. package/dist/core/Prometheus.d.ts +80 -0
  138. package/dist/core/Prometheus.d.ts.map +1 -0
  139. package/dist/core/Prometheus.js +332 -0
  140. package/dist/core/Prometheus.js.map +1 -0
  141. package/dist/core/RequestContext.d.ts +214 -0
  142. package/dist/core/RequestContext.d.ts.map +1 -0
  143. package/dist/core/RequestContext.js +556 -0
  144. package/dist/core/RequestContext.js.map +1 -0
  145. package/dist/core/Router.d.ts +45 -0
  146. package/dist/core/Router.d.ts.map +1 -0
  147. package/dist/core/Router.js +285 -0
  148. package/dist/core/Router.js.map +1 -0
  149. package/dist/core/RoutingStrategy.d.ts +116 -0
  150. package/dist/core/RoutingStrategy.d.ts.map +1 -0
  151. package/dist/core/RoutingStrategy.js +306 -0
  152. package/dist/core/RoutingStrategy.js.map +1 -0
  153. package/dist/core/RpcConfig.d.ts +72 -0
  154. package/dist/core/RpcConfig.d.ts.map +1 -0
  155. package/dist/core/RpcConfig.js +127 -0
  156. package/dist/core/RpcConfig.js.map +1 -0
  157. package/dist/core/SignatureCache.d.ts +81 -0
  158. package/dist/core/SignatureCache.d.ts.map +1 -0
  159. package/dist/core/SignatureCache.js +172 -0
  160. package/dist/core/SignatureCache.js.map +1 -0
  161. package/dist/core/StaticFileServer.d.ts +34 -0
  162. package/dist/core/StaticFileServer.d.ts.map +1 -0
  163. package/dist/core/StaticFileServer.js +497 -0
  164. package/dist/core/StaticFileServer.js.map +1 -0
  165. package/dist/core/Supervisor.d.ts +198 -0
  166. package/dist/core/Supervisor.d.ts.map +1 -0
  167. package/dist/core/Supervisor.js +1418 -0
  168. package/dist/core/Supervisor.js.map +1 -0
  169. package/dist/core/ThreadAllocator.d.ts +52 -0
  170. package/dist/core/ThreadAllocator.d.ts.map +1 -0
  171. package/dist/core/ThreadAllocator.js +174 -0
  172. package/dist/core/ThreadAllocator.js.map +1 -0
  173. package/dist/core/WorkerChannelManager.d.ts +130 -0
  174. package/dist/core/WorkerChannelManager.d.ts.map +1 -0
  175. package/dist/core/WorkerChannelManager.js +956 -0
  176. package/dist/core/WorkerChannelManager.js.map +1 -0
  177. package/dist/core/config-enums.d.ts +41 -0
  178. package/dist/core/config-enums.d.ts.map +1 -0
  179. package/dist/core/config-enums.js +59 -0
  180. package/dist/core/config-enums.js.map +1 -0
  181. package/dist/core/config.d.ts +159 -0
  182. package/dist/core/config.d.ts.map +1 -0
  183. package/dist/core/config.js +694 -0
  184. package/dist/core/config.js.map +1 -0
  185. package/dist/core/host-config.d.ts +146 -0
  186. package/dist/core/host-config.d.ts.map +1 -0
  187. package/dist/core/host-config.js +312 -0
  188. package/dist/core/host-config.js.map +1 -0
  189. package/dist/core/ipc-errors.d.ts +27 -0
  190. package/dist/core/ipc-errors.d.ts.map +1 -0
  191. package/dist/core/ipc-errors.js +36 -0
  192. package/dist/core/ipc-errors.js.map +1 -0
  193. package/dist/core/network-utils.d.ts +35 -0
  194. package/dist/core/network-utils.d.ts.map +1 -0
  195. package/dist/core/network-utils.js +145 -0
  196. package/dist/core/network-utils.js.map +1 -0
  197. package/dist/core/platform-config.d.ts +142 -0
  198. package/dist/core/platform-config.d.ts.map +1 -0
  199. package/dist/core/platform-config.js +299 -0
  200. package/dist/core/platform-config.js.map +1 -0
  201. package/dist/decorators/ServiceProxy.d.ts +175 -0
  202. package/dist/decorators/ServiceProxy.d.ts.map +1 -0
  203. package/dist/decorators/ServiceProxy.js +969 -0
  204. package/dist/decorators/ServiceProxy.js.map +1 -0
  205. package/dist/decorators/index.d.ts +146 -0
  206. package/dist/decorators/index.d.ts.map +1 -0
  207. package/dist/decorators/index.js +545 -0
  208. package/dist/decorators/index.js.map +1 -0
  209. package/dist/deploy/NginxGenerator.d.ts +165 -0
  210. package/dist/deploy/NginxGenerator.d.ts.map +1 -0
  211. package/dist/deploy/NginxGenerator.js +781 -0
  212. package/dist/deploy/NginxGenerator.js.map +1 -0
  213. package/dist/deploy/PlatformManifestGenerator.d.ts +43 -0
  214. package/dist/deploy/PlatformManifestGenerator.d.ts.map +1 -0
  215. package/dist/deploy/PlatformManifestGenerator.js +80 -0
  216. package/dist/deploy/PlatformManifestGenerator.js.map +1 -0
  217. package/dist/deploy/RouteManifestGenerator.d.ts +42 -0
  218. package/dist/deploy/RouteManifestGenerator.d.ts.map +1 -0
  219. package/dist/deploy/RouteManifestGenerator.js +105 -0
  220. package/dist/deploy/RouteManifestGenerator.js.map +1 -0
  221. package/dist/deploy/index.d.ts +210 -0
  222. package/dist/deploy/index.d.ts.map +1 -0
  223. package/dist/deploy/index.js +918 -0
  224. package/dist/deploy/index.js.map +1 -0
  225. package/dist/frontend/FrontendDevLifecycle.d.ts +26 -0
  226. package/dist/frontend/FrontendDevLifecycle.d.ts.map +1 -0
  227. package/dist/frontend/FrontendDevLifecycle.js +60 -0
  228. package/dist/frontend/FrontendDevLifecycle.js.map +1 -0
  229. package/dist/frontend/FrontendPluginOrchestrator.d.ts +64 -0
  230. package/dist/frontend/FrontendPluginOrchestrator.d.ts.map +1 -0
  231. package/dist/frontend/FrontendPluginOrchestrator.js +167 -0
  232. package/dist/frontend/FrontendPluginOrchestrator.js.map +1 -0
  233. package/dist/frontend/SiteResolver.d.ts +33 -0
  234. package/dist/frontend/SiteResolver.d.ts.map +1 -0
  235. package/dist/frontend/SiteResolver.js +53 -0
  236. package/dist/frontend/SiteResolver.js.map +1 -0
  237. package/dist/frontend/StaticMountRegistry.d.ts +36 -0
  238. package/dist/frontend/StaticMountRegistry.d.ts.map +1 -0
  239. package/dist/frontend/StaticMountRegistry.js +94 -0
  240. package/dist/frontend/StaticMountRegistry.js.map +1 -0
  241. package/dist/frontend/index.d.ts +7 -0
  242. package/dist/frontend/index.d.ts.map +1 -0
  243. package/{src → dist}/frontend/index.js +4 -2
  244. package/dist/frontend/index.js.map +1 -0
  245. package/dist/frontend/pathUtils.d.ts +8 -0
  246. package/dist/frontend/pathUtils.d.ts.map +1 -0
  247. package/dist/frontend/pathUtils.js +17 -0
  248. package/dist/frontend/pathUtils.js.map +1 -0
  249. package/dist/frontend/plugins/index.d.ts +2 -0
  250. package/dist/frontend/plugins/index.d.ts.map +1 -0
  251. package/{src → dist}/frontend/plugins/index.js +1 -1
  252. package/dist/frontend/plugins/index.js.map +1 -0
  253. package/dist/frontend/plugins/viteFrontend.d.ts +51 -0
  254. package/dist/frontend/plugins/viteFrontend.d.ts.map +1 -0
  255. package/dist/frontend/plugins/viteFrontend.js +134 -0
  256. package/dist/frontend/plugins/viteFrontend.js.map +1 -0
  257. package/dist/frontend/types.d.ts +25 -0
  258. package/dist/frontend/types.d.ts.map +1 -0
  259. package/dist/frontend/types.js +2 -0
  260. package/dist/frontend/types.js.map +1 -0
  261. package/dist/index.d.ts +17 -0
  262. package/dist/index.d.ts.map +1 -0
  263. package/dist/index.js +32 -0
  264. package/dist/index.js.map +1 -0
  265. package/dist/internals.d.ts +21 -0
  266. package/dist/internals.d.ts.map +1 -0
  267. package/{src → dist}/internals.js +12 -14
  268. package/dist/internals.js.map +1 -0
  269. package/dist/plugins/PluginManager.d.ts +209 -0
  270. package/dist/plugins/PluginManager.d.ts.map +1 -0
  271. package/dist/plugins/PluginManager.js +365 -0
  272. package/dist/plugins/PluginManager.js.map +1 -0
  273. package/dist/plugins/ScopedPostgres.d.ts +78 -0
  274. package/dist/plugins/ScopedPostgres.d.ts.map +1 -0
  275. package/dist/plugins/ScopedPostgres.js +190 -0
  276. package/dist/plugins/ScopedPostgres.js.map +1 -0
  277. package/dist/plugins/ScopedRedis.d.ts +88 -0
  278. package/dist/plugins/ScopedRedis.d.ts.map +1 -0
  279. package/dist/plugins/ScopedRedis.js +169 -0
  280. package/dist/plugins/ScopedRedis.js.map +1 -0
  281. package/dist/plugins/index.d.ts +289 -0
  282. package/dist/plugins/index.d.ts.map +1 -0
  283. package/dist/plugins/index.js +1942 -0
  284. package/dist/plugins/index.js.map +1 -0
  285. package/dist/plugins/types.d.ts +59 -0
  286. package/dist/plugins/types.d.ts.map +1 -0
  287. package/dist/plugins/types.js +2 -0
  288. package/dist/plugins/types.js.map +1 -0
  289. package/dist/registry/ServiceRegistry.d.ts +305 -0
  290. package/dist/registry/ServiceRegistry.d.ts.map +1 -0
  291. package/dist/registry/ServiceRegistry.js +735 -0
  292. package/dist/registry/ServiceRegistry.js.map +1 -0
  293. package/dist/scaling/ScaleAdvisor.d.ts +214 -0
  294. package/dist/scaling/ScaleAdvisor.d.ts.map +1 -0
  295. package/dist/scaling/ScaleAdvisor.js +526 -0
  296. package/dist/scaling/ScaleAdvisor.js.map +1 -0
  297. package/dist/services/Service.d.ts +164 -0
  298. package/dist/services/Service.d.ts.map +1 -0
  299. package/dist/services/Service.js +106 -0
  300. package/dist/services/Service.js.map +1 -0
  301. package/dist/services/worker-bootstrap.d.ts +15 -0
  302. package/dist/services/worker-bootstrap.d.ts.map +1 -0
  303. package/dist/services/worker-bootstrap.js +744 -0
  304. package/dist/services/worker-bootstrap.js.map +1 -0
  305. package/dist/templates/auth-service.d.ts +42 -0
  306. package/dist/templates/auth-service.d.ts.map +1 -0
  307. package/dist/templates/auth-service.js +54 -0
  308. package/dist/templates/auth-service.js.map +1 -0
  309. package/dist/templates/identity-service.d.ts +50 -0
  310. package/dist/templates/identity-service.d.ts.map +1 -0
  311. package/dist/templates/identity-service.js +62 -0
  312. package/dist/templates/identity-service.js.map +1 -0
  313. package/dist/types/contract.d.ts +120 -0
  314. package/dist/types/contract.d.ts.map +1 -0
  315. package/dist/types/contract.js +69 -0
  316. package/dist/types/contract.js.map +1 -0
  317. package/package.json +78 -20
  318. package/src/core/DirectMessageBus.js +0 -364
  319. package/src/core/EndpointResolver.js +0 -259
  320. package/src/core/ForgeContext.js +0 -2236
  321. package/src/core/ForgeHost.js +0 -122
  322. package/src/core/ForgePlatform.js +0 -145
  323. package/src/core/Ingress.js +0 -768
  324. package/src/core/Interceptors.js +0 -420
  325. package/src/core/MessageBus.js +0 -321
  326. package/src/core/Prometheus.js +0 -305
  327. package/src/core/RequestContext.js +0 -413
  328. package/src/core/RoutingStrategy.js +0 -330
  329. package/src/core/Supervisor.js +0 -1349
  330. package/src/core/ThreadAllocator.js +0 -196
  331. package/src/core/WorkerChannelManager.js +0 -879
  332. package/src/core/config.js +0 -637
  333. package/src/core/host-config.js +0 -311
  334. package/src/core/network-utils.js +0 -166
  335. package/src/core/platform-config.js +0 -308
  336. package/src/decorators/ServiceProxy.js +0 -904
  337. package/src/decorators/index.js +0 -571
  338. package/src/deploy/NginxGenerator.js +0 -865
  339. package/src/deploy/PlatformManifestGenerator.js +0 -96
  340. package/src/deploy/RouteManifestGenerator.js +0 -112
  341. package/src/deploy/index.js +0 -984
  342. package/src/frontend/FrontendDevLifecycle.js +0 -65
  343. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  344. package/src/frontend/SiteResolver.js +0 -63
  345. package/src/frontend/StaticMountRegistry.js +0 -90
  346. package/src/frontend/plugins/viteFrontend.js +0 -79
  347. package/src/frontend/types.js +0 -35
  348. package/src/index.js +0 -58
  349. package/src/plugins/PluginManager.js +0 -537
  350. package/src/plugins/ScopedPostgres.js +0 -192
  351. package/src/plugins/ScopedRedis.js +0 -142
  352. package/src/plugins/index.js +0 -1756
  353. package/src/registry/ServiceRegistry.js +0 -797
  354. package/src/scaling/ScaleAdvisor.js +0 -442
  355. package/src/services/Service.js +0 -195
  356. package/src/services/worker-bootstrap.js +0 -679
  357. package/src/templates/auth-service.js +0 -65
  358. package/src/templates/identity-service.js +0 -75
@@ -0,0 +1,246 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { Args, Command, Flags } from "@oclif/core";
4
+ import { buildDefaultInitConfig, buildDefaultPublicIndexHtml, buildDefaultReactWebIndexHtml, buildDefaultReactWebMainJsx, buildDefaultReactWebPackageJson, } from "../util/templates.js";
5
+ function detectLocalThreadforgeDependency(cwd) {
6
+ const linkedPackagePath = path.join(cwd, "node_modules", "threadforge");
7
+ try {
8
+ const stat = fs.lstatSync(linkedPackagePath);
9
+ if (!stat.isSymbolicLink())
10
+ return null;
11
+ const realPath = fs.realpathSync(linkedPackagePath);
12
+ const relativePath = path.relative(cwd, realPath) || ".";
13
+ const normalized = (relativePath.startsWith(".") ? relativePath : `./${relativePath}`)
14
+ .split(path.sep)
15
+ .join("/");
16
+ return `file:${normalized}`;
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function resolveInitDependency(cwd, source) {
23
+ if (source === "npm") {
24
+ console.warn(" Note: ThreadForge is not yet published to npm. The generated dependency");
25
+ console.warn(' "threadforge": "latest" will fail on `npm install` until published.');
26
+ console.warn(" Consider using --source github or --source local instead.\n");
27
+ return { spec: "latest", label: "npm" };
28
+ }
29
+ if (source === "github") {
30
+ return { spec: "github:ChrisBland/threadforge", label: "github" };
31
+ }
32
+ if (source === "local" || source === "auto") {
33
+ const localSpec = detectLocalThreadforgeDependency(cwd);
34
+ if (localSpec) {
35
+ return { spec: localSpec, label: "local-link" };
36
+ }
37
+ if (source === "local") {
38
+ throw new Error('No linked local ThreadForge found at ./node_modules/threadforge. Run "npm link threadforge" first.');
39
+ }
40
+ }
41
+ return { spec: "github:ChrisBland/threadforge", label: "github" };
42
+ }
43
+ export default class Init extends Command {
44
+ static description = "Scaffold a new ThreadForge project";
45
+ static examples = [
46
+ "forge init",
47
+ "forge init my-app",
48
+ "forge init . --source local",
49
+ "forge init . --with-frontend",
50
+ "forge init . --with-react",
51
+ ];
52
+ static args = {
53
+ dir: Args.string({
54
+ description: "Target directory for the new project",
55
+ required: false,
56
+ }),
57
+ };
58
+ static flags = {
59
+ source: Flags.string({
60
+ description: "Dependency source",
61
+ options: ["auto", "github", "local", "npm"],
62
+ default: "auto",
63
+ }),
64
+ "with-frontend": Flags.boolean({
65
+ description: "Include static frontend scaffold",
66
+ default: false,
67
+ }),
68
+ "with-react": Flags.boolean({
69
+ description: "Include React/Vite frontend scaffold",
70
+ default: false,
71
+ }),
72
+ local: Flags.boolean({
73
+ description: "Shorthand for --source local",
74
+ default: false,
75
+ }),
76
+ };
77
+ async run() {
78
+ const { args, flags } = await this.parse(Init);
79
+ const targetDir = args.dir ?? null;
80
+ const source = flags.local ? "local" : flags.source;
81
+ const withFrontend = flags["with-frontend"];
82
+ const withReact = flags["with-react"];
83
+ const scaffoldMode = withReact
84
+ ? "react"
85
+ : withFrontend
86
+ ? "static"
87
+ : "none";
88
+ let cwd = process.cwd();
89
+ if (targetDir) {
90
+ cwd = path.resolve(cwd, targetDir);
91
+ fs.mkdirSync(cwd, { recursive: true });
92
+ }
93
+ const configPath = path.join(cwd, "forge.config.js");
94
+ if (fs.existsSync(configPath)) {
95
+ console.error(" forge.config.js already exists in this directory.");
96
+ this.exit(1);
97
+ }
98
+ let dependency;
99
+ let dependencySourceLabel;
100
+ try {
101
+ const resolved = resolveInitDependency(cwd, source);
102
+ dependency = resolved.spec;
103
+ dependencySourceLabel = resolved.label;
104
+ }
105
+ catch (err) {
106
+ console.error(` Error: ${err.message}`);
107
+ this.exit(1);
108
+ return; // unreachable but satisfies TS
109
+ }
110
+ // Create or update package.json with required fields
111
+ const pkgPath = path.join(cwd, "package.json");
112
+ if (!fs.existsSync(pkgPath)) {
113
+ const projectName = path.basename(cwd);
114
+ fs.writeFileSync(pkgPath, `${JSON.stringify({
115
+ name: projectName,
116
+ version: "1.0.0",
117
+ type: "module",
118
+ scripts: {
119
+ dev: "forge dev",
120
+ start: "forge start",
121
+ },
122
+ dependencies: {
123
+ threadforge: dependency,
124
+ },
125
+ }, null, 2)}\n`);
126
+ }
127
+ else {
128
+ const existing = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
129
+ let modified = false;
130
+ if (existing.type !== "module") {
131
+ existing.type = "module";
132
+ modified = true;
133
+ console.log(' Updated: added "type": "module" to package.json');
134
+ }
135
+ if (!existing.scripts)
136
+ existing.scripts = {};
137
+ if (!existing.scripts.dev) {
138
+ existing.scripts.dev = "forge dev";
139
+ modified = true;
140
+ }
141
+ if (!existing.scripts.start) {
142
+ existing.scripts.start = "forge start";
143
+ modified = true;
144
+ }
145
+ if (!existing.dependencies)
146
+ existing.dependencies = {};
147
+ if (!existing.dependencies.threadforge) {
148
+ existing.dependencies.threadforge = dependency;
149
+ modified = true;
150
+ }
151
+ if (modified) {
152
+ fs.writeFileSync(pkgPath, `${JSON.stringify(existing, null, 2)}\n`);
153
+ console.log(" Updated: package.json merged with ThreadForge defaults");
154
+ }
155
+ }
156
+ // Always use package name for imports
157
+ const configImportPath = "threadforge";
158
+ const serviceImportPath = "threadforge";
159
+ // Create project structure
160
+ const dirs = ["services"];
161
+ if (scaffoldMode === "static")
162
+ dirs.push("public");
163
+ if (scaffoldMode === "react")
164
+ dirs.push("web", path.join("web", "src"));
165
+ for (const dir of dirs) {
166
+ fs.mkdirSync(path.join(cwd, dir), { recursive: true });
167
+ }
168
+ // Write config file
169
+ fs.writeFileSync(configPath, buildDefaultInitConfig(configImportPath, scaffoldMode));
170
+ if (scaffoldMode === "static") {
171
+ fs.writeFileSync(path.join(cwd, "public", "index.html"), buildDefaultPublicIndexHtml());
172
+ }
173
+ if (scaffoldMode === "react") {
174
+ fs.writeFileSync(path.join(cwd, "web", "package.json"), buildDefaultReactWebPackageJson());
175
+ fs.writeFileSync(path.join(cwd, "web", "index.html"), buildDefaultReactWebIndexHtml());
176
+ fs.writeFileSync(path.join(cwd, "web", "src", "main.jsx"), buildDefaultReactWebMainJsx());
177
+ }
178
+ // Write example service
179
+ fs.writeFileSync(path.join(cwd, "services", "api.js"), `import { Service } from '${serviceImportPath}';
180
+
181
+ export default class ApiService extends Service {
182
+ static contract = {
183
+ expose: ['getGreeting'],
184
+ routes: [
185
+ // GET /health is auto-registered by ThreadForge — no need to define it
186
+ { method: 'GET', path: '/hello/:name', handler: 'hello' },
187
+ ],
188
+ };
189
+
190
+ async onStart(ctx) {
191
+ if (ctx.workerId === 0) {
192
+ ctx.logger.info('API service ready');
193
+ }
194
+ }
195
+
196
+ async hello(body, params) {
197
+ return { message: \`Hello, \${params.name}!\` };
198
+ }
199
+
200
+ async getGreeting(name) {
201
+ return { message: \`Hello, \${name}!\` };
202
+ }
203
+ }
204
+ `);
205
+ const shouldSuggestCd = Boolean(targetDir) &&
206
+ path.resolve(process.cwd(), targetDir) !== process.cwd();
207
+ const cdStep = shouldSuggestCd
208
+ ? `cd "${path.basename(cwd)}" && `
209
+ : "";
210
+ const usingLocalLink = dependencySourceLabel === "local-link";
211
+ let optionalFrontendStep = "";
212
+ let browserStep = "";
213
+ let reactSetupSteps = "";
214
+ if (scaffoldMode === "none") {
215
+ optionalFrontendStep =
216
+ " 3. Optional static frontend: forge scaffold frontend\n 4. Optional React frontend: forge scaffold frontend --react\n";
217
+ }
218
+ else if (scaffoldMode === "static") {
219
+ browserStep =
220
+ " 3. Open http://localhost:3000 in your browser\n";
221
+ }
222
+ else {
223
+ reactSetupSteps =
224
+ " 3. cd web && npm install && cd ..\n 4. forge build\n 5. Open http://localhost:3000 in your browser\n";
225
+ }
226
+ console.log(`
227
+ \u26A1 ThreadForge project initialized!
228
+
229
+ Created:
230
+ forge.config.js - Service configuration
231
+ services/api.js - Example API service
232
+ ${scaffoldMode === "static" ? " public/index.html - Static frontend page\n" : ""}
233
+ ${scaffoldMode === "react" ? " web/package.json - React/Vite project manifest\n web/index.html - React entry page\n web/src/main.jsx - Hello World React app\n" : ""}
234
+
235
+ Dependency source: ${dependency}
236
+
237
+ Next steps:
238
+ 1. ${cdStep}npm install
239
+ 2. npm run dev
240
+ ${browserStep}${reactSetupSteps}${optionalFrontendStep}
241
+
242
+ ${usingLocalLink ? "" : "Tip: for local linked development, run `forge init [dir] --source local` after `npm link threadforge`."}
243
+ `);
244
+ }
245
+ }
246
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Platform extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static strict: boolean;
6
+ run(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/platform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,OAAgB,WAAW,SACyB;IAEpD,OAAgB,QAAQ,WAItB;IAEF,OAAgB,MAAM,UAAS;IAEzB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,20 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
+ import { Command } from "@oclif/core";
4
+ export default class Platform extends Command {
5
+ static description = "Platform mode (init, start, add, generate, ...)";
6
+ static examples = [
7
+ "forge platform init",
8
+ "forge platform start",
9
+ "forge platform status",
10
+ ];
11
+ static strict = false;
12
+ async run() {
13
+ const { argv } = await this.parse(Platform);
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+ const platformCommandsPath = path.resolve(__dirname, "..", "..", "..", "bin", "platform-commands.js");
16
+ const { cmdPlatform } = await import(pathToFileURL(platformCommandsPath).href);
17
+ await cmdPlatform(argv);
18
+ }
19
+ }
20
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/cli/commands/platform.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAU,WAAW,GACzB,iDAAiD,CAAC;IAEpD,MAAM,CAAU,QAAQ,GAAG;QACzB,qBAAqB;QACrB,sBAAsB;QACtB,uBAAuB;KACxB,CAAC;IAEF,MAAM,CAAU,MAAM,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CACvC,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,sBAAsB,CACvB,CAAC;QACF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAClC,aAAa,CAAC,oBAAoB,CAAC,CAAC,IAAI,CACzC,CAAC;QACF,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Restart extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static strict: boolean;
6
+ run(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAyC;IAEpE,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,MAAM,UAAS;IAEzB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAU3B"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Restart extends Command {
3
+ static description = "(planned) Restart a running service";
4
+ static examples = ["forge restart api"];
5
+ static strict = false;
6
+ async run() {
7
+ console.error(" `forge restart` is not yet implemented.");
8
+ console.error(" To restart, run `forge stop` followed by `forge start`.");
9
+ console.error(" For zero-downtime restarts, use a process manager (systemd, pm2) or rolling deploy.");
10
+ this.exit(1);
11
+ }
12
+ }
13
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAU,WAAW,GAAG,qCAAqC,CAAC;IAEpE,MAAM,CAAU,QAAQ,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjD,MAAM,CAAU,MAAM,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,GAAG;QACP,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CACX,2DAA2D,CAC5D,CAAC;QACF,OAAO,CAAC,KAAK,CACX,uFAAuF,CACxF,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class ScaffoldFrontend extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ react: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=frontend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/frontend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAa7C,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,OAAgB,WAAW,SAAiD;IAE5E,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;MAKnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmJ3B"}
@@ -0,0 +1,130 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { Command, Flags } from "@oclif/core";
4
+ import { findConfig, printNoConfigError } from "../../util/config-discovery.js";
5
+ import { addDefaultStaticSiteToConfig, addReactFrontendToConfig, } from "../../util/config-patcher.js";
6
+ import { buildDefaultPublicIndexHtml, buildDefaultReactWebIndexHtml, buildDefaultReactWebMainJsx, buildDefaultReactWebPackageJson, } from "../../util/templates.js";
7
+ export default class ScaffoldFrontend extends Command {
8
+ static description = "Scaffold frontend add-ons (static or React)";
9
+ static examples = [
10
+ "forge scaffold frontend",
11
+ "forge scaffold frontend --react",
12
+ ];
13
+ static flags = {
14
+ react: Flags.boolean({
15
+ description: "Scaffold React/Vite frontend instead of static",
16
+ default: false,
17
+ }),
18
+ };
19
+ async run() {
20
+ const { flags } = await this.parse(ScaffoldFrontend);
21
+ const mode = flags.react ? "react" : "static";
22
+ const configPath = await findConfig("generate");
23
+ if (!configPath) {
24
+ printNoConfigError("generate");
25
+ this.exit(1);
26
+ }
27
+ const configText = fs.readFileSync(configPath, "utf8");
28
+ const patched = mode === "react"
29
+ ? addReactFrontendToConfig(configText)
30
+ : addDefaultStaticSiteToConfig(configText);
31
+ if (patched.reason !== "updated" &&
32
+ patched.reason !== "already-configured") {
33
+ console.error(" Could not automatically patch your config.");
34
+ if (patched.reason === "existing-non-react-sites" && mode === "react") {
35
+ console.error(" Your config already contains site entries that are not Vite frontend sites.");
36
+ console.error(" Either convert your existing `sites` manually or run `forge scaffold frontend` for static mode.");
37
+ this.exit(1);
38
+ }
39
+ if (mode === "react") {
40
+ console.error(" Add this under defineServices(..., { ... }) and import viteFrontend:");
41
+ console.error("");
42
+ console.error(" frontendPlugins: [viteFrontend()],");
43
+ console.error(" sites: {");
44
+ console.error(" app: {");
45
+ console.error(" siteId: 'app',");
46
+ console.error(" services: ['api'],");
47
+ console.error(" domains: [],");
48
+ console.error(" frontend: {");
49
+ console.error(" plugin: 'vite',");
50
+ console.error(" root: './web',");
51
+ console.error(" outDir: '.threadforge/build/app',");
52
+ console.error(" basePath: '/',");
53
+ console.error(" spaFallback: true,");
54
+ console.error(" },");
55
+ console.error(" },");
56
+ console.error(" },");
57
+ this.exit(1);
58
+ }
59
+ console.error(" Add this under defineServices(..., { ... }):");
60
+ console.error("");
61
+ console.error(" sites: {");
62
+ console.error(" app: {");
63
+ console.error(" siteId: 'app',");
64
+ console.error(" services: ['api'],");
65
+ console.error(" domains: [],");
66
+ console.error(" frontend: {");
67
+ console.error(" outDir: './public',");
68
+ console.error(" basePath: '/',");
69
+ console.error(" spaFallback: true,");
70
+ console.error(" },");
71
+ console.error(" },");
72
+ console.error(" },");
73
+ this.exit(1);
74
+ }
75
+ if (patched.changed) {
76
+ fs.writeFileSync(configPath, patched.text);
77
+ }
78
+ if (mode === "react") {
79
+ const webDir = path.join(process.cwd(), "web");
80
+ const srcDir = path.join(webDir, "src");
81
+ const webPkgPath = path.join(webDir, "package.json");
82
+ const webIndexPath = path.join(webDir, "index.html");
83
+ const webMainPath = path.join(srcDir, "main.jsx");
84
+ fs.mkdirSync(srcDir, { recursive: true });
85
+ const hadWebPkg = fs.existsSync(webPkgPath);
86
+ const hadWebIndex = fs.existsSync(webIndexPath);
87
+ const hadWebMain = fs.existsSync(webMainPath);
88
+ if (!hadWebPkg)
89
+ fs.writeFileSync(webPkgPath, buildDefaultReactWebPackageJson());
90
+ if (!hadWebIndex)
91
+ fs.writeFileSync(webIndexPath, buildDefaultReactWebIndexHtml());
92
+ if (!hadWebMain)
93
+ fs.writeFileSync(webMainPath, buildDefaultReactWebMainJsx());
94
+ console.log("");
95
+ if (patched.changed) {
96
+ console.log(` \u2713 Updated ${path.basename(configPath)} with React frontend config.`);
97
+ }
98
+ else {
99
+ console.log(` \u2713 ${path.basename(configPath)} already has React frontend config.`);
100
+ }
101
+ console.log(` \u2713 ${hadWebPkg ? "Kept" : "Created"} web/package.json`);
102
+ console.log(` \u2713 ${hadWebIndex ? "Kept" : "Created"} web/index.html`);
103
+ console.log(` \u2713 ${hadWebMain ? "Kept" : "Created"} web/src/main.jsx`);
104
+ console.log("");
105
+ console.log(" Next steps:");
106
+ console.log(" 1. cd web && npm install && cd ..");
107
+ console.log(" 2. forge build");
108
+ console.log(" 3. npm run dev");
109
+ console.log("");
110
+ return;
111
+ }
112
+ const publicDir = path.join(process.cwd(), "public");
113
+ const publicIndexPath = path.join(publicDir, "index.html");
114
+ fs.mkdirSync(publicDir, { recursive: true });
115
+ const hadPublicIndex = fs.existsSync(publicIndexPath);
116
+ if (!hadPublicIndex) {
117
+ fs.writeFileSync(publicIndexPath, buildDefaultPublicIndexHtml());
118
+ }
119
+ console.log("");
120
+ if (patched.changed) {
121
+ console.log(` \u2713 Updated ${path.basename(configPath)} with default static site config.`);
122
+ }
123
+ else {
124
+ console.log(` \u2713 ${path.basename(configPath)} already has site/frontend config.`);
125
+ }
126
+ console.log(` \u2713 ${hadPublicIndex ? "Kept" : "Created"} public/index.html`);
127
+ console.log("");
128
+ }
129
+ }
130
+ //# sourceMappingURL=frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/frontend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class ScaffoldReact extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,OAAgB,WAAW,SAC4C;IAEvE,OAAgB,QAAQ,WAA4B;IAE9C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3B"}
@@ -0,0 +1,12 @@
1
+ import { Command } from "@oclif/core";
2
+ import ScaffoldFrontend from "./frontend.js";
3
+ export default class ScaffoldReact extends Command {
4
+ static description = "Scaffold React/Vite frontend (alias for scaffold frontend --react)";
5
+ static examples = ["forge scaffold react"];
6
+ async run() {
7
+ // Delegate to scaffold frontend --react
8
+ const cmd = new ScaffoldFrontend(["--react"], this.config);
9
+ await cmd.run();
10
+ }
11
+ }
12
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,MAAM,CAAU,WAAW,GACzB,oEAAoE,CAAC;IAEvE,MAAM,CAAU,QAAQ,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpD,KAAK,CAAC,GAAG;QACP,wCAAwC;QACxC,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Scale extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static strict: boolean;
6
+ run(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAAuC;IAElE,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,MAAM,UAAS;IAEzB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAU3B"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Scale extends Command {
3
+ static description = "(planned) Scale a running service";
4
+ static examples = ["forge scale api 4"];
5
+ static strict = false;
6
+ async run() {
7
+ console.error(" `forge scale` is not yet implemented.");
8
+ console.error(" To scale a service, update the `threads` field in your config and restart.");
9
+ console.error(" Auto-scaling recommendations are available via ScaleAdvisor (see `forge status`).");
10
+ this.exit(1);
11
+ }
12
+ }
13
+ //# sourceMappingURL=scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.js","sourceRoot":"","sources":["../../../src/cli/commands/scale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,mCAAmC,CAAC;IAElE,MAAM,CAAU,QAAQ,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjD,MAAM,CAAU,MAAM,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,GAAG;QACP,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CACX,8EAA8E,CAC/E,CAAC;QACF,OAAO,CAAC,KAAK,CACX,qFAAqF,CACtF,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Start extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA8B;IAEzD,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmE3B"}
@@ -0,0 +1,71 @@
1
+ import path from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import { Command, Flags } from "@oclif/core";
4
+ import { findConfig, printNoConfigError } from "../util/config-discovery.js";
5
+ export default class Start extends Command {
6
+ static description = "Start in production mode";
7
+ static examples = [
8
+ "forge start",
9
+ "forge start --config ./my-config.js",
10
+ ];
11
+ static flags = {
12
+ config: Flags.string({ description: "Path to config file" }),
13
+ };
14
+ async run() {
15
+ const { flags } = await this.parse(Start);
16
+ const configPath = await findConfig("start", flags.config);
17
+ if (!configPath) {
18
+ printNoConfigError("start");
19
+ this.exit(1);
20
+ }
21
+ const { loadConfig } = await import("../../core/config.js");
22
+ const { Supervisor } = await import("../../core/Supervisor.js");
23
+ let config;
24
+ try {
25
+ const configUrl = pathToFileURL(configPath).href;
26
+ config = await loadConfig(configUrl);
27
+ config._configUrl = configUrl;
28
+ }
29
+ catch (err) {
30
+ console.error(`\n \u2717 Error loading ${path.basename(configPath)}:`);
31
+ console.error(` ${err.message}`);
32
+ if (err.code === "ERR_MODULE_NOT_FOUND") {
33
+ console.error(" Hint: Check your import paths and run `npm install` to ensure dependencies are installed.");
34
+ }
35
+ else if (err instanceof SyntaxError) {
36
+ console.error(' Hint: Check your config file for syntax errors. Ensure your package.json has "type": "module" for ESM support.');
37
+ }
38
+ else if (err.code === "ENOENT") {
39
+ console.error(" Hint: Service entry file not found. Check that the file path in your config exists.");
40
+ }
41
+ this.exit(1);
42
+ }
43
+ // D11: Warn when `connects` targets undefined services
44
+ if (config.services) {
45
+ const serviceNames = new Set(Object.keys(config.services));
46
+ for (const [name, svc] of Object.entries(config.services)) {
47
+ if (Array.isArray(svc.connects)) {
48
+ for (const target of svc.connects) {
49
+ if (!serviceNames.has(target)) {
50
+ console.warn(` Warning: service "${name}" connects to "${target}", which is not defined in the config.`);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ const supervisor = new Supervisor(config, {
57
+ registryMode: config.registryMode,
58
+ host: config.host,
59
+ httpBasePort: config.httpBasePort,
60
+ });
61
+ try {
62
+ await supervisor.start();
63
+ }
64
+ catch (err) {
65
+ console.error("\n \u2717 Startup failed:");
66
+ console.error(` ${err.message}`);
67
+ this.exit(1);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=start.js.map