alpic 0.0.0-dev.fb2f877 → 0.0.0-dev.fc32bff

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 (203) hide show
  1. package/README.md +40 -0
  2. package/bin/run.js +5 -0
  3. package/dist/__tests__/audit.e2e.test.d.ts +1 -0
  4. package/dist/__tests__/audit.e2e.test.js +557 -0
  5. package/dist/__tests__/audit.e2e.test.js.map +1 -0
  6. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  7. package/dist/__tests__/auth.e2e.test.js +157 -0
  8. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  9. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  10. package/dist/__tests__/deploy-flags.e2e.test.js +188 -0
  11. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  12. package/dist/__tests__/deploy.e2e.test.js +56 -61
  13. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  14. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  15. package/dist/__tests__/deployment-inspect.e2e.test.js +114 -0
  16. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  17. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  18. package/dist/__tests__/deployment-list.e2e.test.js +116 -0
  19. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  20. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  21. package/dist/__tests__/deployment-logs.e2e.test.js +255 -0
  22. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  24. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +259 -0
  25. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  26. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  27. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +139 -0
  28. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  29. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  30. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +150 -0
  31. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  32. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  33. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +342 -0
  34. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  35. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  36. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  37. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  38. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  39. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  40. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  41. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  42. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  43. package/dist/__tests__/git.e2e.test.js +57 -16
  44. package/dist/__tests__/git.e2e.test.js.map +1 -1
  45. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  46. package/dist/__tests__/link.e2e.test.js +279 -0
  47. package/dist/__tests__/link.e2e.test.js.map +1 -0
  48. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  49. package/dist/__tests__/logs.e2e.test.js +227 -0
  50. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  51. package/dist/__tests__/mock-server.d.ts +22 -0
  52. package/dist/__tests__/mock-server.js +359 -20
  53. package/dist/__tests__/mock-server.js.map +1 -1
  54. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  55. package/dist/__tests__/publish.e2e.test.js +505 -0
  56. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  57. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  58. package/dist/__tests__/tunnel.e2e.test.js +61 -0
  59. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  60. package/dist/__tests__/utils.d.ts +23 -5
  61. package/dist/__tests__/utils.js +130 -20
  62. package/dist/__tests__/utils.js.map +1 -1
  63. package/dist/api.d.ts +1 -2
  64. package/dist/api.js +13 -10
  65. package/dist/api.js.map +1 -1
  66. package/dist/commands/audit.d.ts +14 -0
  67. package/dist/commands/audit.js +49 -0
  68. package/dist/commands/audit.js.map +1 -0
  69. package/dist/commands/deploy.d.ts +8 -2
  70. package/dist/commands/deploy.js +63 -28
  71. package/dist/commands/deploy.js.map +1 -1
  72. package/dist/commands/deployment/inspect.d.ts +11 -0
  73. package/dist/commands/deployment/inspect.js +91 -0
  74. package/dist/commands/deployment/inspect.js.map +1 -0
  75. package/dist/commands/deployment/list.d.ts +11 -0
  76. package/dist/commands/deployment/list.js +97 -0
  77. package/dist/commands/deployment/list.js.map +1 -0
  78. package/dist/commands/deployment/logs.d.ts +12 -0
  79. package/dist/commands/deployment/logs.js +50 -0
  80. package/dist/commands/deployment/logs.js.map +1 -0
  81. package/dist/commands/environment-variable/add.d.ts +14 -0
  82. package/dist/commands/environment-variable/add.js +47 -0
  83. package/dist/commands/environment-variable/add.js.map +1 -0
  84. package/dist/commands/environment-variable/list.d.ts +9 -0
  85. package/dist/commands/environment-variable/list.js +45 -0
  86. package/dist/commands/environment-variable/list.js.map +1 -0
  87. package/dist/commands/environment-variable/remove.d.ts +11 -0
  88. package/dist/commands/environment-variable/remove.js +33 -0
  89. package/dist/commands/environment-variable/remove.js.map +1 -0
  90. package/dist/commands/environment-variable/update.d.ts +13 -0
  91. package/dist/commands/environment-variable/update.js +41 -0
  92. package/dist/commands/environment-variable/update.js.map +1 -0
  93. package/dist/commands/git/connect.d.ts +3 -2
  94. package/dist/commands/git/connect.js +29 -34
  95. package/dist/commands/git/connect.js.map +1 -1
  96. package/dist/commands/git/disconnect.d.ts +2 -2
  97. package/dist/commands/git/disconnect.js +20 -30
  98. package/dist/commands/git/disconnect.js.map +1 -1
  99. package/dist/commands/git.js +3 -3
  100. package/dist/commands/git.js.map +1 -1
  101. package/dist/commands/link.d.ts +17 -0
  102. package/dist/commands/link.js +101 -0
  103. package/dist/commands/link.js.map +1 -0
  104. package/dist/commands/login.d.ts +6 -0
  105. package/dist/commands/login.js +21 -0
  106. package/dist/commands/login.js.map +1 -0
  107. package/dist/commands/logout.d.ts +6 -0
  108. package/dist/commands/logout.js +20 -0
  109. package/dist/commands/logout.js.map +1 -0
  110. package/dist/commands/logs.d.ts +16 -0
  111. package/dist/commands/logs.js +96 -0
  112. package/dist/commands/logs.js.map +1 -0
  113. package/dist/commands/publish.d.ts +15 -0
  114. package/dist/commands/publish.js +51 -0
  115. package/dist/commands/publish.js.map +1 -0
  116. package/dist/commands/tunnel.d.ts +9 -0
  117. package/dist/commands/tunnel.js +96 -0
  118. package/dist/commands/tunnel.js.map +1 -0
  119. package/dist/commands/whoami.d.ts +6 -0
  120. package/dist/commands/whoami.js +13 -0
  121. package/dist/commands/whoami.js.map +1 -0
  122. package/dist/env.d.ts +4 -0
  123. package/dist/env.js +10 -0
  124. package/dist/env.js.map +1 -0
  125. package/dist/lib/alpic-command.d.ts +2 -0
  126. package/dist/lib/alpic-command.js +12 -7
  127. package/dist/lib/alpic-command.js.map +1 -1
  128. package/dist/lib/archive.d.ts +3 -3
  129. package/dist/lib/archive.js +11 -15
  130. package/dist/lib/archive.js.map +1 -1
  131. package/dist/lib/audit.d.ts +16 -0
  132. package/dist/lib/audit.js +244 -0
  133. package/dist/lib/audit.js.map +1 -0
  134. package/dist/lib/auth/auth.d.ts +3 -0
  135. package/dist/lib/auth/auth.js +39 -0
  136. package/dist/lib/auth/auth.js.map +1 -0
  137. package/dist/lib/auth/oauth/client.d.ts +28 -0
  138. package/dist/lib/auth/oauth/client.js +110 -0
  139. package/dist/lib/auth/oauth/client.js.map +1 -0
  140. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  141. package/dist/lib/auth/oauth/constants.js +3 -0
  142. package/dist/lib/auth/oauth/constants.js.map +1 -0
  143. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  144. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  145. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  146. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  147. package/dist/lib/auth/oauth/server/index.js +105 -0
  148. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  149. package/dist/lib/auth/whoami.d.ts +1 -0
  150. package/dist/lib/auth/whoami.js +45 -0
  151. package/dist/lib/auth/whoami.js.map +1 -0
  152. package/dist/lib/base-workflow.d.ts +10 -0
  153. package/dist/lib/base-workflow.js +22 -0
  154. package/dist/lib/base-workflow.js.map +1 -0
  155. package/dist/lib/config.d.ts +3 -2
  156. package/dist/lib/config.js +8 -7
  157. package/dist/lib/config.js.map +1 -1
  158. package/dist/lib/deployment.d.ts +71 -4
  159. package/dist/lib/deployment.js +121 -9
  160. package/dist/lib/deployment.js.map +1 -1
  161. package/dist/lib/environment-variable.d.ts +37 -0
  162. package/dist/lib/environment-variable.js +299 -0
  163. package/dist/lib/environment-variable.js.map +1 -0
  164. package/dist/lib/git.d.ts +12 -4
  165. package/dist/lib/git.js +52 -27
  166. package/dist/lib/git.js.map +1 -1
  167. package/dist/lib/global-store.d.ts +28 -0
  168. package/dist/lib/global-store.js +76 -0
  169. package/dist/lib/global-store.js.map +1 -0
  170. package/dist/lib/link.d.ts +83 -0
  171. package/dist/lib/link.js +387 -0
  172. package/dist/lib/link.js.map +1 -0
  173. package/dist/lib/logs.d.ts +20 -0
  174. package/dist/lib/logs.js +86 -0
  175. package/dist/lib/logs.js.map +1 -0
  176. package/dist/lib/publish.d.ts +22 -0
  177. package/dist/lib/publish.js +185 -0
  178. package/dist/lib/publish.js.map +1 -0
  179. package/dist/lib/resolve.d.ts +6 -0
  180. package/dist/lib/resolve.js +26 -0
  181. package/dist/lib/resolve.js.map +1 -0
  182. package/dist/lib/table.d.ts +8 -0
  183. package/dist/lib/table.js +27 -0
  184. package/dist/lib/table.js.map +1 -0
  185. package/dist/lib/telemetry.js +7 -7
  186. package/dist/lib/telemetry.js.map +1 -1
  187. package/dist/lib/utils.d.ts +4 -0
  188. package/dist/lib/utils.js +45 -0
  189. package/dist/lib/utils.js.map +1 -0
  190. package/dist/lib/utils.test.d.ts +1 -0
  191. package/dist/lib/utils.test.js +27 -0
  192. package/dist/lib/utils.test.js.map +1 -0
  193. package/dist/types.d.ts +1 -0
  194. package/package.json +34 -20
  195. package/dist/lib/auth.d.ts +0 -1
  196. package/dist/lib/auth.js +0 -10
  197. package/dist/lib/auth.js.map +0 -1
  198. package/dist/lib/global-config.d.ts +0 -9
  199. package/dist/lib/global-config.js +0 -48
  200. package/dist/lib/global-config.js.map +0 -1
  201. package/dist/lib/project.d.ts +0 -67
  202. package/dist/lib/project.js +0 -285
  203. package/dist/lib/project.js.map +0 -1
@@ -0,0 +1,505 @@
1
+ import { rmSync } from "node:fs";
2
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
3
+ import { MockApiServer } from "./mock-server.js";
4
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, setupTestDirectory, } from "./utils.js";
5
+ const PROJECT_ID = "test-project-id";
6
+ const TEAM_ID = "mock-team-id";
7
+ const ENV_ID = "test-env-id";
8
+ const DOMAIN = "my-server.example.com";
9
+ const SHARED_DOMAIN = `mcp-${PROJECT_ID}.alpic.ai`;
10
+ describe("alpic publish (E2E)", () => {
11
+ let mockServer;
12
+ let serverUrl;
13
+ let cwd;
14
+ let binPath;
15
+ beforeEach(async () => {
16
+ mockServer = new MockApiServer();
17
+ serverUrl = await mockServer.start();
18
+ const setup = await setupTestDirectory();
19
+ cwd = setup.cwd;
20
+ binPath = setup.binPath;
21
+ });
22
+ afterEach(async () => {
23
+ await mockServer.stop();
24
+ if (cwd) {
25
+ rmSync(cwd, { recursive: true, force: true });
26
+ }
27
+ });
28
+ it("publishes interactively with no custom domains — prompts to select the shared domain", async () => {
29
+ mockServer.addProject(buildMockProject({
30
+ projectId: PROJECT_ID,
31
+ teamId: TEAM_ID,
32
+ projectName: "my-server",
33
+ environmentId: ENV_ID,
34
+ environmentName: "production",
35
+ domains: [],
36
+ }));
37
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
38
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish"], {
39
+ cwd,
40
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
41
+ }, async (cli) => {
42
+ await cli.expect("Select a domain to publish for");
43
+ await cli.expect(SHARED_DOMAIN);
44
+ await cli.send("");
45
+ await cli.expect("Server title");
46
+ await cli.send("My Server");
47
+ await cli.expect("Server description");
48
+ await cli.send("Does great things");
49
+ await cli.expect("Website URL");
50
+ await cli.send("");
51
+ await cli.expect("Icon URL");
52
+ await cli.send("");
53
+ await cli.expect("Publish to MCP Registry under domain");
54
+ await cli.send("");
55
+ await cli.expect("Registry publication succeeded (v0.0.1)");
56
+ });
57
+ expect(exitCode).toBe(0);
58
+ expect(output).toContain("Registry publication succeeded (v0.0.1)");
59
+ expect(output).toContain("registry.modelcontextprotocol.io/?q=my-server");
60
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
61
+ expectSuccessfulApiCall(publishCall, (call) => {
62
+ expect(call.input).toMatchObject({
63
+ projectId: PROJECT_ID,
64
+ domain: SHARED_DOMAIN,
65
+ title: "My Server",
66
+ description: "Does great things",
67
+ });
68
+ });
69
+ });
70
+ it("prompts to select from shared domain and custom deployed domains", async () => {
71
+ const domain2 = "other.example.com";
72
+ mockServer.addProject(buildMockProject({
73
+ projectId: PROJECT_ID,
74
+ teamId: TEAM_ID,
75
+ projectName: "my-server",
76
+ environmentId: ENV_ID,
77
+ environmentName: "production",
78
+ domains: [
79
+ { domain: DOMAIN, status: "deployed", createdAt: new Date() },
80
+ { domain: domain2, status: "deployed", createdAt: new Date() },
81
+ {
82
+ domain: "pending.example.com",
83
+ status: "ongoing",
84
+ createdAt: new Date(),
85
+ },
86
+ ],
87
+ }));
88
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
89
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish"], {
90
+ cwd,
91
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
92
+ }, async (cli) => {
93
+ await cli.expect("Select a domain to publish for");
94
+ await cli.expect(`${SHARED_DOMAIN} (shared)`);
95
+ // Default selection is the first non-shared domain (sorted by length),
96
+ // so move down twice to select the shared domain (last option).
97
+ await cli.send("\x1B[B\x1B[B");
98
+ await cli.send("");
99
+ await cli.expect("Server title");
100
+ await cli.send("My Server");
101
+ await cli.expect("Server description");
102
+ await cli.send("Does great things");
103
+ await cli.expect("Website URL");
104
+ await cli.send("");
105
+ await cli.expect("Icon URL");
106
+ await cli.send("");
107
+ await cli.expect("Publish to MCP Registry under domain");
108
+ await cli.send("");
109
+ await cli.expect("Registry publication succeeded (v0.0.1)");
110
+ });
111
+ expect(exitCode).toBe(0);
112
+ expect(output).toContain("Registry publication succeeded (v0.0.1)");
113
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
114
+ expectSuccessfulApiCall(publishCall, (call) => {
115
+ expect(call.input).toMatchObject({ domain: SHARED_DOMAIN });
116
+ });
117
+ });
118
+ it("publishes with optional websiteUrl and iconSrc", async () => {
119
+ mockServer.addProject(buildMockProject({
120
+ projectId: PROJECT_ID,
121
+ teamId: TEAM_ID,
122
+ projectName: "my-server",
123
+ environmentId: ENV_ID,
124
+ environmentName: "production",
125
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
126
+ }));
127
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
128
+ const { exitCode } = await cliSession(process.execPath, [binPath, "publish"], {
129
+ cwd,
130
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
131
+ }, async (cli) => {
132
+ await cli.expect("Select a domain to publish for");
133
+ await cli.send("");
134
+ await cli.expect("Server title");
135
+ await cli.send("My Server");
136
+ await cli.expect("Server description");
137
+ await cli.send("Does great things");
138
+ await cli.expect("Website URL");
139
+ await cli.send("https://my-server.example.com");
140
+ await cli.expect("Icon URL");
141
+ await cli.send("https://my-server.example.com/icon.png");
142
+ await cli.expect("Publish to MCP Registry under domain");
143
+ await cli.send("");
144
+ await cli.expect("Registry publication succeeded (v0.0.1)");
145
+ });
146
+ expect(exitCode).toBe(0);
147
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
148
+ expectSuccessfulApiCall(publishCall, (call) => {
149
+ expect(call.input).toMatchObject({
150
+ websiteUrl: "https://my-server.example.com",
151
+ iconSrc: "https://my-server.example.com/icon.png",
152
+ });
153
+ });
154
+ });
155
+ it("publishes non-interactively with all flags", async () => {
156
+ mockServer.addProject(buildMockProject({
157
+ projectId: PROJECT_ID,
158
+ teamId: TEAM_ID,
159
+ projectName: "my-server",
160
+ environmentId: ENV_ID,
161
+ environmentName: "production",
162
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
163
+ }));
164
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
165
+ const { exitCode, output } = await cliSession(process.execPath, [
166
+ binPath,
167
+ "publish",
168
+ "--non-interactive",
169
+ "--domain",
170
+ DOMAIN,
171
+ "--title",
172
+ "My Server",
173
+ "--description",
174
+ "Does things",
175
+ "--website-url",
176
+ "https://example.com",
177
+ "--icon-src",
178
+ "https://example.com/icon.png",
179
+ ], {
180
+ cwd,
181
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
182
+ }, async (cli) => {
183
+ await cli.expect("Registry publication succeeded (v0.0.1)");
184
+ });
185
+ expect(exitCode).toBe(0);
186
+ expect(output).toContain("Registry publication succeeded (v0.0.1)");
187
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
188
+ expectSuccessfulApiCall(publishCall, (call) => {
189
+ expect(call.input).toMatchObject({
190
+ projectId: PROJECT_ID,
191
+ domain: DOMAIN,
192
+ title: "My Server",
193
+ description: "Does things",
194
+ websiteUrl: "https://example.com",
195
+ iconSrc: "https://example.com/icon.png",
196
+ });
197
+ });
198
+ });
199
+ it("errors when no config file is present", async () => {
200
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--domain", DOMAIN, "--title", "T", "--description", "D"], {
201
+ cwd,
202
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
203
+ });
204
+ expect(exitCode).toBe(1);
205
+ expect(output).toContain("No project specified");
206
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
207
+ });
208
+ it("errors when project has no production environment", async () => {
209
+ const projectWithoutProd = buildMockProject({
210
+ projectId: PROJECT_ID,
211
+ teamId: TEAM_ID,
212
+ projectName: "my-server",
213
+ environmentId: ENV_ID,
214
+ environmentName: "production",
215
+ domains: [],
216
+ });
217
+ mockServer.addProject({
218
+ ...projectWithoutProd,
219
+ productionEnvironment: null,
220
+ });
221
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
222
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--domain", DOMAIN, "--title", "T", "--description", "D"], {
223
+ cwd,
224
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
225
+ });
226
+ expect(exitCode).toBe(1);
227
+ expect(output).toContain("No production environment found");
228
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
229
+ });
230
+ it("errors non-interactively when --title is missing", async () => {
231
+ mockServer.addProject(buildMockProject({
232
+ projectId: PROJECT_ID,
233
+ teamId: TEAM_ID,
234
+ projectName: "my-server",
235
+ environmentId: ENV_ID,
236
+ environmentName: "production",
237
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
238
+ }));
239
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
240
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--domain", DOMAIN, "--description", "D"], {
241
+ cwd,
242
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
243
+ });
244
+ expect(exitCode).toBe(1);
245
+ expect(output).toContain("--title is required");
246
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
247
+ });
248
+ it("errors non-interactively when --description is missing", async () => {
249
+ mockServer.addProject(buildMockProject({
250
+ projectId: PROJECT_ID,
251
+ teamId: TEAM_ID,
252
+ projectName: "my-server",
253
+ environmentId: ENV_ID,
254
+ environmentName: "production",
255
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
256
+ }));
257
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
258
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--domain", DOMAIN, "--title", "T"], {
259
+ cwd,
260
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
261
+ });
262
+ expect(exitCode).toBe(1);
263
+ expect(output).toContain("--description is required");
264
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
265
+ });
266
+ it("errors non-interactively when multiple domains are available and --domain is missing", async () => {
267
+ mockServer.addProject(buildMockProject({
268
+ projectId: PROJECT_ID,
269
+ teamId: TEAM_ID,
270
+ projectName: "my-server",
271
+ environmentId: ENV_ID,
272
+ environmentName: "production",
273
+ domains: [
274
+ { domain: DOMAIN, status: "deployed", createdAt: new Date() },
275
+ {
276
+ domain: "another.example.com",
277
+ status: "deployed",
278
+ createdAt: new Date(),
279
+ },
280
+ ],
281
+ }));
282
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
283
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--title", "T", "--description", "D"], {
284
+ cwd,
285
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
286
+ });
287
+ expect(exitCode).toBe(1);
288
+ expect(output).toContain("--domain is required when using --non-interactive. Available:");
289
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
290
+ });
291
+ it("errors non-interactively when a single domain is available and --domain is missing", async () => {
292
+ mockServer.addProject(buildMockProject({
293
+ projectId: PROJECT_ID,
294
+ teamId: TEAM_ID,
295
+ projectName: "my-server",
296
+ environmentId: ENV_ID,
297
+ environmentName: "production",
298
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
299
+ }));
300
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
301
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish", "--non-interactive", "--title", "T", "--description", "D"], {
302
+ cwd,
303
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
304
+ });
305
+ expect(exitCode).toBe(1);
306
+ expect(output).toContain("--domain is required when using --non-interactive. Available:");
307
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
308
+ });
309
+ it("publishes non-interactively with --project-id when no config file exists", async () => {
310
+ mockServer.addProject(buildMockProject({
311
+ projectId: PROJECT_ID,
312
+ teamId: TEAM_ID,
313
+ projectName: "my-server",
314
+ environmentId: ENV_ID,
315
+ environmentName: "production",
316
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
317
+ }));
318
+ const { exitCode, output } = await cliSession(process.execPath, [
319
+ binPath,
320
+ "publish",
321
+ "--non-interactive",
322
+ "--project-id",
323
+ PROJECT_ID,
324
+ "--domain",
325
+ DOMAIN,
326
+ "--title",
327
+ "My Server",
328
+ "--description",
329
+ "Does things",
330
+ ], {
331
+ cwd,
332
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
333
+ }, async (cli) => {
334
+ await cli.expect("Registry publication succeeded (v0.0.1)");
335
+ });
336
+ expect(exitCode).toBe(0);
337
+ expect(output).toContain("Registry publication succeeded (v0.0.1)");
338
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
339
+ expectSuccessfulApiCall(publishCall, (call) => {
340
+ expect(call.input).toMatchObject({
341
+ projectId: PROJECT_ID,
342
+ domain: DOMAIN,
343
+ });
344
+ });
345
+ });
346
+ it("publishes non-interactively with --project-id overriding the config file", async () => {
347
+ const otherProjectId = "other-project-id";
348
+ mockServer.addProject(buildMockProject({
349
+ projectId: otherProjectId,
350
+ teamId: TEAM_ID,
351
+ projectName: "other-server",
352
+ environmentId: "other-env-id",
353
+ environmentName: "production",
354
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
355
+ }));
356
+ // Config file points to PROJECT_ID, but --project-id should override it
357
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
358
+ const { exitCode, output } = await cliSession(process.execPath, [
359
+ binPath,
360
+ "publish",
361
+ "--non-interactive",
362
+ "--project-id",
363
+ otherProjectId,
364
+ "--domain",
365
+ DOMAIN,
366
+ "--title",
367
+ "My Server",
368
+ "--description",
369
+ "Does things",
370
+ ], {
371
+ cwd,
372
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
373
+ }, async (cli) => {
374
+ await cli.expect("Registry publication succeeded (v0.0.1)");
375
+ });
376
+ expect(exitCode).toBe(0);
377
+ expect(output).toContain("Registry publication succeeded (v0.0.1)");
378
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
379
+ expectSuccessfulApiCall(publishCall, (call) => {
380
+ expect(call.input).toMatchObject({
381
+ projectId: otherProjectId,
382
+ domain: DOMAIN,
383
+ });
384
+ });
385
+ });
386
+ it("prefills prompts with last published data and shows previous version", async () => {
387
+ mockServer.addProject(buildMockProject({
388
+ projectId: PROJECT_ID,
389
+ teamId: TEAM_ID,
390
+ projectName: "my-server",
391
+ environmentId: ENV_ID,
392
+ environmentName: "production",
393
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
394
+ }));
395
+ mockServer.setPublishedServer(PROJECT_ID, DOMAIN, {
396
+ $schema: "https://registry.modelcontextprotocol.io/schemas/1.0/server.json",
397
+ name: "my-server",
398
+ title: "Old Title",
399
+ description: "Old description",
400
+ version: "1.2.3",
401
+ websiteUrl: "https://old.example.com",
402
+ icons: [{ src: "https://old.example.com/icon.png" }],
403
+ });
404
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
405
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish"], {
406
+ cwd,
407
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
408
+ }, async (cli) => {
409
+ await cli.expect("Select a domain to publish for");
410
+ await cli.send("");
411
+ // Accept all prefilled values as-is
412
+ await cli.expect("Server title");
413
+ await cli.send("");
414
+ await cli.expect("Server description");
415
+ await cli.send("");
416
+ await cli.expect("Website URL");
417
+ await cli.send("");
418
+ await cli.expect("Icon URL");
419
+ await cli.send("");
420
+ await cli.expect("Publish to MCP Registry under domain");
421
+ await cli.send("");
422
+ await cli.expect("Registry publication succeeded (v1.2.4)");
423
+ });
424
+ expect(exitCode).toBe(0);
425
+ expect(output).toContain("Registry publication succeeded (v1.2.4)");
426
+ const infoCall = mockServer.getLastCall("GET", "/v1/distribution/get");
427
+ expect(infoCall).toBeDefined();
428
+ expect(infoCall?.input).toMatchObject({
429
+ projectId: PROJECT_ID,
430
+ domain: DOMAIN,
431
+ });
432
+ const publishCall = mockServer.getLastCall("POST", "/v1/distribution/publish");
433
+ expectSuccessfulApiCall(publishCall, (call) => {
434
+ expect(call.input).toMatchObject({
435
+ title: "Old Title",
436
+ description: "Old description",
437
+ websiteUrl: "https://old.example.com",
438
+ iconSrc: "https://old.example.com/icon.png",
439
+ });
440
+ });
441
+ });
442
+ it("cancels when user declines the confirmation prompt", async () => {
443
+ mockServer.addProject(buildMockProject({
444
+ projectId: PROJECT_ID,
445
+ teamId: TEAM_ID,
446
+ projectName: "my-server",
447
+ environmentId: ENV_ID,
448
+ environmentName: "production",
449
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
450
+ }));
451
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
452
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "publish"], {
453
+ cwd,
454
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
455
+ }, async (cli) => {
456
+ await cli.expect("Select a domain to publish for");
457
+ await cli.send("");
458
+ await cli.expect("Server title");
459
+ await cli.send("My Server");
460
+ await cli.expect("Server description");
461
+ await cli.send("Does things");
462
+ await cli.expect("Website URL");
463
+ await cli.send("");
464
+ await cli.expect("Icon URL");
465
+ await cli.send("");
466
+ await cli.expect("Publish to MCP Registry under domain");
467
+ // Arrow down to select "No", then confirm
468
+ await cli.send("\x1B[B");
469
+ });
470
+ expect(exitCode).toBe(1);
471
+ expect(output).toContain("Publish cancelled");
472
+ const publishCalls = mockServer.getCalls("POST", "/v1/distribution/publish");
473
+ expect(publishCalls).toHaveLength(1);
474
+ expect(publishCalls[0]?.input).toMatchObject({ dryRun: true });
475
+ });
476
+ it("errors non-interactively when --domain is not in deployed domains", async () => {
477
+ mockServer.addProject(buildMockProject({
478
+ projectId: PROJECT_ID,
479
+ teamId: TEAM_ID,
480
+ projectName: "my-server",
481
+ environmentId: ENV_ID,
482
+ environmentName: "production",
483
+ domains: [{ domain: DOMAIN, status: "deployed", createdAt: new Date() }],
484
+ }));
485
+ createConfigFile(cwd, PROJECT_ID, TEAM_ID, "my-server", ENV_ID, "production");
486
+ const { exitCode, output } = await cliSession(process.execPath, [
487
+ binPath,
488
+ "publish",
489
+ "--non-interactive",
490
+ "--domain",
491
+ "unknown.example.com",
492
+ "--title",
493
+ "T",
494
+ "--description",
495
+ "D",
496
+ ], {
497
+ cwd,
498
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
499
+ });
500
+ expect(exitCode).toBe(1);
501
+ expect(output).toContain(`Domain "unknown.example.com" not found`);
502
+ expect(mockServer.getCalls("POST", "/v1/distribution/publish")).toHaveLength(0);
503
+ });
504
+ }, 20_000);
505
+ //# sourceMappingURL=publish.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/publish.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { rmSync } from "node:fs";
2
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
3
+ import { MockApiServer } from "./mock-server.js";
4
+ import { cliSession, createOAuthEnv, setupTestDirectory } from "./utils.js";
5
+ describe("alpic tunnel (E2E)", () => {
6
+ let mockServer;
7
+ let serverUrl;
8
+ let cwd;
9
+ let binPath;
10
+ beforeEach(async () => {
11
+ mockServer = new MockApiServer();
12
+ serverUrl = await mockServer.start();
13
+ const setup = await setupTestDirectory();
14
+ cwd = setup.cwd;
15
+ binPath = setup.binPath;
16
+ });
17
+ afterEach(async () => {
18
+ await mockServer.stop();
19
+ if (cwd) {
20
+ rmSync(cwd, { recursive: true, force: true });
21
+ }
22
+ });
23
+ it("triggers login when not authenticated", async () => {
24
+ const { output } = await cliSession(process.execPath, [binPath, "tunnel", "--port", "3000"], {
25
+ cwd,
26
+ env: {
27
+ ALPIC_API_BASE_URL: serverUrl,
28
+ },
29
+ }, async (cli) => {
30
+ await cli.expect("You need to be logged in to use the Alpic tunnel");
31
+ await cli.expect("Opening browser to log in");
32
+ cli.stop();
33
+ });
34
+ expect(output).toContain("You need to be logged in to use the Alpic tunnel");
35
+ });
36
+ it("requires --port flag", async () => {
37
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
38
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "tunnel"], {
39
+ cwd,
40
+ env: oauthEnv,
41
+ }, async (cli) => {
42
+ await cli.expect("Missing required flag port");
43
+ });
44
+ expect(exitCode).toBe(1);
45
+ expect(output).toContain("Missing required flag port");
46
+ });
47
+ it("requests a tunnel ticket from the API", async () => {
48
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
49
+ await cliSession(process.execPath, [binPath, "tunnel", "--port", "3000"], {
50
+ cwd,
51
+ env: oauthEnv,
52
+ timeoutMs: 12000,
53
+ }, async (cli) => {
54
+ await cli.expect("Opening tunnel");
55
+ cli.stop();
56
+ });
57
+ const ticketCall = mockServer.getCalls().find((call) => call.path.includes("tunnels"));
58
+ expect(ticketCall).toBeDefined();
59
+ });
60
+ });
61
+ //# sourceMappingURL=tunnel.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/tunnel.e2e.test.ts"],"names":[],"mappings":"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"}