@agentuity/cli 2.0.11 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/dist/cmd/ai/prompt/index.d.ts.map +1 -1
  2. package/dist/cmd/ai/prompt/index.js +2 -7
  3. package/dist/cmd/ai/prompt/index.js.map +1 -1
  4. package/dist/cmd/build/adapters/generic.d.ts +29 -0
  5. package/dist/cmd/build/adapters/generic.d.ts.map +1 -0
  6. package/dist/cmd/build/adapters/generic.js +190 -0
  7. package/dist/cmd/build/adapters/generic.js.map +1 -0
  8. package/dist/cmd/build/adapters/index.d.ts +15 -0
  9. package/dist/cmd/build/adapters/index.d.ts.map +1 -0
  10. package/dist/cmd/build/adapters/index.js +24 -0
  11. package/dist/cmd/build/adapters/index.js.map +1 -0
  12. package/dist/cmd/build/adapters/nextjs.d.ts +11 -0
  13. package/dist/cmd/build/adapters/nextjs.d.ts.map +1 -0
  14. package/dist/cmd/build/adapters/nextjs.js +118 -0
  15. package/dist/cmd/build/adapters/nextjs.js.map +1 -0
  16. package/dist/cmd/build/adapters/static-server.d.ts +23 -0
  17. package/dist/cmd/build/adapters/static-server.d.ts.map +1 -0
  18. package/dist/cmd/build/adapters/static-server.js +137 -0
  19. package/dist/cmd/build/adapters/static-server.js.map +1 -0
  20. package/dist/cmd/build/adapters/types.d.ts +71 -0
  21. package/dist/cmd/build/adapters/types.d.ts.map +1 -0
  22. package/dist/cmd/build/adapters/types.js +8 -0
  23. package/dist/cmd/build/adapters/types.js.map +1 -0
  24. package/dist/cmd/build/detect/engine.d.ts +24 -0
  25. package/dist/cmd/build/detect/engine.d.ts.map +1 -0
  26. package/dist/cmd/build/detect/engine.js +91 -0
  27. package/dist/cmd/build/detect/engine.js.map +1 -0
  28. package/dist/cmd/build/detect/frameworks.d.ts +66 -0
  29. package/dist/cmd/build/detect/frameworks.d.ts.map +1 -0
  30. package/dist/cmd/build/detect/frameworks.js +278 -0
  31. package/dist/cmd/build/detect/frameworks.js.map +1 -0
  32. package/dist/cmd/build/detect/generic.d.ts +13 -0
  33. package/dist/cmd/build/detect/generic.d.ts.map +1 -0
  34. package/dist/cmd/build/detect/generic.js +62 -0
  35. package/dist/cmd/build/detect/generic.js.map +1 -0
  36. package/dist/cmd/build/detect/index.d.ts +27 -0
  37. package/dist/cmd/build/detect/index.d.ts.map +1 -0
  38. package/dist/cmd/build/detect/index.js +76 -0
  39. package/dist/cmd/build/detect/index.js.map +1 -0
  40. package/dist/cmd/build/detect/types.d.ts +91 -0
  41. package/dist/cmd/build/detect/types.d.ts.map +1 -0
  42. package/dist/cmd/build/detect/types.js +9 -0
  43. package/dist/cmd/build/detect/types.js.map +1 -0
  44. package/dist/cmd/build/detect/util.d.ts +41 -0
  45. package/dist/cmd/build/detect/util.d.ts.map +1 -0
  46. package/dist/cmd/build/detect/util.js +101 -0
  47. package/dist/cmd/build/detect/util.js.map +1 -0
  48. package/dist/cmd/build/index.d.ts.map +1 -1
  49. package/dist/cmd/build/index.js +49 -22
  50. package/dist/cmd/build/index.js.map +1 -1
  51. package/dist/cmd/build/package/index.d.ts +30 -0
  52. package/dist/cmd/build/package/index.d.ts.map +1 -0
  53. package/dist/cmd/build/package/index.js +39 -0
  54. package/dist/cmd/build/package/index.js.map +1 -0
  55. package/dist/cmd/build/package/launch.d.ts +56 -0
  56. package/dist/cmd/build/package/launch.d.ts.map +1 -0
  57. package/dist/cmd/build/package/launch.js +56 -0
  58. package/dist/cmd/build/package/launch.js.map +1 -0
  59. package/dist/cmd/build/typecheck.d.ts.map +1 -1
  60. package/dist/cmd/build/typecheck.js +8 -0
  61. package/dist/cmd/build/typecheck.js.map +1 -1
  62. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  63. package/dist/cmd/cloud/deploy.js +63 -13
  64. package/dist/cmd/cloud/deploy.js.map +1 -1
  65. package/dist/cmd/coder/create.js +7 -7
  66. package/dist/cmd/coder/create.js.map +1 -1
  67. package/dist/cmd/coder/update.js +8 -8
  68. package/dist/cmd/coder/update.js.map +1 -1
  69. package/dist/cmd/coder/workspace/create.js +9 -9
  70. package/dist/cmd/coder/workspace/create.js.map +1 -1
  71. package/dist/cmd/dev/index.d.ts +9 -0
  72. package/dist/cmd/dev/index.d.ts.map +1 -1
  73. package/dist/cmd/dev/index.js +127 -923
  74. package/dist/cmd/dev/index.js.map +1 -1
  75. package/dist/cmd/project/auth/shared.d.ts.map +1 -1
  76. package/dist/cmd/project/auth/shared.js +14 -38
  77. package/dist/cmd/project/auth/shared.js.map +1 -1
  78. package/dist/cmd/project/create.d.ts.map +1 -1
  79. package/dist/cmd/project/create.js +12 -19
  80. package/dist/cmd/project/create.js.map +1 -1
  81. package/dist/cmd/project/frameworks-ai-examples.d.ts +15 -0
  82. package/dist/cmd/project/frameworks-ai-examples.d.ts.map +1 -0
  83. package/dist/cmd/project/frameworks-ai-examples.js +160 -0
  84. package/dist/cmd/project/frameworks-ai-examples.js.map +1 -0
  85. package/dist/cmd/project/frameworks-landing-pages.d.ts +17 -0
  86. package/dist/cmd/project/frameworks-landing-pages.d.ts.map +1 -0
  87. package/dist/cmd/project/frameworks-landing-pages.js +242 -0
  88. package/dist/cmd/project/frameworks-landing-pages.js.map +1 -0
  89. package/dist/cmd/project/frameworks.d.ts +58 -0
  90. package/dist/cmd/project/frameworks.d.ts.map +1 -0
  91. package/dist/cmd/project/frameworks.js +152 -0
  92. package/dist/cmd/project/frameworks.js.map +1 -0
  93. package/dist/cmd/project/reconcile.d.ts.map +1 -1
  94. package/dist/cmd/project/reconcile.js +10 -23
  95. package/dist/cmd/project/reconcile.js.map +1 -1
  96. package/dist/cmd/project/remote-import.js +1 -1
  97. package/dist/cmd/project/scaffold.d.ts +58 -0
  98. package/dist/cmd/project/scaffold.d.ts.map +1 -0
  99. package/dist/cmd/project/scaffold.js +223 -0
  100. package/dist/cmd/project/scaffold.js.map +1 -0
  101. package/dist/cmd/project/template-flow.d.ts +8 -4
  102. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  103. package/dist/cmd/project/template-flow.js +93 -144
  104. package/dist/cmd/project/template-flow.js.map +1 -1
  105. package/dist/deploy-metadata.d.ts +49 -0
  106. package/dist/deploy-metadata.d.ts.map +1 -0
  107. package/dist/deploy-metadata.js +183 -0
  108. package/dist/deploy-metadata.js.map +1 -0
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/types.d.ts +24 -30
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/types.js.map +1 -1
  115. package/package.json +13 -8
  116. package/src/cmd/ai/prompt/index.ts +2 -7
  117. package/src/cmd/build/adapters/generic.ts +239 -0
  118. package/src/cmd/build/adapters/index.ts +30 -0
  119. package/src/cmd/build/adapters/nextjs.ts +146 -0
  120. package/src/cmd/build/adapters/static-server.ts +143 -0
  121. package/src/cmd/build/adapters/types.ts +93 -0
  122. package/src/cmd/build/detect/engine.ts +111 -0
  123. package/src/cmd/build/detect/frameworks.ts +335 -0
  124. package/src/cmd/build/detect/generic.ts +71 -0
  125. package/src/cmd/build/detect/index.ts +122 -0
  126. package/src/cmd/build/detect/types.ts +109 -0
  127. package/src/cmd/build/detect/util.ts +104 -0
  128. package/src/cmd/build/index.ts +64 -24
  129. package/src/cmd/build/package/index.ts +66 -0
  130. package/src/cmd/build/package/launch.ts +104 -0
  131. package/src/cmd/build/typecheck.ts +9 -0
  132. package/src/cmd/cloud/deploy.ts +86 -13
  133. package/src/cmd/coder/create.ts +8 -8
  134. package/src/cmd/coder/update.ts +7 -7
  135. package/src/cmd/coder/workspace/create.ts +10 -10
  136. package/src/cmd/dev/index.ts +155 -1059
  137. package/src/cmd/project/auth/shared.ts +14 -39
  138. package/src/cmd/project/create.ts +14 -19
  139. package/src/cmd/project/frameworks-ai-examples.ts +166 -0
  140. package/src/cmd/project/frameworks-landing-pages.ts +267 -0
  141. package/src/cmd/project/frameworks.ts +223 -0
  142. package/src/cmd/project/reconcile.ts +10 -22
  143. package/src/cmd/project/remote-import.ts +1 -1
  144. package/src/cmd/project/scaffold.ts +300 -0
  145. package/src/cmd/project/template-flow.ts +102 -156
  146. package/src/deploy-metadata.ts +253 -0
  147. package/src/index.ts +0 -2
  148. package/src/types.ts +0 -31
  149. package/dist/agents-docs.d.ts +0 -23
  150. package/dist/agents-docs.d.ts.map +0 -1
  151. package/dist/agents-docs.js +0 -56
  152. package/dist/agents-docs.js.map +0 -1
  153. package/dist/cmd/ai/prompt/agent.d.ts +0 -10
  154. package/dist/cmd/ai/prompt/agent.d.ts.map +0 -1
  155. package/dist/cmd/ai/prompt/agent.js +0 -28
  156. package/dist/cmd/ai/prompt/agent.js.map +0 -1
  157. package/dist/cmd/build/app-router-detector.d.ts +0 -39
  158. package/dist/cmd/build/app-router-detector.d.ts.map +0 -1
  159. package/dist/cmd/build/app-router-detector.js +0 -229
  160. package/dist/cmd/build/app-router-detector.js.map +0 -1
  161. package/dist/cmd/build/format-schema.d.ts +0 -6
  162. package/dist/cmd/build/format-schema.d.ts.map +0 -1
  163. package/dist/cmd/build/format-schema.js +0 -60
  164. package/dist/cmd/build/format-schema.js.map +0 -1
  165. package/dist/cmd/build/vite/agent-discovery.d.ts +0 -37
  166. package/dist/cmd/build/vite/agent-discovery.d.ts.map +0 -1
  167. package/dist/cmd/build/vite/agent-discovery.js +0 -263
  168. package/dist/cmd/build/vite/agent-discovery.js.map +0 -1
  169. package/dist/cmd/build/vite/beacon-plugin.d.ts +0 -19
  170. package/dist/cmd/build/vite/beacon-plugin.d.ts.map +0 -1
  171. package/dist/cmd/build/vite/beacon-plugin.js +0 -137
  172. package/dist/cmd/build/vite/beacon-plugin.js.map +0 -1
  173. package/dist/cmd/build/vite/browser-env-plugin.d.ts +0 -9
  174. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +0 -1
  175. package/dist/cmd/build/vite/browser-env-plugin.js +0 -28
  176. package/dist/cmd/build/vite/browser-env-plugin.js.map +0 -1
  177. package/dist/cmd/build/vite/bun-dev-server.d.ts +0 -67
  178. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +0 -1
  179. package/dist/cmd/build/vite/bun-dev-server.js +0 -340
  180. package/dist/cmd/build/vite/bun-dev-server.js.map +0 -1
  181. package/dist/cmd/build/vite/bundle-files.d.ts +0 -12
  182. package/dist/cmd/build/vite/bundle-files.d.ts.map +0 -1
  183. package/dist/cmd/build/vite/bundle-files.js +0 -107
  184. package/dist/cmd/build/vite/bundle-files.js.map +0 -1
  185. package/dist/cmd/build/vite/config-loader.d.ts +0 -29
  186. package/dist/cmd/build/vite/config-loader.d.ts.map +0 -1
  187. package/dist/cmd/build/vite/config-loader.js +0 -57
  188. package/dist/cmd/build/vite/config-loader.js.map +0 -1
  189. package/dist/cmd/build/vite/db-rewrite.d.ts +0 -50
  190. package/dist/cmd/build/vite/db-rewrite.d.ts.map +0 -1
  191. package/dist/cmd/build/vite/db-rewrite.js +0 -169
  192. package/dist/cmd/build/vite/db-rewrite.js.map +0 -1
  193. package/dist/cmd/build/vite/docs-generator.d.ts +0 -13
  194. package/dist/cmd/build/vite/docs-generator.d.ts.map +0 -1
  195. package/dist/cmd/build/vite/docs-generator.js +0 -97
  196. package/dist/cmd/build/vite/docs-generator.js.map +0 -1
  197. package/dist/cmd/build/vite/env-types-generator.d.ts +0 -26
  198. package/dist/cmd/build/vite/env-types-generator.d.ts.map +0 -1
  199. package/dist/cmd/build/vite/env-types-generator.js +0 -110
  200. package/dist/cmd/build/vite/env-types-generator.js.map +0 -1
  201. package/dist/cmd/build/vite/index.d.ts +0 -3
  202. package/dist/cmd/build/vite/index.d.ts.map +0 -1
  203. package/dist/cmd/build/vite/index.js +0 -4
  204. package/dist/cmd/build/vite/index.js.map +0 -1
  205. package/dist/cmd/build/vite/lifecycle-generator.d.ts +0 -19
  206. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +0 -1
  207. package/dist/cmd/build/vite/lifecycle-generator.js +0 -328
  208. package/dist/cmd/build/vite/lifecycle-generator.js.map +0 -1
  209. package/dist/cmd/build/vite/metadata-generator.d.ts +0 -36
  210. package/dist/cmd/build/vite/metadata-generator.d.ts.map +0 -1
  211. package/dist/cmd/build/vite/metadata-generator.js +0 -575
  212. package/dist/cmd/build/vite/metadata-generator.js.map +0 -1
  213. package/dist/cmd/build/vite/prompt-generator.d.ts +0 -23
  214. package/dist/cmd/build/vite/prompt-generator.d.ts.map +0 -1
  215. package/dist/cmd/build/vite/prompt-generator.js +0 -123
  216. package/dist/cmd/build/vite/prompt-generator.js.map +0 -1
  217. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
  218. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
  219. package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
  220. package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
  221. package/dist/cmd/build/vite/route-discovery.d.ts +0 -64
  222. package/dist/cmd/build/vite/route-discovery.d.ts.map +0 -1
  223. package/dist/cmd/build/vite/route-discovery.js +0 -187
  224. package/dist/cmd/build/vite/route-discovery.js.map +0 -1
  225. package/dist/cmd/build/vite/server-bundler.d.ts +0 -20
  226. package/dist/cmd/build/vite/server-bundler.d.ts.map +0 -1
  227. package/dist/cmd/build/vite/server-bundler.js +0 -388
  228. package/dist/cmd/build/vite/server-bundler.js.map +0 -1
  229. package/dist/cmd/build/vite/static-renderer.d.ts +0 -26
  230. package/dist/cmd/build/vite/static-renderer.d.ts.map +0 -1
  231. package/dist/cmd/build/vite/static-renderer.js +0 -188
  232. package/dist/cmd/build/vite/static-renderer.js.map +0 -1
  233. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +0 -15
  234. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +0 -1
  235. package/dist/cmd/build/vite/tailwind-source-plugin.js +0 -61
  236. package/dist/cmd/build/vite/tailwind-source-plugin.js.map +0 -1
  237. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +0 -24
  238. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +0 -1
  239. package/dist/cmd/build/vite/vite-asset-server-config.js +0 -285
  240. package/dist/cmd/build/vite/vite-asset-server-config.js.map +0 -1
  241. package/dist/cmd/build/vite/vite-asset-server.d.ts +0 -30
  242. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +0 -1
  243. package/dist/cmd/build/vite/vite-asset-server.js +0 -109
  244. package/dist/cmd/build/vite/vite-asset-server.js.map +0 -1
  245. package/dist/cmd/build/vite/vite-builder.d.ts +0 -59
  246. package/dist/cmd/build/vite/vite-builder.d.ts.map +0 -1
  247. package/dist/cmd/build/vite/vite-builder.js +0 -401
  248. package/dist/cmd/build/vite/vite-builder.js.map +0 -1
  249. package/dist/cmd/build/vite/workbench-generator.d.ts +0 -10
  250. package/dist/cmd/build/vite/workbench-generator.d.ts.map +0 -1
  251. package/dist/cmd/build/vite/workbench-generator.js +0 -135
  252. package/dist/cmd/build/vite/workbench-generator.js.map +0 -1
  253. package/dist/cmd/build/vite/ws-proxy.d.ts +0 -53
  254. package/dist/cmd/build/vite/ws-proxy.d.ts.map +0 -1
  255. package/dist/cmd/build/vite/ws-proxy.js +0 -95
  256. package/dist/cmd/build/vite/ws-proxy.js.map +0 -1
  257. package/dist/cmd/build/vite-bundler.d.ts +0 -29
  258. package/dist/cmd/build/vite-bundler.d.ts.map +0 -1
  259. package/dist/cmd/build/vite-bundler.js +0 -93
  260. package/dist/cmd/build/vite-bundler.js.map +0 -1
  261. package/dist/cmd/dev/agents.d.ts +0 -2
  262. package/dist/cmd/dev/agents.d.ts.map +0 -1
  263. package/dist/cmd/dev/agents.js +0 -123
  264. package/dist/cmd/dev/agents.js.map +0 -1
  265. package/dist/cmd/dev/api.d.ts +0 -20
  266. package/dist/cmd/dev/api.d.ts.map +0 -1
  267. package/dist/cmd/dev/api.js +0 -42
  268. package/dist/cmd/dev/api.js.map +0 -1
  269. package/dist/cmd/dev/dev-lock.d.ts +0 -62
  270. package/dist/cmd/dev/dev-lock.d.ts.map +0 -1
  271. package/dist/cmd/dev/dev-lock.js +0 -250
  272. package/dist/cmd/dev/dev-lock.js.map +0 -1
  273. package/dist/cmd/dev/download.d.ts +0 -11
  274. package/dist/cmd/dev/download.d.ts.map +0 -1
  275. package/dist/cmd/dev/download.js +0 -94
  276. package/dist/cmd/dev/download.js.map +0 -1
  277. package/dist/cmd/dev/file-watcher.d.ts +0 -24
  278. package/dist/cmd/dev/file-watcher.d.ts.map +0 -1
  279. package/dist/cmd/dev/file-watcher.js +0 -349
  280. package/dist/cmd/dev/file-watcher.js.map +0 -1
  281. package/dist/cmd/dev/process-manager.d.ts +0 -104
  282. package/dist/cmd/dev/process-manager.d.ts.map +0 -1
  283. package/dist/cmd/dev/process-manager.js +0 -204
  284. package/dist/cmd/dev/process-manager.js.map +0 -1
  285. package/dist/cmd/dev/sync.d.ts +0 -12
  286. package/dist/cmd/dev/sync.d.ts.map +0 -1
  287. package/dist/cmd/dev/sync.js +0 -227
  288. package/dist/cmd/dev/sync.js.map +0 -1
  289. package/dist/cmd/dev/templates.d.ts +0 -3
  290. package/dist/cmd/dev/templates.d.ts.map +0 -1
  291. package/dist/cmd/dev/templates.js +0 -58
  292. package/dist/cmd/dev/templates.js.map +0 -1
  293. package/dist/cmd/project/download.d.ts +0 -35
  294. package/dist/cmd/project/download.d.ts.map +0 -1
  295. package/dist/cmd/project/download.js +0 -403
  296. package/dist/cmd/project/download.js.map +0 -1
  297. package/dist/cmd/project/templates.d.ts +0 -9
  298. package/dist/cmd/project/templates.d.ts.map +0 -1
  299. package/dist/cmd/project/templates.js +0 -34
  300. package/dist/cmd/project/templates.js.map +0 -1
  301. package/src/agents-docs.ts +0 -86
  302. package/src/cmd/ai/prompt/agent.md +0 -305
  303. package/src/cmd/ai/prompt/agent.ts +0 -31
  304. package/src/cmd/build/app-router-detector.ts +0 -320
  305. package/src/cmd/build/format-schema.ts +0 -66
  306. package/src/cmd/build/vite/agent-discovery.ts +0 -380
  307. package/src/cmd/build/vite/beacon-plugin.ts +0 -164
  308. package/src/cmd/build/vite/browser-env-plugin.ts +0 -34
  309. package/src/cmd/build/vite/bun-dev-server.ts +0 -458
  310. package/src/cmd/build/vite/bundle-files.ts +0 -135
  311. package/src/cmd/build/vite/config-loader.ts +0 -76
  312. package/src/cmd/build/vite/db-rewrite.ts +0 -189
  313. package/src/cmd/build/vite/docs-generator.ts +0 -103
  314. package/src/cmd/build/vite/env-types-generator.ts +0 -145
  315. package/src/cmd/build/vite/index.ts +0 -3
  316. package/src/cmd/build/vite/lifecycle-generator.ts +0 -381
  317. package/src/cmd/build/vite/metadata-generator.ts +0 -713
  318. package/src/cmd/build/vite/prompt-generator.ts +0 -169
  319. package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
  320. package/src/cmd/build/vite/route-discovery.ts +0 -271
  321. package/src/cmd/build/vite/server-bundler.ts +0 -481
  322. package/src/cmd/build/vite/static-renderer.ts +0 -239
  323. package/src/cmd/build/vite/tailwind-source-plugin.ts +0 -73
  324. package/src/cmd/build/vite/vite-asset-server-config.ts +0 -349
  325. package/src/cmd/build/vite/vite-asset-server.ts +0 -154
  326. package/src/cmd/build/vite/vite-builder.ts +0 -503
  327. package/src/cmd/build/vite/workbench-generator.ts +0 -152
  328. package/src/cmd/build/vite/ws-proxy.ts +0 -126
  329. package/src/cmd/build/vite-bundler.ts +0 -137
  330. package/src/cmd/dev/agents.ts +0 -140
  331. package/src/cmd/dev/api.ts +0 -65
  332. package/src/cmd/dev/dev-lock.ts +0 -332
  333. package/src/cmd/dev/download.ts +0 -117
  334. package/src/cmd/dev/file-watcher.ts +0 -423
  335. package/src/cmd/dev/process-manager.ts +0 -261
  336. package/src/cmd/dev/sync.ts +0 -411
  337. package/src/cmd/dev/templates.ts +0 -66
  338. package/src/cmd/project/download.ts +0 -505
  339. package/src/cmd/project/templates.ts +0 -56
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Project creation flow — framework-first scaffolding.
3
+ *
4
+ * Instead of custom Agentuity templates, the user picks a framework
5
+ * and we run its official create CLI, then augment with Agentuity integration.
6
+ */
7
+
1
8
  import { existsSync, readdirSync, rmSync, statSync } from 'node:fs';
2
9
  import { homedir } from 'node:os';
3
10
  import { basename, resolve } from 'node:path';
@@ -38,16 +45,14 @@ import {
38
45
  printIntegrationExamples,
39
46
  runAuthMigrations,
40
47
  } from './auth/shared';
41
- import { downloadTemplate, initGitRepo, setupProject } from './download';
42
- import { fetchTemplates, type TemplateInfo } from './templates';
48
+ import { scaffoldFramework, setupProject, initGitRepo } from './scaffold';
49
+ import { frameworkCatalog, type FrameworkScaffold } from './frameworks';
43
50
 
44
51
  interface CreateFlowOptions {
45
52
  projectName?: string;
46
53
  dir?: string;
47
54
  domains?: string[];
48
- template?: string;
49
- templateDir?: string;
50
- templateBranch?: string;
55
+ framework?: string;
51
56
  noInstall: boolean;
52
57
  noBuild: boolean;
53
58
  skipPrompts: boolean;
@@ -67,7 +72,7 @@ export interface CreateFlowResult {
67
72
  orgId?: string;
68
73
  name: string;
69
74
  path: string;
70
- template: string;
75
+ framework: string;
71
76
  installed: boolean;
72
77
  built: boolean;
73
78
  domains?: string[];
@@ -79,9 +84,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
79
84
  const {
80
85
  projectName: initialProjectName,
81
86
  dir: targetDir,
82
- template: initialTemplate,
83
- templateDir,
84
- templateBranch,
87
+ framework: initialFramework,
85
88
  skipPrompts,
86
89
  logger,
87
90
  auth,
@@ -98,26 +101,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
98
101
  const isHeadless = !process.stdin.isTTY || !process.stdout.isTTY;
99
102
  const isInteractive = !skipPrompts && !isHeadless;
100
103
 
101
- // Fetch available templates
102
- if (templateDir) {
103
- tui.info(`📋 Loading templates from local directory: ${templateDir}...\n`);
104
- }
105
-
106
- const templates = await tui.spinner({
107
- message: 'Fetching templates',
108
- clearOnSuccess: true,
109
- callback: async () => {
110
- return fetchTemplates(logger, templateDir, templateBranch);
111
- },
112
- });
113
-
114
- if (templates.length === 0) {
115
- logger.fatal('No templates available', ErrorCode.RESOURCE_NOT_FOUND);
116
- }
117
-
118
- // Get project name
119
- let projectName = initialProjectName;
120
-
121
104
  // Organization is now automatically selected by the CLI framework via optional: { org: true }
122
105
  const orgId = selectedOrgId;
123
106
  let catalystClient: ServerAPIClient | undefined;
@@ -135,6 +118,9 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
135
118
  prompt.intro('Create Agentuity Project');
136
119
  }
137
120
 
121
+ // Step 1: Get project name
122
+ let projectName = initialProjectName;
123
+
138
124
  if (!projectName && isInteractive) {
139
125
  projectName = await prompt.text({
140
126
  message: 'What is the name of your project?',
@@ -157,13 +143,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
157
143
  },
158
144
  });
159
145
  }
160
- projectName = projectName || 'My First Agent';
146
+ projectName = projectName || 'My First App';
161
147
 
162
148
  // Generate disk-friendly directory name
163
149
  const dirName = projectName === '.' ? '.' : sanitizeDirectoryName(projectName);
164
150
 
165
151
  // Determine destination directory
166
- // Expand ~ to home directory
167
152
  let expandedTargetDir = targetDir;
168
153
  if (expandedTargetDir?.startsWith('~')) {
169
154
  expandedTargetDir = expandedTargetDir.replace(/^~/, homedir());
@@ -175,7 +160,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
175
160
  const destEmpty = destIsDir ? readdirSync(dest).length === 0 : !destExists;
176
161
 
177
162
  if (destExists && !destEmpty && dirName !== '.') {
178
- // In interactive mode, ask if they want to overwrite
179
163
  if (isInteractive) {
180
164
  tui.warning(`Directory ${dest} already exists and is not empty.`, true);
181
165
  console.log(tui.tuiColors.secondary('│'));
@@ -189,7 +173,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
189
173
  process.exit(0);
190
174
  }
191
175
 
192
- // Extra safety: refuse to delete root or home directories
193
176
  const home = homedir();
194
177
  if (dest === '/' || dest === home) {
195
178
  logger.fatal(`Refusing to delete protected path: ${dest}`, ErrorCode.VALIDATION_FAILED);
@@ -206,83 +189,90 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
206
189
  }
207
190
  }
208
191
 
209
- // Step 5: Select template
210
- let selectedTemplate: TemplateInfo;
211
- if (initialTemplate) {
212
- const found = templates.find((t) => t.id === initialTemplate);
192
+ // Step 2: Select framework
193
+ let selectedFramework: FrameworkScaffold;
194
+ if (initialFramework) {
195
+ const found = frameworkCatalog.find((f) => f.slug === initialFramework);
213
196
  if (!found) {
214
- const availableTemplates = templates
215
- .map((t) => ` - ${t.id.padEnd(20)} ${t.description}`)
197
+ const available = frameworkCatalog
198
+ .map((f) => ` - ${f.slug.padEnd(15)} ${f.description}`)
216
199
  .join('\n');
217
200
  logger.fatal(
218
- `Template "${initialTemplate}" not found\n\nAvailable templates:\n${availableTemplates}`,
201
+ `Framework "${initialFramework}" not found\n\nAvailable frameworks:\n${available}`,
219
202
  ErrorCode.RESOURCE_NOT_FOUND
220
203
  );
221
204
  return undefined as never;
222
205
  }
223
- selectedTemplate = found;
224
- } else if (!isInteractive || templates.length === 1) {
225
- const firstTemplate = templates[0];
226
- if (!firstTemplate) {
227
- logger.fatal('No templates available', ErrorCode.RESOURCE_NOT_FOUND);
206
+ selectedFramework = found;
207
+ } else if (!isInteractive || frameworkCatalog.length === 1) {
208
+ const firstFramework = frameworkCatalog[0];
209
+ if (!firstFramework) {
210
+ logger.fatal('No frameworks available', ErrorCode.RESOURCE_NOT_FOUND);
228
211
  return undefined as never;
229
212
  }
230
- selectedTemplate = firstTemplate;
213
+ selectedFramework = firstFramework;
231
214
  } else {
232
215
  let maxLength = 15;
233
- templates.forEach((t) => {
234
- if (maxLength < t.name.length) {
235
- maxLength = t.name.length;
216
+ frameworkCatalog.forEach((f) => {
217
+ if (maxLength < f.name.length) {
218
+ maxLength = f.name.length;
236
219
  }
237
220
  });
238
221
  maxLength = Math.min(maxLength + 1, 40);
239
222
  const [_winWidth] = process.stdout.getWindowSize();
240
- const winWidth = _winWidth - maxLength - 8; // space for the name and left indent
241
- const templateId = await prompt.select({
242
- message: 'Select a template:',
243
- options: templates.map((t) => ({
244
- value: t.id,
245
- label: t.name.padEnd(maxLength),
223
+ const winWidth = _winWidth - maxLength - 8;
224
+ const frameworkId = await prompt.select({
225
+ message: 'Select a framework:',
226
+ options: frameworkCatalog.map((f) => ({
227
+ value: f.slug,
228
+ label: f.name.padEnd(maxLength),
246
229
  hint:
247
- t.description.length > winWidth
248
- ? t.description.substring(0, winWidth - 3) + '...'
249
- : t.description,
230
+ f.description.length > winWidth
231
+ ? f.description.substring(0, winWidth - 3) + '...'
232
+ : f.description,
250
233
  })),
251
234
  });
252
- const found = templates.find((t) => t.id === templateId);
235
+ const found = frameworkCatalog.find((f) => f.slug === frameworkId);
253
236
  if (!found) {
254
- logger.fatal('Template selection failed', ErrorCode.USER_CANCELLED);
237
+ logger.fatal('Framework selection failed', ErrorCode.USER_CANCELLED);
255
238
  return undefined as never;
256
239
  }
257
- selectedTemplate = found;
240
+ selectedFramework = found;
258
241
  }
259
242
 
260
- // Download template
261
- await downloadTemplate({
243
+ // Step 3: Ask about AI example
244
+ let includeAiExample = true;
245
+ if (isInteractive && selectedFramework.aiExample) {
246
+ includeAiExample = await prompt.confirm({
247
+ message: 'Include an AI example? (OpenAI API route)',
248
+ initial: true,
249
+ });
250
+ }
251
+
252
+ // Step 4: Scaffold the framework
253
+ await scaffoldFramework({
262
254
  dest,
263
- template: selectedTemplate,
264
- templateDir,
265
- templateBranch,
255
+ dirName,
256
+ framework: selectedFramework,
257
+ includeAiExample,
266
258
  logger,
267
259
  });
268
260
 
269
- // Setup project (replace placeholders, install deps, build)
261
+ // Step 5: Setup project (install deps)
270
262
  const setupResult = await setupProject({
271
263
  dest,
272
264
  projectName: projectName === '.' ? basename(dest) : projectName,
273
- dirName: dirName === '.' ? basename(dest) : dirName,
274
265
  noInstall: options.noInstall,
275
- noBuild: options.noBuild,
276
266
  logger,
277
267
  });
278
268
 
279
- // If setup failed, skip resource prompts and registration - just show error and return
269
+ // If setup failed, skip resource prompts and registration
280
270
  if (!setupResult.success) {
281
271
  tui.warning('Project setup failed. Skipping resource configuration.');
282
272
  return {
283
273
  name: projectName,
284
274
  path: dest,
285
- template: selectedTemplate.id,
275
+ framework: selectedFramework.slug,
286
276
  installed: !options.noInstall,
287
277
  built: false,
288
278
  success: false,
@@ -290,9 +280,10 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
290
280
  };
291
281
  }
292
282
 
293
- // Add separator bar if we're going to show resource prompts
283
+ // ─── Resource provisioning (DB, storage, auth, DNS) ─────────────────────
284
+ // This section is unchanged from the original flow.
285
+
294
286
  const canProvision = auth && apiClient && catalystClient && orgId && region;
295
- // Only count as resource flags if actually requesting provisioning (not explicit skip)
296
287
  const hasResourceFlags =
297
288
  (databaseOption !== undefined && databaseOption.toLowerCase() !== 'skip') ||
298
289
  (storageOption !== undefined && storageOption.toLowerCase() !== 'skip');
@@ -305,7 +296,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
305
296
  let _domains = domains;
306
297
  const resourceEnvVars: EnvVars = {};
307
298
 
308
- // Validate that resource flags require authentication and registration
309
299
  if (hasResourceFlags && !canProvision) {
310
300
  logger.fatal(
311
301
  'Cannot provision database/storage without being authenticated and registering the project.\n' +
@@ -314,7 +304,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
314
304
  );
315
305
  }
316
306
 
317
- // Validate that --enable-auth requires authentication and registration
318
307
  if (enableAuthOption && !canProvision) {
319
308
  logger.fatal(
320
309
  'Cannot enable Agentuity Auth without being authenticated and registering the project.\n' +
@@ -324,7 +313,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
324
313
  }
325
314
 
326
315
  if (canProvision) {
327
- // Fetch resources for selected org and region using Catalyst API (needed for both interactive and CLI flags)
328
316
  let resources: Awaited<ReturnType<typeof listResources>> | undefined;
329
317
 
330
318
  const needResources =
@@ -340,26 +328,19 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
340
328
  return listResources(catalystClient!, orgId!, region!);
341
329
  },
342
330
  });
343
- // Log sanitized summary (avoid exposing DATABASE_URL, tokens, secrets)
344
331
  logger.debug(
345
332
  `Resources for org ${orgId} in region ${region}: ${resources.db.length} databases, ${resources.s3.length} storage buckets`
346
333
  );
347
- logger.debug(`Database names: ${resources.db.map((d) => d.name).join(', ') || '(none)'}`);
348
- logger.debug(
349
- `Storage buckets: ${resources.s3.map((b) => b.bucket_name).join(', ') || '(none)'}`
350
- );
351
334
  }
352
335
 
353
- // Determine database action: CLI flag > interactive prompt > skip (headless)
336
+ // Database action
354
337
  let db_action: string;
355
338
  if (databaseOption !== undefined) {
356
- // CLI flag provided - normalize to expected values
357
339
  if (databaseOption.toLowerCase() === 'new') {
358
340
  db_action = 'Create New';
359
341
  } else if (databaseOption.toLowerCase() === 'skip') {
360
342
  db_action = 'Skip';
361
343
  } else {
362
- // Existing database name - validate it exists
363
344
  const existingDb = resources?.db.find((d) => d.name === databaseOption);
364
345
  if (!existingDb) {
365
346
  logger.fatal(
@@ -382,20 +363,17 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
382
363
  ],
383
364
  });
384
365
  } else {
385
- // Headless without flag - skip
386
366
  db_action = 'Skip';
387
367
  }
388
368
 
389
- // Determine storage action: CLI flag > interactive prompt > skip (headless)
369
+ // Storage action
390
370
  let s3_action: string;
391
371
  if (storageOption !== undefined) {
392
- // CLI flag provided - normalize to expected values
393
372
  if (storageOption.toLowerCase() === 'new') {
394
373
  s3_action = 'Create New';
395
374
  } else if (storageOption.toLowerCase() === 'skip') {
396
375
  s3_action = 'Skip';
397
376
  } else {
398
- // Existing bucket name - validate it exists
399
377
  const existingBucket = resources?.s3.find((b) => b.bucket_name === storageOption);
400
378
  if (!existingBucket) {
401
379
  logger.fatal(
@@ -418,11 +396,10 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
418
396
  ],
419
397
  });
420
398
  } else {
421
- // Headless without flag - skip
422
399
  s3_action = 'Skip';
423
400
  }
424
401
 
425
- // Custom DNS: only prompt in interactive mode if not already provided
402
+ // Custom DNS
426
403
  if (!domains?.length && isInteractive) {
427
404
  const customDns = await prompt.text({
428
405
  message: 'Setup custom DNS?',
@@ -439,13 +416,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
439
416
  }
440
417
  }
441
418
 
442
- // Process storage action
419
+ // Process storage
443
420
  switch (s3_action) {
444
421
  case 'Create New': {
445
422
  let bucketName: string | undefined;
446
423
  let bucketDescription: string | undefined;
447
424
 
448
- // Only prompt for name/description in interactive mode
449
425
  if (isInteractive) {
450
426
  const bucketNameInput = await prompt.text({
451
427
  message: 'Bucket name',
@@ -478,17 +454,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
478
454
  ]);
479
455
  },
480
456
  });
481
- // Collect env vars from newly created resource
482
457
  if (created[0]?.env) {
483
458
  Object.assign(resourceEnvVars, created[0].env);
484
459
  }
485
460
  break;
486
461
  }
487
- case 'Skip': {
462
+ case 'Skip':
488
463
  break;
489
- }
490
464
  default: {
491
- // User selected an existing bucket - get env vars from the resources list
492
465
  const selectedBucket = resources?.s3.find((b) => b.bucket_name === s3_action);
493
466
  if (selectedBucket?.env) {
494
467
  Object.assign(resourceEnvVars, selectedBucket.env);
@@ -497,13 +470,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
497
470
  }
498
471
  }
499
472
 
500
- // Process database action
473
+ // Process database
501
474
  switch (db_action) {
502
475
  case 'Create New': {
503
476
  let dbName: string | undefined;
504
477
  let dbDescription: string | undefined;
505
478
 
506
- // Only prompt for name/description in interactive mode
507
479
  if (isInteractive) {
508
480
  const dbNameInput = await prompt.text({
509
481
  message: 'Database name',
@@ -536,17 +508,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
536
508
  ]);
537
509
  },
538
510
  });
539
- // Collect env vars from newly created resource
540
511
  if (created[0]?.env) {
541
512
  Object.assign(resourceEnvVars, created[0].env);
542
513
  }
543
514
  break;
544
515
  }
545
- case 'Skip': {
516
+ case 'Skip':
546
517
  break;
547
- }
548
518
  default: {
549
- // User selected an existing database - get env vars from the resources list
550
519
  const selectedDb = resources?.db.find((d) => d.name === db_action);
551
520
  if (selectedDb?.env) {
552
521
  Object.assign(resourceEnvVars, selectedDb.env);
@@ -556,19 +525,15 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
556
525
  }
557
526
  }
558
527
 
559
- // Auth setup - either from template, CLI flag, or user choice
560
- const templateHasAuth = selectedTemplate.id === 'agentuity-auth';
528
+ // ─── Auth setup ─────────────────────────────────────────────────────────
561
529
 
562
- let authEnabled = templateHasAuth; // Auth templates have auth enabled by default
530
+ let authEnabled = false;
563
531
  let authDatabaseName: string | undefined;
564
532
  let authDatabaseUrl: string | undefined;
565
533
 
566
- // Handle auth enablement: CLI flag > interactive prompt > disabled (headless)
567
534
  if (enableAuthOption !== undefined) {
568
- // CLI flag provided
569
535
  authEnabled = enableAuthOption;
570
- } else if (canProvision && isInteractive && !templateHasAuth) {
571
- // For non-auth templates in interactive mode, ask if they want to enable auth
536
+ } else if (canProvision && isInteractive) {
572
537
  const enableAuth = await prompt.select({
573
538
  message: 'Enable Agentuity Authentication?',
574
539
  options: [
@@ -581,26 +546,20 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
581
546
  authEnabled = true;
582
547
  }
583
548
  }
584
- // In headless mode without --enable-auth flag, authEnabled stays false (unless template has auth)
585
549
 
586
- // Set up database and secret for any auth-enabled project
587
550
  if (authEnabled && canProvision) {
588
- // If a database was already selected/created above, use it for auth
589
551
  if (resourceEnvVars.DATABASE_URL) {
590
552
  authDatabaseUrl = resourceEnvVars.DATABASE_URL;
591
- // Extract database name from URL using proper URL parsing
592
553
  try {
593
554
  const dbUrl = new URL(authDatabaseUrl);
594
- const dbName = dbUrl.pathname.replace(/^\/+/, ''); // Remove leading slashes
595
- // Validate: non-empty and contains only safe characters
555
+ const dbName = dbUrl.pathname.replace(/^\/+/, '');
596
556
  if (dbName && /^[A-Za-z0-9_-]+$/.test(dbName)) {
597
557
  authDatabaseName = dbName;
598
558
  }
599
559
  } catch {
600
- // Invalid URL format, authDatabaseName stays undefined
560
+ // Invalid URL format
601
561
  }
602
562
  } else {
603
- // No database selected yet, create one for auth
604
563
  const created = await tui.spinner({
605
564
  message: 'Provisioning database for auth',
606
565
  clearOnSuccess: true,
@@ -615,33 +574,26 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
615
574
  }
616
575
  authDatabaseName = createdDb.name;
617
576
 
618
- // Get env vars from created resource
619
577
  if (createdDb.env) {
620
578
  authDatabaseUrl = createdDb.env.DATABASE_URL;
621
- // Also add to resourceEnvVars if not already set
622
579
  if (!resourceEnvVars.DATABASE_URL) {
623
580
  Object.assign(resourceEnvVars, createdDb.env);
624
581
  }
625
582
  }
626
583
  }
627
584
 
628
- // Install auth dependencies (skip for agentuity-auth template which has them)
629
- if (!templateHasAuth) {
630
- await ensureAuthDependencies({ projectDir: dest, logger });
585
+ await ensureAuthDependencies({ projectDir: dest, logger });
631
586
 
632
- // Generate auth.ts
633
- const authFilePath = resolve(dest, 'src', 'auth.ts');
634
- if (!existsSync(authFilePath)) {
635
- const srcDir = resolve(dest, 'src');
636
- if (!existsSync(srcDir)) {
637
- await Bun.write(resolve(srcDir, '.gitkeep'), '');
638
- }
639
- await Bun.write(authFilePath, generateAuthFileContent());
640
- tui.success('Created src/auth.ts');
587
+ const authFilePath = resolve(dest, 'src', 'auth.ts');
588
+ if (!existsSync(authFilePath)) {
589
+ const srcDir = resolve(dest, 'src');
590
+ if (!existsSync(srcDir)) {
591
+ await Bun.write(resolve(srcDir, '.gitkeep'), '');
641
592
  }
593
+ await Bun.write(authFilePath, generateAuthFileContent());
594
+ tui.success('Created src/auth.ts');
642
595
  }
643
596
 
644
- // Run migrations
645
597
  if (authDatabaseName) {
646
598
  const sql = await tui.spinner({
647
599
  message: 'Preparing auth database schema...',
@@ -661,6 +613,8 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
661
613
  }
662
614
  }
663
615
 
616
+ // ─── Cloud registration ─────────────────────────────────────────────────
617
+
664
618
  let projectId: string | undefined;
665
619
 
666
620
  if (auth && apiClient && orgId) {
@@ -702,17 +656,16 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
702
656
  },
703
657
  });
704
658
 
705
- // Add auth secret to resourceEnvVars if auth is enabled
659
+ // Add auth secret
706
660
  if (authEnabled && !resourceEnvVars.AGENTUITY_AUTH_SECRET) {
707
661
  const devSecret = `dev-${crypto.randomUUID()}`;
708
662
  resourceEnvVars.AGENTUITY_AUTH_SECRET = devSecret;
709
663
  }
710
664
 
711
- // Write resource environment variables to .env
665
+ // Write resource env vars
712
666
  if (Object.keys(resourceEnvVars).length > 0) {
713
667
  await addResourceEnvVars(dest, resourceEnvVars);
714
668
 
715
- // Show user feedback for auth-related env vars
716
669
  if (authEnabled) {
717
670
  if (resourceEnvVars.DATABASE_URL) {
718
671
  tui.success('DATABASE_URL added to .env');
@@ -726,7 +679,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
726
679
  }
727
680
  }
728
681
 
729
- // After registration, push any existing env/secrets from .env
682
+ // Sync env vars to cloud
730
683
  if (projectId) {
731
684
  await tui.spinner({
732
685
  message: 'Syncing environment variables',
@@ -749,7 +702,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
749
702
  );
750
703
  }
751
704
  } catch (error) {
752
- // Non-fatal: just log the error
753
705
  logger.debug('Failed to sync environment variables:', error);
754
706
  }
755
707
  },
@@ -757,7 +709,8 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
757
709
  }
758
710
  }
759
711
 
760
- // Fetch GitHub App bot identity for commit authorship (if authenticated)
712
+ // ─── Git initialization ─────────────────────────────────────────────────
713
+
761
714
  let botAuthor: { name: string; email: string } | undefined;
762
715
  if (apiClient) {
763
716
  try {
@@ -767,14 +720,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
767
720
  }
768
721
  }
769
722
 
770
- // Initialize git repository after all files are generated
771
723
  await initGitRepo(dest, {
772
724
  projectName,
773
- source: `template: ${selectedTemplate.name}`,
725
+ source: `framework: ${selectedFramework.name}`,
774
726
  author: botAuthor,
775
727
  });
776
728
 
777
- // Show completion message
729
+ // ─── Completion ─────────────────────────────────────────────────────────
730
+
778
731
  if (isInteractive) {
779
732
  if (setupResult.success) {
780
733
  tui.success('✨ Project created successfully!\n');
@@ -782,9 +735,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
782
735
  tui.warning('Project created with errors (see above)\n');
783
736
  }
784
737
 
785
- // Show next steps in a box with primary color for commands
786
738
  if (dirName !== '.') {
787
- // Use relative path if dest is under cwd, otherwise show full path
788
739
  const currentDir = cwd();
789
740
  const dirDisplay = dest.startsWith(currentDir) ? basename(dest) : dest;
790
741
  note(
@@ -819,8 +770,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
819
770
  }
820
771
  }
821
772
 
822
- // Print auth integration examples if auth was enabled (skip for auth template - already set up)
823
- if (authEnabled && !templateHasAuth) {
773
+ if (authEnabled) {
824
774
  printIntegrationExamples();
825
775
  }
826
776
 
@@ -829,7 +779,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
829
779
  orgId,
830
780
  name: projectName,
831
781
  path: dest,
832
- template: selectedTemplate.id,
782
+ framework: selectedFramework.slug,
833
783
  installed: !options.noInstall,
834
784
  built: !options.noBuild && setupResult.success,
835
785
  domains: _domains,
@@ -840,19 +790,15 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
840
790
 
841
791
  /**
842
792
  * Sanitize a project name to create a safe directory/package name
843
- * - Converts to lowercase
844
- * - Replaces spaces and underscores with hyphens
845
- * - Removes unsafe characters
846
- * - Ensures it starts with a letter or number
847
793
  */
848
794
  function sanitizeDirectoryName(name: string): string {
849
795
  return name
850
796
  .toLowerCase()
851
797
  .trim()
852
- .replace(/\s+/g, '-') // Replace spaces with hyphens
853
- .replace(/_+/g, '-') // Replace underscores with hyphens
854
- .replace(/[^a-z0-9-]/g, '') // Remove non-alphanumeric except hyphens
855
- .replace(/-+/g, '-') // Collapse multiple hyphens
856
- .replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens
857
- .replace(/^[^a-z0-9]+/, ''); // Remove leading non-alphanumeric
798
+ .replace(/\s+/g, '-')
799
+ .replace(/_+/g, '-')
800
+ .replace(/[^a-z0-9-]/g, '')
801
+ .replace(/-+/g, '-')
802
+ .replace(/^-+|-+$/g, '')
803
+ .replace(/^[^a-z0-9]+/, '');
858
804
  }