threadforge 0.1.0 → 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 (359) hide show
  1. package/README.md +52 -20
  2. package/bin/forge.js +2 -1049
  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 +160 -49
  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 +84 -22
  318. package/shared/identity.js +26 -0
  319. package/src/core/DirectMessageBus.js +0 -364
  320. package/src/core/EndpointResolver.js +0 -247
  321. package/src/core/ForgeContext.js +0 -2227
  322. package/src/core/ForgeHost.js +0 -122
  323. package/src/core/ForgePlatform.js +0 -145
  324. package/src/core/Ingress.js +0 -768
  325. package/src/core/Interceptors.js +0 -420
  326. package/src/core/MessageBus.js +0 -310
  327. package/src/core/Prometheus.js +0 -305
  328. package/src/core/RequestContext.js +0 -413
  329. package/src/core/RoutingStrategy.js +0 -316
  330. package/src/core/Supervisor.js +0 -1306
  331. package/src/core/ThreadAllocator.js +0 -196
  332. package/src/core/WorkerChannelManager.js +0 -879
  333. package/src/core/config.js +0 -624
  334. package/src/core/host-config.js +0 -311
  335. package/src/core/network-utils.js +0 -166
  336. package/src/core/platform-config.js +0 -308
  337. package/src/decorators/ServiceProxy.js +0 -899
  338. package/src/decorators/index.js +0 -571
  339. package/src/deploy/NginxGenerator.js +0 -865
  340. package/src/deploy/PlatformManifestGenerator.js +0 -96
  341. package/src/deploy/RouteManifestGenerator.js +0 -112
  342. package/src/deploy/index.js +0 -984
  343. package/src/frontend/FrontendDevLifecycle.js +0 -65
  344. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  345. package/src/frontend/SiteResolver.js +0 -63
  346. package/src/frontend/StaticMountRegistry.js +0 -90
  347. package/src/frontend/plugins/viteFrontend.js +0 -79
  348. package/src/frontend/types.js +0 -35
  349. package/src/index.js +0 -56
  350. package/src/plugins/PluginManager.js +0 -537
  351. package/src/plugins/ScopedPostgres.js +0 -192
  352. package/src/plugins/ScopedRedis.js +0 -142
  353. package/src/plugins/index.js +0 -1729
  354. package/src/registry/ServiceRegistry.js +0 -796
  355. package/src/scaling/ScaleAdvisor.js +0 -442
  356. package/src/services/Service.js +0 -195
  357. package/src/services/worker-bootstrap.js +0 -676
  358. package/src/templates/auth-service.js +0 -65
  359. package/src/templates/identity-service.js +0 -75
@@ -0,0 +1,2 @@
1
+ export function cmdHost(args: any): Promise<void>;
2
+ //# sourceMappingURL=host-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-commands.d.ts","sourceRoot":"","sources":["host-commands.js"],"names":[],"mappings":"AAsTA,kDAgCC"}
@@ -58,7 +58,7 @@ async function cmdHostInit() {
58
58
  // Write host config
59
59
  fs.writeFileSync(
60
60
  configPath,
61
- `import { defineHost, postgres, redis } from 'threadforge';
61
+ `import { defineHost, postgres, redis, ServiceType } from 'threadforge';
62
62
 
63
63
  export default defineHost({
64
64
  domain: 'myhost.dev',
@@ -67,7 +67,7 @@ export default defineHost({
67
67
  shared: {
68
68
  auth: {
69
69
  entry: './shared/auth.js',
70
- type: 'edge',
70
+ type: ServiceType.EDGE,
71
71
  port: 3100,
72
72
  prefix: '/auth',
73
73
  },
@@ -141,7 +141,7 @@ export default class AuthService extends Service {
141
141
 
142
142
  async function cmdHostStart() {
143
143
  const hostConfig = await loadHostConfig();
144
- const { ForgeHost } = await import("../src/core/ForgeHost.js");
144
+ const { ForgeHost } = await import("../dist/core/ForgeHost.js");
145
145
 
146
146
  const host = new ForgeHost(hostConfig);
147
147
  await host.start();
@@ -155,9 +155,7 @@ async function cmdHostAdd(args) {
155
155
  }
156
156
 
157
157
  const absPath = path.resolve(process.cwd(), projectPath);
158
- const configFile = ["forge.config.js", "forge.config.mjs"].find((name) =>
159
- fs.existsSync(path.join(absPath, name)),
160
- );
158
+ const configFile = ["forge.config.js", "forge.config.mjs"].find((name) => fs.existsSync(path.join(absPath, name)));
161
159
 
162
160
  if (!configFile) {
163
161
  console.error(` No forge.config.js found at ${absPath}`);
@@ -252,8 +250,8 @@ async function cmdHostRestart(args) {
252
250
 
253
251
  async function cmdHostGenerate() {
254
252
  const hostConfig = await loadHostConfig();
255
- const { resolveHostConfig } = await import("../src/core/host-config.js");
256
- const { generateHostNginxConfig } = await import("../src/deploy/NginxGenerator.js");
253
+ const { resolveHostConfig } = await import("../dist/core/host-config.js");
254
+ const { generateHostNginxConfig } = await import("../dist/deploy/NginxGenerator.js");
257
255
 
258
256
  const raw = hostConfig._isHostConfig ? hostConfig._raw : hostConfig;
259
257
  const resolved = await resolveHostConfig(raw);
@@ -277,6 +275,7 @@ async function cmdHostGenerate() {
277
275
  const nginxConfig = generateHostNginxConfig({
278
276
  hostMeta: resolved.hostMeta,
279
277
  services: resolved.services,
278
+ forgeProxy: raw.forgeProxy,
280
279
  });
281
280
  const deployDir = path.join(process.cwd(), "deploy");
282
281
  fs.mkdirSync(deployDir, { recursive: true });
@@ -0,0 +1,2 @@
1
+ export function cmdPlatform(args: any): Promise<void>;
2
+ //# sourceMappingURL=platform-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-commands.d.ts","sourceRoot":"","sources":["platform-commands.js"],"names":[],"mappings":"AA2oBA,sDA6BC"}
@@ -12,11 +12,9 @@
12
12
 
13
13
  import fs from "node:fs";
14
14
  import path from "node:path";
15
- import { fileURLToPath, pathToFileURL } from "node:url";
15
+ import { pathToFileURL } from "node:url";
16
16
 
17
17
  const PLATFORM_CONFIG_NAMES = ["forge.platform.js", "forge.platform.mjs"];
18
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
19
- const LOCAL_PKG_PATH = path.resolve(__dirname, "..", "package.json");
20
18
 
21
19
  async function findPlatformConfig() {
22
20
  const cwd = process.cwd();
@@ -39,19 +37,77 @@ async function findPlatformConfig() {
39
37
  * @returns {string}
40
38
  */
41
39
  function computeImportPath(fromDir) {
40
+ void fromDir;
41
+ return "threadforge";
42
+ }
43
+
44
+ function detectLocalThreadforgeDependency(cwd) {
45
+ const linkedPackagePath = path.join(cwd, "node_modules", "threadforge");
42
46
  try {
43
- if (fs.existsSync(LOCAL_PKG_PATH)) {
44
- const pkg = JSON.parse(fs.readFileSync(LOCAL_PKG_PATH, "utf8"));
45
- if (pkg.name === "threadforge") {
46
- const indexAbsolute = fs.realpathSync(path.resolve(__dirname, "..", "src", "index.js"));
47
- const realFrom = fs.realpathSync(fromDir);
48
- let rel = path.relative(realFrom, indexAbsolute);
49
- if (!rel.startsWith(".")) rel = `./${rel}`;
50
- return rel;
51
- }
47
+ const stat = fs.lstatSync(linkedPackagePath);
48
+ if (!stat.isSymbolicLink()) return null;
49
+
50
+ const realPath = fs.realpathSync(linkedPackagePath);
51
+ const relativePath = path.relative(cwd, realPath) || ".";
52
+ const normalized = (relativePath.startsWith(".") ? relativePath : `./${relativePath}`).split(path.sep).join("/");
53
+ return `file:${normalized}`;
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+
59
+ function resolvePlatformInitDependency(cwd) {
60
+ return detectLocalThreadforgeDependency(cwd) ?? "github:ChrisBland/threadforge";
61
+ }
62
+
63
+ function ensurePlatformPackageJson(cwd) {
64
+ const pkgPath = path.join(cwd, "package.json");
65
+ const defaultName = path.basename(cwd);
66
+ const defaultScripts = {
67
+ start: "forge platform start",
68
+ build: "forge build",
69
+ generate: "forge platform generate",
70
+ };
71
+ const defaultThreadforgeDependency = resolvePlatformInitDependency(cwd);
72
+
73
+ let pkg = {};
74
+ if (fs.existsSync(pkgPath)) {
75
+ try {
76
+ pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
77
+ } catch (err) {
78
+ throw new Error(`Invalid package.json: ${err.message}`);
52
79
  }
53
- } catch {}
54
- return "threadforge";
80
+ } else {
81
+ pkg = {
82
+ name: defaultName,
83
+ version: "1.0.0",
84
+ };
85
+ }
86
+
87
+ if (!pkg.type) {
88
+ pkg.type = "module";
89
+ }
90
+
91
+ if (!pkg.scripts || typeof pkg.scripts !== "object" || Array.isArray(pkg.scripts)) {
92
+ pkg.scripts = {};
93
+ }
94
+
95
+ for (const [name, command] of Object.entries(defaultScripts)) {
96
+ if (!pkg.scripts[name]) {
97
+ pkg.scripts[name] = command;
98
+ }
99
+ }
100
+
101
+ if (!pkg.dependencies || typeof pkg.dependencies !== "object" || Array.isArray(pkg.dependencies)) {
102
+ pkg.dependencies = {};
103
+ }
104
+ if (!pkg.dependencies.threadforge) {
105
+ pkg.dependencies.threadforge = defaultThreadforgeDependency;
106
+ }
107
+
108
+ fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
109
+
110
+ return pkg.dependencies.threadforge;
55
111
  }
56
112
 
57
113
  async function loadPlatformConfig() {
@@ -66,6 +122,50 @@ async function loadPlatformConfig() {
66
122
  return mod.default ?? mod;
67
123
  }
68
124
 
125
+ async function suggestNextPlatformEdgePort(cwd = process.cwd()) {
126
+ const DEFAULT_PORT = 4001;
127
+ let platformConfig;
128
+ try {
129
+ platformConfig = await loadPlatformConfig();
130
+ } catch {
131
+ platformConfig = null;
132
+ }
133
+
134
+ const usedPorts = new Set();
135
+ if (platformConfig) {
136
+ const raw = platformConfig._isPlatformConfig ? platformConfig._raw : platformConfig;
137
+ for (const [key, value] of Object.entries(raw ?? {})) {
138
+ if (key === "platform" || key === "plugins" || key === "frontendPlugins") continue;
139
+ if (!value || typeof value !== "object" || Array.isArray(value)) continue;
140
+ if (value.type !== "edge") continue;
141
+ if (Number.isInteger(value.port) && value.port > 0) {
142
+ usedPorts.add(value.port);
143
+ }
144
+ }
145
+ }
146
+
147
+ // If users scaffold multiple apps before editing forge.platform.js,
148
+ // infer likely app ports from existing app api stubs to avoid duplicate suggestions.
149
+ const appsDir = path.join(cwd, "apps");
150
+ let inferredAppCount = 0;
151
+ if (fs.existsSync(appsDir)) {
152
+ try {
153
+ const entries = fs.readdirSync(appsDir, { withFileTypes: true });
154
+ inferredAppCount = entries.filter((entry) => {
155
+ if (!entry.isDirectory()) return false;
156
+ const apiPath = path.join(appsDir, entry.name, "api.js");
157
+ return fs.existsSync(apiPath);
158
+ }).length;
159
+ } catch {
160
+ inferredAppCount = 0;
161
+ }
162
+ }
163
+
164
+ let candidate = DEFAULT_PORT + inferredAppCount;
165
+ while (usedPorts.has(candidate)) candidate += 1;
166
+ return candidate;
167
+ }
168
+
69
169
  function loadFrontendBuildManifest(cwd) {
70
170
  const manifestPath = path.join(cwd, ".threadforge", "frontend-manifest.json");
71
171
  if (!fs.existsSync(manifestPath)) return null;
@@ -92,6 +192,8 @@ async function cmdPlatformInit() {
92
192
  const importPath = computeImportPath(cwd);
93
193
  const serviceImportPath = computeImportPath(path.join(cwd, "shared"));
94
194
 
195
+ const dependency = ensurePlatformPackageJson(cwd);
196
+
95
197
  // Create directories
96
198
  for (const dir of ["shared", "apps"]) {
97
199
  fs.mkdirSync(path.join(cwd, dir), { recursive: true });
@@ -100,7 +202,7 @@ async function cmdPlatformInit() {
100
202
  // Write platform config
101
203
  fs.writeFileSync(
102
204
  configPath,
103
- `import { definePlatform } from '${importPath}';
205
+ `import { definePlatform, ServiceType } from '${importPath}';
104
206
 
105
207
  export default definePlatform({
106
208
  platform: {
@@ -123,23 +225,23 @@ export default definePlatform({
123
225
  // Shared services (run once, serve all apps)
124
226
  identity: {
125
227
  entry: './shared/identity.js',
126
- type: 'edge',
228
+ type: ServiceType.EDGE,
127
229
  port: 3001,
128
230
  },
129
231
  auth: {
130
232
  entry: './shared/auth.js',
131
- type: 'edge',
233
+ type: ServiceType.EDGE,
132
234
  port: 3002,
133
235
  prefix: '/auth',
134
236
  },
135
237
 
136
238
  // Per-app services go here:
137
- // 'myapp-api': {
138
- // entry: './apps/myapp/api.js',
139
- // type: 'edge',
140
- // port: 4001,
141
- // connects: ['auth'],
142
- // },
239
+ // 'myapp-api': {
240
+ // entry: './apps/myapp/api.js',
241
+ // type: ServiceType.EDGE,
242
+ // port: 4001,
243
+ // connects: ['auth'],
244
+ // },
143
245
  });
144
246
  `,
145
247
  );
@@ -221,6 +323,7 @@ export default class AuthService extends Service {
221
323
  shared/identity.js - Identity service (stub)
222
324
  shared/auth.js - Auth service (stub)
223
325
  apps/ - App directory
326
+ package.json - Includes threadforge dependency (${dependency})
224
327
 
225
328
  Next steps:
226
329
  1. Edit forge.platform.js to configure your apps
@@ -233,7 +336,7 @@ export default class AuthService extends Service {
233
336
 
234
337
  async function cmdPlatformStart() {
235
338
  const platformConfig = await loadPlatformConfig();
236
- const { ForgePlatform } = await import("../src/core/ForgePlatform.js");
339
+ const { ForgePlatform } = await import("../dist/core/ForgePlatform.js");
237
340
 
238
341
  const platform = new ForgePlatform(platformConfig);
239
342
  await platform.start();
@@ -249,7 +352,9 @@ async function cmdPlatformAdd(args) {
249
352
  }
250
353
 
251
354
  if (!/^[a-z][a-z0-9_-]*$/.test(appName)) {
252
- console.error(` Invalid app name "${appName}": must start with a lowercase letter and contain only lowercase letters, digits, hyphens, and underscores.`);
355
+ console.error(
356
+ ` Invalid app name "${appName}": must start with a lowercase letter and contain only lowercase letters, digits, hyphens, and underscores.`,
357
+ );
253
358
  process.exit(1);
254
359
  }
255
360
 
@@ -262,6 +367,7 @@ async function cmdPlatformAdd(args) {
262
367
  }
263
368
 
264
369
  const serviceImportPath = computeImportPath(path.join(cwd, "apps", appName));
370
+ const suggestedPort = await suggestNextPlatformEdgePort();
265
371
 
266
372
  // Create app directory + migrations
267
373
  fs.mkdirSync(path.join(appDir, "migrations"), { recursive: true });
@@ -337,8 +443,8 @@ CREATE INDEX IF NOT EXISTS "idx_${safeName}_items_created"
337
443
  // As a top-level service:
338
444
  '${appName}-api': {
339
445
  entry: './apps/${appName}/api.js',
340
- type: 'edge',
341
- port: 4001,
446
+ type: ServiceType.EDGE,
447
+ port: ${suggestedPort},
342
448
  connects: ['auth'],
343
449
  },
344
450
  `);
@@ -372,7 +478,7 @@ async function cmdPlatformRemove(args) {
372
478
  // ── forge platform status ────────────────────────────────────────────────
373
479
 
374
480
  async function cmdPlatformStatus() {
375
- const metricsPort = parseInt(process.env.FORGE_METRICS_PORT || '9090', 10);
481
+ const metricsPort = parseInt(process.env.FORGE_METRICS_PORT || "9090", 10);
376
482
  try {
377
483
  const res = await fetch(`http://localhost:${metricsPort}/status`);
378
484
  const data = await res.json();
@@ -414,10 +520,10 @@ async function cmdPlatformStatus() {
414
520
 
415
521
  async function cmdPlatformGenerate() {
416
522
  const platformConfig = await loadPlatformConfig();
417
- const { resolveAppDomains, transformToHostConfig } = await import("../src/core/platform-config.js");
418
- const { resolveHostConfig } = await import("../src/core/host-config.js");
419
- const { generatePlatformNginxConfig } = await import("../src/deploy/NginxGenerator.js");
420
- const { generatePlatformManifest } = await import("../src/deploy/PlatformManifestGenerator.js");
523
+ const { resolveAppDomains, transformToHostConfig } = await import("../dist/core/platform-config.js");
524
+ const { resolveHostConfig } = await import("../dist/core/host-config.js");
525
+ const { generatePlatformNginxConfig } = await import("../dist/deploy/NginxGenerator.js");
526
+ const { generatePlatformManifest } = await import("../dist/deploy/PlatformManifestGenerator.js");
421
527
 
422
528
  const raw = platformConfig._isPlatformConfig ? platformConfig._raw : platformConfig;
423
529
  const hostConfig = transformToHostConfig(raw);
@@ -451,7 +557,7 @@ async function cmdPlatformGenerate() {
451
557
  const apps = {};
452
558
  for (const [appId, app] of Object.entries(raw.platform.apps)) {
453
559
  const site = resolved.sites?.[appId];
454
- const frontend = site?.frontend ? { ...site.frontend } : (app.frontend ? { ...app.frontend } : null);
560
+ const frontend = site?.frontend ? { ...site.frontend } : app.frontend ? { ...app.frontend } : null;
455
561
  if (frontend && builtOutDirBySite[appId]) {
456
562
  frontend.outDir = builtOutDirBySite[appId];
457
563
  }
@@ -460,25 +566,29 @@ async function cmdPlatformGenerate() {
460
566
  ? mountsFromManifest[appId]
461
567
  : (() => {
462
568
  if (frontend) {
463
- return [{
464
- siteId: appId,
465
- domains: site?.domains ?? resolveAppDomains(app),
466
- basePath: frontend.basePath ?? "/",
467
- dir: frontend.outDir,
468
- spaFallback: frontend.spaFallback ?? true,
469
- cachePolicy: "short",
470
- }];
569
+ return [
570
+ {
571
+ siteId: appId,
572
+ domains: site?.domains ?? resolveAppDomains(app),
573
+ basePath: frontend.basePath ?? "/",
574
+ dir: frontend.outDir,
575
+ spaFallback: frontend.spaFallback ?? true,
576
+ cachePolicy: "short",
577
+ },
578
+ ];
471
579
  }
472
580
  const legacyStatic = site?.staticDir ?? app.static ?? null;
473
581
  if (!legacyStatic) return [];
474
- return [{
475
- siteId: appId,
476
- domains: site?.domains ?? resolveAppDomains(app),
477
- basePath: "/static",
478
- dir: legacyStatic,
479
- spaFallback: false,
480
- cachePolicy: "short",
481
- }];
582
+ return [
583
+ {
584
+ siteId: appId,
585
+ domains: site?.domains ?? resolveAppDomains(app),
586
+ basePath: "/static",
587
+ dir: legacyStatic,
588
+ spaFallback: false,
589
+ cachePolicy: "short",
590
+ },
591
+ ];
482
592
  })();
483
593
 
484
594
  apps[appId] = {
@@ -498,6 +608,7 @@ async function cmdPlatformGenerate() {
498
608
  hostMeta: resolved.hostMeta,
499
609
  defaultSsl: raw.platform.ssl ?? null,
500
610
  maxBodySize: raw.platform.maxBodySize ?? 10,
611
+ forgeProxy: raw.platform.forgeProxy,
501
612
  });
502
613
  fs.writeFileSync(path.join(deployDir, "nginx.conf"), nginxConfig);
503
614
 
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Base command class for all ThreadForge CLI commands.
3
+ * Provides shared flags and config discovery.
4
+ */
5
+ import { Command } from "@oclif/core";
6
+ export declare abstract class ForgeCommand extends Command {
7
+ static baseFlags: {
8
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ protected resolveConfig(commandName: string): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=base-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/cli/base-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,8BAAsB,YAAa,SAAQ,OAAO;IAChD,MAAM,CAAC,SAAS;;MAKd;cAEc,aAAa,CAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;CAcnB"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Base command class for all ThreadForge CLI commands.
3
+ * Provides shared flags and config discovery.
4
+ */
5
+ import { Command, Flags } from "@oclif/core";
6
+ import { findConfig, printNoConfigError } from "./util/config-discovery.js";
7
+ export class ForgeCommand extends Command {
8
+ static baseFlags = {
9
+ config: Flags.string({
10
+ description: "Path to config file",
11
+ required: false,
12
+ }),
13
+ };
14
+ async resolveConfig(commandName) {
15
+ const parsed = await this.parse(this.constructor);
16
+ const configFlag = parsed.flags?.config;
17
+ const configPath = await findConfig(commandName, configFlag);
18
+ if (!configPath) {
19
+ printNoConfigError(commandName);
20
+ this.exit(1);
21
+ }
22
+ return configPath;
23
+ }
24
+ }
25
+ //# sourceMappingURL=base-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/cli/base-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE5E,MAAM,OAAgB,YAAa,SAAQ,OAAO;IAChD,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,qBAAqB;YAClC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEQ,KAAK,CAAC,aAAa,CAC3B,WAAmB;QAEnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,IAAI,CAAC,WAAkC,CACxC,CAAC;QACF,MAAM,UAAU,GAAI,MAAM,CAAC,KAAa,EAAE,MAE7B,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QACD,OAAO,UAAW,CAAC;IACrB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Build 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=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAG7C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA+C;IAE1E,OAAgB,QAAQ,WAAmB;IAE3C,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyI3B"}
@@ -0,0 +1,110 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { Command, Flags } from "@oclif/core";
5
+ import { findConfig, printNoConfigError } from "../util/config-discovery.js";
6
+ export default class Build extends Command {
7
+ static description = "Build frontend sites via frontend plugins";
8
+ static examples = ["forge build"];
9
+ static flags = {
10
+ config: Flags.string({ description: "Path to config file" }),
11
+ };
12
+ async run() {
13
+ const { flags } = await this.parse(Build);
14
+ const configPath = await findConfig("build", flags.config);
15
+ if (!configPath) {
16
+ printNoConfigError("build");
17
+ this.exit(1);
18
+ }
19
+ const { loadConfig } = await import("../../core/config.js");
20
+ const { resolveSitesMap } = await import("../../frontend/SiteResolver.js");
21
+ let config;
22
+ try {
23
+ const configUrl = pathToFileURL(configPath).href;
24
+ config = await loadConfig(configUrl);
25
+ }
26
+ catch (err) {
27
+ console.error(`\n \u2717 Error loading ${path.basename(configPath)}:`);
28
+ console.error(` ${err.message}`);
29
+ this.exit(1);
30
+ }
31
+ const sitesMap = resolveSitesMap(config);
32
+ const frontendSites = Object.values(sitesMap).filter((site) => site?.frontend);
33
+ if (frontendSites.length === 0) {
34
+ console.log(" No frontend sites configured. Nothing to build.");
35
+ return;
36
+ }
37
+ const { FrontendPluginOrchestrator } = await import("../../frontend/FrontendPluginOrchestrator.js");
38
+ const orchestrator = new FrontendPluginOrchestrator();
39
+ const frontendPlugins = config.frontendPlugins ?? [];
40
+ try {
41
+ orchestrator.register(frontendPlugins);
42
+ await orchestrator.validateAll({ logger: console });
43
+ await orchestrator.registerAll({ logger: console });
44
+ }
45
+ catch (err) {
46
+ console.error(` Frontend plugin setup failed: ${err.message}`);
47
+ this.exit(1);
48
+ }
49
+ const sitesNeedingPlugin = frontendSites.filter((site) => site.frontend.plugin);
50
+ if (orchestrator.plugins.size === 0 && sitesNeedingPlugin.length > 0) {
51
+ console.error(" Frontend sites are configured, but no frontendPlugins are registered in config.");
52
+ this.exit(1);
53
+ }
54
+ const results = [];
55
+ const mountsBySite = {};
56
+ let failures = 0;
57
+ try {
58
+ console.log(`\n \u26A1 Building frontend sites (${frontendSites.length})\n`);
59
+ for (const site of frontendSites) {
60
+ const pluginName = site.frontend.plugin;
61
+ if (!pluginName) {
62
+ console.log(` \u2022 ${site.siteId} (static \u2014 no build needed)`);
63
+ results.push({
64
+ siteId: site.siteId,
65
+ plugin: null,
66
+ outDir: site.frontend.outDir,
67
+ });
68
+ continue;
69
+ }
70
+ try {
71
+ console.log(` \u2022 ${site.siteId} (${pluginName})`);
72
+ const result = await orchestrator.buildSite(site, {
73
+ logger: console,
74
+ });
75
+ const mounts = await orchestrator.staticMounts(site, {
76
+ logger: console,
77
+ });
78
+ mountsBySite[site.siteId] = mounts;
79
+ results.push({
80
+ siteId: site.siteId,
81
+ plugin: pluginName,
82
+ outDir: result?.outDir ?? site.frontend.outDir,
83
+ });
84
+ console.log(` \u2713 ${result?.outDir ?? site.frontend.outDir}`);
85
+ }
86
+ catch (err) {
87
+ failures++;
88
+ console.error(` \u2717 ${err.message}`);
89
+ }
90
+ }
91
+ }
92
+ finally {
93
+ await orchestrator.disposeAll({ logger: console });
94
+ }
95
+ const outputDir = path.join(process.cwd(), ".threadforge");
96
+ fs.mkdirSync(outputDir, { recursive: true });
97
+ const manifestPath = path.join(outputDir, "frontend-manifest.json");
98
+ fs.writeFileSync(manifestPath, JSON.stringify({
99
+ generatedAt: new Date().toISOString(),
100
+ sites: results,
101
+ mounts: mountsBySite,
102
+ }, null, 2));
103
+ console.log(`\n Wrote frontend manifest: ${manifestPath}`);
104
+ if (failures > 0) {
105
+ console.error(` Frontend build completed with ${failures} failure(s).`);
106
+ this.exit(1);
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Deploy 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
+ "dry-run": import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ "check-secrets": import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SACqB;IAEhD,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;MAUnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyJ3B"}