@hubspot/cli 7.7.35-experimental.0 → 7.8.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/doctor.test.js +16 -16
  4. package/commands/__tests__/getStarted.test.js +2 -2
  5. package/commands/__tests__/mcp.test.js +1 -1
  6. package/commands/__tests__/project.test.js +2 -3
  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 -6
  18. package/commands/app/migrate.js +13 -19
  19. package/commands/app/secret/add.js +2 -1
  20. package/commands/app/secret/delete.js +2 -1
  21. package/commands/app/secret/list.js +2 -1
  22. package/commands/app/secret/update.js +2 -1
  23. package/commands/app/secret.js +2 -1
  24. package/commands/app.js +2 -2
  25. package/commands/auth.d.ts +1 -0
  26. package/commands/auth.js +17 -7
  27. package/commands/cms/convertFields.js +7 -9
  28. package/commands/cms/getReactModule.js +9 -14
  29. package/commands/cms/lighthouseScore.js +33 -36
  30. package/commands/cms.js +2 -2
  31. package/commands/completion.js +3 -3
  32. package/commands/config/set.d.ts +1 -1
  33. package/commands/config/set.js +64 -37
  34. package/commands/config.js +2 -2
  35. package/commands/create.js +2 -2
  36. package/commands/customObject/create.js +10 -12
  37. package/commands/customObject/schema/create.js +9 -11
  38. package/commands/customObject/schema/delete.js +16 -16
  39. package/commands/customObject/schema/fetch-all.js +12 -11
  40. package/commands/customObject/schema/fetch.js +15 -15
  41. package/commands/customObject/schema/list.js +4 -4
  42. package/commands/customObject/schema/update.js +13 -13
  43. package/commands/customObject/schema.js +2 -2
  44. package/commands/customObject.js +6 -7
  45. package/commands/doctor.js +8 -11
  46. package/commands/feedback.js +8 -13
  47. package/commands/fetch.js +8 -8
  48. package/commands/filemanager/fetch.js +7 -7
  49. package/commands/filemanager/upload.js +15 -34
  50. package/commands/filemanager.js +2 -2
  51. package/commands/function/deploy.js +11 -29
  52. package/commands/function/list.js +8 -8
  53. package/commands/function/server.js +9 -11
  54. package/commands/function.d.ts +1 -1
  55. package/commands/function.js +2 -2
  56. package/commands/getStarted.d.ts +0 -2
  57. package/commands/getStarted.js +4 -4
  58. package/commands/hubdb/clear.js +7 -15
  59. package/commands/hubdb/create.js +9 -15
  60. package/commands/hubdb/delete.js +8 -15
  61. package/commands/hubdb/fetch.js +6 -9
  62. package/commands/hubdb.d.ts +1 -1
  63. package/commands/hubdb.js +2 -2
  64. package/commands/init.js +2 -3
  65. package/commands/lint.js +16 -16
  66. package/commands/list.js +8 -14
  67. package/commands/logs.js +14 -20
  68. package/commands/mcp/__tests__/setup.test.js +2 -2
  69. package/commands/mcp/setup.js +11 -2
  70. package/commands/mcp.js +3 -3
  71. package/commands/mv.js +6 -17
  72. package/commands/open.js +5 -5
  73. package/commands/project/__tests__/add.test.js +15 -13
  74. package/commands/project/__tests__/create.test.js +6 -6
  75. package/commands/project/__tests__/deploy.test.js +3 -7
  76. package/commands/project/__tests__/devUnifiedFlow.test.js +2 -4
  77. package/commands/project/__tests__/installDeps.test.js +8 -8
  78. package/commands/project/__tests__/list.test.js +31 -0
  79. package/commands/project/__tests__/logs.test.js +1 -4
  80. package/commands/project/__tests__/migrate.test.js +7 -7
  81. package/commands/project/__tests__/migrateApp.test.js +3 -7
  82. package/commands/project/__tests__/profile.test.js +1 -1
  83. package/commands/project/__tests__/validate.test.js +98 -0
  84. package/commands/project/add.d.ts +2 -2
  85. package/commands/project/add.js +7 -10
  86. package/commands/project/cloneApp.js +14 -19
  87. package/commands/project/create.js +3 -10
  88. package/commands/project/deploy.js +5 -5
  89. package/commands/project/dev/deprecatedFlow.js +9 -18
  90. package/commands/project/dev/index.js +21 -18
  91. package/commands/project/dev/unifiedFlow.js +14 -7
  92. package/commands/project/download.js +15 -16
  93. package/commands/project/installDeps.d.ts +2 -2
  94. package/commands/project/installDeps.js +9 -9
  95. package/commands/project/list.d.ts +4 -0
  96. package/commands/project/list.js +62 -0
  97. package/commands/project/listBuilds.js +12 -21
  98. package/commands/project/logs.js +21 -24
  99. package/commands/project/migrate.js +46 -15
  100. package/commands/project/migrateApp.js +10 -17
  101. package/commands/project/open.js +6 -14
  102. package/commands/project/profile/add.js +3 -3
  103. package/commands/project/profile/delete.js +1 -2
  104. package/commands/project/profile.js +2 -3
  105. package/commands/project/upload.js +16 -25
  106. package/commands/project/validate.js +7 -7
  107. package/commands/project/watch.js +13 -22
  108. package/commands/project.js +4 -3
  109. package/commands/sandbox/__tests__/create.test.js +5 -5
  110. package/commands/sandbox/create.js +22 -32
  111. package/commands/sandbox/delete.js +39 -64
  112. package/commands/sandbox.js +2 -2
  113. package/commands/secret/addSecret.js +7 -17
  114. package/commands/secret/deleteSecret.js +10 -20
  115. package/commands/secret/listSecret.js +8 -10
  116. package/commands/secret/updateSecret.js +9 -17
  117. package/commands/secret.js +2 -2
  118. package/commands/testAccount/__tests__/delete.test.js +2 -4
  119. package/commands/testAccount/create.js +2 -2
  120. package/commands/testAccount/delete.d.ts +4 -3
  121. package/commands/testAccount/delete.js +155 -14
  122. package/commands/testAccount/importData.d.ts +1 -1
  123. package/commands/testAccount/importData.js +1 -1
  124. package/commands/testAccount.js +1 -1
  125. package/commands/theme/preview.js +1 -4
  126. package/lang/en.d.ts +364 -110
  127. package/lang/en.js +409 -158
  128. package/lang/en.lyaml +4 -4
  129. package/lib/__tests__/buildAccount.test.js +4 -3
  130. package/lib/__tests__/commonOpts.test.js +1 -1
  131. package/lib/__tests__/dependencyManagement.test.js +1 -1
  132. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  133. package/lib/__tests__/npm.test.js +1 -1
  134. package/lib/__tests__/oauth.test.js +4 -4
  135. package/lib/__tests__/process.test.js +10 -5
  136. package/lib/__tests__/sandboxSync.test.js +8 -8
  137. package/lib/__tests__/sandboxes.test.js +8 -8
  138. package/lib/__tests__/serverlessLogs.test.js +1 -1
  139. package/lib/__tests__/usageTracking.test.js +5 -5
  140. package/lib/__tests__/validation.test.js +2 -1
  141. package/lib/__tests__/yargsUtils.test.js +83 -9
  142. package/lib/app/__tests__/migrate.test.js +19 -56
  143. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  144. package/lib/app/migrate.d.ts +2 -8
  145. package/lib/app/migrate.js +6 -81
  146. package/lib/app/migrate_legacy.js +20 -24
  147. package/lib/buildAccount.d.ts +2 -2
  148. package/lib/buildAccount.js +32 -64
  149. package/lib/commonOpts.d.ts +1 -1
  150. package/lib/commonOpts.js +25 -22
  151. package/lib/configMigrate.js +88 -9
  152. package/lib/configOptions.js +7 -0
  153. package/lib/constants.d.ts +21 -1
  154. package/lib/constants.js +25 -1
  155. package/lib/dependencyManagement.js +9 -27
  156. package/lib/developerTestAccounts.js +9 -23
  157. package/lib/doctor/Diagnosis.js +11 -23
  158. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  159. package/lib/doctor/Doctor.js +42 -90
  160. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  161. package/lib/errorHandlers/index.js +12 -20
  162. package/lib/errorHandlers/suppressError.js +11 -18
  163. package/lib/lang.js +6 -5
  164. package/lib/links.d.ts +1 -0
  165. package/lib/links.js +14 -7
  166. package/lib/mcp/setup.js +1 -1
  167. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  168. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  169. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  170. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  171. package/lib/middleware/commandTargetingUtils.js +74 -0
  172. package/lib/middleware/configMiddleware.d.ts +1 -1
  173. package/lib/middleware/configMiddleware.js +21 -81
  174. package/lib/middleware/fireAlarmMiddleware.js +15 -5
  175. package/lib/middleware/gitMiddleware.js +5 -1
  176. package/lib/middleware/notificationsMiddleware.js +5 -11
  177. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  178. package/lib/npm.js +2 -2
  179. package/lib/oauth.js +5 -5
  180. package/lib/process.js +5 -4
  181. package/lib/projects/__tests__/AppDevModeInterface.test.js +87 -90
  182. package/lib/projects/__tests__/LocalDevProcess.test.js +231 -19
  183. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +89 -63
  184. package/lib/projects/__tests__/deploy.test.js +73 -8
  185. package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
  186. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  187. package/lib/projects/__tests__/projects.test.js +12 -12
  188. package/lib/projects/__tests__/structure.test.js +3 -3
  189. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  190. package/lib/projects/__tests__/upload.test.js +82 -0
  191. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  192. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  193. package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
  194. package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
  195. package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
  196. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  197. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  198. package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +82 -7
  199. package/lib/projects/create/index.js +4 -4
  200. package/lib/projects/create/legacy.js +2 -2
  201. package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
  202. package/lib/projects/create/{v3.js → v2.js} +13 -11
  203. package/lib/projects/deploy.d.ts +1 -1
  204. package/lib/projects/deploy.js +2 -2
  205. package/lib/projects/localDev/AppDevModeInterface.d.ts +10 -1
  206. package/lib/projects/localDev/AppDevModeInterface.js +118 -89
  207. package/lib/projects/localDev/DevServerManager.d.ts +11 -29
  208. package/lib/projects/localDev/DevServerManager.js +19 -61
  209. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
  210. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
  211. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  212. package/lib/projects/localDev/LocalDevLogger.js +27 -6
  213. package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
  214. package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
  215. package/lib/projects/localDev/LocalDevProcess.js +93 -21
  216. package/lib/projects/localDev/LocalDevState.d.ts +12 -8
  217. package/lib/projects/localDev/LocalDevState.js +27 -17
  218. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +6 -1
  219. package/lib/projects/localDev/LocalDevWebsocketServer.js +94 -33
  220. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  221. package/lib/projects/localDev/helpers/account.js +2 -2
  222. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  223. package/lib/projects/localDev/helpers/project.js +44 -4
  224. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +7 -0
  225. package/lib/projects/localDev/localDevWebsocketServerUtils.js +19 -0
  226. package/lib/projects/platformVersion.d.ts +1 -1
  227. package/lib/projects/platformVersion.js +1 -1
  228. package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
  229. package/lib/projects/structure.js +6 -6
  230. package/lib/projects/upload.d.ts +1 -1
  231. package/lib/projects/upload.js +17 -8
  232. package/lib/projects/urls.d.ts +0 -1
  233. package/lib/projects/urls.js +0 -3
  234. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  235. package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
  236. package/lib/prompts/accountNamePrompt.js +14 -19
  237. package/lib/prompts/accountsPrompt.js +2 -2
  238. package/lib/prompts/cmsFieldPrompt.js +2 -2
  239. package/lib/prompts/createApiSamplePrompt.js +5 -5
  240. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  241. package/lib/prompts/createFunctionPrompt.js +14 -14
  242. package/lib/prompts/createModulePrompt.js +9 -9
  243. package/lib/prompts/createTemplatePrompt.js +2 -2
  244. package/lib/prompts/downloadProjectPrompt.js +5 -8
  245. package/lib/prompts/installAppPrompt.d.ts +1 -6
  246. package/lib/prompts/installAppPrompt.js +1 -6
  247. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  248. package/lib/prompts/previewPrompt.js +6 -6
  249. package/lib/prompts/projectAddPrompt.d.ts +2 -2
  250. package/lib/prompts/projectAddPrompt.js +9 -2
  251. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  252. package/lib/prompts/projectNamePrompt.js +4 -8
  253. package/lib/prompts/projectsLogsPrompt.js +2 -4
  254. package/lib/prompts/promptUtils.js +30 -9
  255. package/lib/prompts/sandboxesPrompt.js +7 -7
  256. package/lib/prompts/secretPrompt.js +3 -3
  257. package/lib/prompts/selectAppPrompt.js +3 -3
  258. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  259. package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
  260. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  261. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  262. package/lib/prompts/uploadPrompt.js +5 -5
  263. package/lib/sandboxSync.js +24 -41
  264. package/lib/sandboxes.js +19 -47
  265. package/lib/schema.js +3 -3
  266. package/lib/serverlessLogs.js +11 -13
  267. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  268. package/lib/theme/__tests__/migrate.test.js +233 -0
  269. package/lib/theme/migrate.d.ts +13 -0
  270. package/lib/theme/migrate.js +90 -0
  271. package/lib/ui/SpinniesManager.d.ts +2 -0
  272. package/lib/ui/SpinniesManager.js +7 -0
  273. package/lib/ui/boxen.js +1 -2
  274. package/lib/ui/git.js +13 -10
  275. package/lib/ui/index.d.ts +4 -0
  276. package/lib/ui/index.js +47 -38
  277. package/lib/ui/serverlessFunctionLogs.js +9 -7
  278. package/lib/ui/uiMessages.d.ts +72 -0
  279. package/lib/ui/uiMessages.js +75 -0
  280. package/lib/usageTracking.js +8 -8
  281. package/lib/validation.js +20 -23
  282. package/lib/yargsUtils.d.ts +1 -1
  283. package/lib/yargsUtils.js +12 -5
  284. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  285. package/mcp-server/tools/index.js +4 -0
  286. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +2 -2
  287. package/mcp-server/tools/project/CreateProjectTool.d.ts +2 -2
  288. package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
  289. package/mcp-server/tools/project/DocsSearchTool.js +5 -5
  290. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  291. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  292. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  293. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  294. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
  295. package/mcp-server/tools/project/GetConfigValuesTool.js +12 -6
  296. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  297. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
  298. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +12 -10
  299. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  300. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  301. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  302. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  303. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -7
  304. package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
  305. package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
  306. package/mcp-server/utils/cliConfig.d.ts +1 -0
  307. package/mcp-server/utils/cliConfig.js +12 -0
  308. package/mcp-server/utils/toolUsageTracking.js +2 -2
  309. package/package.json +8 -7
  310. package/types/LocalDev.d.ts +19 -3
  311. package/ui/index.js +1 -1
  312. package/lib/middleware/__test__/utils.test.js +0 -51
  313. package/lib/middleware/utils.d.ts +0 -8
  314. package/lib/middleware/utils.js +0 -14
  315. package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
  316. package/lib/projects/localDev/DevServerManagerV2.js +0 -81
  317. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/list.test.d.ts} +0 -0
  318. /package/{lib/projects/add/__tests__/v3AddComponent.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
  319. /package/lib/{projects/create/__tests__/v3.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
  320. /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
package/lang/en.js CHANGED
@@ -3,9 +3,10 @@ import { mapToUserFriendlyName } from '@hubspot/project-parsing-lib';
3
3
  import { PLATFORM_VERSIONS } from '@hubspot/local-dev-lib/constants/projects';
4
4
  import { PERSONAL_ACCESS_KEY_AUTH_METHOD } from '@hubspot/local-dev-lib/constants/auth';
5
5
  import { ARCHIVED_HUBSPOT_CONFIG_YAML_FILE_NAME, GLOBAL_CONFIG_PATH, DEFAULT_HUBSPOT_CONFIG_YAML_FILE_NAME, } from '@hubspot/local-dev-lib/constants/config';
6
- import { uiAccountDescription, uiBetaTag, uiCommandReference, uiLink, UI_COLORS, } from '../lib/ui/index.js';
7
- import { getProjectDetailUrl, getProjectSettingsUrl, getLocalDevUiUrl, getAppAllowlistUrl, } from '../lib/projects/urls.js';
8
- import { APP_DISTRIBUTION_TYPES, APP_AUTH_TYPES, PROJECT_CONFIG_FILE, PROJECT_WITH_APP, } from '../lib/constants.js';
6
+ import { uiAccountDescription, uiBetaTag, uiCommandReference, uiLink, UI_COLORS, uiAuthCommandReference, } from '../lib/ui/index.js';
7
+ import { getProjectDetailUrl, getProjectSettingsUrl, getLocalDevUiUrl, } from '../lib/projects/urls.js';
8
+ import { getProductUpdatesUrl } from '../lib/links.js';
9
+ import { APP_DISTRIBUTION_TYPES, APP_AUTH_TYPES, PROJECT_CONFIG_FILE, PROJECT_WITH_APP, LEGACY_PUBLIC_APP_FILE, } from '../lib/constants.js';
9
10
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
10
11
  export const commands = {
11
12
  generalErrors: {
@@ -18,6 +19,7 @@ export const commands = {
18
19
  },
19
20
  },
20
21
  getStarted: {
22
+ describe: 'A step-by-step command to get you started with a HubSpot project.',
21
23
  options: {
22
24
  dest: {
23
25
  describe: 'Directory where the project should be created',
@@ -84,7 +86,7 @@ export const commands = {
84
86
  errors: {
85
87
  invalidAccountIdProvided: `--account must be a number.`,
86
88
  failedToUpdateConfig: 'Failed to update the configuration file. Please try again.',
87
- migrationNotConfirmed: `Did not migrate your configuration file. Run ${uiCommandReference('hs auth')} to update your existing config, or use ${uiCommandReference('hs config migrate')} to switch to the new global configuration.`,
89
+ migrationNotConfirmed: `Did not migrate your configuration file. Run ${uiAuthCommandReference()} to update your existing config, or use ${uiCommandReference('hs config migrate')} to switch to the new global configuration.`,
88
90
  mergeNotConfirmed: `Did not merge configuration files. When you are ready to merge the deprecated config file with the global config file, run ${uiCommandReference('hs config migrate')}.`,
89
91
  },
90
92
  success: {
@@ -94,9 +96,13 @@ export const commands = {
94
96
  },
95
97
  list: {
96
98
  accounts: `${chalk.bold('Accounts')}:`,
97
- defaultAccount: (account) => `${chalk.bold('Default account')}: ${account}`,
99
+ defaultAccountTitle: `${chalk.bold('Default Account')}`,
100
+ defaultAccount: (account) => `Account: ${account}`,
98
101
  describe: 'List names of accounts defined in config.',
99
- configPath: (configPath) => `${chalk.bold('Config path')}: ${configPath}`,
102
+ configPath: (configPath) => `Source: ${configPath}`,
103
+ overrideFilePathTitle: `${chalk.bold('Default Account Override')}`,
104
+ overrideFilePath: (overrideFilePath) => `Source: ${overrideFilePath}`,
105
+ overrideAccount: (account) => `Account: ${account}`,
100
106
  labels: {
101
107
  accountId: 'Account ID',
102
108
  authType: 'Auth Type',
@@ -122,6 +128,8 @@ export const commands = {
122
128
  errors: {
123
129
  accountNotFound: (specifiedAccount, configPath) => `The account "${specifiedAccount}" could not be found in ${configPath}`,
124
130
  },
131
+ accountOverride: (accountOverride) => `This project currently has an account override set: "${accountOverride}". Account "${accountOverride}" will continue to act as the default account for this project.`,
132
+ accountOverrideCommands: `Use ${uiCommandReference('hs account create-override')} to change override accounts, or ${uiCommandReference('hs account remove-override')} to remove the override and use your default account.`,
125
133
  examples: {
126
134
  default: 'Select a HubSpot account to use as the default account',
127
135
  idBased: 'Set the default account to the account in the config with accountId equal to "1234567"',
@@ -143,6 +151,7 @@ export const commands = {
143
151
  replaceDefaultAccount: 'The removed account was the default account.',
144
152
  },
145
153
  prompts: {
154
+ deleteOverrideFile: (overrideFilePath, accountName) => `Delete the override file (${overrideFilePath}) associated with ${accountName}?`,
146
155
  selectAccountToRemove: 'Select an account to remove from the config',
147
156
  },
148
157
  errors: {
@@ -162,12 +171,40 @@ export const commands = {
162
171
  accountRemoved: (accountName) => `Account "${accountName}" removed from the config`,
163
172
  },
164
173
  },
174
+ removeOverride: {
175
+ describe: (overrideFile) => `Remove the default account override file (${overrideFile}) from the current working directory.`,
176
+ accountOverride: (overrideFilePath, accountOverride) => `There is an account override file at ${overrideFilePath} associated with account "${accountOverride}".`,
177
+ prompts: {
178
+ deleteOverrideFile: 'Delete account override file?',
179
+ },
180
+ success: 'Removed the default account override file.',
181
+ noOverrideFile: 'No default account override file found in the current working directory. No action required.',
182
+ errors: {
183
+ globalConfigNotFound: `This command is only compatible with our new global config. Run ${uiCommandReference('hs account auth')} to get started.`,
184
+ },
185
+ options: {
186
+ force: {
187
+ describe: 'Skip confirmation prompt when removing the override file',
188
+ },
189
+ },
190
+ },
165
191
  info: {
166
192
  accountId: (accountId) => `${chalk.bold('Account ID')}: ${accountId}`,
193
+ defaultAccountTitle: `${chalk.bold('Default Account')}`,
194
+ configPath: (configPath) => `Source: ${configPath}`,
195
+ defaultAccount: (accountName) => `Account: ${accountName}`,
196
+ overrideFilePathTitle: `${chalk.bold('Default Account Override')}`,
197
+ overrideFilePath: (overrideFilePath) => `Source: ${overrideFilePath}`,
198
+ overrideAccount: (accountName) => `Account: ${accountName}`,
167
199
  describe: 'Print information about the default account, or about the account specified with the "account" option.',
168
200
  errors: {
169
201
  notUsingPersonalAccessKey: 'This command currently only supports fetching scopes for the personal access key auth type.',
170
202
  },
203
+ options: {
204
+ account: {
205
+ describe: 'Account name or id to show info for',
206
+ },
207
+ },
171
208
  examples: {
172
209
  default: 'Print information for the default account',
173
210
  idBased: 'Print information for the account with accountId equal to "1234567"',
@@ -191,6 +228,30 @@ export const commands = {
191
228
  other: (count) => `Remove ${count} inactive accounts from the CLI config?`,
192
229
  },
193
230
  removeSuccess: (accountName) => `Removed ${accountName} from the CLI config.`,
231
+ replaceDefaultAccount: 'The default account was removed.',
232
+ defaultAccountOverride: (overrideFilePath) => `\n(This will also delete the default account override file at ${overrideFilePath})`,
233
+ },
234
+ createOverride: {
235
+ describe: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory.`,
236
+ success: (overrideFilePath) => `Default account override file created at ${overrideFilePath}`,
237
+ accountOverride: (overrideFilePath, accountOverride) => `An account override file already exists at ${overrideFilePath} associated with account "${accountOverride}".`,
238
+ prompts: {
239
+ replaceOverrideFile: 'Replace existing account override file?',
240
+ },
241
+ errors: {
242
+ globalConfigNotFound: `This command is only compatible with our new global config. Run ${uiCommandReference('hs account auth')} to get started.`,
243
+ accountNotFound: (configPath) => `The specified account could not be found in the config file ${configPath}`,
244
+ },
245
+ options: {
246
+ account: {
247
+ describe: 'Name or ID of the account to create an override file for.',
248
+ },
249
+ },
250
+ examples: {
251
+ default: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory`,
252
+ idBased: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory, using the account with accountId "1234567"`,
253
+ nameBased: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory, using the account with name "MyAccount"`,
254
+ },
194
255
  },
195
256
  },
196
257
  },
@@ -260,6 +321,10 @@ export const commands = {
260
321
  describe: 'Enable or disable automatic opening of the browser',
261
322
  },
262
323
  },
324
+ errors: {
325
+ invalidBoolean: (commandName, value) => `Invalid boolean value "${value}" for --${commandName}. Valid values are: true, false`,
326
+ invalidHTTPTimeout: `Invalid HTTP timeout value. Must be a number greater than 3000.`,
327
+ },
263
328
  },
264
329
  },
265
330
  },
@@ -280,6 +345,9 @@ export const commands = {
280
345
  pageTemplateScoreTitle: 'Page template scores',
281
346
  lighthouseLinksTitle: 'Lighthouse links',
282
347
  failedTemplatePathsTitle: 'The following templates could not be scored',
348
+ themeToCheckTitle: (themeToCheck, target) => `${themeToCheck} ${target} scores`,
349
+ themeTitle: (themeToCheck) => `Theme: ${themeToCheck}`,
350
+ poweredByLink: `Powered by ${uiLink('Google Lighthouse', 'https://developer.chrome.com/docs/lighthouse/overview/')}`,
283
351
  },
284
352
  errors: {
285
353
  targetOptionRequired: '[--target] is required for detailed view',
@@ -398,9 +466,9 @@ export const commands = {
398
466
  },
399
467
  },
400
468
  customObject: {
401
- betaMessage: `${chalk.bold('[BETA]')} The Custom Object CLI is currently in beta and is subject to change.`,
469
+ betaMessage: `The Custom Object CLI is currently in beta and is subject to change.`,
402
470
  describe: 'Commands for managing custom objects.',
403
- seeMoreLink: 'View our docs to find out more.',
471
+ seeMoreLink: `${uiLink('View our docs to find out more', 'https://developers.hubspot.com/docs/api-reference/crm-custom-objects-v3/guide#custom-objects-api-guide')}`,
404
472
  subcommands: {
405
473
  create: {
406
474
  describe: 'Create custom object instances.',
@@ -800,7 +868,7 @@ export const commands = {
800
868
  configFileUpdated: (authType, account) => `Connected account "${account}" using "${authType}" and set it as the default account`,
801
869
  },
802
870
  logs: {
803
- updateConfig: 'To update an existing config file, use the "hs auth" command.',
871
+ updateConfig: `To update an existing config file, use the ${uiAuthCommandReference()} command.`,
804
872
  },
805
873
  errors: {
806
874
  invalidAccountIdProvided: `--account must be a number.`,
@@ -862,8 +930,9 @@ export const commands = {
862
930
  tailLogs: (functionPath, accountId) => `Waiting for log entries for "${functionPath}" on account "${accountId}".\n`,
863
931
  },
864
932
  mcp: {
865
- describe: 'Commands for managing HubSpot MCP servers',
933
+ describe: 'Commands for managing HubSpot MCP servers.',
866
934
  setup: {
935
+ describe: 'Setup the HubSpot development MCP servers.',
867
936
  installingDocSearch: 'Adding the docs-search mcp server',
868
937
  claudeCode: 'Claude Code',
869
938
  cursor: 'Cursor',
@@ -875,6 +944,7 @@ export const commands = {
875
944
  },
876
945
  success: (derivedTargets) => `You can now use the HubSpot CLI MCP Server in ${derivedTargets.join(', ')}. ${chalk.bold('You may need to restart these tools to apply the changes')}.`,
877
946
  errors: {
947
+ needsMcpAccess: (accountId) => `You must opt in to the developer MCP beta to use this feature on ${uiAccountDescription(accountId)}. Try again with a different account or ${uiLink('join the beta now', getProductUpdatesUrl('239890', accountId))}`,
878
948
  needsNode20: `This feature requires node >=20`,
879
949
  errorParsingJsonFIle: (filename, errorMessage) => `Unable to update ${chalk.bold(filename)} due to invalid JSON: ${errorMessage}`,
880
950
  },
@@ -941,6 +1011,7 @@ export const commands = {
941
1011
  selectLink: 'Select a link to open',
942
1012
  },
943
1013
  project: {
1014
+ describe: `Commands for managing projects. For more information visit our documentation https://developers.hubspot.com/docs/getting-started/quickstart`,
944
1015
  profile: {
945
1016
  describe: 'Commands for managing project profiles',
946
1017
  verboseDescribe: `Commands for managing project profiles\n\nProfiles are stored at the root of your project's source directory and they make configuration dynamic. Use them to couple specialized configurations of your project to specific HubSpot accounts.\n\nRun ${uiCommandReference('hs project profile add')} to get started!`,
@@ -1009,11 +1080,11 @@ export const commands = {
1009
1080
  dev: {
1010
1081
  describe: 'Start local dev for the current project.',
1011
1082
  logs: {
1012
- betaMessage: 'HubSpot projects local development',
1083
+ header: 'HubSpot projects local development',
1013
1084
  placeholderAccountSelection: 'Using default account as target account (for now)',
1014
1085
  accountTypeInformation: 'Testing in a developer test account is strongly recommended, but you can use a sandbox account if your plan allows you to create one.',
1015
- learnMoreMessageV3: `Learn more about ${uiLink('HubSpot projects local dev', 'https://hubspot.mintlify.io/en-us/developer-tooling/local-development/hubspot-cli/project-commands#start-a-local-development-server')} | ${uiLink('HubSpot account types', 'https://developers.hubspot.com/docs/getting-started/account-types')}`,
1016
- learnMoreMessageLegacy: uiLink('Learn more about the projects local dev server', 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'),
1086
+ learnMoreMessageV2: `Learn more about ${uiLink('HubSpot projects local dev', 'https://developers.hubspot.com/docs/developer-tooling/local-development/hubspot-cli/project-commands#start-a-local-development-server')} | ${uiLink('HubSpot account types', 'https://developers.hubspot.com/docs/getting-started/account-types')}`,
1087
+ learnMoreMessageLegacy: uiLink('Learn more about the projects local dev server', 'https://developers.hubspot.com/docs/developer-tooling/local-development/hubspot-cli/project-commands#start-a-local-development-server'),
1017
1088
  profileProjectAccountExplanation: (accountId, profileName) => `Using account ${uiAccountDescription(accountId)} from profile ${chalk.bold(profileName)} for project upload`,
1018
1089
  defaultProjectAccountExplanation: (accountId) => `Using default account ${uiAccountDescription(accountId)} for project upload`,
1019
1090
  projectAccountFlagExplanation: (accountId) => `Using account ${uiAccountDescription(accountId)} provided by the --project-account flag for project upload`,
@@ -1023,21 +1094,22 @@ export const commands = {
1023
1094
  },
1024
1095
  errors: {
1025
1096
  noProjectConfig: 'No project detected. Please run this command again from a project directory.',
1026
- noAccount: (accountId) => `An error occurred while reading account ${uiAccountDescription(accountId)} from your config. Run ${uiCommandReference('hs auth')} to re-auth this account.`,
1027
- noAccountsInConfig: (authCommand) => `No accounts found in your config. Run ${chalk.bold(authCommand)} to configure a HubSpot account with the CLI.`,
1097
+ noAccount: (accountId) => `An error occurred while reading account ${uiAccountDescription(accountId)} from your config. Run ${uiAuthCommandReference()} to re-auth this account.`,
1098
+ noAccountsInConfig: `No accounts found in your config. Run ${uiAuthCommandReference()} to configure a HubSpot account with the CLI.`,
1028
1099
  invalidProjectComponents: 'Projects cannot contain both private and public apps. Move your apps to separate projects before attempting local development.',
1029
1100
  noRunnableComponents: `No supported components were found in this project. Run ${uiCommandReference('hs project add')} to see a list of available components and add one to your project.`,
1030
1101
  accountNotCombined: `\nLocal development of unified apps is currently only compatible with accounts that are opted into the unified apps beta. Make sure that this account is opted in or switch accounts using ${uiCommandReference('hs account use')}.`,
1031
1102
  unsupportedAccountFlagLegacy: 'The --project-account and --testing-account flags are not supported for projects with platform versions earlier than 2025.2.',
1032
- unsupportedAccountFlagV3: 'The --account flag is is not supported supported for projects with platform versions 2025.2 and newer. Use --testing-account and --project-account flags to specify accounts to use for local dev',
1103
+ unsupportedAccountFlagV2: 'The --account flag is is not supported supported for projects with platform versions 2025.2 and newer. Use --testing-account and --project-account flags to specify accounts to use for local dev',
1033
1104
  },
1034
1105
  examples: {
1035
1106
  default: 'Start local dev for the current project',
1036
1107
  },
1037
1108
  options: {
1038
1109
  profile: 'The profile to target during local dev',
1039
- projectAccount: 'The id of the account to upload your project to. Only compatible with platform versions 2025.2 and above.',
1040
- testingAccount: 'The id of the account to install apps and test on. Only compatible with platform versions 2025.2 and above.',
1110
+ projectAccount: 'The id of the account to upload your project to. Must be used with --testing-account. Supported on platform versions 2025.2 and newer.',
1111
+ testingAccount: 'The id of the account to install apps and test on. Must be used with --project-account. Supported on platform versions 2025.2 and newer.',
1112
+ account: 'The id of the account to upload your project to. Unsupported on platform versions 2025.2 and newer.',
1041
1113
  },
1042
1114
  },
1043
1115
  create: {
@@ -1069,7 +1141,7 @@ export const commands = {
1069
1141
  describe: 'Project name (cannot be changed)',
1070
1142
  },
1071
1143
  template: {
1072
- describe: 'The starting template',
1144
+ describe: 'The starting template. Only applies when platform version is less than 2025.2.',
1073
1145
  },
1074
1146
  templateSource: {
1075
1147
  describe: 'Path to custom GitHub repository from which to create project template',
@@ -1107,34 +1179,40 @@ export const commands = {
1107
1179
  describe: 'Project name (cannot be changed)',
1108
1180
  },
1109
1181
  },
1110
- header: {
1111
- text: 'This command will migrate an app to the projects framework. It will walk you through the fields required to complete the migration and download the project source code into a directory of your choosing.',
1112
- link: 'Learn more about migrating apps to the projects framework',
1113
- },
1114
- deprecationWarning: (oldCommand, newCommand) => `The ${oldCommand} command is deprecated and will be removed. Use ${newCommand} going forward.`,
1182
+ header: `This command will migrate an app to the projects framework. It will walk you through the fields required to complete the migration and download the project source code into a directory of your choosing.\n${uiLink('Learn more about migrating apps to the projects framework', 'https://developers.hubspot.com/docs/platform/migrate-a-public-app-to-projects')}`,
1183
+ deprecationWarning: (platformVersion) => `The ${uiCommandReference('hs project migrate-app')} command is deprecated and will be removed. Use ${uiCommandReference(`hs app migrate --platform-version=${platformVersion}`)} going forward.`,
1115
1184
  migrationStatus: {
1116
- inProgress: () => `Converting app configuration to ${chalk.bold('public-app.json')} component definition ...`,
1185
+ inProgress: () => `Converting app configuration to ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition ...`,
1117
1186
  success: () => `${chalk.bold('Your app was converted and build #1 is deployed')}`,
1118
- done: () => 'Converting app configuration to public-app.json component definition ... DONE',
1119
- failure: () => 'Converting app configuration to public-app.json component definition ... FAILED',
1187
+ done: () => `Converting app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... DONE`,
1188
+ failure: () => `Converting app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... FAILED`,
1120
1189
  },
1121
1190
  warning: {
1122
- title: () => `${chalk.bold('You are about to migrate an app to the projects framework')}`,
1123
- projectConversion: () => `${chalk.bold('The selected app will be converted to a project component.')}`,
1124
- appConfig: () => `All supported app configuration will be moved to the ${chalk.bold('public-app.json')} component definition file. Future updates to those features must be made through the project build and deploy pipeline, not the developer account UI.`,
1125
- buildAndDeploy: 'This will create a new project with a single app component and immediately build and deploy it to your developer account (build #1).',
1126
- existingApps: () => `${chalk.bold('This will not affect existing app users or installs.')}`,
1191
+ title: `${chalk.bold('You are about to migrate an app to the projects framework')}\n`,
1192
+ projectConversion: `${chalk.bold('The selected app will be converted to a project component.')}\n`,
1193
+ appConfig: `All supported app configuration will be moved to the ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition file. Future updates to those features must be made through the project build and deploy pipeline, not the developer account UI.\n`,
1194
+ buildAndDeploy: 'This will create a new project with a single app component and immediately build and deploy it to your developer account (build #1).\n',
1195
+ existingApps: `${chalk.bold('This will not affect existing app users or installs.')}`,
1127
1196
  copyApp: 'We strongly recommend making a copy of your app to test this process in a development app before replacing production.',
1128
1197
  },
1129
1198
  migrationInterrupted: '\nThe command is terminated, but app migration is still in progress. Please check your account to ensure that the project and associated app have been created successfully.',
1130
1199
  createAppPrompt: "Proceed with migrating this app to a project component (this process can't be aborted)?",
1131
1200
  projectDetailsLink: 'View project details in your developer account',
1201
+ errors: {
1202
+ noAppsForProject: (projectName) => `No apps associated with project ${projectName}`,
1203
+ noAccountConfig: 'No account configuration found. Please check your account settings.',
1204
+ projectAlreadyExists: (projectName) => `A project with name ${projectName} already exists. Please choose another name.`,
1205
+ invalidApp: (appId) => `Could not migrate appId ${appId}. This app cannot be migrated at this time. Please choose another public app.`,
1206
+ migrationFailed: 'Migration Failed',
1207
+ notAllowedWithinProject: `This command cannot be run from within a project directory. Run the command again from outside a project directory. If you are trying to migrate a project, run ${uiCommandReference('hs project migrate')}`,
1208
+ },
1132
1209
  },
1133
1210
  migrate: {
1134
1211
  preamble: (platformVersion) => `This command will migrate an existing project to platformVersion ${platformVersion}. It will walk you through the fields required to complete the migration and download the new project source code into the project source directory. It will also copy all of your existing files to a new directory (archive) in case you need access to your old files later.`,
1135
1212
  describe: 'Migrate an existing project to the new version of the projects framework.',
1136
1213
  errors: {
1137
1214
  noProjectConfig: (command) => `No project detected. Please run this command again from a project directory. If you are trying to migrate an app, run ${command}`,
1215
+ noThemeMigrationAccess: (accountId) => `This project contains a CMS theme. You must opt in to theme migration beta to continue updating it on ${uiAccountDescription(accountId)}. Try again with a different account or ${uiLink('join the beta now', getProductUpdatesUrl('253920', accountId))}`,
1138
1216
  },
1139
1217
  examples: {
1140
1218
  default: 'Migrate an existing project to the new version of the projects framework.',
@@ -1154,15 +1232,16 @@ export const commands = {
1154
1232
  },
1155
1233
  },
1156
1234
  cloneStatus: {
1157
- inProgress: () => `Cloning app configuration to ${chalk.bold('public-app.json')} component definition ...`,
1158
- done: 'Cloning app configuration to public-app.json component definition ... DONE',
1235
+ inProgress: `Cloning app configuration to ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition ...`,
1236
+ done: `Cloning app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... DONE`,
1159
1237
  success: (dest) => `Your cloned project was created in ${dest}`,
1160
- failure: 'Cloning app configuration to public-app.json component definition ... FAILED',
1238
+ failure: `Cloning app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... FAILED`,
1161
1239
  },
1162
1240
  errors: {
1163
1241
  invalidAccountTypeTitle: () => `${chalk.bold('Developer account not targeted')}`,
1164
1242
  invalidAccountTypeDescription: (useCommand, authCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${authCommand} and try again.`,
1165
1243
  couldNotWriteConfigPath: (configPath) => `Failed to write project config at ${configPath}`,
1244
+ noAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}`,
1166
1245
  },
1167
1246
  },
1168
1247
  add: {
@@ -1192,7 +1271,7 @@ export const commands = {
1192
1271
  maxExceeded: (maxCount) => `This project has the maximum allowed(${maxCount})`,
1193
1272
  authTypeNotAllowed: (authType) => `Auth type '${authType}' not allowed.`,
1194
1273
  distributionNotAllowed: (dist) => `Distribution '${dist}' not allowed.`,
1195
- portalDoesNotHaveAccessToThisFeature: (accountId) => `The account ${uiAccountDescription(accountId)} does not have access to this feature`,
1274
+ portalDoesNotHaveAccessToThisFeature: (accountId) => `The account ${uiAccountDescription(accountId)} does not have access to this feature.`,
1196
1275
  locationInProject: 'This command must be run from within a project directory.',
1197
1276
  failedToFetchComponentList: 'Failed to fetch the list of available features. Please try again later.',
1198
1277
  projectContainsPublicApp: 'This project contains a public app. This command is currently only compatible with projects that contain private apps.',
@@ -1269,7 +1348,7 @@ export const commands = {
1269
1348
  },
1270
1349
  logs: {
1271
1350
  showingLogs: 'Showing logs for:',
1272
- hubspotLogsDirectLink: 'View function logs in HubSpot',
1351
+ hubspotLogsDirectLink: (url) => `${uiLink('View function logs in HubSpot', url)}`,
1273
1352
  noLogsFound: (name) => `No logs were found for "${name}"`,
1274
1353
  },
1275
1354
  table: {
@@ -1310,11 +1389,11 @@ export const commands = {
1310
1389
  logs: {
1311
1390
  buildSucceeded: (buildId) => `Build #${buildId} succeeded\n`,
1312
1391
  readyToGoLive: '🚀 Ready to take your project live?',
1313
- runCommand: (command) => `Run \`${command}\``,
1314
- autoDeployDisabled: (deployCommand) => `Automatic deploys are disabled for this project. Run ${deployCommand} to deploy this build.`,
1392
+ runCommand: (command) => `Run \`${uiCommandReference(command)}\``,
1393
+ autoDeployDisabled: (deployCommand) => `Automatic deploys are disabled for this project. Run ${uiCommandReference(deployCommand)} to deploy this build.`,
1315
1394
  },
1316
1395
  errors: {
1317
- projectLockedError: () => `Your project is locked. This may mean that another user is running the ${chalk.bold('`hs project dev`')} command for this project. If this is you, unlock the project in Projects UI.`,
1396
+ projectLockedError: `Your project is locked. This may mean that another user is running the ${uiCommandReference('hs project dev')} command for this project. If this is you, unlock the project in Projects UI.`,
1318
1397
  },
1319
1398
  options: {
1320
1399
  forceCreate: {
@@ -1323,6 +1402,9 @@ export const commands = {
1323
1402
  message: {
1324
1403
  describe: 'Add a message when you upload your project and create a build',
1325
1404
  },
1405
+ profile: {
1406
+ describe: 'Profile to target for this upload',
1407
+ },
1326
1408
  },
1327
1409
  },
1328
1410
  watch: {
@@ -1360,6 +1442,7 @@ export const commands = {
1360
1442
  uploadFailed: (remotePath, filePath) => `Failed to upload file "${filePath}" to "${remotePath}"`,
1361
1443
  deleteFileFailed: (remotePath) => `Failed to delete file "${remotePath}"`,
1362
1444
  deleteFolderFailed: (remotePath) => `Failed to delete folder "${remotePath}"`,
1445
+ v2ApiError: (platformVersion) => `${uiCommandReference('hs project watch')} is not supported for platform version '${platformVersion}' use ${uiCommandReference('hs project dev')} instead to develop locally. ${uiLink('How to develop locally', 'https://developers.hubspot.com/docs/guides/crm/ui-extensions/local-development')}`,
1363
1446
  },
1364
1447
  },
1365
1448
  download: {
@@ -1374,6 +1457,7 @@ export const commands = {
1374
1457
  errors: {
1375
1458
  downloadFailed: 'Something went wrong downloading the project',
1376
1459
  projectNotFound: (projectName, accountId) => `Your project ${chalk.bold(projectName)} could not be found in ${accountId}`,
1460
+ noBuildIdToDownload: 'No build ID available for download',
1377
1461
  },
1378
1462
  warnings: {
1379
1463
  cannotDownloadWithinProject: 'Cancelling project download. Please run the command again outside the context of an existing project.',
@@ -1421,8 +1505,8 @@ export const commands = {
1421
1505
  addingDependenciesToLocation: (dependencies, directory) => `Installing ${dependencies} in ${directory}`,
1422
1506
  installingDependenciesFailed: (directory) => `Installing dependencies for ${directory} failed`,
1423
1507
  noProjectConfig: 'No project detected. Run this command from a project directory.',
1424
- noPackageJsonInProject: (projectName, link) => `No dependencies to install. The project ${projectName} folder might be missing component or subcomponent files. ${link}`,
1425
- packageManagerNotInstalled: (packageManager, link) => `This command depends on ${packageManager}, install ${chalk.bold(link)}`,
1508
+ noPackageJsonInProject: (projectName) => `No dependencies to install. The project ${projectName} folder might be missing component or subcomponent files. ${uiLink('Learn how to create a project from scratch', 'https://developers.hubspot.com/docs/apps/developer-platform/build-apps/create-an-app#customize-a-new-project-using-the-cli')}`,
1509
+ packageManagerNotInstalled: (packageManager) => `This command depends on ${packageManager}, install ${uiLink(packageManager, 'https://docs.npmjs.com/downloading-and-installing-node-js-and-npm')}`,
1426
1510
  },
1427
1511
  validate: {
1428
1512
  describe: 'Validate the project before uploading',
@@ -1439,6 +1523,17 @@ export const commands = {
1439
1523
  },
1440
1524
  },
1441
1525
  },
1526
+ list: {
1527
+ describe: 'List uploaded projects that exist in the current target account',
1528
+ projects: `${chalk.bold('Projects')}:`,
1529
+ labels: {
1530
+ name: 'Name',
1531
+ platformVersion: 'Platform Version',
1532
+ },
1533
+ errors: {
1534
+ noProjectsFound: (accountId) => `No projects found for account ${uiAccountDescription(accountId)}`,
1535
+ },
1536
+ },
1442
1537
  },
1443
1538
  remove: {
1444
1539
  describe: 'Delete a file or folder from the HubSpot CMS.',
@@ -1454,6 +1549,30 @@ export const commands = {
1454
1549
  describe: 'Commands for managing sandboxes.',
1455
1550
  subcommands: {
1456
1551
  create: {
1552
+ describe: 'Create a sandbox account.',
1553
+ failure: {
1554
+ noAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}. Run ${uiAuthCommandReference()} to add it.`,
1555
+ invalidAccountType: (accountType, accountName) => `Sandboxes must be created from a production account. Your current default account ${chalk.bold(accountName)} is a ${chalk.bold(accountType)}. \n- Run ${uiCommandReference('hs account use')} to switch to your default account to your production account. \n- Run ${uiAuthCommandReference()} to connect a production account to the HubSpot CLI.\n`,
1556
+ noSandboxAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}. Run ${uiAuthCommandReference()} to add the sandbox account.`,
1557
+ optionMissing: {
1558
+ type: 'Type is required when using --force. Use --type=developer or --type=standard.',
1559
+ name: 'Name is required when using --force. Use --name=YourSandboxName.',
1560
+ },
1561
+ },
1562
+ options: {
1563
+ force: {
1564
+ describe: 'Skips all prompts and uses provided options.',
1565
+ },
1566
+ name: {
1567
+ describe: 'Name of the sandbox account to create',
1568
+ },
1569
+ type: {
1570
+ describe: 'Type of sandbox to create (developer or standard)',
1571
+ },
1572
+ },
1573
+ examples: {
1574
+ default: 'Creates a standard sandbox named MySandboxAccount.',
1575
+ },
1457
1576
  developer: {
1458
1577
  loading: {
1459
1578
  add: (accountName) => `Creating developer sandbox ${chalk.bold(accountName)}`,
@@ -1465,11 +1584,11 @@ export const commands = {
1465
1584
  },
1466
1585
  failure: {
1467
1586
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1468
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
1469
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs accounts use')}.`,
1587
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
1588
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs account use')}.`,
1470
1589
  scopes: {
1471
1590
  message: "The personal access key you provided doesn't include developer sandbox permissions.",
1472
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1591
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1473
1592
  },
1474
1593
  },
1475
1594
  },
@@ -1484,11 +1603,11 @@ export const commands = {
1484
1603
  },
1485
1604
  failure: {
1486
1605
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1487
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
1488
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs accounts use')}.`,
1606
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
1607
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs account use')}.`,
1489
1608
  scopes: {
1490
1609
  message: "The personal access key you provided doesn't include standard sandbox permissions.",
1491
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1610
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1492
1611
  },
1493
1612
  },
1494
1613
  },
@@ -1496,28 +1615,28 @@ export const commands = {
1496
1615
  delete: {
1497
1616
  describe: 'Delete a sandbox account.',
1498
1617
  debug: {
1499
- deleting: (account) => `Deleting sandbox account "${account}"`,
1618
+ deleting: (account) => `Deleting sandbox account "${uiAccountDescription(account)}"`,
1500
1619
  error: 'Error deleting sandbox account:',
1501
1620
  },
1502
1621
  examples: {
1503
1622
  default: 'Deletes the sandbox account named MySandboxAccount.',
1504
1623
  },
1505
- confirm: (account) => `Delete sandbox ${chalk.bold(account)}? All data for this sandbox will be permanently deleted.`,
1506
- defaultAccountWarning: (account) => `The sandbox ${chalk.bold(account)} is currently set as the default account.`,
1624
+ confirm: (account) => `Delete sandbox ${uiAccountDescription(account)}? All data for this sandbox will be permanently deleted.`,
1625
+ defaultAccountWarning: (account) => `The sandbox ${uiAccountDescription(account)} is currently set as the default account.`,
1507
1626
  success: {
1508
1627
  delete: (account, sandboxHubId) => `Sandbox "${account}" with portalId "${sandboxHubId}" was deleted successfully.`,
1509
1628
  deleteDefault: (account, sandboxHubId) => `Sandbox "${account}" with portalId "${sandboxHubId}" was deleted successfully and removed as the default account.`,
1510
1629
  configFileUpdated: (account, configFilename) => `Removed account ${account} from ${configFilename}.`,
1511
1630
  },
1512
1631
  failure: {
1513
- invalidUser: (accountName, parentAccountName) => `Couldn't delete ${accountName} because your account has been removed from ${parentAccountName} or your permission set doesn't allow you to delete the sandbox. To update your permissions, contact a super admin in ${parentAccountName}.`,
1632
+ invalidUser: (account, parentAccount) => `Couldn't delete ${uiAccountDescription(account)} because your account has been removed from ${uiAccountDescription(parentAccount)} or your permission set doesn't allow you to delete the sandbox. To update your permissions, contact a super admin in ${uiAccountDescription(parentAccount)}.`,
1514
1633
  noAccount: 'No account specified. Specify an account by using the --account flag.',
1515
- noSandboxAccounts: (authCommand) => `There are no sandboxes connected to the CLI. To add a sandbox, run ${authCommand}.`,
1634
+ noSandboxAccounts: `There are no sandboxes connected to the CLI. To add a sandbox, run ${uiAuthCommandReference()}.`,
1516
1635
  noSandboxAccountId: "This sandbox can't be deleted from the CLI because we could not find the associated sandbox account.",
1517
- noParentAccount: (authCommand) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${authCommand} and add the parent account.`,
1518
- objectNotFound: (account) => `Sandbox ${chalk.bold(account)} may have been deleted through the UI. The account has been removed from the config.`,
1519
- noParentPortalAvailable: (command, url) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${command}. You can also delete the sandbox from the HubSpot management tool: ${chalk.bold(url)}.`,
1520
- invalidKey: (account, authCommand) => `Your personal access key for account ${chalk.bold(account)} is inactive. To re-authenticate, please run ${authCommand}.`,
1636
+ noParentAccount: `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${uiAuthCommandReference()} and add the parent account.`,
1637
+ objectNotFound: (account) => `Sandbox ${uiAccountDescription(account)} may have been deleted through the UI. The account has been removed from the config.`,
1638
+ noParentPortalAvailable: (command, url) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${uiCommandReference(command)}. You can also delete the sandbox from the HubSpot management tool: ${chalk.bold(url)}.`,
1639
+ invalidKey: (account) => `Your personal access key for account ${uiAccountDescription(account)} is inactive. To re-authenticate, please run ${uiAuthCommandReference()}.`,
1521
1640
  },
1522
1641
  options: {
1523
1642
  force: {
@@ -1542,7 +1661,13 @@ export const commands = {
1542
1661
  invalidUser: (accountName, parentAccountName) => `Couldn't sync ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to sync the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1543
1662
  scopes: {
1544
1663
  message: "The personal access key you provided doesn't include sandbox sync permissions.",
1545
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1664
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1665
+ },
1666
+ },
1667
+ confirm: {
1668
+ syncContactRecords: {
1669
+ standard: 'Copy up to 5000 most recently updated contacts? This includes up to 100 of each of the following: associated deals, tickets, and companies.',
1670
+ developer: 'Include up to 100 most recently updated contacts? This includes up to 100 of each of the following: associated deals, tickets, and companies. This can be done once per sandbox.',
1546
1671
  },
1547
1672
  },
1548
1673
  },
@@ -1622,7 +1747,7 @@ export const commands = {
1622
1747
  describe: 'Create a new secret.',
1623
1748
  errors: {
1624
1749
  add: (secretName) => `The secret "${secretName}" was not added`,
1625
- alreadyExists: (secretName, command) => `The secret "${secretName}" already exists, it's value can be modified with ${command}`,
1750
+ alreadyExists: (secretName) => `The secret "${secretName}" already exists, it's value can be modified with ${uiCommandReference('hs secret update')}`,
1626
1751
  },
1627
1752
  positionals: {
1628
1753
  name: {
@@ -1630,7 +1755,7 @@ export const commands = {
1630
1755
  },
1631
1756
  },
1632
1757
  success: {
1633
- add: (secretName, accountIdentifier) => `The secret "${secretName}" was added to the HubSpot account: ${accountIdentifier}`,
1758
+ add: (secretName, accountId) => `The secret "${secretName}" was added to the HubSpot account: ${uiAccountDescription(accountId)}`,
1634
1759
  },
1635
1760
  },
1636
1761
  delete: {
@@ -1648,7 +1773,7 @@ export const commands = {
1648
1773
  },
1649
1774
  },
1650
1775
  success: {
1651
- delete: (secretName, accountIdentifier) => `The secret "${secretName}" was deleted from the HubSpot account: ${accountIdentifier}`,
1776
+ delete: (secretName, accountId) => `The secret "${secretName}" was deleted from the HubSpot account: ${uiAccountDescription(accountId)}`,
1652
1777
  },
1653
1778
  },
1654
1779
  list: {
@@ -1671,7 +1796,7 @@ export const commands = {
1671
1796
  },
1672
1797
  },
1673
1798
  success: {
1674
- update: (secretName, accountIdentifier) => `The secret "${secretName}" was updated in the HubSpot account: ${accountIdentifier}`,
1799
+ update: (secretName, accountId) => `The secret "${secretName}" was updated in the HubSpot account: ${accountId}`,
1675
1800
  updateExplanation: 'Existing serverless functions will start using this new value within 10 seconds.',
1676
1801
  },
1677
1802
  },
@@ -1900,18 +2025,41 @@ export const commands = {
1900
2025
  example: (name) => `Create a test account config file with the name "${name}"`,
1901
2026
  },
1902
2027
  delete: {
1903
- describe: 'Delete a test account config file.',
2028
+ describe: 'Delete a test account from your HubSpot account and CLI config',
1904
2029
  pathPrompt: '[--path] What is the path to the test account config?',
2030
+ info: {
2031
+ deletionCanceled: 'Deletion canceled by user',
2032
+ accountNotFoundWithId: (id) => `No account was found with ID ${id}`,
2033
+ replaceDefaultAccount: (testAccountId, parentAccountName) => `The removed test account ${chalk.bold(testAccountId)} was the default account. Replaced default account to parent account: ${chalk.bold(parentAccountName)}`,
2034
+ },
2035
+ prompts: {
2036
+ selectTestAccounts: 'Select test account(s) to delete',
2037
+ confirmDeletion: 'All data for the account will be permanently deleted. Any connected apps will have their access tokens revoked. Do you wish to proceed?',
2038
+ },
1905
2039
  errors: {
1906
- failedToDelete: 'Failed to delete test account',
2040
+ failedToDelete: (testAccountToDelete) => `Failed to delete test account with ID ${testAccountToDelete}`,
2041
+ failedToSelectAccount: 'Failed to select a test account to delete',
2042
+ noAccountsToDelete: (accountId) => `There are no test accounts associated with ${uiAccountDescription(accountId)} to delete. Try running ${uiCommandReference('hs account use')} to change your default account`,
2043
+ failedToDeleteFromConfig: (testAccountToDelete) => `Failed to delete test account with ID ${testAccountToDelete} from the CLI config`,
2044
+ failedToFetchTestAccounts: 'Failed to fetch developer test accounts',
2045
+ testAccountNotFound: (nameOrId) => `Test account${nameOrId ? ` ${chalk.bold(nameOrId)}` : ''} not found in config. \nTry running ${uiCommandReference('hs account auth')} to add the account to config or visit ${uiLink('developer test accounts', 'https://app.hubspot.com/l/developer-test-accounts/')} to delete the test account.`,
2046
+ parentAccountNotFound: (testAccountId) => `Parent account of test account ${chalk.bold(testAccountId)} not found in config. \nTry running ${uiCommandReference('hs account auth')} to add the parent account to config or visit ${uiLink('developer test accounts', 'https://app.hubspot.com/l/developer-test-accounts/')} to delete the test account.`,
1907
2047
  },
1908
2048
  success: {
1909
- testAccountDeleted: (testAccountId) => `Test account with id ${testAccountId} successfully deleted`,
2049
+ testAccountDeletedFromHubSpot: (testAccountToDelete) => `Successfully deleted test account with ID ${testAccountToDelete}`,
2050
+ testAccountDeletedFromConfig: (accountId) => `Successfully deleted test account with ID ${accountId} from the CLI config`,
1910
2051
  },
1911
- positionals: {
1912
- testAccountId: 'The id of the test account',
2052
+ options: {
2053
+ name: 'The name of the test account (in your CLI config) to delete',
2054
+ id: 'The id of the test account',
2055
+ },
2056
+ examples: {
2057
+ withPositionalID: (testAccountToDelete) => `Delete a test account with id "${testAccountToDelete}" using positional argument`,
2058
+ withPositionalName: (testAccountToDelete) => `Delete a test account with name "${testAccountToDelete}" using positional argument`,
2059
+ withID: (testAccountToDelete) => `Delete a test account with the id "${testAccountToDelete}"`,
2060
+ withName: (testAccountToDelete) => `Delete a test account with the name "${testAccountToDelete}"`,
2061
+ withoutId: 'Delete a test account via a prompt',
1913
2062
  },
1914
- example: (testAccountId) => `Delete a test account with the id "${testAccountId}"`,
1915
2063
  },
1916
2064
  },
1917
2065
  secrets: {
@@ -1928,7 +2076,7 @@ export const commands = {
1928
2076
  invalidUser: (secretName, parentAccountName) => `Couldn't add ${chalk.bold(secretName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1929
2077
  scopes: {
1930
2078
  message: "The personal access key you provided doesn't include secrets permissions.",
1931
- instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2079
+ instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1932
2080
  },
1933
2081
  },
1934
2082
  },
@@ -1945,7 +2093,7 @@ export const commands = {
1945
2093
  invalidUser: (secretName, parentAccountName) => `Couldn't delete ${chalk.bold(secretName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1946
2094
  scopes: {
1947
2095
  message: "The personal access key you provided doesn't include secrets permissions.",
1948
- instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2096
+ instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1949
2097
  },
1950
2098
  },
1951
2099
  },
@@ -1962,7 +2110,7 @@ export const commands = {
1962
2110
  invalidUser: (parentAccountName) => `Couldn't list secrets because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1963
2111
  scopes: {
1964
2112
  message: "The personal access key you provided doesn't include secrets permissions.",
1965
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2113
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1966
2114
  },
1967
2115
  },
1968
2116
  },
@@ -1981,7 +2129,7 @@ export const commands = {
1981
2129
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1982
2130
  scopes: {
1983
2131
  message: "The personal access key you provided doesn't include serverless function permissions.",
1984
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2132
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1985
2133
  },
1986
2134
  },
1987
2135
  },
@@ -1998,7 +2146,7 @@ export const commands = {
1998
2146
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1999
2147
  scopes: {
2000
2148
  message: "The personal access key you provided doesn't include serverless function permissions.",
2001
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2149
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2002
2150
  },
2003
2151
  },
2004
2152
  },
@@ -2015,7 +2163,7 @@ export const commands = {
2015
2163
  invalidUser: (parentAccountName) => `Couldn't list serverless functions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2016
2164
  scopes: {
2017
2165
  message: "The personal access key you provided doesn't include serverless function permissions.",
2018
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2166
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2019
2167
  },
2020
2168
  },
2021
2169
  },
@@ -2034,7 +2182,7 @@ export const commands = {
2034
2182
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2035
2183
  scopes: {
2036
2184
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2037
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2185
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2038
2186
  },
2039
2187
  },
2040
2188
  },
@@ -2051,7 +2199,7 @@ export const commands = {
2051
2199
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2052
2200
  scopes: {
2053
2201
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2054
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2202
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2055
2203
  },
2056
2204
  },
2057
2205
  },
@@ -2068,7 +2216,7 @@ export const commands = {
2068
2216
  invalidUser: (parentAccountName) => `Couldn't list serverless function logs because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2069
2217
  scopes: {
2070
2218
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2071
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2219
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2072
2220
  },
2073
2221
  },
2074
2222
  },
@@ -2087,7 +2235,7 @@ export const commands = {
2087
2235
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2088
2236
  scopes: {
2089
2237
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2090
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2238
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2091
2239
  },
2092
2240
  },
2093
2241
  },
@@ -2104,7 +2252,7 @@ export const commands = {
2104
2252
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2105
2253
  scopes: {
2106
2254
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2107
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2255
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2108
2256
  },
2109
2257
  },
2110
2258
  },
@@ -2121,7 +2269,7 @@ export const commands = {
2121
2269
  invalidUser: (parentAccountName) => `Couldn't list serverless function metrics because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2122
2270
  scopes: {
2123
2271
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2124
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2272
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2125
2273
  },
2126
2274
  },
2127
2275
  },
@@ -2140,7 +2288,7 @@ export const commands = {
2140
2288
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2141
2289
  scopes: {
2142
2290
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2143
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2291
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2144
2292
  },
2145
2293
  },
2146
2294
  },
@@ -2157,7 +2305,7 @@ export const commands = {
2157
2305
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2158
2306
  scopes: {
2159
2307
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2160
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2308
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2161
2309
  },
2162
2310
  },
2163
2311
  },
@@ -2174,7 +2322,7 @@ export const commands = {
2174
2322
  invalidUser: (parentAccountName) => `Couldn't list serverless function settings because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2175
2323
  scopes: {
2176
2324
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2177
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2325
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2178
2326
  },
2179
2327
  },
2180
2328
  },
@@ -2193,7 +2341,7 @@ export const commands = {
2193
2341
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2194
2342
  scopes: {
2195
2343
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2196
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2344
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2197
2345
  },
2198
2346
  },
2199
2347
  },
@@ -2210,7 +2358,7 @@ export const commands = {
2210
2358
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2211
2359
  scopes: {
2212
2360
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2213
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2361
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2214
2362
  },
2215
2363
  },
2216
2364
  },
@@ -2227,7 +2375,7 @@ export const commands = {
2227
2375
  invalidUser: (parentAccountName) => `Couldn't list serverless function versions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2228
2376
  scopes: {
2229
2377
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2230
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2378
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2231
2379
  },
2232
2380
  },
2233
2381
  },
@@ -2246,7 +2394,7 @@ export const commands = {
2246
2394
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2247
2395
  scopes: {
2248
2396
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2249
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2397
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2250
2398
  },
2251
2399
  },
2252
2400
  },
@@ -2263,7 +2411,7 @@ export const commands = {
2263
2411
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2264
2412
  scopes: {
2265
2413
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2266
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2414
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2267
2415
  },
2268
2416
  },
2269
2417
  },
@@ -2280,7 +2428,7 @@ export const commands = {
2280
2428
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhooks because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2281
2429
  scopes: {
2282
2430
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2283
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2431
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2284
2432
  },
2285
2433
  },
2286
2434
  },
@@ -2299,7 +2447,7 @@ export const commands = {
2299
2447
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2300
2448
  scopes: {
2301
2449
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2302
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2450
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2303
2451
  },
2304
2452
  },
2305
2453
  },
@@ -2316,7 +2464,7 @@ export const commands = {
2316
2464
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2317
2465
  scopes: {
2318
2466
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2319
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2467
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2320
2468
  },
2321
2469
  },
2322
2470
  },
@@ -2333,7 +2481,7 @@ export const commands = {
2333
2481
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscriptions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2334
2482
  scopes: {
2335
2483
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2336
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2484
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2337
2485
  },
2338
2486
  },
2339
2487
  },
@@ -2352,7 +2500,7 @@ export const commands = {
2352
2500
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2353
2501
  scopes: {
2354
2502
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2355
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2503
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2356
2504
  },
2357
2505
  },
2358
2506
  },
@@ -2369,7 +2517,7 @@ export const commands = {
2369
2517
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2370
2518
  scopes: {
2371
2519
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2372
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2520
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2373
2521
  },
2374
2522
  },
2375
2523
  },
@@ -2386,7 +2534,7 @@ export const commands = {
2386
2534
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription events because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2387
2535
  scopes: {
2388
2536
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2389
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2537
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2390
2538
  },
2391
2539
  },
2392
2540
  },
@@ -2405,7 +2553,7 @@ export const commands = {
2405
2553
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2406
2554
  scopes: {
2407
2555
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2408
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2556
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2409
2557
  },
2410
2558
  },
2411
2559
  },
@@ -2422,7 +2570,7 @@ export const commands = {
2422
2570
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2423
2571
  scopes: {
2424
2572
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2425
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2573
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2426
2574
  },
2427
2575
  },
2428
2576
  },
@@ -2439,7 +2587,7 @@ export const commands = {
2439
2587
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription event types because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2440
2588
  scopes: {
2441
2589
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2442
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2590
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2443
2591
  },
2444
2592
  },
2445
2593
  },
@@ -2458,7 +2606,7 @@ export const commands = {
2458
2606
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2459
2607
  scopes: {
2460
2608
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2461
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2609
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2462
2610
  },
2463
2611
  },
2464
2612
  },
@@ -2475,7 +2623,7 @@ export const commands = {
2475
2623
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2476
2624
  scopes: {
2477
2625
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2478
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2626
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2479
2627
  },
2480
2628
  },
2481
2629
  },
@@ -2492,7 +2640,7 @@ export const commands = {
2492
2640
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription event type options because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2493
2641
  scopes: {
2494
2642
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2495
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2643
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2496
2644
  },
2497
2645
  },
2498
2646
  },
@@ -2558,10 +2706,14 @@ export const lib = {
2558
2706
  },
2559
2707
  },
2560
2708
  AppDevModeInterface: {
2709
+ autoInstallStaticAuthApp: {
2710
+ installing: (appName, targetTestAccountId) => `Installing ${chalk.bold(appName)} on account ${uiAccountDescription(targetTestAccountId)}...`,
2711
+ success: (appName, targetTestAccountId) => `Successfully installed ${chalk.bold(appName)} on account ${uiAccountDescription(targetTestAccountId)}\n`,
2712
+ error: (appName, targetTestAccountId) => `Error installing ${chalk.bold(appName)} on account ${uiAccountDescription(targetTestAccountId)}. You may still be able to install your app in your browser.`,
2713
+ },
2561
2714
  defaultMarketplaceAppWarning: (installCount) => `Your marketplace app is currently installed in ${chalk.bold(`${installCount} ${installCount === 1 ? 'account' : 'accounts'}`)}. Any uploaded changes will impact your app's users. We strongly recommend creating a copy of this app to test your changes before proceeding.`,
2562
2715
  autoInstallDeclined: 'You must install your app on your target test account to proceed with local development.',
2563
2716
  autoInstallSuccess: (appName, targetTestAccountId) => `Successfully installed app ${appName} on account ${uiAccountDescription(targetTestAccountId)}\n`,
2564
- autoInstallError: (appName, targetTestAccountId) => `Error installing app ${appName} on account ${uiAccountDescription(targetTestAccountId)}. You may still be able to install your app in your browser.`,
2565
2717
  fetchAppData: {
2566
2718
  checking: (appName) => `Checking installations for your app ${chalk.bold(appName)}...`,
2567
2719
  success: (appName, accountId) => `Your app ${chalk.bold(appName)} is installed on account ${uiAccountDescription(accountId, false)}`,
@@ -2571,6 +2723,12 @@ export const lib = {
2571
2723
  },
2572
2724
  distributionChanged: `Your app's distribution type has been changed from ${APP_DISTRIBUTION_TYPES.PRIVATE} to ${APP_DISTRIBUTION_TYPES.MARKETPLACE}. Once uploaded, this change cannot be reversed. Before uploading your project, confirm that you want to ${chalk.bold('permanantly')} change your app's distribution type. This will uninstall your app from all accounts.`,
2573
2725
  authTypeChanged: `Your app's auth type has been changed from ${APP_AUTH_TYPES.STATIC} to ${APP_AUTH_TYPES.OAUTH}. Once uploaded, this change cannot be reversed. Before uploading your project, confirm that you want to ${chalk.bold('permanantly')} change your app's auth type. This will uninstall your app from all accounts.`,
2726
+ installationFailed: 'An error occured while installing your app. Your app must be installed in your target test account to proceed with local development.',
2727
+ waitUntilAppIsInstalled: {
2728
+ link: (installUrl) => `${uiLink('Install your app', installUrl)} to proceed with local development\n`,
2729
+ waiting: 'Waiting for your app to be installed...',
2730
+ success: (appName, accountId) => `Your app ${chalk.bold(appName)} has been installed successfully on account ${uiAccountDescription(accountId)}\n`,
2731
+ },
2574
2732
  },
2575
2733
  LocalDevWebsocketServer: {
2576
2734
  errors: {
@@ -2588,8 +2746,13 @@ export const lib = {
2588
2746
  LocalDevProcess: {
2589
2747
  projectConfigMismatch: `Unable to upload project. The project config has been modified since starting ${uiCommandReference('hs project dev')}.`,
2590
2748
  uploadInitiated: 'Project upload initiated from Local Dev UI.',
2749
+ deployInitiated: 'Project deploy initiated from Local Dev UI.',
2591
2750
  uploadFailed: 'Project upload failed. To proceed with local development, fix any necessary errors, then re-upload your project.',
2751
+ deployFailed: 'Project deploy failed. To proceed with local development, fix any necessary errors, then re-deploy your project.',
2592
2752
  uploadSuccess: 'Project upload completed successfully. Resuming local dev...',
2753
+ uploadSuccessAutoDeployDisabled: 'Project upload completed successfully, but auto-deploy is disabled for this project. Deploy your latest build to proceed with local development.',
2754
+ deploySuccess: 'Project deploy completed successfully. Resuming local dev...',
2755
+ noBuildToDeploy: 'Error deploying project. No build was found to deploy.',
2593
2756
  },
2594
2757
  localDevHelpers: {
2595
2758
  project: {
@@ -2598,7 +2761,7 @@ export const lib = {
2598
2761
  checking: 'Checking if your deployed build is up to date...',
2599
2762
  upToDate: 'Deployed build is up to date.',
2600
2763
  notUpToDate: `Your project contains undeployed local changes.`,
2601
- notUpToDateExplanation: (profile) => `Run ${uiCommandReference(`hs project upload ${profile ? `--profile ${profile}` : ''}`)} to upload these changes to HubSpot, then re-run ${uiCommandReference(`hs project dev ${profile ? `--profile ${profile}` : ''}`)} to continue local development.`,
2764
+ notUpToDateExplanation: (profile) => `Run ${uiCommandReference(`hs project upload${profile ? ` --profile ${profile}` : ''}`)} to upload these changes to HubSpot, then re-run ${uiCommandReference(`hs project dev${profile ? ` --profile ${profile}` : ''}`)} to continue local development.`,
2602
2765
  },
2603
2766
  createNewProjectForLocalDev: {
2604
2767
  projectMustExistExplanation: (projectName, accountId) => `The project ${projectName} does not exist in the target account ${uiAccountDescription(accountId)}. This command requires the project to exist in the target account.`,
@@ -2614,37 +2777,42 @@ export const lib = {
2614
2777
  projectLockedError: 'Your project is locked. This may mean that another user is running the `hs project watch` command for this project. If this is you, unlock the project in Projects UI.',
2615
2778
  genericError: `An error occurred while creating the initial build for this project. Run ${uiCommandReference('hs project upload')} to try again.`,
2616
2779
  },
2780
+ checkAndInstallDependencies: {
2781
+ checkingDependencies: 'Checking for missing or updated dependencies...',
2782
+ dependenciesUpToDate: 'All dependencies are up to date',
2783
+ dependenciesFailure: 'Failed to check or install dependencies',
2784
+ },
2617
2785
  },
2618
2786
  account: {
2619
2787
  checkIfDefaultAccountIsSupported: {
2620
- publicApp: `This project contains a public app. Local development of public apps is only supported on developer accounts and developer test accounts. Change your default account using ${uiCommandReference('hs accounts use')}, or link a new account with ${uiCommandReference('hs auth')}.`,
2621
- privateApp: `This project contains a private app. Local development of private apps is not supported in developer accounts. Change your default account using ${uiCommandReference('hs accounts use')}, or link a new account with ${uiCommandReference('hs auth')}.`,
2788
+ publicApp: `This project contains a public app. Local development of public apps is only supported on developer accounts and developer test accounts. Change your default account using ${uiCommandReference('hs account use')}, or link a new account with ${uiAuthCommandReference()}.`,
2789
+ privateApp: `This project contains a private app. Local development of private apps is not supported in developer accounts. Change your default account using ${uiCommandReference('hs account use')}, or link a new account with ${uiAuthCommandReference()}.`,
2622
2790
  },
2623
2791
  validateAccountOption: {
2624
- invalidPublicAppAccount: `This project contains a public app. The "--account" flag must point to a developer test account to develop this project locally. Alternatively, change your default account to an App Developer Account using ${uiCommandReference('hs accounts use')} and run ${uiCommandReference('hs project dev')} to set up a new Developer Test Account.`,
2625
- invalidPrivateAppAccount: `This project contains a private app. The account specified with the "--account" flag points to a developer account, which do not support the local development of private apps. Update the "--account" flag to point to a standard, sandbox, or developer test account, or change your default account by running ${uiCommandReference('hs accounts use')}.`,
2626
- nonSandboxWarning: `Testing in a sandbox is strongly recommended. To switch the target account, select an option below or run ${uiCommandReference('hs accounts use')} before running the command again.`,
2792
+ invalidPublicAppAccount: `This project contains a public app. The "--account" flag must point to a developer test account to develop this project locally. Alternatively, change your default account to an App Developer Account using ${uiCommandReference('hs account use')} and run ${uiCommandReference('hs project dev')} to set up a new Developer Test Account.`,
2793
+ invalidPrivateAppAccount: `This project contains a private app. The account specified with the "--account" flag points to a developer account, which do not support the local development of private apps. Update the "--account" flag to point to a standard, sandbox, or developer test account, or change your default account by running ${uiCommandReference('hs account use')}.`,
2794
+ nonSandboxWarning: `Testing in a sandbox is strongly recommended. To switch the target account, select an option below or run ${uiCommandReference('hs account use')} before running the command again.`,
2627
2795
  publicAppNonDeveloperTestAccountWarning: `Local development of public apps is only supported in ${chalk.bold('developer test accounts')}.`,
2628
2796
  },
2629
2797
  checkIfParentAccountIsAuthed: {
2630
- notAuthedError: (parentAccountId, accountIdentifier) => `To develop this project locally, run ${uiCommandReference(`hs auth --account=${parentAccountId}`)} to authenticate the App Developer Account ${parentAccountId} associated with ${accountIdentifier}.`,
2798
+ notAuthedError: (parentAccountId, accountIdentifier) => `To develop this project locally, run ${uiAuthCommandReference({ accountId: parentAccountId })} to authenticate the App Developer Account ${parentAccountId} associated with ${accountIdentifier}.`,
2631
2799
  },
2632
2800
  selectAccountTypePrompt: {
2633
- message: '[--testing-account] Choose the type of account to test on',
2801
+ message: 'Choose the type of account to test on',
2634
2802
  developerTestAccountOption: 'Test on a developer test account (recommended)',
2635
2803
  sandboxAccountOption: 'Test on a sandbox account',
2636
2804
  sandboxAccountOptionDisabled: 'Disabled - requires access to sandbox accounts',
2637
2805
  productionAccountOption: (accountId) => `<${chalk.red('!')} Test on your project account: ${uiAccountDescription(accountId, false)} ${chalk.red('!')}>`,
2638
2806
  },
2639
2807
  confirmDefaultAccountIsTarget: {
2640
- configError: `An error occurred while reading the default account from your config. Run ${uiCommandReference('hs auth')} to re-auth this account`,
2641
- declineDefaultAccountExplanation: `To develop on a different account, run ${uiCommandReference('hs accounts use')} to change your default account, then re-run ${uiCommandReference('hs project dev')}.`,
2808
+ configError: `An error occurred while reading the default account from your config. Run ${uiAuthCommandReference()} to re-auth this account`,
2809
+ declineDefaultAccountExplanation: `To develop on a different account, run ${uiCommandReference('hs account use')} to change your default account, then re-run ${uiCommandReference('hs project dev')}.`,
2642
2810
  },
2643
2811
  },
2644
2812
  },
2645
2813
  middleware: {
2646
2814
  updateNotification: {
2647
- notifyTitle: chalk.bold('Update available'),
2815
+ notifyTitle: chalk.bold('CLI update available'),
2648
2816
  cmsUpdateNotification: (packageName) => `${chalk.bold('The CMS CLI is now the HubSpot CLI')}\n\nTo upgrade, uninstall ${chalk.bold(packageName)}\nand then run ${uiCommandReference('{updateCommand}')}`,
2649
2817
  cliUpdateNotification: `HubSpot CLI version ${chalk.cyan(chalk.bold('{currentVersion}'))} is outdated.\nRun ${uiCommandReference('{updateCommand}')} to upgrade to version ${chalk.cyan(chalk.bold('{latestVersion}'))}`,
2650
2818
  },
@@ -2755,6 +2923,7 @@ export const lib = {
2755
2923
  compressed: (byteCount) => `Project files compressed: ${byteCount} bytes`,
2756
2924
  compressing: (path) => `Compressing build files to "${path}"`,
2757
2925
  fileFiltered: (filename) => `Ignore rule triggered for "${filename}"`,
2926
+ legacyFileDetected: (filename, platformVersion) => `The ${chalk.bold(filename)} file is not supported on platform version ${chalk.bold(platformVersion)} and will be ignored.`,
2758
2927
  },
2759
2928
  },
2760
2929
  boxen: {
@@ -2771,13 +2940,15 @@ export const lib = {
2771
2940
  viewImportLink: (baseUrl, accountId, importId) => `Data import currently processing. You can view the status of your import ${uiLink('here', `${baseUrl}/import/${accountId}/post/${importId}`)}`,
2772
2941
  },
2773
2942
  ui: {
2774
- betaTag: chalk.bold('[BETA]'),
2943
+ betaTag: '[BETA]',
2944
+ betaTagWithStyle: chalk.bold('[BETA]'),
2775
2945
  betaWarning: {
2776
2946
  header: chalk.yellow('***************************** WARNING ****************************'),
2777
2947
  footer: chalk.yellow('******************************************************************'),
2778
2948
  },
2779
2949
  infoTag: chalk.bold('[INFO]'),
2780
- deprecatedTag: chalk.bold('[DEPRECATED]'),
2950
+ deprecatedTag: '[DEPRECATED]',
2951
+ deprecatedTagWithStyle: chalk.bold('[DEPRECATED]'),
2781
2952
  errorTag: chalk.bold('[ERROR]'),
2782
2953
  deprecatedMessage: (command, url) => `The ${command} command is deprecated and will be disabled soon. ${url}`,
2783
2954
  deprecatedDescription: (message, command, url) => `${message}. The ${command} command is deprecated and will be disabled soon. ${url}`,
@@ -2796,7 +2967,7 @@ export const lib = {
2796
2967
  message: (command) => `${command} - See a list of configured HubSpot accounts`,
2797
2968
  },
2798
2969
  accountsUseCommand: {
2799
- command: 'hs accounts use',
2970
+ command: 'hs account use',
2800
2971
  message: (command) => `${command} - Set the Hubspot account that the CLI will target by default`,
2801
2972
  },
2802
2973
  authCommand: {
@@ -2835,6 +3006,9 @@ export const lib = {
2835
3006
  command: 'hs project install-deps',
2836
3007
  message: (command) => `${command} - Install all project dependencies`,
2837
3008
  },
3009
+ projectCommandTip: {
3010
+ message: 'Tip: All project commands must be run from within a project directory',
3011
+ },
2838
3012
  sampleProjects: {
2839
3013
  linkText: "HubSpot's sample projects",
2840
3014
  url: 'https://developers.hubspot.com/docs/platform/sample-projects?utm_source=cli&utm_content=project_create_whats_next',
@@ -2858,7 +3032,7 @@ export const lib = {
2858
3032
  },
2859
3033
  },
2860
3034
  buildAccount: {
2861
- createDeveloperTestAccountV3: {
3035
+ createDeveloperTestAccountV2: {
2862
3036
  syncFailure: 'Failed to sync developer test account',
2863
3037
  pakFailure: 'Failed to generate personal access key for developer test account',
2864
3038
  },
@@ -2873,25 +3047,26 @@ export const lib = {
2873
3047
  },
2874
3048
  setAllowUsageTracking: {
2875
3049
  fieldName: 'usage tracking',
2876
- success: (isEnabled) => `Allow usage tracking set to: "${isEnabled}"`,
3050
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow usage tracking')} to ${chalk.bold(isEnabled)}`,
2877
3051
  },
2878
3052
  setAllowAutoUpdates: {
2879
3053
  fieldName: 'auto updates',
2880
- success: (isEnabled) => `Allow auto updates set to: "${isEnabled}"`,
3054
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow auto updates')} to ${chalk.bold(isEnabled)}`,
2881
3055
  },
2882
3056
  setDefaultCmsPublishMode: {
2883
3057
  promptMessage: 'Select CMS publish mode to be used as the default',
2884
3058
  error: (validModes) => `The provided CMS publish mode is invalid. Valid values are ${validModes}.`,
2885
- success: (mode) => `Default mode updated to: ${mode}`,
3059
+ success: (mode) => `Successfully updated ${chalk.bold('default CMS publish mode')} to ${chalk.bold(mode)}`,
2886
3060
  },
2887
3061
  setHttpTimeout: {
2888
3062
  promptMessage: 'Enter http timeout duration',
2889
- success: (timeout) => `HTTP timeout set to: ${timeout}`,
3063
+ success: (timeout) => `Successfully updated ${chalk.bold('HTTP timeout')} to ${chalk.bold(timeout)}`,
3064
+ error: (timeout) => `Invalid HTTP timeout value "${timeout}". Must be a number greater than 3000.`,
2890
3065
  },
2891
3066
  setAutoOpenBrowser: {
2892
3067
  fieldName: 'auto open browser',
2893
- enabled: 'Auto opening your browser has been enabled',
2894
- disabled: 'Auto opening your browser has been disabled',
3068
+ enabled: `Successfully updated ${chalk.bold('auto open browser')} to ${chalk.bold('enabled')}`,
3069
+ disabled: `Successfully updated ${chalk.bold('auto open browser')} to ${chalk.bold('disabled')}`,
2895
3070
  },
2896
3071
  },
2897
3072
  commonOpts: {
@@ -2921,6 +3096,21 @@ export const lib = {
2921
3096
  mergeConflictMessage: (count, propertyList) => `Conflict${count > 1 ? 's' : ''} detected for ${chalk.bold(propertyList)}.`,
2922
3097
  mergeConfigConflictPrompt: (property, newValue, oldValue) => `Change ${property} from ${newValue} to ${oldValue}?`,
2923
3098
  },
3099
+ handleAccountNameConflicts: {
3100
+ warnings: {
3101
+ accountNameConflictMessage: (count) => `${count} account name conflict${count > 1 ? 's' : ''} detected.`,
3102
+ forceFlagDetected: (count, renameDetails) => `Force flag detected. Automatically renaming ${count} account${count > 1 ? 's' : ''} with duplicate name${count > 1 ? 's' : ''}:\n${renameDetails}`,
3103
+ },
3104
+ prompts: {
3105
+ renameOrOmitAccountPrompt: (accountName, accountId) => `Local account name="${accountName}" (ID: ${accountId}) conflicts with an existing global account.\nRename the local account to include it in the merge? If not, it will be skipped.`,
3106
+ newAccountNamePrompt: (accountName, portalId) => `Enter a new name for the local account [ID: ${portalId}] (currently named "${accountName}"):`,
3107
+ },
3108
+ errors: {
3109
+ nameRequired: 'The name may not be blank. Please add a name for the config.',
3110
+ sameName: 'The new account name must be different from the current name.',
3111
+ nameAlreadyInConfig: (name) => `The name "${name}" is already used by another account.`,
3112
+ },
3113
+ },
2924
3114
  handleMerge: {
2925
3115
  description: (archivedConfigName) => `We will automatically merge the contents of your deprecated config file into your global configuration file. This will merge the configured accounts and settings into the global config. Then it will archive the deprecated config as ${archivedConfigName} for you to manually cleanup at your convenience.`,
2926
3116
  confirmPrompt: 'Merge the deprecated config into your global config?',
@@ -2929,6 +3119,11 @@ export const lib = {
2929
3119
  },
2930
3120
  },
2931
3121
  prompts: {
3122
+ promptUtils: {
3123
+ errors: {
3124
+ noSelectableChoices: 'Exiting prompt because no selectable choices are available',
3125
+ },
3126
+ },
2932
3127
  importDataFilePathPrompt: {
2933
3128
  promptContext: `To view the JSON schema for data imports, visit ${uiLink('the docs', 'https://developers.hubspot.com/docs/guides/api/crm/imports')}`,
2934
3129
  promptMessage: '[--file-path] Select the JSON file that will be used to import your data.',
@@ -2945,10 +3140,10 @@ export const lib = {
2945
3140
  projectDevTargetAccountPrompt: {
2946
3141
  createNewSandboxOption: '<Test on a new development sandbox>',
2947
3142
  createNewDeveloperTestAccountOption: '<Test on a new developer test account>',
2948
- chooseDefaultAccountOption: () => `<${chalk.bold('❗')} Test on this production account ${chalk.bold('❗')}>`,
2949
- promptMessage: (accountType, accountIdentifier) => `[--account] Choose a ${accountType} under ${accountIdentifier} to test with:`,
3143
+ chooseDefaultAccountOption: `<${chalk.bold('❗')} Test on this production account ${chalk.bold('❗')}>`,
3144
+ promptMessage: (accountType, accountIdentifier) => `Choose a ${accountType} under ${accountIdentifier} to test with:`,
2950
3145
  sandboxLimit: (limit) => `Your account reached the limit of ${limit} development sandboxes`,
2951
- sandboxLimitWithSuggestion: (limit, authCommand) => `Your account reached the limit of ${limit} development sandboxes. Run ${authCommand} to add an existing one to the config.`,
3146
+ sandboxLimitWithSuggestion: (limit) => `Your account reached the limit of ${limit} development sandboxes. Run ${uiAuthCommandReference()} to add an existing one to the config.`,
2952
3147
  developerTestAccountLimit: (limit) => `Your account reached the limit of ${limit} developer test accounts.`,
2953
3148
  confirmDefaultAccount: (accountName, accountType) => `Continue testing on ${chalk.bold(`${accountName} (${accountType})`)}? (Y/n)`,
2954
3149
  confirmUseExistingDeveloperTestAccount: (accountName) => `Continue with ${accountName}? This account isn't currently connected to the HubSpot CLI. By continuing, you'll be prompted to generate a personal access key and connect it.`,
@@ -3088,8 +3283,8 @@ export const lib = {
3088
3283
  selectAppIdClone: (accountName) => `[--appId] Choose an app under ${accountName} to clone:`,
3089
3284
  errors: {
3090
3285
  noAccountId: 'An account ID is required to select an app.',
3091
- noAppsMigration: () => `${chalk.bold('No apps to migrate')}`,
3092
- noAppsClone: () => `${chalk.bold('No apps to clone')}`,
3286
+ noAppsMigration: `${chalk.bold('No apps to migrate')}`,
3287
+ noAppsClone: `${chalk.bold('No apps to clone')}`,
3093
3288
  noAppsMigrationMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be migrated to the projects framework.`,
3094
3289
  noAppsCloneMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be cloned to the projects framework.`,
3095
3290
  errorFetchingApps: 'There was an error fetching public apps.',
@@ -3105,10 +3300,12 @@ export const lib = {
3105
3300
  },
3106
3301
  projectAddPrompt: {
3107
3302
  selectType: '[--type] Select an app feature to add: ',
3303
+ selectFeatures: '[--features] Select an app feature to add: ',
3108
3304
  enterName: '[--name] Give your component a name: ',
3109
3305
  errors: {
3110
3306
  nameRequired: 'A component name is required',
3111
3307
  componentRequired: 'Must select a feature to add',
3308
+ noSelectableChoices: 'There are no available features that can be added to this project',
3112
3309
  invalidType: (type) => `[--type] Could not find type "${type}". Please choose an available type:`,
3113
3310
  cannotAddFeature: (feature, reasons) => `Cannot Add feature '${feature}' to project for the following reasons: ${reasons}`,
3114
3311
  },
@@ -3144,7 +3341,7 @@ export const lib = {
3144
3341
  enterName: '[--project] Enter project name:',
3145
3342
  errors: {
3146
3343
  invalidName: 'You entered an invalid name. Please try again.',
3147
- projectDoesNotExist: (projectName, accountIdentifier) => `Project ${chalk.bold(projectName)} could not be found in "${accountIdentifier}"`,
3344
+ projectDoesNotExist: (projectName, accountId) => `Project ${chalk.bold(projectName)} could not be found in "${uiAccountDescription(accountId)}"`,
3148
3345
  },
3149
3346
  },
3150
3347
  previewPrompt: {
@@ -3159,7 +3356,6 @@ export const lib = {
3159
3356
  installAppPrompt: {
3160
3357
  explanation: 'Local development requires this app to be installed in the target test account.',
3161
3358
  reinstallExplanation: "This app's required scopes have been updated since it was last installed on the target test account. To avoid issues with local development, we recommend reinstalling the app with the updated scopes.",
3162
- staticAuthExplanation: (projectAccountId, testingAccountId, projectName, appUid) => `To install this static auth app, your testing account ${uiAccountDescription(testingAccountId)} must be on ${uiLink("this app's allowlist", getAppAllowlistUrl(projectAccountId, projectName, appUid))}.`,
3163
3359
  prompt: 'Open HubSpot to install this app?',
3164
3360
  autoPrompt: 'Install this app in your target test account?',
3165
3361
  reinstallPrompt: 'Open HubSpot to reinstall this app?',
@@ -3204,11 +3400,11 @@ export const lib = {
3204
3400
  },
3205
3401
  failure: {
3206
3402
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3207
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To connect a developer test account to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3208
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To use an existing developer test account, run ${chalk.bold('hs accounts use')}.`,
3403
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To connect a developer test account to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3404
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To use an existing developer test account, run ${uiCommandReference('hs account use')}.`,
3209
3405
  scopes: {
3210
3406
  message: "The personal access key you provided doesn't include developer test account permissions.",
3211
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer test account permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3407
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer test account permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3212
3408
  },
3213
3409
  },
3214
3410
  },
@@ -3225,14 +3421,13 @@ export const lib = {
3225
3421
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3226
3422
  },
3227
3423
  failure: {
3228
- invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3229
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3230
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs accounts use')}.`,
3424
+ limit: (accountId, limit, link) => `${uiAccountDescription(accountId)} reached the limit of ${limit} developer sandboxes. \n- View sandbox details at ${uiLink('View sandbox details at', link)} \n- To connect a developer sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3425
+ alreadyInConfig: (accountId, limit) => `${uiAccountDescription(accountId)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${uiCommandReference('hs account use')}. \n- To delete an existing sandbox, run ${uiCommandReference('hs sandbox delete')}.`,
3426
+ generic: 'An error occurred while creating a developer sandbox',
3231
3427
  scopes: {
3232
3428
  message: "The personal access key you provided doesn't include developer sandbox permissions.",
3233
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3429
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3234
3430
  },
3235
- generic: 'An error occurred while creating a developer sandbox',
3236
3431
  },
3237
3432
  },
3238
3433
  standard: {
@@ -3245,30 +3440,54 @@ export const lib = {
3245
3440
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3246
3441
  },
3247
3442
  failure: {
3248
- invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3249
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3250
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs accounts use')}.`,
3443
+ limit: (accountId, limit, link) => `${uiAccountDescription(accountId)} reached the limit of ${limit} standard sandboxes.\n- View sandbox details at ${uiLink('View sandbox details at', link)} \n- To connect a standard sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3444
+ alreadyInConfig: (accountId, limit) => `${uiAccountDescription(accountId)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${uiCommandReference('hs account use')}. \n- To delete an existing sandbox, run ${uiCommandReference('hs sandbox delete')}.`,
3251
3445
  scopes: {
3252
3446
  message: "The personal access key you provided doesn't include standard sandbox permissions.",
3253
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3447
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3254
3448
  },
3255
3449
  },
3256
3450
  },
3451
+ failure: {
3452
+ usageLimitsFetch: 'Unable to fetch sandbox usage limits. Please try again.',
3453
+ scopes: {
3454
+ message: "The personal access key you provided doesn't include sandbox permissions.",
3455
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes Sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3456
+ },
3457
+ invalidUser: (accountName, parentAccountId) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${uiAccountDescription(parentAccountId)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${uiAccountDescription(parentAccountId)}.`,
3458
+ '403Gating': (accountName, parentAccountId) => `We couldn't create ${chalk.bold(accountName)} because ${uiAccountDescription(parentAccountId)} is a developer account and does not have access to development sandboxes. To gain access to developer sandboxes, you can ${uiLink('convert your account', 'https://developers.hubspot.com/docs/getting-started/convert-your-account-into-a-developer-crm-account')}.`,
3459
+ },
3257
3460
  },
3258
3461
  sync: {
3462
+ info: {
3463
+ syncMessage: (url) => `Asset sync from production to the sandbox is in progress and is running in the background. It may take some time. ${uiLink('View sync status details here', url)}`,
3464
+ syncMessageDevSb: (url) => `Sync of object definitions from production to the sandbox is in progress and is running in the background. It may take some time. ${url}`,
3465
+ },
3466
+ confirm: {
3467
+ syncContactRecords: {
3468
+ standard: 'Do you want to sync contact records from your production account?',
3469
+ },
3470
+ },
3259
3471
  loading: {
3260
3472
  add: (accountName) => `Syncing sandbox ${chalk.bold(accountName)}`,
3261
- fail: (accountName) => `Failed to sync sandbox ${chalk.bold(accountName)}.`,
3262
- succeed: (accountName) => `Successfully synced sandbox ${chalk.bold(accountName)}.`,
3473
+ fail: (accountId) => `Failed to sync sandbox ${uiAccountDescription(accountId)}.`,
3474
+ succeed: (accountId) => `Successfully synced sandbox ${uiAccountDescription(accountId)}.`,
3475
+ startSync: 'Initiating sync...',
3476
+ succeedDevSb: (accountId) => `Initiated sync of object definitions from production to ${uiAccountDescription(accountId)}`,
3477
+ successDevSbInfo: (accountId, url) => `Initiated sync of object definitions from production to ${uiAccountDescription(accountId)}. It may take some time. ${url}`,
3263
3478
  },
3264
3479
  success: {
3265
3480
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3266
3481
  },
3267
3482
  failure: {
3483
+ syncTypeFetch: 'Unable to fetch available sandbox sync types. Please try again.',
3268
3484
  invalidUser: (accountName, parentAccountName) => `Couldn't sync ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to sync the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3485
+ syncInProgress: (url) => `Couldn't run the sync because there's another sync in progress. Wait for the current sync to finish and then try again. To check the sync status, visit the sync activity log: ${url}.`,
3486
+ notSuperAdmin: (accountId) => `Couldn't run the sync because you are not a super admin in ${uiAccountDescription(accountId)}. Ask the account owner for super admin access to the sandbox.`,
3487
+ objectNotFound: (accountId) => `Couldn't sync the sandbox because ${uiAccountDescription(accountId)} may have been deleted through the UI. Run ${uiCommandReference('hs sandbox delete')} to remove this account from the config.`,
3269
3488
  scopes: {
3270
3489
  message: "The personal access key you provided doesn't include sandbox sync permissions.",
3271
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3490
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3272
3491
  },
3273
3492
  },
3274
3493
  },
@@ -3279,6 +3498,8 @@ export const lib = {
3279
3498
  errorContext: (context) => `Context: ${context}`,
3280
3499
  errorCause: (cause) => `Cause: ${cause}`,
3281
3500
  unknownErrorOccurred: 'An unknown error has occurred.',
3501
+ configTimeoutErrorOccurred: (timeout, configSetCommand) => `This error occurred because a request exceeded the default HTTP timeout of ${timeout}ms. To increase the default HTTP timeout, run ${uiCommandReference(configSetCommand)}.`,
3502
+ genericTimeoutErrorOccurred: 'This error occurred because an HTTP request timed out. Re-running the command may resolve this issue.',
3282
3503
  },
3283
3504
  suppressErrors: {
3284
3505
  platformVersionErrors: {
@@ -3290,7 +3511,7 @@ export const lib = {
3290
3511
  docsLink: 'Projects platform versioning (BETA)',
3291
3512
  betaLink: (docsLink) => `For more info, see ${docsLink}.`,
3292
3513
  },
3293
- missingScopeError: (request, accountName, authCommand) => `Couldn't execute the ${request} because the access key for ${accountName} is missing required scopes. To update scopes, run ${authCommand}. Then deactivate the existing key and generate a new one that includes the missing scopes.`,
3514
+ missingScopeError: (request, accountName) => `Couldn't execute the ${request} because the access key for ${accountName} is missing required scopes. To update scopes, run ${uiAuthCommandReference()}. Then deactivate the existing key and generate a new one that includes the missing scopes.`,
3294
3515
  },
3295
3516
  },
3296
3517
  serverless: {
@@ -3298,7 +3519,7 @@ export const lib = {
3298
3519
  fetchScopeDataError: (scopeGroup) => `Error verifying access of scopeGroup ${scopeGroup}:`,
3299
3520
  portalMissingScope: 'Your account does not have access to this action. Talk to an account admin to request it.',
3300
3521
  userMissingScope: "You don't have access to this action. Ask an account admin to change your permissions in Users & Teams settings.",
3301
- genericMissingScope: 'Your access key does not allow this action. Please generate a new access key by running `hs auth personalaccesskey`.',
3522
+ genericMissingScope: `Your access key does not allow this action. Please generate a new access key by running ${uiAuthCommandReference()}.`,
3302
3523
  },
3303
3524
  },
3304
3525
  doctor: {
@@ -3307,13 +3528,13 @@ export const lib = {
3307
3528
  accountChecks: {
3308
3529
  active: 'Default account active',
3309
3530
  inactive: "Default account isn't active",
3310
- inactiveSecondary: (command) => `Run ${command} to remove inactive accounts from your CLI config`,
3531
+ inactiveSecondary: (command) => `Run ${uiCommandReference(command)} to remove inactive accounts from your CLI config`,
3311
3532
  unableToDetermine: 'Unable to determine if the portal is active',
3312
3533
  pak: {
3313
3534
  incomplete: 'Personal access key is valid, but there are more scopes available to your user that are not included in your key.',
3314
- incompleteSecondary: (command, link) => `To add the available scopes, run ${command} and re-authenticate your account with a new key that has those scopes. Visit HubSpot to view selected and available scopes for your personal access key. ${link}`,
3535
+ incompleteSecondary: (link) => `To add the available scopes, run ${uiAuthCommandReference()} and re-authenticate your account with a new key that has those scopes. Visit HubSpot to view selected and available scopes for your personal access key. ${link}`,
3315
3536
  invalid: 'Personal access key is invalid',
3316
- invalidSecondary: (command) => `To get a new key, run ${command}, deactivate your access key, and generate a new one. Then use that new key to authenticate your account.`,
3537
+ invalidSecondary: `To get a new key, run ${uiAuthCommandReference()}, deactivate your access key, and generate a new one. Then use that new key to authenticate your account.`,
3317
3538
  valid: (link) => `Personal Access Key is valid. ${link}`,
3318
3539
  viewScopes: 'View selected scopes',
3319
3540
  },
@@ -3330,25 +3551,24 @@ export const lib = {
3330
3551
  },
3331
3552
  hsChecks: {
3332
3553
  notLatest: (hsVersion) => `Version ${hsVersion} outdated`,
3333
- notLatestSecondary: (command, hsVersion) => `Run ${command} to upgrade to the latest version ${hsVersion}`,
3554
+ notLatestSecondary: (command, hsVersion) => `Run ${uiCommandReference(command)} to upgrade to the latest version ${hsVersion}`,
3334
3555
  latest: (hsVersion) => `HubSpot CLI v${hsVersion} up to date`,
3335
3556
  unableToDetermine: 'Unable to determine if HubSpot CLI is up to date.',
3336
- unableToDetermineSecondary: (command, link) => `Run ${command} to check your installed version; then visit the ${link} to validate whether you have the latest version`,
3337
- unableToDetermineSecondaryLink: 'npm HubSpot CLI version history',
3557
+ unableToDetermineSecondary: (command, link) => `Run ${uiCommandReference(command)} to check your installed version; then visit the ${uiLink('npm HubSpot CLI version history', link)} to validate whether you have the latest version`,
3338
3558
  },
3339
3559
  projectDependenciesChecks: {
3340
3560
  missingDependencies: (dir) => `missing dependencies in ${chalk.bold(dir)}`,
3341
- missingDependenciesSecondary: (command) => `Run ${command} to install all project dependencies locally`,
3561
+ missingDependenciesSecondary: (command) => `Run ${uiCommandReference(command)} to install all project dependencies locally`,
3342
3562
  unableToDetermine: (dir) => `Unable to determine if dependencies are installed ${dir}`,
3343
3563
  success: 'App dependencies are installed and up to date',
3344
3564
  },
3345
3565
  files: {
3346
- invalidJson: (filename) => `invalid JSON in ${chalk.bold(filename)}`,
3566
+ invalidJson: (filename) => `Invalid JSON in ${chalk.bold(filename)}`,
3347
3567
  validJson: 'JSON files valid',
3348
3568
  },
3349
3569
  port: {
3350
3570
  inUse: (port) => `Port ${port} is in use`,
3351
- inUseSecondary: (command) => `Make sure it is available before running ${command}`,
3571
+ inUseSecondary: (command) => `Make sure it is available before running ${uiCommandReference(command)}`,
3352
3572
  available: (port) => `Port ${port} available for local development`,
3353
3573
  },
3354
3574
  diagnosis: {
@@ -3360,28 +3580,59 @@ export const lib = {
3360
3580
  configFileSubHeader: (filename) => `Config File: ${chalk.bold(filename)}`,
3361
3581
  defaultAccountSubHeader: (accountDetails) => `Default Account: ${accountDetails}`,
3362
3582
  noConfigFile: 'CLI configuration not found',
3363
- noConfigFileSecondary: (command) => `Run ${command} and follow the prompts to create your CLI configuration file and connect it to your HubSpot account`,
3583
+ noConfigFileSecondary: (command) => `Run ${uiCommandReference(command)} and follow the prompts to create your CLI configuration file and connect it to your HubSpot account`,
3584
+ settings: {
3585
+ httpUseLocalhost: `The setting ${chalk.bold('httpUseLocalhost')} is enabled`,
3586
+ httpUseLocalhostSecondary: 'This setting causes all CLI requests to route to localhost',
3587
+ },
3364
3588
  },
3365
3589
  projectConfig: {
3366
3590
  header: 'Project configuration',
3367
3591
  projectDirSubHeader: (projectDir) => `Project dir: ${chalk.bold(projectDir)}`,
3368
3592
  projectNameSubHeader: (projectName) => `Project name: ${chalk.bold(projectName)}`,
3369
3593
  },
3594
+ defaultAccountOverrideFile: {
3595
+ header: 'Default account override file path:',
3596
+ },
3370
3597
  counts: {
3371
3598
  errors: (count) => `${chalk.bold('Errors:')} ${count}`,
3372
3599
  warnings: (count) => `${chalk.bold('Warning:')} ${count}`,
3373
3600
  },
3374
3601
  },
3602
+ defaultAccountOverrideFileChecks: {
3603
+ overrideActive: (defaultAccountOverrideFile) => `Default account override file is active: ${defaultAccountOverrideFile}`,
3604
+ overrideAccountId: (overrideAccountId) => `Active account ID: ${overrideAccountId}`,
3605
+ },
3375
3606
  },
3376
3607
  oauth: {
3377
3608
  missingClientId: 'Error building oauth URL: missing client ID.',
3378
3609
  },
3610
+ validation: {
3611
+ accountNotFoundInConfig: (userProvidedAccount) => `The account "${userProvidedAccount}" could not be found in the config`,
3612
+ accountRequired: 'An account needs to be supplied either via "--account" or through setting a "defaultPortal"',
3613
+ userProvidedAccount: 'Cannot specify an account when environment variables are supplied. Please unset the environment variables or do not use the "--account" flag.',
3614
+ accountNotConfigured: (accountId) => `The account ${uiAccountDescription(accountId)} has not been configured`,
3615
+ invalidAuthType: (authType, accountId, configPath, validValues) => `Invalid "authType" value "${authType}" for account "${uiAccountDescription(accountId)}" in config file: ${configPath}. Valid values are ${validValues}.`,
3616
+ oauth2ConfigMissing: (accountId) => `The OAuth2 auth configuration for account ${uiAccountDescription(accountId)} is missing`,
3617
+ oauth2ConfigIncorrect: (accountId) => `The OAuth2 configuration for account ${uiAccountDescription(accountId)} is incorrect \n Run ${uiCommandReference('hs auth --auth-type=oauth2')} to reauthenticate`,
3618
+ oauth2AccessTokenNotFound: (accountId) => `The OAuth2 access token could not be found for accountId ${uiAccountDescription(accountId)}`,
3619
+ personalAccessKeyMissing: (accountId) => `The account "${uiAccountDescription(accountId)}" is configured to use a access key for authentication and is missing a "personalAccessKey" in the configuration file`,
3620
+ personalAccessKeyTokenRetrievalFailed: (accountId) => `An OAuth2 access token for account "${uiAccountDescription(accountId)} could not be retrieved using the "personalAccessKey" provided`,
3621
+ authConfigurationMissing: (accountId) => `The accountId ${uiAccountDescription(accountId)} is missing authentication configuration`,
3622
+ availableCMSModes: (modes) => `Available CMS publish modes are: ${modes}`,
3623
+ invalidCmsPublishMode: (cmsPublishMode, modesMessage) => `The CMS publish mode "${cmsPublishMode}" is invalid. ${modesMessage}`,
3624
+ missingCmsPublishMode: (modesMessage) => `The CMS publish mode option is missing. ${modesMessage}`,
3625
+ pathNotFile: (path) => `The path "${path}" is not a path to a file`,
3626
+ fileNotJson: (path) => `The file "${path}" must be a valid JSON file`,
3627
+ fileInvalidJson: (path) => `The file "${path}" contains invalid JSON`,
3628
+ },
3379
3629
  migrate: {
3380
3630
  componentsToBeMigrated: (components) => `The following features will be migrated: ${components}`,
3381
3631
  componentsThatWillNotBeMigrated: (components) => `[NOTE] These features are not yet supported for migration but will be available later: ${components}`,
3382
3632
  sourceContentsMoved: (newLocation) => `The contents of your old source directory have been moved to ${newLocation}, move any required files to the new source directory.`,
3383
3633
  projectMigrationWarningTitle: 'Important: Migrating to platformVersion 2025.2 is irreversible',
3384
3634
  projectMigrationWarning: uiBetaTag(`Running the ${uiCommandReference('hs project migrate')} command will permanently upgrade your project to platformVersion 2025.2. This action cannot be undone. To ensure you have access to your original files, they will be copied to a new directory (archive) for safekeeping.\n\nThis command will guide you through the process, prompting you to enter the required fields and will download the new project source code into your project source directory.`, false),
3635
+ exitWithoutMigrating: 'Exiting without migrating',
3385
3636
  success: {
3386
3637
  downloadedProject: (projectName, projectDest) => `Saved ${projectName} to ${projectDest}`,
3387
3638
  themesMigrationSuccess: (platformVersion) => `Successfully migrated project to platformVersion ${chalk.bold(platformVersion)}. Upload your project using ${uiCommandReference('hs project upload')}`,
@@ -3408,7 +3659,7 @@ export const lib = {
3408
3659
  },
3409
3660
  noAppsEligible: (accountId, reasons) => `No apps in account ${accountId} are currently migratable${reasons.length ? `\n - ${reasons.join('\n - ')}` : ''}`,
3410
3661
  invalidAccountTypeTitle: `${chalk.bold('Developer account not targeted')}`,
3411
- invalidAccountTypeDescription: (useCommand, authCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${authCommand} and try again.`,
3662
+ invalidAccountTypeDescription: (useCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${uiAuthCommandReference()} and try again.`,
3412
3663
  appWithAppIdNotFound: (appId) => `Could not find an app with the id ${appId} `,
3413
3664
  noAppsForProject: (projectName) => `No apps associated with project ${projectName}`,
3414
3665
  migrationFailed: 'Migration Failed',