@hubspot/cli 7.8.12-experimental.0 → 7.9.0-beta.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 (451) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/cms.test.js +44 -1
  4. package/commands/__tests__/customObject.test.js +22 -1
  5. package/commands/__tests__/doctor.test.js +16 -16
  6. package/commands/__tests__/project.test.js +2 -0
  7. package/commands/account/auth.js +1 -0
  8. package/commands/account/clean.js +18 -27
  9. package/commands/account/createOverride.js +13 -31
  10. package/commands/account/info.js +20 -31
  11. package/commands/account/list.js +16 -22
  12. package/commands/account/remove.js +12 -20
  13. package/commands/account/removeOverride.js +11 -21
  14. package/commands/account/rename.js +6 -9
  15. package/commands/account/use.js +12 -26
  16. package/commands/account.js +2 -2
  17. package/commands/app/__tests__/migrate.test.js +5 -5
  18. package/commands/app/migrate.js +13 -18
  19. package/commands/app.js +1 -6
  20. package/commands/auth.d.ts +1 -0
  21. package/commands/auth.js +17 -7
  22. package/commands/{__tests__/remove.test.js → cms/__tests__/delete.test.js} +8 -8
  23. package/commands/{__tests__ → cms/__tests__}/fetch.test.js +3 -3
  24. package/commands/{__tests__ → cms/__tests__}/function.test.js +7 -3
  25. package/commands/{__tests__ → cms/__tests__}/lint.test.js +3 -3
  26. package/commands/{__tests__ → cms/__tests__}/list.test.js +3 -3
  27. package/commands/{__tests__ → cms/__tests__}/mv.test.js +3 -3
  28. package/commands/{__tests__ → cms/__tests__}/theme.test.js +9 -2
  29. package/commands/cms/app/create.d.ts +9 -0
  30. package/commands/cms/app/create.js +82 -0
  31. package/commands/cms/app.d.ts +3 -0
  32. package/commands/cms/app.js +17 -0
  33. package/commands/cms/convertFields.js +7 -9
  34. package/commands/cms/delete.d.ts +6 -0
  35. package/commands/cms/delete.js +43 -0
  36. package/commands/cms/fetch.d.ts +12 -0
  37. package/commands/cms/fetch.js +79 -0
  38. package/commands/{__tests__ → cms/function/__tests__}/logs.test.js +4 -5
  39. package/commands/cms/function/create.d.ts +12 -0
  40. package/commands/cms/function/create.js +84 -0
  41. package/commands/cms/function/deploy.d.ts +6 -0
  42. package/commands/cms/function/deploy.js +89 -0
  43. package/commands/cms/function/list.d.ts +6 -0
  44. package/commands/cms/function/list.js +60 -0
  45. package/commands/cms/function/logs.d.ts +10 -0
  46. package/commands/cms/function/logs.js +135 -0
  47. package/commands/cms/function/server.d.ts +10 -0
  48. package/commands/cms/function/server.js +69 -0
  49. package/commands/cms/function.d.ts +3 -0
  50. package/commands/cms/function.js +27 -0
  51. package/commands/cms/getReactModule.js +9 -14
  52. package/commands/cms/lighthouseScore.js +33 -36
  53. package/commands/cms/lint.d.ts +6 -0
  54. package/commands/cms/lint.js +83 -0
  55. package/commands/cms/list.d.ts +6 -0
  56. package/commands/cms/list.js +96 -0
  57. package/commands/cms/module/create.d.ts +11 -0
  58. package/commands/cms/module/create.js +84 -0
  59. package/commands/cms/module/marketplace-validate.d.ts +6 -0
  60. package/commands/cms/module/marketplace-validate.js +45 -0
  61. package/commands/cms/module.d.ts +3 -0
  62. package/commands/cms/module.js +17 -0
  63. package/commands/cms/mv.d.ts +7 -0
  64. package/commands/cms/mv.js +60 -0
  65. package/commands/cms/template/create.d.ts +9 -0
  66. package/commands/cms/template/create.js +72 -0
  67. package/commands/cms/template.d.ts +3 -0
  68. package/commands/cms/template.js +17 -0
  69. package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.js +2 -2
  70. package/commands/{theme → cms/theme}/__tests__/preview.test.js +2 -2
  71. package/commands/cms/theme/create.d.ts +6 -0
  72. package/commands/cms/theme/create.js +58 -0
  73. package/commands/cms/theme/generate-selectors.d.ts +6 -0
  74. package/commands/cms/theme/generate-selectors.js +171 -0
  75. package/commands/cms/theme/marketplace-validate.d.ts +6 -0
  76. package/commands/cms/theme/marketplace-validate.js +46 -0
  77. package/commands/cms/theme/preview.d.ts +12 -0
  78. package/commands/cms/theme/preview.js +224 -0
  79. package/commands/cms/theme.d.ts +3 -0
  80. package/commands/cms/theme.js +25 -0
  81. package/commands/cms/upload.d.ts +12 -0
  82. package/commands/cms/upload.js +212 -0
  83. package/commands/cms/watch.d.ts +14 -0
  84. package/commands/cms/watch.js +138 -0
  85. package/commands/cms/webpack/create.d.ts +6 -0
  86. package/commands/cms/webpack/create.js +58 -0
  87. package/commands/cms/webpack.d.ts +3 -0
  88. package/commands/cms/webpack.js +17 -0
  89. package/commands/cms.js +28 -2
  90. package/commands/completion.js +3 -3
  91. package/commands/config/set.d.ts +1 -1
  92. package/commands/config/set.js +64 -36
  93. package/commands/config.js +2 -2
  94. package/commands/create.js +6 -4
  95. package/commands/customObject/{schema/__tests__/create.test.js → __tests__/createSchema.test.js} +5 -5
  96. package/commands/customObject/{schema/__tests__/delete.test.js → __tests__/deleteSchema.test.js} +5 -5
  97. package/commands/customObject/{schema/__tests__/fetch-all.test.js → __tests__/fetch-all-schemas.test.js} +5 -5
  98. package/commands/customObject/{schema/__tests__/fetch.test.js → __tests__/fetchSchema.test.js} +5 -5
  99. package/commands/customObject/{schema/__tests__/list.test.js → __tests__/listSchemas.test.js} +5 -5
  100. package/commands/customObject/{schema/__tests__/update.test.js → __tests__/updateSchema.test.js} +5 -5
  101. package/commands/customObject/create.js +10 -12
  102. package/commands/customObject/createSchema.d.ts +6 -0
  103. package/commands/customObject/createSchema.js +56 -0
  104. package/commands/customObject/deleteSchema.d.ts +7 -0
  105. package/commands/customObject/deleteSchema.js +69 -0
  106. package/commands/customObject/fetchAllSchemas.d.ts +6 -0
  107. package/commands/customObject/fetchAllSchemas.js +57 -0
  108. package/commands/customObject/fetchSchema.d.ts +7 -0
  109. package/commands/customObject/fetchSchema.js +67 -0
  110. package/commands/customObject/listSchemas.d.ts +4 -0
  111. package/commands/customObject/listSchemas.js +35 -0
  112. package/commands/customObject/schema/create.d.ts +4 -6
  113. package/commands/customObject/schema/create.js +13 -38
  114. package/commands/customObject/schema/delete.d.ts +4 -7
  115. package/commands/customObject/schema/delete.js +15 -50
  116. package/commands/customObject/schema/fetch-all.d.ts +4 -6
  117. package/commands/customObject/schema/fetch-all.js +14 -40
  118. package/commands/customObject/schema/fetch.d.ts +4 -7
  119. package/commands/customObject/schema/fetch.js +14 -49
  120. package/commands/customObject/schema/list.d.ts +4 -4
  121. package/commands/customObject/schema/list.js +10 -19
  122. package/commands/customObject/schema/update.d.ts +4 -7
  123. package/commands/customObject/schema/update.js +15 -50
  124. package/commands/customObject/schema.js +5 -3
  125. package/commands/customObject/updateSchema.d.ts +7 -0
  126. package/commands/customObject/updateSchema.js +71 -0
  127. package/commands/customObject.js +22 -8
  128. package/commands/doctor.js +8 -11
  129. package/commands/feedback.js +7 -12
  130. package/commands/fetch.d.ts +4 -12
  131. package/commands/fetch.js +20 -47
  132. package/commands/filemanager/fetch.js +7 -7
  133. package/commands/filemanager/upload.js +15 -34
  134. package/commands/filemanager.js +2 -2
  135. package/commands/function/deploy.d.ts +4 -6
  136. package/commands/function/deploy.js +14 -89
  137. package/commands/function/list.d.ts +4 -6
  138. package/commands/function/list.js +14 -40
  139. package/commands/function/server.d.ts +4 -10
  140. package/commands/function/server.js +22 -31
  141. package/commands/function.d.ts +2 -4
  142. package/commands/function.js +25 -14
  143. package/commands/getStarted.js +2 -2
  144. package/commands/hubdb/clear.js +7 -15
  145. package/commands/hubdb/create.js +9 -15
  146. package/commands/hubdb/delete.js +8 -15
  147. package/commands/hubdb/fetch.js +6 -9
  148. package/commands/hubdb.d.ts +1 -1
  149. package/commands/hubdb.js +2 -2
  150. package/commands/init.js +2 -3
  151. package/commands/lint.d.ts +4 -6
  152. package/commands/lint.js +13 -65
  153. package/commands/list.d.ts +4 -6
  154. package/commands/list.js +14 -81
  155. package/commands/logs.d.ts +4 -10
  156. package/commands/logs.js +25 -94
  157. package/commands/module/marketplace-validate.d.ts +4 -6
  158. package/commands/module/marketplace-validate.js +15 -27
  159. package/commands/module.d.ts +2 -2
  160. package/commands/module.js +17 -15
  161. package/commands/mv.d.ts +4 -7
  162. package/commands/mv.js +14 -51
  163. package/commands/open.js +5 -5
  164. package/commands/project/__tests__/add.test.js +15 -13
  165. package/commands/project/__tests__/deploy.test.js +3 -4
  166. package/commands/project/__tests__/devUnifiedFlow.test.js +32 -0
  167. package/commands/project/__tests__/installDeps.test.js +8 -8
  168. package/commands/project/__tests__/list.test.js +31 -0
  169. package/commands/project/__tests__/logs.test.js +1 -1
  170. package/commands/project/__tests__/migrate.test.js +6 -5
  171. package/commands/project/__tests__/migrateApp.test.js +2 -5
  172. package/commands/project/__tests__/validate.test.js +98 -0
  173. package/commands/project/add.d.ts +2 -2
  174. package/commands/project/add.js +6 -5
  175. package/commands/project/cloneApp.js +14 -19
  176. package/commands/project/create.js +1 -2
  177. package/commands/project/deploy.js +3 -3
  178. package/commands/project/dev/deprecatedFlow.js +9 -18
  179. package/commands/project/dev/index.js +19 -17
  180. package/commands/project/dev/unifiedFlow.js +11 -4
  181. package/commands/project/download.js +15 -15
  182. package/commands/project/installDeps.d.ts +2 -2
  183. package/commands/project/installDeps.js +9 -8
  184. package/commands/project/list.d.ts +4 -0
  185. package/commands/project/list.js +62 -0
  186. package/commands/project/listBuilds.js +11 -20
  187. package/commands/project/logs.js +21 -24
  188. package/commands/project/migrate.js +5 -2
  189. package/commands/project/migrateApp.js +9 -15
  190. package/commands/project/open.js +6 -13
  191. package/commands/project/upload.d.ts +2 -2
  192. package/commands/project/upload.js +17 -26
  193. package/commands/project/validate.js +6 -6
  194. package/commands/project/watch.js +13 -22
  195. package/commands/project.js +4 -2
  196. package/commands/remove.d.ts +4 -6
  197. package/commands/remove.js +12 -24
  198. package/commands/sandbox/__tests__/create.test.js +5 -5
  199. package/commands/sandbox/create.js +22 -32
  200. package/commands/sandbox/delete.js +38 -63
  201. package/commands/sandbox.js +2 -2
  202. package/commands/secret/addSecret.js +7 -17
  203. package/commands/secret/deleteSecret.js +10 -20
  204. package/commands/secret/listSecret.js +8 -10
  205. package/commands/secret/updateSecret.js +9 -17
  206. package/commands/secret.js +2 -2
  207. package/commands/testAccount/__tests__/delete.test.js +2 -4
  208. package/commands/testAccount/create.js +2 -5
  209. package/commands/testAccount/delete.d.ts +4 -3
  210. package/commands/testAccount/delete.js +155 -14
  211. package/commands/theme/generate-selectors.d.ts +4 -6
  212. package/commands/theme/generate-selectors.js +14 -152
  213. package/commands/theme/marketplace-validate.d.ts +4 -6
  214. package/commands/theme/marketplace-validate.js +14 -25
  215. package/commands/theme/preview.d.ts +4 -12
  216. package/commands/theme/preview.js +18 -183
  217. package/commands/theme.d.ts +2 -2
  218. package/commands/theme.js +19 -13
  219. package/commands/upload.d.ts +4 -12
  220. package/commands/upload.js +19 -169
  221. package/commands/watch.d.ts +4 -14
  222. package/commands/watch.js +23 -88
  223. package/lang/en.d.ts +863 -542
  224. package/lang/en.js +912 -595
  225. package/lang/en.lyaml +4 -4
  226. package/lib/__tests__/buildAccount.test.js +4 -3
  227. package/lib/__tests__/commonOpts.test.js +1 -1
  228. package/lib/__tests__/dependencyManagement.test.js +1 -1
  229. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  230. package/lib/__tests__/npm.test.js +1 -1
  231. package/lib/__tests__/oauth.test.js +4 -4
  232. package/lib/__tests__/process.test.js +10 -5
  233. package/lib/__tests__/sandboxSync.test.js +8 -8
  234. package/lib/__tests__/sandboxes.test.js +8 -8
  235. package/lib/__tests__/serverlessLogs.test.js +1 -1
  236. package/lib/__tests__/usageTracking.test.js +5 -5
  237. package/lib/__tests__/validation.test.js +2 -1
  238. package/lib/__tests__/yargsUtils.test.js +83 -9
  239. package/lib/app/__tests__/migrate.test.js +5 -5
  240. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  241. package/lib/app/migrate.js +1 -1
  242. package/lib/app/migrate_legacy.js +20 -24
  243. package/lib/buildAccount.d.ts +2 -2
  244. package/lib/buildAccount.js +32 -64
  245. package/lib/commonOpts.d.ts +1 -1
  246. package/lib/commonOpts.js +25 -22
  247. package/lib/configMigrate.js +88 -9
  248. package/lib/configOptions.js +7 -0
  249. package/lib/constants.d.ts +15 -1
  250. package/lib/constants.js +19 -1
  251. package/lib/dependencyManagement.js +9 -27
  252. package/lib/developerTestAccounts.js +9 -23
  253. package/lib/doctor/Diagnosis.js +11 -23
  254. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  255. package/lib/doctor/Doctor.js +42 -90
  256. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  257. package/lib/errorHandlers/index.js +12 -20
  258. package/lib/errorHandlers/suppressError.js +11 -18
  259. package/lib/generateSelectors.js +1 -1
  260. package/lib/lang.js +6 -5
  261. package/lib/links.js +4 -4
  262. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  263. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  264. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  265. package/lib/middleware/autoUpdateMiddleware.d.ts +2 -1
  266. package/lib/middleware/autoUpdateMiddleware.js +12 -2
  267. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  268. package/lib/middleware/commandTargetingUtils.js +74 -0
  269. package/lib/middleware/configMiddleware.d.ts +1 -1
  270. package/lib/middleware/configMiddleware.js +21 -81
  271. package/lib/middleware/gitMiddleware.js +5 -1
  272. package/lib/middleware/notificationsMiddleware.js +5 -11
  273. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  274. package/lib/npm.js +2 -2
  275. package/lib/oauth.js +5 -5
  276. package/lib/process.js +5 -4
  277. package/lib/projectProfiles.d.ts +1 -1
  278. package/lib/projectProfiles.js +2 -10
  279. package/lib/projects/__tests__/AppDevModeInterface.test.js +101 -135
  280. package/lib/projects/__tests__/DevServerManager.test.js +183 -0
  281. package/lib/projects/__tests__/LocalDevProcess.test.js +6 -5
  282. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +76 -45
  283. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +1 -0
  284. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +161 -0
  285. package/lib/projects/__tests__/deploy.test.js +9 -9
  286. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  287. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  288. package/lib/projects/__tests__/projects.test.js +12 -12
  289. package/lib/projects/__tests__/structure.test.js +3 -3
  290. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  291. package/lib/projects/__tests__/upload.test.js +82 -0
  292. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  293. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  294. package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
  295. package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
  296. package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
  297. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  298. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  299. package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +3 -3
  300. package/lib/projects/create/index.js +4 -4
  301. package/lib/projects/create/legacy.js +2 -2
  302. package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
  303. package/lib/projects/create/{v3.js → v2.js} +5 -5
  304. package/lib/projects/deploy.d.ts +1 -1
  305. package/lib/projects/deploy.js +2 -2
  306. package/lib/projects/localDev/AppDevModeInterface.d.ts +11 -3
  307. package/lib/projects/localDev/AppDevModeInterface.js +128 -115
  308. package/lib/projects/localDev/DevServerManager.d.ts +10 -29
  309. package/lib/projects/localDev/DevServerManager.js +20 -76
  310. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
  311. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
  312. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  313. package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
  314. package/lib/projects/localDev/LocalDevProcess.js +3 -2
  315. package/lib/projects/localDev/LocalDevState.d.ts +3 -0
  316. package/lib/projects/localDev/LocalDevState.js +9 -0
  317. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +4 -1
  318. package/lib/projects/localDev/LocalDevWebsocketServer.js +46 -16
  319. package/lib/projects/localDev/UIExtensionsDevModeInterface.d.ts +13 -0
  320. package/lib/projects/localDev/UIExtensionsDevModeInterface.js +37 -0
  321. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  322. package/lib/projects/localDev/helpers/account.js +2 -2
  323. package/lib/projects/localDev/helpers/process.d.ts +1 -0
  324. package/lib/projects/localDev/helpers/process.js +15 -0
  325. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  326. package/lib/projects/localDev/helpers/project.js +39 -3
  327. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +3 -0
  328. package/lib/projects/localDev/localDevWebsocketServerUtils.js +9 -0
  329. package/lib/projects/platformVersion.d.ts +1 -1
  330. package/lib/projects/platformVersion.js +1 -1
  331. package/lib/projects/structure.d.ts +2 -2
  332. package/lib/projects/structure.js +6 -6
  333. package/lib/projects/upload.d.ts +2 -3
  334. package/lib/projects/upload.js +17 -9
  335. package/lib/projects/urls.d.ts +0 -1
  336. package/lib/projects/urls.js +0 -3
  337. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  338. package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
  339. package/lib/prompts/accountNamePrompt.js +14 -19
  340. package/lib/prompts/accountsPrompt.js +2 -2
  341. package/lib/prompts/cmsFieldPrompt.js +2 -2
  342. package/lib/prompts/createApiSamplePrompt.js +5 -5
  343. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  344. package/lib/prompts/createFunctionPrompt.js +14 -14
  345. package/lib/prompts/createModulePrompt.js +9 -9
  346. package/lib/prompts/createTemplatePrompt.js +2 -2
  347. package/lib/prompts/downloadProjectPrompt.js +5 -8
  348. package/lib/prompts/installAppPrompt.d.ts +1 -6
  349. package/lib/prompts/installAppPrompt.js +1 -6
  350. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  351. package/lib/prompts/previewPrompt.js +6 -6
  352. package/lib/prompts/projectAddPrompt.d.ts +2 -2
  353. package/lib/prompts/projectAddPrompt.js +7 -1
  354. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  355. package/lib/prompts/projectNamePrompt.js +4 -8
  356. package/lib/prompts/projectsLogsPrompt.js +2 -4
  357. package/lib/prompts/promptUtils.js +27 -9
  358. package/lib/prompts/sandboxesPrompt.js +7 -7
  359. package/lib/prompts/secretPrompt.js +3 -3
  360. package/lib/prompts/selectAppPrompt.js +3 -3
  361. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  362. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  363. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  364. package/lib/prompts/uploadPrompt.js +5 -5
  365. package/lib/sandboxSync.js +24 -41
  366. package/lib/sandboxes.js +19 -47
  367. package/lib/schema.js +3 -3
  368. package/lib/serverlessLogs.js +11 -13
  369. package/lib/theme/__tests__/migrate.test.js +6 -6
  370. package/lib/theme/migrate.js +2 -2
  371. package/lib/ui/SpinniesManager.d.ts +2 -0
  372. package/lib/ui/SpinniesManager.js +7 -0
  373. package/lib/ui/boxen.js +1 -2
  374. package/lib/ui/git.js +13 -10
  375. package/lib/ui/index.d.ts +6 -0
  376. package/lib/ui/index.js +55 -38
  377. package/lib/ui/serverlessFunctionLogs.js +9 -7
  378. package/lib/ui/uiMessages.d.ts +73 -0
  379. package/lib/ui/uiMessages.js +76 -0
  380. package/lib/usageTracking.js +7 -7
  381. package/lib/validation.js +20 -23
  382. package/lib/yargsUtils.d.ts +1 -1
  383. package/lib/yargsUtils.js +12 -5
  384. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
  385. package/mcp-server/tools/index.js +4 -0
  386. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  387. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  388. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  389. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  390. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  391. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  392. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
  393. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  394. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  395. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  396. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  397. package/mcp-server/utils/toolUsageTracking.js +2 -2
  398. package/package.json +8 -7
  399. package/types/Cms.d.ts +6 -6
  400. package/types/Yargs.d.ts +1 -1
  401. package/commands/app/__tests__/install.test.js +0 -47
  402. package/commands/app/install.d.ts +0 -8
  403. package/commands/app/install.js +0 -122
  404. package/lib/middleware/__test__/utils.test.js +0 -51
  405. package/lib/middleware/utils.d.ts +0 -8
  406. package/lib/middleware/utils.js +0 -14
  407. package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
  408. package/lib/projects/localDev/DevServerManagerV2.js +0 -81
  409. /package/commands/{customObject/schema → cms}/__tests__/delete.test.d.ts +0 -0
  410. /package/commands/{__tests__ → cms/__tests__}/fetch.test.d.ts +0 -0
  411. /package/commands/{__tests__ → cms/__tests__}/function.test.d.ts +0 -0
  412. /package/commands/{__tests__ → cms/__tests__}/lint.test.d.ts +0 -0
  413. /package/commands/{__tests__ → cms/__tests__}/list.test.d.ts +0 -0
  414. /package/commands/{__tests__ → cms/__tests__}/mv.test.d.ts +0 -0
  415. /package/commands/{__tests__ → cms/__tests__}/theme.test.d.ts +0 -0
  416. /package/commands/{__tests__ → cms/function/__tests__}/logs.test.d.ts +0 -0
  417. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.d.ts +0 -0
  418. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.js +0 -0
  419. /package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.d.ts +0 -0
  420. /package/commands/{theme → cms/theme}/__tests__/preview.test.d.ts +0 -0
  421. /package/commands/{__tests__/remove.test.d.ts → customObject/__tests__/createSchema.test.d.ts} +0 -0
  422. /package/commands/{app/__tests__/install.test.d.ts → customObject/__tests__/deleteSchema.test.d.ts} +0 -0
  423. /package/commands/customObject/{schema/__tests__/create.test.d.ts → __tests__/fetch-all-schemas.test.d.ts} +0 -0
  424. /package/commands/customObject/{schema/__tests__/fetch-all.test.d.ts → __tests__/fetchSchema.test.d.ts} +0 -0
  425. /package/commands/customObject/{schema/__tests__/fetch.test.d.ts → __tests__/listSchemas.test.d.ts} +0 -0
  426. /package/commands/customObject/{schema/__tests__/list.test.d.ts → __tests__/updateSchema.test.d.ts} +0 -0
  427. /package/commands/{customObject/schema/__tests__/update.test.d.ts → project/__tests__/list.test.d.ts} +0 -0
  428. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
  429. /package/{commands/create → lib/cmsAssets}/api-sample.d.ts +0 -0
  430. /package/{commands/create → lib/cmsAssets}/api-sample.js +0 -0
  431. /package/{commands/create → lib/cmsAssets}/app.d.ts +0 -0
  432. /package/{commands/create → lib/cmsAssets}/app.js +0 -0
  433. /package/{commands/create → lib/cmsAssets}/function.d.ts +0 -0
  434. /package/{commands/create → lib/cmsAssets}/function.js +0 -0
  435. /package/{commands/create → lib/cmsAssets}/index.d.ts +0 -0
  436. /package/{commands/create → lib/cmsAssets}/index.js +0 -0
  437. /package/{commands/create → lib/cmsAssets}/module.d.ts +0 -0
  438. /package/{commands/create → lib/cmsAssets}/module.js +0 -0
  439. /package/{commands/create → lib/cmsAssets}/react-app.d.ts +0 -0
  440. /package/{commands/create → lib/cmsAssets}/react-app.js +0 -0
  441. /package/{commands/create → lib/cmsAssets}/template.d.ts +0 -0
  442. /package/{commands/create → lib/cmsAssets}/template.js +0 -0
  443. /package/{commands/create → lib/cmsAssets}/vue-app.d.ts +0 -0
  444. /package/{commands/create → lib/cmsAssets}/vue-app.js +0 -0
  445. /package/{commands/create → lib/cmsAssets}/webpack-serverless.d.ts +0 -0
  446. /package/{commands/create → lib/cmsAssets}/webpack-serverless.js +0 -0
  447. /package/{commands/create → lib/cmsAssets}/website-theme.d.ts +0 -0
  448. /package/{commands/create → lib/cmsAssets}/website-theme.js +0 -0
  449. /package/lib/{projects/add/__tests__/v3AddComponent.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
  450. /package/lib/projects/{create/__tests__/v3.test.d.ts → __tests__/DevServerManager.test.d.ts} +0 -0
  451. /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
@@ -0,0 +1,68 @@
1
+ import { Tool } from '../../types.js';
2
+ import { z } from 'zod';
3
+ import { trackToolUsage } from '../../utils/toolUsageTracking.js';
4
+ import { http } from '@hubspot/local-dev-lib/http';
5
+ import { formatTextContents } from '../../utils/content.js';
6
+ import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
7
+ import { getAccountId } from '@hubspot/local-dev-lib/config';
8
+ const inputSchema = {
9
+ appId: z
10
+ .string()
11
+ .regex(/^\d+$/, 'App ID must be a numeric string')
12
+ .describe('The numeric app ID as a string (e.g., "3003909"). Use get-applications-info to find available app IDs.'),
13
+ startDate: z
14
+ .string()
15
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Start date must be in YYYY-MM-DD format')
16
+ .optional()
17
+ .describe('Start date for the usage patterns query in ISO 8601 format (e.g., 2025-01-01).'),
18
+ endDate: z
19
+ .string()
20
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'End date must be in YYYY-MM-DD format')
21
+ .optional()
22
+ .describe('End date for the usage patterns query in ISO 8601 format (e.g., 2025-12-31).'),
23
+ };
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ const inputSchemaZodObject = z.object({ ...inputSchema });
26
+ const toolName = 'get-api-usage-patterns-by-app-id';
27
+ export class GetApiUsagePatternsByAppIdTool extends Tool {
28
+ constructor(mcpServer) {
29
+ super(mcpServer);
30
+ }
31
+ async handler({ appId, startDate, endDate, }) {
32
+ await trackToolUsage(toolName);
33
+ try {
34
+ // Get account ID from CLI config
35
+ const accountId = getAccountId();
36
+ if (!accountId) {
37
+ const authErrorMessage = `No account ID found. Please run \`hs account auth\` to configure an account, or set a default account with \`hs account use <account>\``;
38
+ return formatTextContents(authErrorMessage);
39
+ }
40
+ const response = await http.get(accountId, {
41
+ url: `app/feature/utilization/public/v3/insights/app/${appId}/usage-patterns`,
42
+ params: {
43
+ ...(startDate && { startDate }),
44
+ ...(endDate && { endDate }),
45
+ },
46
+ });
47
+ // Format the response for display
48
+ const { data } = response;
49
+ const formattedResult = JSON.stringify(data, null, 2);
50
+ return formatTextContents(formattedResult);
51
+ }
52
+ catch (error) {
53
+ if (isHubSpotHttpError(error)) {
54
+ // Handle HubSpot-specific HTTP errors
55
+ return formatTextContents(error.toString());
56
+ }
57
+ const errorMessage = `${error instanceof Error ? error.message : String(error)}`;
58
+ return formatTextContents(errorMessage);
59
+ }
60
+ }
61
+ register() {
62
+ return this.mcpServer.registerTool(toolName, {
63
+ title: 'Get API Usage Patterns by App ID',
64
+ description: 'Retrieves detailed API usage pattern analytics for a specific HubSpot application. Requires an appId (string) to identify the target application. Optionally accepts startDate and endDate parameters in YYYY-MM-DD format to filter results within a specific time range. Returns patternSummaries object containing usage statistics including portalPercentage (percentage of portals using this pattern) and numOfPortals (total count of portals) for different usage patterns. This data helps analyze how the application is being used across different HubSpot portals and can inform optimization decisions.',
65
+ inputSchema,
66
+ }, this.handler);
67
+ }
68
+ }
@@ -0,0 +1,11 @@
1
+ import { TextContentResponse, Tool } from '../../types.js';
2
+ import { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchemaZodObject: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
5
+ export type GetApplicationInfoInputSchema = z.infer<typeof inputSchemaZodObject>;
6
+ export declare class GetApplicationInfoTool extends Tool<GetApplicationInfoInputSchema> {
7
+ constructor(mcpServer: McpServer);
8
+ handler({}: GetApplicationInfoInputSchema): Promise<TextContentResponse>;
9
+ register(): RegisteredTool;
10
+ }
11
+ export {};
@@ -0,0 +1,49 @@
1
+ import { Tool } from '../../types.js';
2
+ import { z } from 'zod';
3
+ import { trackToolUsage } from '../../utils/toolUsageTracking.js';
4
+ import { http } from '@hubspot/local-dev-lib/http';
5
+ import { formatTextContents } from '../../utils/content.js';
6
+ import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
7
+ import { getAccountId } from '@hubspot/local-dev-lib/config';
8
+ const inputSchema = {};
9
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
+ const inputSchemaZodObject = z.object({ ...inputSchema });
11
+ const toolName = 'get-applications-info';
12
+ export class GetApplicationInfoTool extends Tool {
13
+ constructor(mcpServer) {
14
+ super(mcpServer);
15
+ }
16
+ async handler({}) {
17
+ await trackToolUsage(toolName);
18
+ try {
19
+ // Get account ID from CLI config
20
+ const accountId = getAccountId();
21
+ if (!accountId) {
22
+ const authErrorMessage = `No account ID found. Please run \`hs account auth\` to configure an account, or set a default account with \`hs account use <account>\``;
23
+ return formatTextContents(authErrorMessage);
24
+ }
25
+ const response = await http.get(accountId, {
26
+ url: `app/feature/utilization/public/v3/insights/apps`,
27
+ });
28
+ // Format the response for display
29
+ const { data } = response;
30
+ const formattedResult = JSON.stringify(data, null, 2);
31
+ return formatTextContents(formattedResult);
32
+ }
33
+ catch (error) {
34
+ if (isHubSpotHttpError(error)) {
35
+ // Handle HubSpot-specific HTTP errors
36
+ return formatTextContents(error.toString());
37
+ }
38
+ const errorMessage = `${error instanceof Error ? error.message : String(error)}`;
39
+ return formatTextContents(errorMessage);
40
+ }
41
+ }
42
+ register() {
43
+ return this.mcpServer.registerTool(toolName, {
44
+ title: 'Get Applications Information',
45
+ description: 'Retrieves a list of all HubSpot applications available in the current account. Returns an array of applications, where each application contains an appId (numeric identifier) and appName (string). This information is useful for identifying available applications before using other tools that require specific application IDs, such as getting API usage patterns. No input parameters are required - this tool fetches all applications from the HubSpot Insights API.',
46
+ inputSchema,
47
+ }, this.handler);
48
+ }
49
+ }
@@ -3,7 +3,7 @@ import { z } from 'zod';
3
3
  import { formatTextContents } from '../../utils/content.js';
4
4
  import { absoluteCurrentWorkingDirectory } from './constants.js';
5
5
  import { getIntermediateRepresentationSchema, mapToInternalType, } from '@hubspot/project-parsing-lib';
6
- import { useV3Api } from '../../../lib/projects/platformVersion.js';
6
+ import { isV2Project } from '../../../lib/projects/platformVersion.js';
7
7
  import { getAccountIdFromCliConfig } from '../../utils/cliConfig.js';
8
8
  const inputSchema = {
9
9
  absoluteCurrentWorkingDirectory,
@@ -25,7 +25,7 @@ export class GetConfigValuesTool extends Tool {
25
25
  }
26
26
  async handler({ absoluteCurrentWorkingDirectory, platformVersion, featureType, }) {
27
27
  try {
28
- if (!useV3Api(platformVersion)) {
28
+ if (!isV2Project(platformVersion)) {
29
29
  return formatTextContents(`Can only be used on projects with a minimum platformVersion of 2025.2`);
30
30
  }
31
31
  const accountId = getAccountIdFromCliConfig(absoluteCurrentWorkingDirectory);
@@ -4,9 +4,9 @@ import { z } from 'zod';
4
4
  declare const inputSchemaZodObject: z.ZodObject<{
5
5
  command: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<"hs init">, z.ZodLiteral<"hs auth">, z.ZodLiteral<"hs project create">, z.ZodLiteral<"hs project upload">]>>;
6
6
  }, "strip", z.ZodTypeAny, {
7
- command?: "hs auth" | "hs project upload" | "hs project create" | "hs init" | undefined;
7
+ command?: "hs auth" | "hs project create" | "hs project upload" | "hs init" | undefined;
8
8
  }, {
9
- command?: "hs auth" | "hs project upload" | "hs project create" | "hs init" | undefined;
9
+ command?: "hs auth" | "hs project create" | "hs project upload" | "hs init" | undefined;
10
10
  }>;
11
11
  type InputSchemaType = z.infer<typeof inputSchemaZodObject>;
12
12
  export declare class GuidedWalkthroughTool extends Tool<InputSchemaType> {
@@ -6,7 +6,7 @@ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
6
6
  vi.mock('../../../utils/project');
7
7
  vi.mock('../../../utils/command');
8
8
  vi.mock('../../../../lib/constants');
9
- vi.mock('../../../../lib/projects/create/v3');
9
+ vi.mock('../../../../lib/projects/create/v2');
10
10
  vi.mock('../../../utils/toolUsageTracking');
11
11
  const mockRunCommandInDir = runCommandInDir;
12
12
  const mockAddFlag = addFlag;
@@ -0,0 +1,169 @@
1
+ import { GetApiUsagePatternsByAppIdTool } from '../GetApiUsagePatternsByAppIdTool.js';
2
+ import { z } from 'zod';
3
+ import { getAccountId } from '@hubspot/local-dev-lib/config';
4
+ import { http } from '@hubspot/local-dev-lib/http';
5
+ import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
6
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
7
+ vi.mock('../../../utils/toolUsageTracking');
8
+ vi.mock('@hubspot/local-dev-lib/http');
9
+ vi.mock('@hubspot/local-dev-lib/errors/index');
10
+ vi.mock('@hubspot/local-dev-lib/config');
11
+ const mockGetAccountId = getAccountId;
12
+ const mockHttp = http;
13
+ const mockIsHubSpotHttpError = isHubSpotHttpError;
14
+ describe('mcp-server/tools/project/GetApiUsagePatternsByAppIdTool', () => {
15
+ let mockMcpServer;
16
+ let tool;
17
+ let mockRegisteredTool;
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ // @ts-expect-error Not mocking the whole thing
21
+ mockMcpServer = {
22
+ registerTool: vi.fn(),
23
+ };
24
+ mockRegisteredTool = {};
25
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
26
+ tool = new GetApiUsagePatternsByAppIdTool(mockMcpServer);
27
+ });
28
+ describe('register', () => {
29
+ it('should register tool with correct parameters', () => {
30
+ const result = tool.register();
31
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('get-api-usage-patterns-by-app-id', {
32
+ title: 'Get API Usage Patterns by App ID',
33
+ description: 'Retrieves detailed API usage pattern analytics for a specific HubSpot application. Requires an appId (string) to identify the target application. Optionally accepts startDate and endDate parameters in YYYY-MM-DD format to filter results within a specific time range. Returns patternSummaries object containing usage statistics including portalPercentage (percentage of portals using this pattern) and numOfPortals (total count of portals) for different usage patterns. This data helps analyze how the application is being used across different HubSpot portals and can inform optimization decisions.',
34
+ inputSchema: expect.objectContaining({
35
+ appId: expect.objectContaining({
36
+ describe: expect.any(Function),
37
+ }),
38
+ startDate: expect.objectContaining({
39
+ optional: expect.any(Function),
40
+ }),
41
+ endDate: expect.objectContaining({
42
+ optional: expect.any(Function),
43
+ }),
44
+ }),
45
+ }, tool.handler);
46
+ expect(result).toBe(mockRegisteredTool);
47
+ });
48
+ });
49
+ describe('input validation', () => {
50
+ const inputSchema = z.object({
51
+ appId: z
52
+ .string()
53
+ .describe('The application ID to get API usage patterns for.'),
54
+ startDate: z
55
+ .string()
56
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'Start date must be in YYYY-MM-DD format')
57
+ .optional()
58
+ .describe('Start date for the usage patterns query in ISO 8601 format (e.g., 2025-01-01).'),
59
+ endDate: z
60
+ .string()
61
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'End date must be in YYYY-MM-DD format')
62
+ .optional()
63
+ .describe('End date for the usage patterns query in ISO 8601 format (e.g., 2025-12-31).'),
64
+ });
65
+ it('should validate date format correctly', () => {
66
+ const validInput = {
67
+ appId: '12345',
68
+ startDate: '2025-01-01',
69
+ endDate: '2025-12-31',
70
+ };
71
+ const invalidInput = {
72
+ appId: '12345',
73
+ startDate: '2025-1-1',
74
+ endDate: '2025-12-31T00:00:00Z',
75
+ };
76
+ expect(() => inputSchema.parse(validInput)).not.toThrow();
77
+ expect(() => inputSchema.parse(invalidInput)).toThrow();
78
+ });
79
+ });
80
+ describe('handler', () => {
81
+ const input = {
82
+ appId: '12345',
83
+ startDate: '2025-01-01',
84
+ endDate: '2025-12-31',
85
+ };
86
+ beforeEach(() => {
87
+ mockGetAccountId.mockReturnValue(123456789);
88
+ mockIsHubSpotHttpError.mockReturnValue(false);
89
+ });
90
+ it('should return API usage patterns successfully', async () => {
91
+ const mockResponse = {
92
+ data: {
93
+ patternSummaries: {
94
+ additionalProp1: {
95
+ portalPercentage: 25.5,
96
+ numOfPortals: 150,
97
+ },
98
+ additionalProp2: {
99
+ portalPercentage: 18.2,
100
+ numOfPortals: 89,
101
+ },
102
+ additionalProp3: {
103
+ portalPercentage: 32.1,
104
+ numOfPortals: 201,
105
+ },
106
+ },
107
+ },
108
+ status: 200,
109
+ statusText: 'OK',
110
+ headers: {},
111
+ config: { headers: {} },
112
+ };
113
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
114
+ mockHttp.get.mockResolvedValue(mockResponse);
115
+ const result = await tool.handler(input);
116
+ expect(mockGetAccountId).toHaveBeenCalledWith();
117
+ expect(mockHttp.get).toHaveBeenCalledWith(123456789, {
118
+ url: 'app/feature/utilization/public/v3/insights/app/12345/usage-patterns',
119
+ params: {
120
+ startDate: '2025-01-01',
121
+ endDate: '2025-12-31',
122
+ },
123
+ });
124
+ expect(result).toEqual({
125
+ content: [
126
+ {
127
+ type: 'text',
128
+ text: JSON.stringify(mockResponse.data, null, 2),
129
+ },
130
+ ],
131
+ });
132
+ });
133
+ it('should return error when account ID cannot be determined', async () => {
134
+ mockGetAccountId.mockReturnValue(null);
135
+ const result = await tool.handler(input);
136
+ expect(result).toEqual({
137
+ content: [
138
+ {
139
+ type: 'text',
140
+ text: 'No account ID found. Please run `hs account auth` to configure an account, or set a default account with `hs account use <account>`',
141
+ },
142
+ ],
143
+ });
144
+ expect(mockHttp.get).not.toHaveBeenCalled();
145
+ });
146
+ it('should handle empty usage patterns response', async () => {
147
+ const mockResponse = {
148
+ data: {
149
+ patternSummaries: {},
150
+ },
151
+ status: 200,
152
+ statusText: 'OK',
153
+ headers: {},
154
+ config: { headers: {} },
155
+ };
156
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
157
+ mockHttp.get.mockResolvedValue(mockResponse);
158
+ const result = await tool.handler(input);
159
+ expect(result).toEqual({
160
+ content: [
161
+ {
162
+ type: 'text',
163
+ text: JSON.stringify(mockResponse.data, null, 2),
164
+ },
165
+ ],
166
+ });
167
+ });
168
+ });
169
+ });
@@ -0,0 +1,115 @@
1
+ import { GetApplicationInfoTool } from '../GetApplicationInfoTool.js';
2
+ import { getAccountId } from '@hubspot/local-dev-lib/config';
3
+ import { http } from '@hubspot/local-dev-lib/http';
4
+ import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
5
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
6
+ vi.mock('../../utils/toolUsageTracking');
7
+ vi.mock('@hubspot/local-dev-lib/http');
8
+ vi.mock('@hubspot/local-dev-lib/errors/index');
9
+ vi.mock('@hubspot/local-dev-lib/config');
10
+ const mockGetAccountId = getAccountId;
11
+ const mockHttp = http;
12
+ const mockIsHubSpotHttpError = isHubSpotHttpError;
13
+ describe('mcp-server/tools/project/GetApplicationInfoTool', () => {
14
+ let mockMcpServer;
15
+ let tool;
16
+ let mockRegisteredTool;
17
+ beforeEach(() => {
18
+ vi.clearAllMocks();
19
+ // @ts-expect-error Not mocking the whole thing
20
+ mockMcpServer = {
21
+ registerTool: vi.fn(),
22
+ };
23
+ mockRegisteredTool = {};
24
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
25
+ tool = new GetApplicationInfoTool(mockMcpServer);
26
+ });
27
+ describe('register', () => {
28
+ it('should register tool with correct parameters', () => {
29
+ const result = tool.register();
30
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('get-applications-info', {
31
+ title: 'Get Applications Information',
32
+ description: 'Retrieves a list of all HubSpot applications available in the current account. Returns an array of applications, where each application contains an appId (numeric identifier) and appName (string). This information is useful for identifying available applications before using other tools that require specific application IDs, such as getting API usage patterns. No input parameters are required - this tool fetches all applications from the HubSpot Insights API.',
33
+ inputSchema: {},
34
+ }, tool.handler);
35
+ expect(result).toBe(mockRegisteredTool);
36
+ });
37
+ });
38
+ describe('handler', () => {
39
+ const input = {};
40
+ beforeEach(() => {
41
+ mockGetAccountId.mockReturnValue(123456789);
42
+ mockIsHubSpotHttpError.mockReturnValue(false);
43
+ });
44
+ it('should return application information successfully', async () => {
45
+ const mockResponse = {
46
+ data: {
47
+ applications: [
48
+ {
49
+ appId: 12345,
50
+ appName: 'Test App 1',
51
+ },
52
+ {
53
+ appId: 67890,
54
+ appName: 'Test App 2',
55
+ },
56
+ ],
57
+ },
58
+ status: 200,
59
+ statusText: 'OK',
60
+ headers: {},
61
+ config: { headers: {} },
62
+ };
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ mockHttp.get.mockResolvedValue(mockResponse);
65
+ const result = await tool.handler(input);
66
+ expect(mockGetAccountId).toHaveBeenCalledWith();
67
+ expect(mockHttp.get).toHaveBeenCalledWith(123456789, {
68
+ url: 'app/feature/utilization/public/v3/insights/apps',
69
+ });
70
+ expect(result).toEqual({
71
+ content: [
72
+ {
73
+ type: 'text',
74
+ text: JSON.stringify(mockResponse.data, null, 2),
75
+ },
76
+ ],
77
+ });
78
+ });
79
+ it('should return error when account ID cannot be determined', async () => {
80
+ mockGetAccountId.mockReturnValue(null);
81
+ const result = await tool.handler(input);
82
+ expect(result).toEqual({
83
+ content: [
84
+ {
85
+ type: 'text',
86
+ text: 'No account ID found. Please run `hs account auth` to configure an account, or set a default account with `hs account use <account>`',
87
+ },
88
+ ],
89
+ });
90
+ expect(mockHttp.get).not.toHaveBeenCalled();
91
+ });
92
+ it('should handle empty applications response', async () => {
93
+ const mockResponse = {
94
+ data: {
95
+ applications: [],
96
+ },
97
+ status: 200,
98
+ statusText: 'OK',
99
+ headers: {},
100
+ config: { headers: {} },
101
+ };
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ mockHttp.get.mockResolvedValue(mockResponse);
104
+ const result = await tool.handler(input);
105
+ expect(result).toEqual({
106
+ content: [
107
+ {
108
+ type: 'text',
109
+ text: JSON.stringify(mockResponse.data, null, 2),
110
+ },
111
+ ],
112
+ });
113
+ });
114
+ });
115
+ });
@@ -1,7 +1,7 @@
1
1
  import { trackUsage } from '@hubspot/local-dev-lib/trackUsage';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
3
2
  import { EventClass, getNodeVersionData, getPlatform, } from '../../lib/usageTracking.js';
4
3
  import { getAccountId, isTrackingAllowed } from '@hubspot/local-dev-lib/config';
4
+ import { uiLogger } from '../../lib/ui/logger.js';
5
5
  export async function trackToolUsage(toolName, meta) {
6
6
  if (!isTrackingAllowed()) {
7
7
  return;
@@ -16,7 +16,7 @@ export async function trackToolUsage(toolName, meta) {
16
16
  };
17
17
  const accountId = getAccountId() || undefined;
18
18
  try {
19
- logger.info('Tracking tool usage');
19
+ uiLogger.info('Tracking tool usage');
20
20
  await trackUsage('cli-interaction', EventClass.INTERACTION, usageTrackingEvent, accountId);
21
21
  }
22
22
  catch (error) { }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@hubspot/cli",
3
- "version": "7.8.12-experimental.0",
3
+ "version": "7.9.0-beta.0",
4
4
  "description": "The official CLI for developing on HubSpot",
5
5
  "license": "Apache-2.0",
6
6
  "repository": "https://github.com/HubSpot/hubspot-cli",
7
7
  "type": "module",
8
8
  "dependencies": {
9
- "@hubspot/local-dev-lib": "3.19.1",
10
- "@hubspot/project-parsing-lib": "0.8.6",
9
+ "@hubspot/local-dev-lib": "3.21.0",
10
+ "@hubspot/project-parsing-lib": "0.10.1",
11
11
  "@hubspot/serverless-dev-runtime": "7.0.6",
12
12
  "@hubspot/theme-preview-dev-server": "0.0.10",
13
- "@hubspot/ui-extensions-dev-server": "0.10.0",
13
+ "@hubspot/ui-extensions-dev-server": "0.10.2",
14
14
  "archiver": "7.0.1",
15
15
  "boxen": "8.0.1",
16
16
  "chalk": "5.4.1",
@@ -29,13 +29,14 @@
29
29
  "react": "^18.0.0",
30
30
  "strip-ansi": "7.1.0",
31
31
  "table": "6.9.0",
32
- "tmp": "0.2.3",
32
+ "tmp": "0.2.4",
33
33
  "update-notifier": "7.3.1",
34
34
  "ws": "^8.18.2",
35
35
  "yargs": "17.7.2",
36
36
  "yargs-parser": "21.1.1"
37
37
  },
38
38
  "devDependencies": {
39
+ "@hubspot/npm-scripts": "0.0.5",
39
40
  "@types/archiver": "^6.0.3",
40
41
  "@types/cli-progress": "^3.11.6",
41
42
  "@types/express": "^5.0.0",
@@ -52,7 +53,7 @@
52
53
  "@types/yargs": "^17.0.33",
53
54
  "@typescript-eslint/eslint-plugin": "^8.30.1",
54
55
  "@typescript-eslint/parser": "^8.11.0",
55
- "axios": "^1.7.4",
56
+ "axios": "^1.12.2",
56
57
  "eslint": "^8.56.0",
57
58
  "eslint-plugin-import": "^2.31.0",
58
59
  "husky": "^4.3.8",
@@ -80,7 +81,7 @@
80
81
  "lint": "echo 'Linting is disabled for Blazar'",
81
82
  "lint:local": "eslint . && prettier --list-different './**/*.{ts,tsx,js,json}'",
82
83
  "list-all-commands": "yarn tsx ./scripts/get-all-commands.ts",
83
- "local-link": "yarn tsx ./scripts/linking.ts",
84
+ "local-link": "hubspot-linking",
84
85
  "mcp-local": "yarn tsx ./scripts/mcp-local.ts",
85
86
  "prettier:write": "prettier --write './**/*.{ts,js,json}'",
86
87
  "release": "yarn tsx ./scripts/release.ts release",
package/types/Cms.d.ts CHANGED
@@ -7,9 +7,9 @@ export declare const CONTENT_TYPES: readonly ["ANY", "LANDING_PAGE", "SITE_PAGE"
7
7
  export type ContentType = (typeof CONTENT_TYPES)[number];
8
8
  export type CreateArgs = CommonArgs & ConfigArgs & {
9
9
  branch?: string;
10
- type: string;
11
- dest: string;
12
- name: string;
10
+ type?: string;
11
+ dest?: string;
12
+ name?: string;
13
13
  internal?: boolean;
14
14
  templateType?: TemplateType;
15
15
  moduleLabel?: string;
@@ -24,9 +24,9 @@ export type CreateArgs = CommonArgs & ConfigArgs & {
24
24
  };
25
25
  export type CmsAssetOperationArgs = {
26
26
  assetType: string;
27
- name: string;
28
- dest: string;
29
- getInternalVersion: boolean;
27
+ name?: string;
28
+ dest?: string;
29
+ getInternalVersion?: boolean;
30
30
  commandArgs: CreateArgs;
31
31
  };
32
32
  export type CreatableCmsAsset = {
package/types/Yargs.d.ts CHANGED
@@ -15,7 +15,7 @@ export type AccountArgs = {
15
15
  account?: string;
16
16
  };
17
17
  export type EnvironmentArgs = {
18
- 'use-env'?: boolean;
18
+ 'use-env'?: string;
19
19
  };
20
20
  export type OverwriteArgs = Options & {
21
21
  o?: boolean;
@@ -1,47 +0,0 @@
1
- import yargs from 'yargs';
2
- import { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addGlobalOptions, addJSONOutputOptions, } from '../../../lib/commonOpts.js';
3
- import installCommand from '../install.js';
4
- vi.mock('../../../lib/commonOpts');
5
- describe('commands/app/install', () => {
6
- const yargsMock = yargs;
7
- describe('command', () => {
8
- it('should have the correct command structure', () => {
9
- expect(installCommand.command).toEqual('install <test-account-id>');
10
- });
11
- });
12
- describe('describe', () => {
13
- it('should provide a description', () => {
14
- expect(installCommand.describe).not.toBeDefined();
15
- });
16
- });
17
- describe('builder', () => {
18
- it('should support the correct options', () => {
19
- installCommand.builder(yargsMock);
20
- expect(addGlobalOptions).toHaveBeenCalledTimes(1);
21
- expect(addGlobalOptions).toHaveBeenCalledWith(yargsMock);
22
- expect(addAccountOptions).toHaveBeenCalledTimes(1);
23
- expect(addAccountOptions).toHaveBeenCalledWith(yargsMock);
24
- expect(addConfigOptions).toHaveBeenCalledTimes(1);
25
- expect(addConfigOptions).toHaveBeenCalledWith(yargsMock);
26
- expect(addUseEnvironmentOptions).toHaveBeenCalledTimes(1);
27
- expect(addUseEnvironmentOptions).toHaveBeenCalledWith(yargsMock);
28
- expect(addJSONOutputOptions).toHaveBeenCalledTimes(1);
29
- expect(addJSONOutputOptions).toHaveBeenCalledWith(yargsMock);
30
- expect(yargsMock.positional).toHaveBeenCalledTimes(1);
31
- expect(yargsMock.positional).toHaveBeenCalledWith('test-account-id', expect.objectContaining({
32
- type: 'number',
33
- required: true,
34
- describe: expect.any(String),
35
- }));
36
- expect(yargsMock.option).toHaveBeenCalledTimes(2);
37
- expect(yargsMock.option).toHaveBeenCalledWith('app-uid', expect.objectContaining({
38
- type: 'string',
39
- describe: expect.any(String),
40
- }));
41
- expect(yargsMock.option).toHaveBeenCalledWith('project-name', expect.objectContaining({
42
- type: 'string',
43
- describe: expect.any(String),
44
- }));
45
- });
46
- });
47
- });
@@ -1,8 +0,0 @@
1
- import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, YargsCommandModule, JSONOutputArgs } from '../../types/Yargs.js';
2
- type InstallAppArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & JSONOutputArgs & {
3
- appUid?: string;
4
- projectName?: string;
5
- testAccountId: number;
6
- };
7
- declare const installAppCommand: YargsCommandModule<unknown, InstallAppArgs>;
8
- export default installAppCommand;