alpic 0.0.0-dev.ff6c5b5 → 0.0.0-dev.ff9c7e6

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 (148) hide show
  1. package/dist/__tests__/auth.e2e.test.js +18 -3
  2. package/dist/__tests__/auth.e2e.test.js.map +1 -1
  3. package/dist/__tests__/deploy-flags.e2e.test.js +107 -6
  4. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -1
  5. package/dist/__tests__/deploy.e2e.test.js +22 -10
  6. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  7. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/deployment-inspect.e2e.test.js +114 -0
  9. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  10. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/deployment-list.e2e.test.js +116 -0
  12. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  13. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/deployment-logs.e2e.test.js +255 -0
  15. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  16. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  17. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +259 -0
  18. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  19. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  20. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +139 -0
  21. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +150 -0
  24. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  25. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  26. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +342 -0
  27. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  28. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  29. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  30. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  31. package/dist/__tests__/git-flags.e2e.test.js +6 -6
  32. package/dist/__tests__/git-flags.e2e.test.js.map +1 -1
  33. package/dist/__tests__/git.e2e.test.js +2 -2
  34. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  35. package/dist/__tests__/link.e2e.test.js +279 -0
  36. package/dist/__tests__/link.e2e.test.js.map +1 -0
  37. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  38. package/dist/__tests__/logs.e2e.test.js +227 -0
  39. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  40. package/dist/__tests__/mock-server.d.ts +20 -0
  41. package/dist/__tests__/mock-server.js +266 -20
  42. package/dist/__tests__/mock-server.js.map +1 -1
  43. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  44. package/dist/__tests__/publish.e2e.test.js +505 -0
  45. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  46. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  47. package/dist/__tests__/tunnel.e2e.test.js +64 -0
  48. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  49. package/dist/__tests__/utils.d.ts +8 -2
  50. package/dist/__tests__/utils.js +55 -20
  51. package/dist/__tests__/utils.js.map +1 -1
  52. package/dist/api.d.ts +1 -1
  53. package/dist/api.js +1 -1
  54. package/dist/api.js.map +1 -1
  55. package/dist/commands/deploy.d.ts +4 -4
  56. package/dist/commands/deploy.js +44 -33
  57. package/dist/commands/deploy.js.map +1 -1
  58. package/dist/commands/deployment/inspect.d.ts +11 -0
  59. package/dist/commands/deployment/inspect.js +91 -0
  60. package/dist/commands/deployment/inspect.js.map +1 -0
  61. package/dist/commands/deployment/list.d.ts +11 -0
  62. package/dist/commands/deployment/list.js +97 -0
  63. package/dist/commands/deployment/list.js.map +1 -0
  64. package/dist/commands/deployment/logs.d.ts +12 -0
  65. package/dist/commands/deployment/logs.js +50 -0
  66. package/dist/commands/deployment/logs.js.map +1 -0
  67. package/dist/commands/environment-variable/add.d.ts +14 -0
  68. package/dist/commands/environment-variable/add.js +47 -0
  69. package/dist/commands/environment-variable/add.js.map +1 -0
  70. package/dist/commands/environment-variable/list.d.ts +9 -0
  71. package/dist/commands/environment-variable/list.js +45 -0
  72. package/dist/commands/environment-variable/list.js.map +1 -0
  73. package/dist/commands/environment-variable/remove.d.ts +11 -0
  74. package/dist/commands/environment-variable/remove.js +33 -0
  75. package/dist/commands/environment-variable/remove.js.map +1 -0
  76. package/dist/commands/environment-variable/update.d.ts +13 -0
  77. package/dist/commands/environment-variable/update.js +41 -0
  78. package/dist/commands/environment-variable/update.js.map +1 -0
  79. package/dist/commands/git/connect.d.ts +1 -4
  80. package/dist/commands/git/connect.js +16 -26
  81. package/dist/commands/git/connect.js.map +1 -1
  82. package/dist/commands/git/disconnect.d.ts +1 -4
  83. package/dist/commands/git/disconnect.js +14 -26
  84. package/dist/commands/git/disconnect.js.map +1 -1
  85. package/dist/commands/git.js +2 -2
  86. package/dist/commands/git.js.map +1 -1
  87. package/dist/commands/link.d.ts +17 -0
  88. package/dist/commands/link.js +101 -0
  89. package/dist/commands/link.js.map +1 -0
  90. package/dist/commands/login.js +4 -2
  91. package/dist/commands/login.js.map +1 -1
  92. package/dist/commands/logs.d.ts +16 -0
  93. package/dist/commands/logs.js +96 -0
  94. package/dist/commands/logs.js.map +1 -0
  95. package/dist/commands/publish.d.ts +15 -0
  96. package/dist/commands/publish.js +51 -0
  97. package/dist/commands/publish.js.map +1 -0
  98. package/dist/commands/tunnel.d.ts +9 -0
  99. package/dist/commands/tunnel.js +53 -0
  100. package/dist/commands/tunnel.js.map +1 -0
  101. package/dist/lib/archive.d.ts +3 -3
  102. package/dist/lib/archive.js +11 -15
  103. package/dist/lib/archive.js.map +1 -1
  104. package/dist/lib/auth/oauth/server/index.js +5 -2
  105. package/dist/lib/auth/oauth/server/index.js.map +1 -1
  106. package/dist/lib/base-workflow.d.ts +1 -1
  107. package/dist/lib/base-workflow.js +1 -1
  108. package/dist/lib/base-workflow.js.map +1 -1
  109. package/dist/lib/config.d.ts +3 -2
  110. package/dist/lib/config.js +8 -7
  111. package/dist/lib/config.js.map +1 -1
  112. package/dist/lib/deployment.d.ts +68 -1
  113. package/dist/lib/deployment.js +111 -15
  114. package/dist/lib/deployment.js.map +1 -1
  115. package/dist/lib/environment-variable.d.ts +37 -0
  116. package/dist/lib/environment-variable.js +299 -0
  117. package/dist/lib/environment-variable.js.map +1 -0
  118. package/dist/lib/git.d.ts +5 -5
  119. package/dist/lib/git.js +10 -13
  120. package/dist/lib/git.js.map +1 -1
  121. package/dist/lib/global-store.js +2 -2
  122. package/dist/lib/global-store.js.map +1 -1
  123. package/dist/lib/{project.d.ts → link.d.ts} +24 -12
  124. package/dist/lib/{project.js → link.js} +184 -96
  125. package/dist/lib/link.js.map +1 -0
  126. package/dist/lib/logs.d.ts +20 -0
  127. package/dist/lib/logs.js +86 -0
  128. package/dist/lib/logs.js.map +1 -0
  129. package/dist/lib/publish.d.ts +22 -0
  130. package/dist/lib/publish.js +185 -0
  131. package/dist/lib/publish.js.map +1 -0
  132. package/dist/lib/resolve.d.ts +6 -0
  133. package/dist/lib/resolve.js +26 -0
  134. package/dist/lib/resolve.js.map +1 -0
  135. package/dist/lib/table.d.ts +8 -0
  136. package/dist/lib/table.js +27 -0
  137. package/dist/lib/table.js.map +1 -0
  138. package/dist/lib/telemetry.js +1 -1
  139. package/dist/lib/telemetry.js.map +1 -1
  140. package/dist/lib/utils.d.ts +4 -0
  141. package/dist/lib/utils.js +45 -0
  142. package/dist/lib/utils.js.map +1 -0
  143. package/dist/lib/utils.test.d.ts +1 -0
  144. package/dist/lib/utils.test.js +27 -0
  145. package/dist/lib/utils.test.js.map +1 -0
  146. package/dist/types.d.ts +1 -0
  147. package/package.json +24 -19
  148. 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,64 @@
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, 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("requires authentication", async () => {
24
+ const { exitCode, 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("Not authenticated");
31
+ });
32
+ expect(exitCode).toBe(1);
33
+ expect(output).toContain("Not authenticated");
34
+ });
35
+ it("requires --port flag", async () => {
36
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "tunnel"], {
37
+ cwd,
38
+ env: {
39
+ ALPIC_API_BASE_URL: serverUrl,
40
+ ALPIC_API_KEY: "test-api-key",
41
+ },
42
+ }, async (cli) => {
43
+ await cli.expect("Missing required flag port");
44
+ });
45
+ expect(exitCode).toBe(1);
46
+ expect(output).toContain("Missing required flag port");
47
+ });
48
+ it("requests a tunnel ticket from the API", async () => {
49
+ await cliSession(process.execPath, [binPath, "tunnel", "--port", "3000"], {
50
+ cwd,
51
+ env: {
52
+ ALPIC_API_BASE_URL: serverUrl,
53
+ ALPIC_API_KEY: "test-api-key",
54
+ },
55
+ timeoutMs: 12000,
56
+ }, async (cli) => {
57
+ await cli.expect("Opening tunnel");
58
+ cli.stop();
59
+ });
60
+ const ticketCall = mockServer.getCalls().find((call) => call.path.includes("tunnels"));
61
+ expect(ticketCall).toBeDefined();
62
+ });
63
+ });
64
+ //# 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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"}
@@ -2,6 +2,9 @@ import type { RouterOutput } from "@alpic-ai/api";
2
2
  import type { ApiCall, MockApiServer } from "./mock-server.js";
3
3
  type Expectable = string | RegExp;
4
4
  type ProjectGetV1 = RouterOutput["projects"]["get"]["v1"];
5
+ type DeploymentGetV1 = RouterOutput["deployments"]["get"]["v1"];
6
+ type ProductionEnvironment = NonNullable<ProjectGetV1["productionEnvironment"]>;
7
+ type ProductionEnvironmentDomains = ProductionEnvironment["domains"];
5
8
  export type CliSessionOptions = {
6
9
  cwd?: string;
7
10
  env?: Record<string, string | undefined>;
@@ -37,8 +40,10 @@ export type BuildMockProjectParams = {
37
40
  environmentName: string;
38
41
  sourceRepository?: string | null;
39
42
  sourceBranch?: string | null;
43
+ domains?: ProductionEnvironmentDomains;
40
44
  };
41
45
  export declare function buildMockProject(params: BuildMockProjectParams): ProjectGetV1;
46
+ export declare function buildMockDeployment(overrides?: Partial<DeploymentGetV1>): DeploymentGetV1;
42
47
  export type SetupTestDirectoryOptions = {
43
48
  /** If true, run git init and add origin/upstream remotes */
44
49
  initGit?: boolean;
@@ -47,7 +52,7 @@ export declare function setupTestDirectory(options?: SetupTestDirectoryOptions):
47
52
  cwd: string;
48
53
  binPath: string;
49
54
  }>;
50
- export declare function createConfigFile(cwd: string, projectId: string, teamId: string, projectName: string, environmentId: string, environmentName: string): void;
55
+ export declare function createConfigFile(cwd: string, projectId: string, teamId: string, projectName: string, environmentId: string, environmentName: string, teamName?: string): void;
51
56
  export declare function runGit(args: string[], cwd: string): void;
52
57
  export declare function expectSuccessfulApiCall(call: ApiCall | undefined, customAssertions?: (call: ApiCall) => void): asserts call is ApiCall;
53
58
  /**
@@ -56,10 +61,11 @@ export declare function expectSuccessfulApiCall(call: ApiCall | undefined, custo
56
61
  * Caller must pass serverUrl so userinfo can be pointed at the mock server.
57
62
  */
58
63
  export declare function createOAuthEnv(cwd: string, serverUrl: string): Record<string, string>;
59
- export declare function verifyConfigFile(cwd: string, output: string, expected: {
64
+ export declare function verifyConfigFile(cwd: string, expected: {
60
65
  projectName: string;
61
66
  projectId?: string;
62
67
  teamId?: string;
68
+ teamName?: string;
63
69
  environmentId?: string;
64
70
  environmentName?: string;
65
71
  }): Promise<void>;