@launch77/cli 1.2.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 (398) hide show
  1. package/.eslintrc.json +6 -0
  2. package/dist/app-templates/webapp/.env.ci +6 -0
  3. package/dist/app-templates/webapp/.env.example +9 -0
  4. package/dist/app-templates/webapp/.eslintrc.json +6 -0
  5. package/dist/app-templates/webapp/README.md.hbs +80 -0
  6. package/dist/app-templates/webapp/app/about/page.tsx.hbs +41 -0
  7. package/dist/app-templates/webapp/app/dashboard/page.tsx.hbs +51 -0
  8. package/dist/app-templates/webapp/app/globals.css +31 -0
  9. package/dist/app-templates/webapp/app/layout.tsx.hbs +26 -0
  10. package/dist/app-templates/webapp/app/page.tsx.hbs +30 -0
  11. package/dist/app-templates/webapp/next.config.js +99 -0
  12. package/dist/app-templates/webapp/package.json.hbs +30 -0
  13. package/dist/app-templates/webapp/postcss.config.js +6 -0
  14. package/dist/app-templates/webapp/tailwind.config.ts +24 -0
  15. package/dist/app-templates/webapp/tsconfig.json +29 -0
  16. package/dist/app-templates/webapp/vercel.json.hbs +7 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +29 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/infrastructure/filesystem.d.ts +41 -0
  22. package/dist/infrastructure/filesystem.d.ts.map +1 -0
  23. package/dist/infrastructure/filesystem.js +61 -0
  24. package/dist/infrastructure/filesystem.js.map +1 -0
  25. package/dist/infrastructure/npm.d.ts +9 -0
  26. package/dist/infrastructure/npm.d.ts.map +1 -0
  27. package/dist/infrastructure/npm.js +17 -0
  28. package/dist/infrastructure/npm.js.map +1 -0
  29. package/dist/infrastructure/template-engine.d.ts +12 -0
  30. package/dist/infrastructure/template-engine.d.ts.map +1 -0
  31. package/dist/infrastructure/template-engine.js +40 -0
  32. package/dist/infrastructure/template-engine.js.map +1 -0
  33. package/dist/infrastructure/template-generator.d.ts +9 -0
  34. package/dist/infrastructure/template-generator.d.ts.map +1 -0
  35. package/dist/infrastructure/template-generator.js +19 -0
  36. package/dist/infrastructure/template-generator.js.map +1 -0
  37. package/dist/infrastructure/template.d.ts +20 -0
  38. package/dist/infrastructure/template.d.ts.map +1 -0
  39. package/dist/infrastructure/template.js +53 -0
  40. package/dist/infrastructure/template.js.map +1 -0
  41. package/dist/modules/app/commands/create-app.d.ts +3 -0
  42. package/dist/modules/app/commands/create-app.d.ts.map +1 -0
  43. package/dist/modules/app/commands/create-app.js +51 -0
  44. package/dist/modules/app/commands/create-app.js.map +1 -0
  45. package/dist/modules/app/commands/delete-app.d.ts +3 -0
  46. package/dist/modules/app/commands/delete-app.d.ts.map +1 -0
  47. package/dist/modules/app/commands/delete-app.js +109 -0
  48. package/dist/modules/app/commands/delete-app.js.map +1 -0
  49. package/dist/modules/app/commands/generate-manifest.d.ts +3 -0
  50. package/dist/modules/app/commands/generate-manifest.d.ts.map +1 -0
  51. package/dist/modules/app/commands/generate-manifest.js +62 -0
  52. package/dist/modules/app/commands/generate-manifest.js.map +1 -0
  53. package/dist/modules/app/commands/validate-manifest.d.ts +3 -0
  54. package/dist/modules/app/commands/validate-manifest.d.ts.map +1 -0
  55. package/dist/modules/app/commands/validate-manifest.js +68 -0
  56. package/dist/modules/app/commands/validate-manifest.js.map +1 -0
  57. package/dist/modules/app/errors/app-errors.d.ts +19 -0
  58. package/dist/modules/app/errors/app-errors.d.ts.map +1 -0
  59. package/dist/modules/app/errors/app-errors.js +37 -0
  60. package/dist/modules/app/errors/app-errors.js.map +1 -0
  61. package/dist/modules/app/index.d.ts +10 -0
  62. package/dist/modules/app/index.d.ts.map +1 -0
  63. package/dist/modules/app/index.js +11 -0
  64. package/dist/modules/app/index.js.map +1 -0
  65. package/dist/modules/app/lib/manifest-schema.d.ts +39 -0
  66. package/dist/modules/app/lib/manifest-schema.d.ts.map +1 -0
  67. package/dist/modules/app/lib/manifest-schema.js +44 -0
  68. package/dist/modules/app/lib/manifest-schema.js.map +1 -0
  69. package/dist/modules/app/services/app-svc.d.ts +15 -0
  70. package/dist/modules/app/services/app-svc.d.ts.map +1 -0
  71. package/dist/modules/app/services/app-svc.js +90 -0
  72. package/dist/modules/app/services/app-svc.js.map +1 -0
  73. package/dist/modules/app/services/manifest-svc.d.ts +28 -0
  74. package/dist/modules/app/services/manifest-svc.d.ts.map +1 -0
  75. package/dist/modules/app/services/manifest-svc.js +119 -0
  76. package/dist/modules/app/services/manifest-svc.js.map +1 -0
  77. package/dist/modules/app/types/app-types.d.ts +21 -0
  78. package/dist/modules/app/types/app-types.d.ts.map +1 -0
  79. package/dist/modules/app/types/app-types.js +5 -0
  80. package/dist/modules/app/types/app-types.js.map +1 -0
  81. package/dist/modules/catalog/commands/generate.d.ts +9 -0
  82. package/dist/modules/catalog/commands/generate.d.ts.map +1 -0
  83. package/dist/modules/catalog/commands/generate.js +94 -0
  84. package/dist/modules/catalog/commands/generate.js.map +1 -0
  85. package/dist/modules/catalog/commands/scan.d.ts +9 -0
  86. package/dist/modules/catalog/commands/scan.d.ts.map +1 -0
  87. package/dist/modules/catalog/commands/scan.js +43 -0
  88. package/dist/modules/catalog/commands/scan.js.map +1 -0
  89. package/dist/modules/catalog/config/catalog-config.d.ts +49 -0
  90. package/dist/modules/catalog/config/catalog-config.d.ts.map +1 -0
  91. package/dist/modules/catalog/config/catalog-config.js +116 -0
  92. package/dist/modules/catalog/config/catalog-config.js.map +1 -0
  93. package/dist/modules/catalog/config/catalog-config.test.d.ts +2 -0
  94. package/dist/modules/catalog/config/catalog-config.test.d.ts.map +1 -0
  95. package/dist/modules/catalog/config/catalog-config.test.js +362 -0
  96. package/dist/modules/catalog/config/catalog-config.test.js.map +1 -0
  97. package/dist/modules/catalog/index.d.ts +9 -0
  98. package/dist/modules/catalog/index.d.ts.map +1 -0
  99. package/dist/modules/catalog/index.js +9 -0
  100. package/dist/modules/catalog/index.js.map +1 -0
  101. package/dist/modules/catalog/parsers/typescript-parser.d.ts +15 -0
  102. package/dist/modules/catalog/parsers/typescript-parser.d.ts.map +1 -0
  103. package/dist/modules/catalog/parsers/typescript-parser.js +82 -0
  104. package/dist/modules/catalog/parsers/typescript-parser.js.map +1 -0
  105. package/dist/modules/catalog/scanners/metadata-extractor.d.ts +10 -0
  106. package/dist/modules/catalog/scanners/metadata-extractor.d.ts.map +1 -0
  107. package/dist/modules/catalog/scanners/metadata-extractor.js +122 -0
  108. package/dist/modules/catalog/scanners/metadata-extractor.js.map +1 -0
  109. package/dist/modules/catalog/scanners/metadata-validator.d.ts +6 -0
  110. package/dist/modules/catalog/scanners/metadata-validator.d.ts.map +1 -0
  111. package/dist/modules/catalog/scanners/metadata-validator.js +57 -0
  112. package/dist/modules/catalog/scanners/metadata-validator.js.map +1 -0
  113. package/dist/modules/catalog/scanners/ui-component-scanner.d.ts +11 -0
  114. package/dist/modules/catalog/scanners/ui-component-scanner.d.ts.map +1 -0
  115. package/dist/modules/catalog/scanners/ui-component-scanner.js +147 -0
  116. package/dist/modules/catalog/scanners/ui-component-scanner.js.map +1 -0
  117. package/dist/modules/catalog/schemas/catalog-ui-components.schema.json +161 -0
  118. package/dist/modules/catalog/schemas/schemas/catalog-ui-components.schema.json +145 -0
  119. package/dist/modules/catalog/services/catalog-generator-svc.d.ts +27 -0
  120. package/dist/modules/catalog/services/catalog-generator-svc.d.ts.map +1 -0
  121. package/dist/modules/catalog/services/catalog-generator-svc.js +100 -0
  122. package/dist/modules/catalog/services/catalog-generator-svc.js.map +1 -0
  123. package/dist/modules/catalog/services/catalog-generator-svc.test.d.ts +2 -0
  124. package/dist/modules/catalog/services/catalog-generator-svc.test.d.ts.map +1 -0
  125. package/dist/modules/catalog/services/catalog-generator-svc.test.js +201 -0
  126. package/dist/modules/catalog/services/catalog-generator-svc.test.js.map +1 -0
  127. package/dist/modules/catalog/services/catalog-svc.d.ts +39 -0
  128. package/dist/modules/catalog/services/catalog-svc.d.ts.map +1 -0
  129. package/dist/modules/catalog/services/catalog-svc.js +163 -0
  130. package/dist/modules/catalog/services/catalog-svc.js.map +1 -0
  131. package/dist/modules/catalog/types/catalog-types.d.ts +120 -0
  132. package/dist/modules/catalog/types/catalog-types.d.ts.map +1 -0
  133. package/dist/modules/catalog/types/catalog-types.js +5 -0
  134. package/dist/modules/catalog/types/catalog-types.js.map +1 -0
  135. package/dist/modules/catalog/utils/examples-generator.d.ts +6 -0
  136. package/dist/modules/catalog/utils/examples-generator.d.ts.map +1 -0
  137. package/dist/modules/catalog/utils/examples-generator.js +55 -0
  138. package/dist/modules/catalog/utils/examples-generator.js.map +1 -0
  139. package/dist/modules/catalog/utils/quality-reporter.d.ts +13 -0
  140. package/dist/modules/catalog/utils/quality-reporter.d.ts.map +1 -0
  141. package/dist/modules/catalog/utils/quality-reporter.js +64 -0
  142. package/dist/modules/catalog/utils/quality-reporter.js.map +1 -0
  143. package/dist/modules/catalog/validators/component-name-validator.d.ts +20 -0
  144. package/dist/modules/catalog/validators/component-name-validator.d.ts.map +1 -0
  145. package/dist/modules/catalog/validators/component-name-validator.js +33 -0
  146. package/dist/modules/catalog/validators/component-name-validator.js.map +1 -0
  147. package/dist/modules/catalog/validators/component-name-validator.test.d.ts +2 -0
  148. package/dist/modules/catalog/validators/component-name-validator.test.d.ts.map +1 -0
  149. package/dist/modules/catalog/validators/component-name-validator.test.js +196 -0
  150. package/dist/modules/catalog/validators/component-name-validator.test.js.map +1 -0
  151. package/dist/modules/deploy/commands/deploy-init-action.d.ts +12 -0
  152. package/dist/modules/deploy/commands/deploy-init-action.d.ts.map +1 -0
  153. package/dist/modules/deploy/commands/deploy-init-action.js +220 -0
  154. package/dist/modules/deploy/commands/deploy-init-action.js.map +1 -0
  155. package/dist/modules/deploy/commands/deploy-init.d.ts +6 -0
  156. package/dist/modules/deploy/commands/deploy-init.d.ts.map +1 -0
  157. package/dist/modules/deploy/commands/deploy-init.js +16 -0
  158. package/dist/modules/deploy/commands/deploy-init.js.map +1 -0
  159. package/dist/modules/deploy/commands/deploy-logs-action.d.ts +12 -0
  160. package/dist/modules/deploy/commands/deploy-logs-action.d.ts.map +1 -0
  161. package/dist/modules/deploy/commands/deploy-logs-action.js +113 -0
  162. package/dist/modules/deploy/commands/deploy-logs-action.js.map +1 -0
  163. package/dist/modules/deploy/commands/deploy-logs.d.ts +6 -0
  164. package/dist/modules/deploy/commands/deploy-logs.d.ts.map +1 -0
  165. package/dist/modules/deploy/commands/deploy-logs.js +17 -0
  166. package/dist/modules/deploy/commands/deploy-logs.js.map +1 -0
  167. package/dist/modules/deploy/commands/deploy-status-action.d.ts +8 -0
  168. package/dist/modules/deploy/commands/deploy-status-action.d.ts.map +1 -0
  169. package/dist/modules/deploy/commands/deploy-status-action.js +153 -0
  170. package/dist/modules/deploy/commands/deploy-status-action.js.map +1 -0
  171. package/dist/modules/deploy/commands/deploy-status.d.ts +6 -0
  172. package/dist/modules/deploy/commands/deploy-status.d.ts.map +1 -0
  173. package/dist/modules/deploy/commands/deploy-status.js +13 -0
  174. package/dist/modules/deploy/commands/deploy-status.js.map +1 -0
  175. package/dist/modules/deploy/index.d.ts +7 -0
  176. package/dist/modules/deploy/index.d.ts.map +1 -0
  177. package/dist/modules/deploy/index.js +7 -0
  178. package/dist/modules/deploy/index.js.map +1 -0
  179. package/dist/modules/deploy/services/deploy-svc.d.ts +17 -0
  180. package/dist/modules/deploy/services/deploy-svc.d.ts.map +1 -0
  181. package/dist/modules/deploy/services/deploy-svc.js +25 -0
  182. package/dist/modules/deploy/services/deploy-svc.js.map +1 -0
  183. package/dist/modules/deploy/utils/vercel-extended.d.ts +63 -0
  184. package/dist/modules/deploy/utils/vercel-extended.d.ts.map +1 -0
  185. package/dist/modules/deploy/utils/vercel-extended.js +238 -0
  186. package/dist/modules/deploy/utils/vercel-extended.js.map +1 -0
  187. package/dist/modules/plugin/commands/plugin-install.d.ts +3 -0
  188. package/dist/modules/plugin/commands/plugin-install.d.ts.map +1 -0
  189. package/dist/modules/plugin/commands/plugin-install.js +45 -0
  190. package/dist/modules/plugin/commands/plugin-install.js.map +1 -0
  191. package/dist/modules/plugin/errors/plugin-errors.d.ts +16 -0
  192. package/dist/modules/plugin/errors/plugin-errors.d.ts.map +1 -0
  193. package/dist/modules/plugin/errors/plugin-errors.js +39 -0
  194. package/dist/modules/plugin/errors/plugin-errors.js.map +1 -0
  195. package/dist/modules/plugin/index.d.ts +6 -0
  196. package/dist/modules/plugin/index.d.ts.map +1 -0
  197. package/dist/modules/plugin/index.js +9 -0
  198. package/dist/modules/plugin/index.js.map +1 -0
  199. package/dist/modules/plugin/lib/plugin-registry.d.ts +15 -0
  200. package/dist/modules/plugin/lib/plugin-registry.d.ts.map +1 -0
  201. package/dist/modules/plugin/lib/plugin-registry.js +47 -0
  202. package/dist/modules/plugin/lib/plugin-registry.js.map +1 -0
  203. package/dist/modules/plugin/services/plugin-svc.d.ts +10 -0
  204. package/dist/modules/plugin/services/plugin-svc.d.ts.map +1 -0
  205. package/dist/modules/plugin/services/plugin-svc.js +44 -0
  206. package/dist/modules/plugin/services/plugin-svc.js.map +1 -0
  207. package/dist/modules/plugin/types/plugin-types.d.ts +19 -0
  208. package/dist/modules/plugin/types/plugin-types.d.ts.map +1 -0
  209. package/dist/modules/plugin/types/plugin-types.js +2 -0
  210. package/dist/modules/plugin/types/plugin-types.js.map +1 -0
  211. package/dist/modules/startup/commands/create-startup.d.ts +3 -0
  212. package/dist/modules/startup/commands/create-startup.d.ts.map +1 -0
  213. package/dist/modules/startup/commands/create-startup.js +43 -0
  214. package/dist/modules/startup/commands/create-startup.js.map +1 -0
  215. package/dist/modules/startup/errors/startup-errors.d.ts +13 -0
  216. package/dist/modules/startup/errors/startup-errors.d.ts.map +1 -0
  217. package/dist/modules/startup/errors/startup-errors.js +25 -0
  218. package/dist/modules/startup/errors/startup-errors.js.map +1 -0
  219. package/dist/modules/startup/index.d.ts +5 -0
  220. package/dist/modules/startup/index.d.ts.map +1 -0
  221. package/dist/modules/startup/index.js +7 -0
  222. package/dist/modules/startup/index.js.map +1 -0
  223. package/dist/modules/startup/services/startup-service.d.ts +7 -0
  224. package/dist/modules/startup/services/startup-service.d.ts.map +1 -0
  225. package/dist/modules/startup/services/startup-service.js +43 -0
  226. package/dist/modules/startup/services/startup-service.js.map +1 -0
  227. package/dist/modules/startup/types/startup-types.d.ts +8 -0
  228. package/dist/modules/startup/types/startup-types.d.ts.map +1 -0
  229. package/dist/modules/startup/types/startup-types.js +2 -0
  230. package/dist/modules/startup/types/startup-types.js.map +1 -0
  231. package/dist/modules/startup/utils/startup-validators.d.ts +8 -0
  232. package/dist/modules/startup/utils/startup-validators.d.ts.map +1 -0
  233. package/dist/modules/startup/utils/startup-validators.js +17 -0
  234. package/dist/modules/startup/utils/startup-validators.js.map +1 -0
  235. package/dist/modules/workspace/commands/init-workspace.d.ts +3 -0
  236. package/dist/modules/workspace/commands/init-workspace.d.ts.map +1 -0
  237. package/dist/modules/workspace/commands/init-workspace.js +54 -0
  238. package/dist/modules/workspace/commands/init-workspace.js.map +1 -0
  239. package/dist/modules/workspace/errors/workspace-errors.d.ts +10 -0
  240. package/dist/modules/workspace/errors/workspace-errors.d.ts.map +1 -0
  241. package/dist/modules/workspace/errors/workspace-errors.js +19 -0
  242. package/dist/modules/workspace/errors/workspace-errors.js.map +1 -0
  243. package/dist/modules/workspace/index.d.ts +5 -0
  244. package/dist/modules/workspace/index.d.ts.map +1 -0
  245. package/dist/modules/workspace/index.js +7 -0
  246. package/dist/modules/workspace/index.js.map +1 -0
  247. package/dist/modules/workspace/services/workspace-service.d.ts +6 -0
  248. package/dist/modules/workspace/services/workspace-service.d.ts.map +1 -0
  249. package/dist/modules/workspace/services/workspace-service.js +46 -0
  250. package/dist/modules/workspace/services/workspace-service.js.map +1 -0
  251. package/dist/modules/workspace/types/workspace-types.d.ts +8 -0
  252. package/dist/modules/workspace/types/workspace-types.d.ts.map +1 -0
  253. package/dist/modules/workspace/types/workspace-types.js +2 -0
  254. package/dist/modules/workspace/types/workspace-types.js.map +1 -0
  255. package/dist/modules/workspace/utils/workspace-validators.d.ts +8 -0
  256. package/dist/modules/workspace/utils/workspace-validators.d.ts.map +1 -0
  257. package/dist/modules/workspace/utils/workspace-validators.js +17 -0
  258. package/dist/modules/workspace/utils/workspace-validators.js.map +1 -0
  259. package/dist/plugins/theme/package.json +32 -0
  260. package/dist/plugins/theme/plugin.json +9 -0
  261. package/dist/plugins/theme/src/generator.ts +92 -0
  262. package/dist/plugins/theme/src/utils/config-modifier.ts +142 -0
  263. package/dist/plugins/theme/src/utils/css-modifier.ts +89 -0
  264. package/dist/plugins/theme/templates/app/theme-test/page.tsx +156 -0
  265. package/dist/plugins/theme/templates/src/modules/theme/README.md +209 -0
  266. package/dist/plugins/theme/templates/src/modules/theme/config/brand.css +23 -0
  267. package/dist/plugins/theme/tsconfig.json +14 -0
  268. package/dist/plugins/theme/tsup.config.ts +10 -0
  269. package/dist/templates/startup/apps/.gitkeep +8 -0
  270. package/dist/templates/templates/startup/apps/.gitkeep +8 -0
  271. package/dist/templates/templates/workspace/.eslintignore +7 -0
  272. package/dist/templates/templates/workspace/.eslintrc.js +38 -0
  273. package/dist/templates/templates/workspace/.husky/pre-push +24 -0
  274. package/dist/templates/templates/workspace/.launch77/workspace.json +3 -0
  275. package/dist/templates/templates/workspace/.lintstagedrc.json +4 -0
  276. package/dist/templates/templates/workspace/.prettierrc +9 -0
  277. package/dist/templates/templates/workspace/README.md +62 -0
  278. package/dist/templates/templates/workspace/app-templates/.gitkeep +1 -0
  279. package/dist/templates/templates/workspace/apps/.gitkeep +1 -0
  280. package/dist/templates/templates/workspace/libraries/.gitkeep +1 -0
  281. package/dist/templates/templates/workspace/package.json +31 -0
  282. package/dist/templates/templates/workspace/plugins/.gitkeep +1 -0
  283. package/dist/templates/templates/workspace/tsconfig.json +22 -0
  284. package/dist/templates/templates/workspace/turbo.json +25 -0
  285. package/dist/templates/workspace/.launch77/workspace.json +3 -0
  286. package/dist/templates/workspace/README.md +62 -0
  287. package/dist/templates/workspace/app-templates/.gitkeep +1 -0
  288. package/dist/templates/workspace/apps/.gitkeep +1 -0
  289. package/dist/templates/workspace/libraries/.gitkeep +1 -0
  290. package/dist/templates/workspace/package.json +21 -0
  291. package/dist/templates/workspace/plugins/.gitkeep +1 -0
  292. package/dist/templates/workspace/tsconfig.json +22 -0
  293. package/dist/templates/workspace/turbo.json +25 -0
  294. package/dist/utils/launch77-context.d.ts +16 -0
  295. package/dist/utils/launch77-context.d.ts.map +1 -0
  296. package/dist/utils/launch77-context.js +111 -0
  297. package/dist/utils/launch77-context.js.map +1 -0
  298. package/dist/utils/launch77-validation.d.ts +17 -0
  299. package/dist/utils/launch77-validation.d.ts.map +1 -0
  300. package/dist/utils/launch77-validation.js +44 -0
  301. package/dist/utils/launch77-validation.js.map +1 -0
  302. package/dist/utils/monorepo.d.ts +19 -0
  303. package/dist/utils/monorepo.d.ts.map +1 -0
  304. package/dist/utils/monorepo.js +100 -0
  305. package/dist/utils/monorepo.js.map +1 -0
  306. package/dist/utils/validation.d.ts +32 -0
  307. package/dist/utils/validation.d.ts.map +1 -0
  308. package/dist/utils/validation.js +92 -0
  309. package/dist/utils/validation.js.map +1 -0
  310. package/dist/utils/version.d.ts +7 -0
  311. package/dist/utils/version.d.ts.map +1 -0
  312. package/dist/utils/version.js +16 -0
  313. package/dist/utils/version.js.map +1 -0
  314. package/launch77-cli-1.2.0.tgz +0 -0
  315. package/package.json +48 -0
  316. package/src/cli.ts +34 -0
  317. package/src/infrastructure/filesystem.ts +69 -0
  318. package/src/infrastructure/npm.ts +18 -0
  319. package/src/infrastructure/template-engine.ts +48 -0
  320. package/src/infrastructure/template-generator.ts +26 -0
  321. package/src/infrastructure/template.ts +66 -0
  322. package/src/modules/app/commands/create-app.ts +60 -0
  323. package/src/modules/app/commands/delete-app.ts +123 -0
  324. package/src/modules/app/commands/generate-manifest.ts +75 -0
  325. package/src/modules/app/commands/validate-manifest.ts +78 -0
  326. package/src/modules/app/errors/app-errors.ts +41 -0
  327. package/src/modules/app/index.ts +16 -0
  328. package/src/modules/app/lib/manifest-schema.ts +65 -0
  329. package/src/modules/app/services/app-svc.ts +115 -0
  330. package/src/modules/app/services/manifest-svc.ts +144 -0
  331. package/src/modules/app/types/app-types.ts +27 -0
  332. package/src/modules/catalog/commands/generate.ts +115 -0
  333. package/src/modules/catalog/commands/scan.ts +48 -0
  334. package/src/modules/catalog/config/catalog-config.test.ts +404 -0
  335. package/src/modules/catalog/config/catalog-config.ts +130 -0
  336. package/src/modules/catalog/index.ts +9 -0
  337. package/src/modules/catalog/parsers/typescript-parser.ts +93 -0
  338. package/src/modules/catalog/scanners/metadata-extractor.ts +134 -0
  339. package/src/modules/catalog/scanners/metadata-validator.ts +67 -0
  340. package/src/modules/catalog/scanners/ui-component-scanner.ts +185 -0
  341. package/src/modules/catalog/schemas/catalog-ui-components.schema.json +145 -0
  342. package/src/modules/catalog/services/catalog-generator-svc.test.ts +233 -0
  343. package/src/modules/catalog/services/catalog-generator-svc.ts +124 -0
  344. package/src/modules/catalog/services/catalog-svc.ts +222 -0
  345. package/src/modules/catalog/types/catalog-types.ts +149 -0
  346. package/src/modules/catalog/utils/examples-generator.ts +68 -0
  347. package/src/modules/catalog/utils/quality-reporter.ts +76 -0
  348. package/src/modules/catalog/validators/component-name-validator.test.ts +233 -0
  349. package/src/modules/catalog/validators/component-name-validator.ts +43 -0
  350. package/src/modules/deploy/commands/deploy-init-action.ts +247 -0
  351. package/src/modules/deploy/commands/deploy-init.ts +19 -0
  352. package/src/modules/deploy/commands/deploy-logs-action.ts +135 -0
  353. package/src/modules/deploy/commands/deploy-logs.ts +20 -0
  354. package/src/modules/deploy/commands/deploy-status-action.ts +175 -0
  355. package/src/modules/deploy/commands/deploy-status.ts +16 -0
  356. package/src/modules/deploy/index.ts +7 -0
  357. package/src/modules/deploy/services/deploy-svc.ts +31 -0
  358. package/src/modules/deploy/utils/vercel-extended.ts +286 -0
  359. package/src/modules/plugin/commands/plugin-install.ts +51 -0
  360. package/src/modules/plugin/errors/plugin-errors.ts +44 -0
  361. package/src/modules/plugin/index.ts +14 -0
  362. package/src/modules/plugin/lib/launch77-workspace.code-workspace +14 -0
  363. package/src/modules/plugin/lib/plugin-registry.ts +59 -0
  364. package/src/modules/plugin/services/plugin-svc.ts +53 -0
  365. package/src/modules/plugin/types/plugin-types.ts +21 -0
  366. package/src/modules/startup/commands/create-startup.ts +53 -0
  367. package/src/modules/startup/errors/startup-errors.ts +23 -0
  368. package/src/modules/startup/index.ts +11 -0
  369. package/src/modules/startup/services/startup-service.ts +57 -0
  370. package/src/modules/startup/types/startup-types.ts +8 -0
  371. package/src/modules/startup/utils/startup-validators.ts +19 -0
  372. package/src/modules/workspace/commands/init-workspace.ts +63 -0
  373. package/src/modules/workspace/errors/workspace-errors.ts +16 -0
  374. package/src/modules/workspace/index.ts +11 -0
  375. package/src/modules/workspace/services/workspace-service.ts +59 -0
  376. package/src/modules/workspace/types/workspace-types.ts +8 -0
  377. package/src/modules/workspace/utils/workspace-validators.ts +19 -0
  378. package/src/utils/launch77-context.ts +152 -0
  379. package/src/utils/launch77-validation.ts +59 -0
  380. package/src/utils/monorepo.ts +137 -0
  381. package/src/utils/validation.ts +117 -0
  382. package/src/utils/version.ts +16 -0
  383. package/templates/startup/apps/.gitkeep +8 -0
  384. package/templates/workspace/.eslintignore +7 -0
  385. package/templates/workspace/.eslintrc.js +38 -0
  386. package/templates/workspace/.husky/pre-push +24 -0
  387. package/templates/workspace/.launch77/workspace.json +3 -0
  388. package/templates/workspace/.lintstagedrc.json +4 -0
  389. package/templates/workspace/.prettierrc +9 -0
  390. package/templates/workspace/README.md +62 -0
  391. package/templates/workspace/app-templates/.gitkeep +1 -0
  392. package/templates/workspace/apps/.gitkeep +1 -0
  393. package/templates/workspace/libraries/.gitkeep +1 -0
  394. package/templates/workspace/package.json +31 -0
  395. package/templates/workspace/plugins/.gitkeep +1 -0
  396. package/templates/workspace/tsconfig.json +22 -0
  397. package/templates/workspace/turbo.json +25 -0
  398. package/tsconfig.json +23 -0
@@ -0,0 +1,37 @@
1
+ export class AppAlreadyExistsError extends Error {
2
+ constructor(appName, appPath) {
3
+ super(`App ${appName} already exists at ${appPath}`);
4
+ this.name = 'AppAlreadyExistsError';
5
+ }
6
+ }
7
+ export class AppNotFoundError extends Error {
8
+ constructor(appName, expectedPath) {
9
+ super(`App '${appName}' does not exist at ${expectedPath}`);
10
+ this.name = 'AppNotFoundError';
11
+ }
12
+ }
13
+ export class InvalidAppNameError extends Error {
14
+ constructor(appName, reason) {
15
+ super(`Invalid app name '${appName}': ${reason}`);
16
+ this.name = 'InvalidAppNameError';
17
+ }
18
+ }
19
+ export class TemplateNotFoundError extends Error {
20
+ constructor(templateType) {
21
+ super(`Template not found for type: ${templateType}`);
22
+ this.name = 'TemplateNotFoundError';
23
+ }
24
+ }
25
+ export class ManifestNotFoundError extends Error {
26
+ constructor(searchDir) {
27
+ super(`No Launch77 manifest found in ${searchDir} or any parent directory`);
28
+ this.name = 'ManifestNotFoundError';
29
+ }
30
+ }
31
+ export class InvalidManifestError extends Error {
32
+ constructor(message) {
33
+ super(`Invalid manifest: ${message}`);
34
+ this.name = 'InvalidManifestError';
35
+ }
36
+ }
37
+ //# sourceMappingURL=app-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-errors.js","sourceRoot":"","sources":["../../../../src/modules/app/errors/app-errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,OAAO,sBAAsB,OAAO,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe,EAAE,YAAoB;QAC/C,KAAK,CAAC,QAAQ,OAAO,uBAAuB,YAAY,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,qBAAqB,OAAO,MAAM,MAAM,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,YAAoB;QAC9B,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAA;QACrD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,SAAiB;QAC3B,KAAK,CAAC,iCAAiC,SAAS,0BAA0B,CAAC,CAAA;QAC3E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { AppService } from './services/app-svc.js';
2
+ export { ManifestService } from './services/manifest-svc.js';
3
+ export type { CreateAppRequest, CreateAppResult, DeleteAppRequest, DeleteAppResult, AppType } from './types/app-types.js';
4
+ export type { AppManifest, DeploymentConfig } from './lib/manifest-schema.js';
5
+ export { AppAlreadyExistsError, AppNotFoundError, InvalidAppNameError, TemplateNotFoundError, ManifestNotFoundError, InvalidManifestError } from './errors/app-errors.js';
6
+ export { createAppCommand } from './commands/create-app.js';
7
+ export { deleteAppCommand } from './commands/delete-app.js';
8
+ export { generateManifestCommand } from './commands/generate-manifest.js';
9
+ export { validateManifestCommand } from './commands/validate-manifest.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/app/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAG5D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACzH,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG7E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAGzK,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,11 @@
1
+ // Services
2
+ export { AppService } from './services/app-svc.js';
3
+ export { ManifestService } from './services/manifest-svc.js';
4
+ // Errors
5
+ export { AppAlreadyExistsError, AppNotFoundError, InvalidAppNameError, TemplateNotFoundError, ManifestNotFoundError, InvalidManifestError } from './errors/app-errors.js';
6
+ // Commands
7
+ export { createAppCommand } from './commands/create-app.js';
8
+ export { deleteAppCommand } from './commands/delete-app.js';
9
+ export { generateManifestCommand } from './commands/generate-manifest.js';
10
+ export { validateManifestCommand } from './commands/validate-manifest.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/app/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAM5D,SAAS;AACT,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAEzK,WAAW;AACX,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import type { AppType } from '../types/app-types.js';
3
+ export type DeploymentConfig = {
4
+ platform: 'vercel';
5
+ connected: boolean;
6
+ connectedAt?: string;
7
+ projectName?: string;
8
+ };
9
+ export type AppManifest = {
10
+ schemaVersion: 1;
11
+ name: string;
12
+ type: AppType | 'marketing';
13
+ package: string;
14
+ deployment?: DeploymentConfig;
15
+ };
16
+ export declare const manifestZ: z.ZodObject<{
17
+ schemaVersion: z.ZodLiteral<1>;
18
+ name: z.ZodString;
19
+ type: z.ZodEnum<{
20
+ api: "api";
21
+ webapp: "webapp";
22
+ marketing: "marketing";
23
+ }>;
24
+ package: z.ZodString;
25
+ deployment: z.ZodOptional<z.ZodObject<{
26
+ platform: z.ZodLiteral<"vercel">;
27
+ connected: z.ZodBoolean;
28
+ connectedAt: z.ZodOptional<z.ZodString>;
29
+ projectName: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strict>;
32
+ /**
33
+ * Parse and validate a manifest from unknown JSON data
34
+ * @param json - Unknown JSON data to parse
35
+ * @returns Validated AppManifest
36
+ * @throws ZodError with aggregated error messages
37
+ */
38
+ export declare function parseManifest(json: unknown): AppManifest;
39
+ //# sourceMappingURL=manifest-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-schema.d.ts","sourceRoot":"","sources":["../../../../src/modules/app/lib/manifest-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAGpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAGD,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,CAAC,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,WAAW,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAC9B,CAAA;AAYD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;kBAQX,CAAA;AAEX;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAiBxD"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ // Zod schemas
3
+ const deploymentConfigZ = z.object({
4
+ platform: z.literal('vercel'),
5
+ connected: z.boolean(),
6
+ connectedAt: z.string().optional(),
7
+ projectName: z.string().optional(),
8
+ });
9
+ // Main manifest schema - strict mode to reject extra fields
10
+ // Note: Manifests store 'marketing' but we accept 'marketing-site' in commands
11
+ export const manifestZ = z
12
+ .object({
13
+ schemaVersion: z.literal(1),
14
+ name: z.string().min(1),
15
+ type: z.enum(['marketing', 'webapp', 'api']),
16
+ package: z.string().min(1),
17
+ deployment: deploymentConfigZ.optional(),
18
+ })
19
+ .strict();
20
+ /**
21
+ * Parse and validate a manifest from unknown JSON data
22
+ * @param json - Unknown JSON data to parse
23
+ * @returns Validated AppManifest
24
+ * @throws ZodError with aggregated error messages
25
+ */
26
+ export function parseManifest(json) {
27
+ try {
28
+ return manifestZ.parse(json);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof z.ZodError) {
32
+ // Format error messages nicely
33
+ const errorMessages = error.issues
34
+ .map((err) => {
35
+ const path = err.path.join('.');
36
+ return ` - ${path ? `${path}: ` : ''}${err.message}`;
37
+ })
38
+ .join('\n');
39
+ throw new Error(`Manifest validation failed:\n${errorMessages}`);
40
+ }
41
+ throw error;
42
+ }
43
+ }
44
+ //# sourceMappingURL=manifest-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-schema.js","sourceRoot":"","sources":["../../../../src/modules/app/lib/manifest-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAqBvB,cAAc;AACd,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAA;AAEF,4DAA4D;AAC5D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,UAAU,EAAE,iBAAiB,CAAC,QAAQ,EAAE;CACzC,CAAC;KACD,MAAM,EAAE,CAAA;AAEX;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAA;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChC,+BAA+B;YAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM;iBAC/B,GAAG,CAAC,CAAC,GAAe,EAAE,EAAE;gBACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC/B,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAA;YACvD,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAA;YAEb,MAAM,IAAI,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Launch77Context } from '../../../utils/launch77-context.js';
2
+ import type { CreateAppRequest, CreateAppResult, DeleteAppRequest, DeleteAppResult } from '../types/app-types.js';
3
+ export declare class AppService {
4
+ private manifestService;
5
+ constructor();
6
+ /**
7
+ * Create a new app from template
8
+ */
9
+ createApp(request: CreateAppRequest, context: Launch77Context): Promise<CreateAppResult>;
10
+ /**
11
+ * Delete an existing app
12
+ */
13
+ deleteApp(request: DeleteAppRequest, context: Launch77Context): Promise<DeleteAppResult>;
14
+ }
15
+ //# sourceMappingURL=app-svc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/app/services/app-svc.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEjH,qBAAa,UAAU;IACrB,OAAO,CAAC,eAAe,CAAiB;;IAMxC;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAgD9F;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;CAsC/F"}
@@ -0,0 +1,90 @@
1
+ import * as path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { ManifestService } from './manifest-svc.js';
4
+ import * as filesystem from '../../../infrastructure/filesystem.js';
5
+ import * as npm from '../../../infrastructure/npm.js';
6
+ import { generateFromTemplate } from '../../../infrastructure/template-generator.js';
7
+ import { templateExists } from '../../../infrastructure/template.js';
8
+ import { validateWorkspaceContext } from '../../../utils/launch77-validation.js';
9
+ import { validateAppName } from '../../../utils/validation.js';
10
+ export class AppService {
11
+ manifestService;
12
+ constructor() {
13
+ this.manifestService = new ManifestService();
14
+ }
15
+ /**
16
+ * Create a new app from template
17
+ */
18
+ async createApp(request, context) {
19
+ const { type, appName, port } = request;
20
+ // 1. Validate app name
21
+ const nameValidation = validateAppName(appName);
22
+ if (!nameValidation.valid) {
23
+ throw new Error(nameValidation.errorMessage);
24
+ }
25
+ // 2. Validate workspace context
26
+ const contextValidation = validateWorkspaceContext(context);
27
+ if (!contextValidation.valid) {
28
+ throw new Error(contextValidation.errorMessage);
29
+ }
30
+ // 3. Determine app path
31
+ const appPath = path.join(context.appsDir, appName);
32
+ // 4. Check if app already exists
33
+ if (await fs.pathExists(appPath)) {
34
+ throw new Error(`App ${appName} already exists at ${appPath}`);
35
+ }
36
+ // 5. Validate template exists
37
+ if (!(await templateExists(type))) {
38
+ throw new Error(`Unknown app type: ${type}. Currently supported: api, webapp, marketing-site`);
39
+ }
40
+ // 6. Generate from template (context already has packageName computed)
41
+ await generateFromTemplate(type, appPath, appName, context, { port });
42
+ // 7. Generate and write app manifest
43
+ const manifest = this.manifestService.generateManifest(type, appName, context, { port });
44
+ const launchDir = path.join(appPath, '.launch');
45
+ await filesystem.ensureDir(launchDir);
46
+ const manifestPath = path.join(launchDir, 'app.json');
47
+ await filesystem.writeJSON(manifestPath, manifest);
48
+ // 8. Install dependencies
49
+ await npm.install(context.workspaceRoot);
50
+ return {
51
+ appPath,
52
+ appName,
53
+ type,
54
+ };
55
+ }
56
+ /**
57
+ * Delete an existing app
58
+ */
59
+ async deleteApp(request, context) {
60
+ const { appName } = request;
61
+ // 1. Validate app name
62
+ const nameValidation = validateAppName(appName);
63
+ if (!nameValidation.valid) {
64
+ throw new Error(nameValidation.errorMessage);
65
+ }
66
+ // 2. Validate workspace context
67
+ const contextValidation = validateWorkspaceContext(context);
68
+ if (!contextValidation.valid) {
69
+ throw new Error(contextValidation.errorMessage);
70
+ }
71
+ // 3. Determine app path
72
+ const appPath = path.join(context.appsDir, appName);
73
+ // 4. Check if app exists
74
+ if (!(await fs.pathExists(appPath))) {
75
+ throw new Error(`App '${appName}' does not exist.\n\n` + `Expected location: ${appPath}\n\n` + `Available apps:\n` + ` cd apps/\n` + ` ls`);
76
+ }
77
+ // 5. Check for Docker resources
78
+ const dockerComposePath = path.join(appPath, 'docker-compose.db.yml');
79
+ const hasDockerResources = await fs.pathExists(dockerComposePath);
80
+ // 6. Delete the app directory
81
+ await fs.remove(appPath);
82
+ // 7. Update dependencies
83
+ await npm.install(context.workspaceRoot);
84
+ return {
85
+ appName,
86
+ hadDockerResources: hasDockerResources,
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=app-svc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-svc.js","sourceRoot":"","sources":["../../../../src/modules/app/services/app-svc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,GAAG,MAAM,gCAAgC,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAK9D,MAAM,OAAO,UAAU;IACb,eAAe,CAAiB;IAExC;QACE,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAyB,EAAE,OAAwB;QACjE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QAEvC,uBAAuB;QACvB,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC;QAED,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;QAC3D,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;QACjD,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAEnD,iCAAiC;QACjC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,sBAAsB,OAAO,EAAE,CAAC,CAAA;QAChE,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,oDAAoD,CAAC,CAAA;QAChG,CAAC;QAED,uEAAuE;QACvE,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAErE,qCAAqC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACxF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAC/C,MAAM,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QACrD,MAAM,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;QAElD,0BAA0B;QAC1B,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAExC,OAAO;YACL,OAAO;YACP,OAAO;YACP,IAAI;SACL,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAyB,EAAE,OAAwB;QACjE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QAE3B,uBAAuB;QACvB,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC;QAED,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;QAC3D,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;QACjD,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAEnD,yBAAyB;QACzB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,uBAAuB,GAAG,sBAAsB,OAAO,MAAM,GAAG,mBAAmB,GAAG,cAAc,GAAG,MAAM,CAAC,CAAA;QAC/I,CAAC;QAED,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAA;QACrE,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;QAEjE,8BAA8B;QAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAExB,yBAAyB;QACzB,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAExC,OAAO;YACL,OAAO;YACP,kBAAkB,EAAE,kBAAkB;SACvC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { Launch77Context } from '../../../utils/launch77-context.js';
2
+ import type { AppManifest } from '../lib/manifest-schema.js';
3
+ export declare class ManifestService {
4
+ /**
5
+ * Generate an app manifest based on app type
6
+ */
7
+ generateManifest(type: string, appName: string, context: Launch77Context, _options: {
8
+ port?: string;
9
+ }): AppManifest;
10
+ /**
11
+ * Load and validate a Launch77 app manifest file
12
+ * @param startDir - Directory to start searching from (defaults to process.cwd())
13
+ * @returns Object containing manifest, manifestPath, and appRoot
14
+ * @throws Error if manifest not found or invalid
15
+ */
16
+ loadManifest(startDir?: string): Promise<{
17
+ manifest: AppManifest;
18
+ manifestPath: string;
19
+ appRoot: string;
20
+ }>;
21
+ /**
22
+ * Save a manifest file
23
+ * @param manifestPath - Path to save the manifest
24
+ * @param manifest - Manifest data to save
25
+ */
26
+ saveManifest(manifestPath: string, manifest: AppManifest): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=manifest-svc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/app/services/manifest-svc.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAuD5D,qBAAa,eAAe;IAC1B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;IAiBnH;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,QAAQ,EAAE,WAAW,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;IA2CF;;;;OAIG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/E"}
@@ -0,0 +1,119 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { parseManifest } from '../lib/manifest-schema.js';
4
+ /**
5
+ * Convert kebab-case to Title Case
6
+ * e.g., "my-startup-name" -> "My Startup Name"
7
+ */
8
+ function toTitleCase(str) {
9
+ return str
10
+ .split('-')
11
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
12
+ .join(' ');
13
+ }
14
+ /**
15
+ * Generate a manifest for a marketing app
16
+ */
17
+ function generateMarketingManifest(appName, context) {
18
+ const workspaceName = context.workspaceName;
19
+ return {
20
+ schemaVersion: 1,
21
+ name: `${toTitleCase(workspaceName)} Marketing`,
22
+ type: 'marketing',
23
+ package: `@${workspaceName}/${appName}`,
24
+ };
25
+ }
26
+ /**
27
+ * Generate a manifest for a webapp
28
+ */
29
+ function generateWebappManifest(appName, context) {
30
+ const workspaceName = context.workspaceName;
31
+ return {
32
+ schemaVersion: 1,
33
+ name: `${toTitleCase(workspaceName)} Web`,
34
+ type: 'webapp',
35
+ package: `@${workspaceName}/${appName}`,
36
+ };
37
+ }
38
+ /**
39
+ * Generate a manifest for an API app
40
+ */
41
+ function generateApiManifest(appName, context) {
42
+ const workspaceName = context.workspaceName;
43
+ return {
44
+ schemaVersion: 1,
45
+ name: `${toTitleCase(workspaceName)} API`,
46
+ type: 'api',
47
+ package: `@${workspaceName}/${appName}`,
48
+ };
49
+ }
50
+ export class ManifestService {
51
+ /**
52
+ * Generate an app manifest based on app type
53
+ */
54
+ generateManifest(type, appName, context, _options) {
55
+ switch (type) {
56
+ case 'marketing-site':
57
+ case 'marketing':
58
+ return generateMarketingManifest(appName, context);
59
+ case 'webapp':
60
+ return generateWebappManifest(appName, context);
61
+ case 'api':
62
+ return generateApiManifest(appName, context);
63
+ default:
64
+ throw new Error(`Unsupported app type for manifest generation: ${type}. Supported types: api, webapp, marketing-site`);
65
+ }
66
+ }
67
+ /**
68
+ * Load and validate a Launch77 app manifest file
69
+ * @param startDir - Directory to start searching from (defaults to process.cwd())
70
+ * @returns Object containing manifest, manifestPath, and appRoot
71
+ * @throws Error if manifest not found or invalid
72
+ */
73
+ async loadManifest(startDir) {
74
+ const searchDir = startDir || process.cwd();
75
+ let currentDir = path.resolve(searchDir);
76
+ const root = path.parse(currentDir).root;
77
+ // Walk up the directory tree looking for .launch/app.json
78
+ while (currentDir !== root) {
79
+ const manifestPath = path.join(currentDir, '.launch', 'app.json');
80
+ try {
81
+ const fileContent = await fs.readFile(manifestPath, 'utf-8');
82
+ const jsonData = JSON.parse(fileContent);
83
+ const manifest = parseManifest(jsonData);
84
+ return {
85
+ manifest,
86
+ manifestPath,
87
+ appRoot: currentDir,
88
+ };
89
+ }
90
+ catch (error) {
91
+ // If file doesn't exist, continue searching up
92
+ if (error.code === 'ENOENT') {
93
+ const parentDir = path.dirname(currentDir);
94
+ if (parentDir === currentDir) {
95
+ break; // Reached root
96
+ }
97
+ currentDir = parentDir;
98
+ continue;
99
+ }
100
+ // If JSON parse error or validation error, throw with helpful message
101
+ if (error instanceof SyntaxError) {
102
+ throw new Error(`Invalid JSON in ${manifestPath}: ${error.message}`);
103
+ }
104
+ // Re-throw validation errors as-is
105
+ throw error;
106
+ }
107
+ }
108
+ throw new Error(`No Launch77 manifest found in ${searchDir} or any parent directory.\n` + `Looking for .launch/app.json.\n` + `Create one using 'launch77 create-app' or manually add a .launch/app.json file.`);
109
+ }
110
+ /**
111
+ * Save a manifest file
112
+ * @param manifestPath - Path to save the manifest
113
+ * @param manifest - Manifest data to save
114
+ */
115
+ async saveManifest(manifestPath, manifest) {
116
+ await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
117
+ }
118
+ }
119
+ //# sourceMappingURL=manifest-svc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-svc.js","sourceRoot":"","sources":["../../../../src/modules/app/services/manifest-svc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const APP_TYPES: readonly ["api", "webapp", "marketing-site"];
2
+ export type AppType = (typeof APP_TYPES)[number];
3
+ export declare const APP_TYPES_LIST: string;
4
+ export interface CreateAppRequest {
5
+ type: AppType;
6
+ appName: string;
7
+ port: string;
8
+ }
9
+ export interface CreateAppResult {
10
+ appPath: string;
11
+ appName: string;
12
+ type: AppType;
13
+ }
14
+ export interface DeleteAppRequest {
15
+ appName: string;
16
+ }
17
+ export interface DeleteAppResult {
18
+ appName: string;
19
+ hadDockerResources: boolean;
20
+ }
21
+ //# sourceMappingURL=app-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-types.d.ts","sourceRoot":"","sources":["../../../../src/modules/app/types/app-types.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,SAAS,8CAA+C,CAAA;AACrE,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAGhD,eAAO,MAAM,cAAc,QAAuB,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,OAAO,CAAA;CAC5B"}
@@ -0,0 +1,5 @@
1
+ // Supported app types
2
+ export const APP_TYPES = ['api', 'webapp', 'marketing-site'];
3
+ // Display list for error messages
4
+ export const APP_TYPES_LIST = APP_TYPES.join(', ');
5
+ //# sourceMappingURL=app-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-types.js","sourceRoot":"","sources":["../../../../src/modules/app/types/app-types.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAU,CAAA;AAGrE,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI command for generating catalog metadata files
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create the catalog:generate command
7
+ */
8
+ export declare function createGenerateCommand(): Command;
9
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/modules/catalog/commands/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAanC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAqB/C"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * CLI command for generating catalog metadata files
3
+ */
4
+ import path from 'path';
5
+ import chalk from 'chalk';
6
+ import { Command } from 'commander';
7
+ import ora from 'ora';
8
+ import { readCatalogConfig } from '../config/catalog-config.js';
9
+ import { CatalogGeneratorService } from '../services/catalog-generator-svc.js';
10
+ import { printQualityReport } from '../utils/quality-reporter.js';
11
+ /**
12
+ * Create the catalog:generate command
13
+ */
14
+ export function createGenerateCommand() {
15
+ const command = new Command('catalog:generate')
16
+ .description('Generate catalog metadata for a component library')
17
+ .option('-l, --library <path>', 'Library directory path', process.cwd())
18
+ .option('-c, --config <file>', 'Config file name', 'catalog.config.js')
19
+ .option('--no-strict', 'Allow generation with validation errors (warnings only)')
20
+ .action(async (options) => {
21
+ try {
22
+ await generateCatalog(options);
23
+ }
24
+ catch (error) {
25
+ console.error(chalk.red('\\nāœ— Catalog generation failed\\n'));
26
+ if (error instanceof Error) {
27
+ console.error(chalk.red(error.message));
28
+ }
29
+ else {
30
+ console.error(chalk.red(String(error)));
31
+ }
32
+ process.exit(1);
33
+ }
34
+ });
35
+ return command;
36
+ }
37
+ /**
38
+ * Execute catalog generation
39
+ */
40
+ async function generateCatalog(options) {
41
+ const libraryPath = path.resolve(options.library);
42
+ console.log(chalk.blue('\\nšŸ“š Generating catalog metadata...\\n'));
43
+ console.log(chalk.gray('Library: ' + libraryPath));
44
+ console.log(chalk.gray('Config: ' + options.config + '\\n'));
45
+ // Read and validate configuration
46
+ const spinner = ora('Reading configuration...').start();
47
+ let config;
48
+ try {
49
+ config = await readCatalogConfig(libraryPath);
50
+ spinner.succeed('Configuration loaded');
51
+ }
52
+ catch (error) {
53
+ spinner.fail('Failed to load configuration');
54
+ throw error;
55
+ }
56
+ // Override strict mode if --no-strict flag provided
57
+ if (options.strict === false) {
58
+ config.validation.strict = false;
59
+ console.log(chalk.yellow('⚠ Running in non-strict mode (validation errors will not fail build)\\n'));
60
+ }
61
+ // Display configuration
62
+ console.log(chalk.gray('Configuration:'));
63
+ console.log(chalk.gray(' Package: ' + config.packageName));
64
+ console.log(chalk.gray(' Catalog version: ' + config.catalogVersion));
65
+ console.log(chalk.gray(' Output file: ' + config.outputFile));
66
+ console.log(chalk.gray(' Strict mode: ' + (config.validation.strict ? 'enabled' : 'disabled') + '\\n'));
67
+ // Generate catalog
68
+ const generationSpinner = ora('Scanning components...').start();
69
+ const service = new CatalogGeneratorService();
70
+ const result = await service.generateForLibrary(libraryPath, config);
71
+ generationSpinner.stop();
72
+ // Display quality report
73
+ console.log(chalk.blue('\\nšŸ“Š Quality Report\\n'));
74
+ printQualityReport(result.qualityReport, config.validation.strict);
75
+ // Handle result
76
+ if (!result.success) {
77
+ console.log(chalk.red('\\nāœ— Catalog generation failed\\n'));
78
+ console.log(chalk.red('Validation errors must be fixed before building.'));
79
+ console.log(chalk.gray('\\nTo fix:'));
80
+ console.log(chalk.gray(' 1. Add @launch77-component JSDoc to components listed above'));
81
+ console.log(chalk.gray(' 2. Or add @launch77-ignore to exclude internal/WIP components'));
82
+ console.log(chalk.gray(' 3. Or run with --no-strict to allow warnings\\n'));
83
+ process.exit(1);
84
+ }
85
+ // Success!
86
+ console.log(chalk.green('\\nāœ“ Generated ' + config.outputFile));
87
+ console.log(chalk.gray(' Quality score: ' + result.qualityReport.qualityScore + '%'));
88
+ console.log(chalk.gray(' Total components: ' + result.qualityReport.totalComponents));
89
+ if (result.warnings.length > 0) {
90
+ console.log(chalk.yellow(' Warnings: ' + result.warnings.length));
91
+ }
92
+ console.log();
93
+ }
94
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/modules/catalog/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Scan command - Generate catalog.json from Launch77 artifacts
4
+ *
5
+ * Scans UI components, libraries, plugins, and utilities from the Launch77 monorepo
6
+ * and generates a machine-readable catalog for AI discovery.
7
+ */
8
+ export declare function scanCommand(): Command;
9
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/modules/catalog/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAmCrC"}