@hubspot/cli 7.9.0 → 7.10.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 (82) hide show
  1. package/commands/__tests__/project.test.js +2 -0
  2. package/commands/account/__tests__/rename.test.js +35 -0
  3. package/commands/account/createOverride.js +2 -12
  4. package/commands/account/removeOverride.js +2 -10
  5. package/commands/account/rename.d.ts +1 -1
  6. package/commands/account/rename.js +5 -2
  7. package/commands/cms/theme/preview.js +1 -4
  8. package/commands/config/set.js +1 -2
  9. package/commands/getStarted.js +13 -19
  10. package/commands/hubdb.d.ts +1 -1
  11. package/commands/project/__tests__/updateDeps.test.d.ts +1 -0
  12. package/commands/project/__tests__/updateDeps.test.js +142 -0
  13. package/commands/project/create.js +0 -1
  14. package/commands/project/dev/index.js +8 -1
  15. package/commands/project/listBuilds.js +7 -1
  16. package/commands/project/updateDeps.d.ts +6 -0
  17. package/commands/project/updateDeps.js +80 -0
  18. package/commands/project/upload.js +7 -1
  19. package/commands/project/validate.js +7 -1
  20. package/commands/project/watch.js +7 -2
  21. package/commands/project.js +2 -0
  22. package/commands/testAccount/__tests__/create.test.js +68 -0
  23. package/commands/testAccount/create.d.ts +8 -0
  24. package/commands/testAccount/create.js +134 -44
  25. package/commands/testAccount/importData.d.ts +1 -1
  26. package/lang/en.d.ts +3194 -3184
  27. package/lang/en.js +43 -8
  28. package/lib/__tests__/dependencyManagement.test.js +273 -1
  29. package/lib/commonOpts.js +2 -5
  30. package/lib/constants.d.ts +1 -0
  31. package/lib/constants.js +6 -0
  32. package/lib/dependencyManagement.d.ts +8 -2
  33. package/lib/dependencyManagement.js +75 -12
  34. package/lib/mcp/__tests__/setup.test.d.ts +1 -0
  35. package/lib/mcp/__tests__/setup.test.js +127 -0
  36. package/lib/mcp/setup.d.ts +4 -12
  37. package/lib/mcp/setup.js +34 -1
  38. package/lib/middleware/autoUpdateMiddleware.d.ts +3 -1
  39. package/lib/middleware/autoUpdateMiddleware.js +1 -0
  40. package/lib/npm.d.ts +3 -0
  41. package/lib/npm.js +6 -0
  42. package/lib/projects/__tests__/components.test.js +148 -24
  43. package/lib/projects/__tests__/platformVersion.test.js +5 -1
  44. package/lib/projects/__tests__/projects.test.js +13 -42
  45. package/lib/projects/components.js +76 -20
  46. package/lib/projects/config.js +5 -9
  47. package/lib/projects/platformVersion.js +1 -1
  48. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +1 -0
  49. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +153 -0
  50. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +5 -0
  51. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +76 -66
  52. package/mcp-server/tools/cms/HsCreateFunctionTool.js +6 -0
  53. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
  54. package/mcp-server/tools/cms/HsCreateModuleTool.js +6 -0
  55. package/mcp-server/tools/cms/HsCreateTemplateTool.js +6 -0
  56. package/mcp-server/tools/cms/HsFunctionLogsTool.d.ts +4 -4
  57. package/mcp-server/tools/cms/HsFunctionLogsTool.js +4 -0
  58. package/mcp-server/tools/cms/HsListFunctionsTool.js +4 -0
  59. package/mcp-server/tools/cms/HsListTool.js +4 -0
  60. package/mcp-server/tools/index.js +2 -0
  61. package/mcp-server/tools/project/AddFeatureToProjectTool.js +6 -0
  62. package/mcp-server/tools/project/CreateProjectTool.js +6 -0
  63. package/mcp-server/tools/project/CreateTestAccountTool.d.ts +41 -0
  64. package/mcp-server/tools/project/CreateTestAccountTool.js +137 -0
  65. package/mcp-server/tools/project/DeployProjectTool.js +6 -0
  66. package/mcp-server/tools/project/DocFetchTool.js +4 -0
  67. package/mcp-server/tools/project/DocsSearchTool.js +4 -0
  68. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +4 -0
  69. package/mcp-server/tools/project/GetApplicationInfoTool.js +4 -0
  70. package/mcp-server/tools/project/GetConfigValuesTool.js +4 -0
  71. package/mcp-server/tools/project/GuidedWalkthroughTool.js +4 -0
  72. package/mcp-server/tools/project/UploadProjectTools.d.ts +9 -3
  73. package/mcp-server/tools/project/UploadProjectTools.js +50 -4
  74. package/mcp-server/tools/project/ValidateProjectTool.js +4 -0
  75. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +1 -0
  76. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +231 -0
  77. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +2 -2
  78. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +56 -4
  79. package/package.json +2 -2
  80. package/lang/en.lyaml +0 -1508
  81. package/lib/lang.d.ts +0 -8
  82. package/lib/lang.js +0 -72
@@ -31,11 +31,11 @@ describe('mcp-server/tools/project/DocsSearchTool', () => {
31
31
  describe('register', () => {
32
32
  it('should register tool with correct parameters and enhanced description', () => {
33
33
  const result = tool.register();
34
- expect(mockMcpServer.registerTool).toHaveBeenCalledWith('search-docs', {
34
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('search-docs', expect.objectContaining({
35
35
  title: 'Search HubSpot Developer Documentation',
36
36
  description: 'Use this first whenever you need details about HubSpot APIs, SDKs, integrations, or developer platform features. This searches the official HubSpot Developer Documentation and returns the most relevant pages, each with a URL for use in `fetch-doc`. Always follow this with a fetch to get the full, authoritative content before making plans or writing answers.',
37
37
  inputSchema: expect.any(Object),
38
- }, expect.any(Function));
38
+ }), expect.any(Function));
39
39
  expect(result).toBe(mockRegisteredTool);
40
40
  });
41
41
  });
@@ -1,12 +1,18 @@
1
1
  import { UploadProjectTools } from '../UploadProjectTools.js';
2
+ import { getAllHsProfiles } from '@hubspot/project-parsing-lib';
3
+ import { getProjectConfig } from '../../../../lib/projects/config.js';
2
4
  import { runCommandInDir } from '../../../utils/project.js';
3
5
  import { mcpFeedbackRequest } from '../../../utils/feedbackTracking.js';
4
6
  vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
7
+ vi.mock('@hubspot/project-parsing-lib');
8
+ vi.mock('../../../../lib/projects/config.js');
5
9
  vi.mock('../../../utils/project');
6
10
  vi.mock('../../../utils/toolUsageTracking');
7
11
  vi.mock('../../../utils/feedbackTracking');
8
12
  const mockMcpFeedbackRequest = mcpFeedbackRequest;
9
13
  const mockRunCommandInDir = runCommandInDir;
14
+ const mockGetProjectConfig = getProjectConfig;
15
+ const mockGetAllHsProfiles = getAllHsProfiles;
10
16
  describe('mcp-server/tools/project/UploadProjectTools', () => {
11
17
  let mockMcpServer;
12
18
  let tool;
@@ -20,6 +26,15 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
20
26
  mockRegisteredTool = {};
21
27
  mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
22
28
  mockMcpFeedbackRequest.mockResolvedValue('');
29
+ mockGetProjectConfig.mockResolvedValue({
30
+ projectConfig: {
31
+ srcDir: 'src',
32
+ name: 'test-project',
33
+ platformVersion: '2025.2',
34
+ },
35
+ projectDir: '/test/project',
36
+ });
37
+ mockGetAllHsProfiles.mockResolvedValue([]);
23
38
  tool = new UploadProjectTools(mockMcpServer);
24
39
  });
25
40
  describe('register', () => {
@@ -37,6 +52,7 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
37
52
  const input = {
38
53
  absoluteCurrentWorkingDirectory: '/test/dir',
39
54
  absoluteProjectPath: '/test/project',
55
+ uploadMessage: 'Test upload message',
40
56
  };
41
57
  it('should upload project successfully', async () => {
42
58
  mockRunCommandInDir.mockResolvedValue({
@@ -44,7 +60,9 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
44
60
  stderr: '',
45
61
  });
46
62
  const result = await tool.handler(input);
47
- expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project upload --force-create');
63
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('hs project upload'));
64
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--force-create'));
65
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--message "Test upload message"'));
48
66
  expect(result).toEqual({
49
67
  content: [
50
68
  { type: 'text', text: 'Project uploaded successfully' },
@@ -68,13 +86,44 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
68
86
  mockRunCommandInDir.mockRejectedValue(error);
69
87
  await expect(tool.handler(input)).rejects.toThrow('Upload failed');
70
88
  });
71
- it('should use force-create flag', async () => {
89
+ it('should use force-create and message flags', async () => {
72
90
  mockRunCommandInDir.mockResolvedValue({
73
91
  stdout: 'Project created and uploaded',
74
92
  stderr: '',
75
93
  });
76
94
  await tool.handler(input);
77
- expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project upload --force-create');
95
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('hs project upload'));
96
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--force-create'));
97
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--message "Test upload message"'));
98
+ });
99
+ it('should use profiles', async () => {
100
+ mockRunCommandInDir.mockResolvedValue({
101
+ stdout: 'Project created and uploaded',
102
+ stderr: '',
103
+ });
104
+ await tool.handler({
105
+ ...input,
106
+ profile: 'dev',
107
+ });
108
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('hs project upload'));
109
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--force-create'));
110
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--message "Test upload message"'));
111
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--profile "dev"'));
112
+ });
113
+ it('should prompt for profile if not specified and the project requires them', async () => {
114
+ mockGetAllHsProfiles.mockResolvedValue(['prod', 'dev']);
115
+ mockRunCommandInDir.mockResolvedValue({
116
+ stdout: 'Project created and uploaded',
117
+ stderr: '',
118
+ });
119
+ const result = await tool.handler(input);
120
+ expect(mockRunCommandInDir).not.toHaveBeenCalled();
121
+ expect(result.content).toEqual([
122
+ {
123
+ type: 'text',
124
+ text: 'Ask the user which profile they would like to use for the upload.',
125
+ },
126
+ ]);
78
127
  });
79
128
  it('should handle empty stdout and stderr', async () => {
80
129
  mockRunCommandInDir.mockResolvedValue({
@@ -95,9 +144,12 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
95
144
  const differentInput = {
96
145
  absoluteCurrentWorkingDirectory: '/test/dir',
97
146
  absoluteProjectPath: '/different/path/to/project',
147
+ uploadMessage: 'Different test upload message',
98
148
  };
99
149
  await tool.handler(differentInput);
100
- expect(mockRunCommandInDir).toHaveBeenCalledWith('/different/path/to/project', 'hs project upload --force-create');
150
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/different/path/to/project', expect.stringContaining('hs project upload'));
151
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/different/path/to/project', expect.stringContaining('--force-create'));
152
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/different/path/to/project', expect.stringContaining('--message "Different test upload message"'));
101
153
  });
102
154
  it('should handle very long output', async () => {
103
155
  const longOutput = 'A'.repeat(10000);
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@hubspot/cli",
3
- "version": "7.9.0",
3
+ "version": "7.10.0-beta.1",
4
4
  "description": "The official CLI for developing on HubSpot",
5
5
  "license": "Apache-2.0",
6
6
  "repository": "https://github.com/HubSpot/hubspot-cli",
7
7
  "type": "module",
8
8
  "dependencies": {
9
- "@hubspot/local-dev-lib": "3.21.1",
9
+ "@hubspot/local-dev-lib": "3.21.2",
10
10
  "@hubspot/project-parsing-lib": "0.10.1",
11
11
  "@hubspot/serverless-dev-runtime": "7.0.6",
12
12
  "@hubspot/theme-preview-dev-server": "0.0.10",