alpic 0.0.0-dev.ff063bb → 0.0.0-dev.ff4302e

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 (205) hide show
  1. package/README.md +40 -0
  2. package/bin/run.js +5 -0
  3. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  4. package/dist/__tests__/auth.e2e.test.js +157 -0
  5. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  7. package/dist/__tests__/deploy-flags.e2e.test.js +188 -0
  8. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  9. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  10. package/dist/__tests__/deploy.e2e.test.js +180 -0
  11. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  12. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  13. package/dist/__tests__/deployment-inspect.e2e.test.js +114 -0
  14. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  15. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  16. package/dist/__tests__/deployment-list.e2e.test.js +116 -0
  17. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  18. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  19. package/dist/__tests__/deployment-logs.e2e.test.js +255 -0
  20. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  21. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +259 -0
  23. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  24. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  25. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +139 -0
  26. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  27. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  28. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +150 -0
  29. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  30. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  31. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +342 -0
  32. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  33. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  34. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  35. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  36. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  37. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  38. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  39. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  40. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  41. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  42. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  43. package/dist/__tests__/git.e2e.test.js +221 -0
  44. package/dist/__tests__/git.e2e.test.js.map +1 -0
  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 +42 -0
  52. package/dist/__tests__/mock-server.js +739 -0
  53. package/dist/__tests__/mock-server.js.map +1 -0
  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 +73 -0
  61. package/dist/__tests__/utils.js +278 -0
  62. package/dist/__tests__/utils.js.map +1 -0
  63. package/dist/api.d.ts +3 -9
  64. package/dist/api.js +20 -31
  65. package/dist/api.js.map +1 -1
  66. package/dist/commands/deploy.d.ts +10 -4
  67. package/dist/commands/deploy.js +85 -32
  68. package/dist/commands/deploy.js.map +1 -1
  69. package/dist/commands/deployment/inspect.d.ts +11 -0
  70. package/dist/commands/deployment/inspect.js +91 -0
  71. package/dist/commands/deployment/inspect.js.map +1 -0
  72. package/dist/commands/deployment/list.d.ts +11 -0
  73. package/dist/commands/deployment/list.js +97 -0
  74. package/dist/commands/deployment/list.js.map +1 -0
  75. package/dist/commands/deployment/logs.d.ts +12 -0
  76. package/dist/commands/deployment/logs.js +50 -0
  77. package/dist/commands/deployment/logs.js.map +1 -0
  78. package/dist/commands/environment-variable/add.d.ts +14 -0
  79. package/dist/commands/environment-variable/add.js +47 -0
  80. package/dist/commands/environment-variable/add.js.map +1 -0
  81. package/dist/commands/environment-variable/list.d.ts +9 -0
  82. package/dist/commands/environment-variable/list.js +45 -0
  83. package/dist/commands/environment-variable/list.js.map +1 -0
  84. package/dist/commands/environment-variable/remove.d.ts +11 -0
  85. package/dist/commands/environment-variable/remove.js +33 -0
  86. package/dist/commands/environment-variable/remove.js.map +1 -0
  87. package/dist/commands/environment-variable/update.d.ts +13 -0
  88. package/dist/commands/environment-variable/update.js +41 -0
  89. package/dist/commands/environment-variable/update.js.map +1 -0
  90. package/dist/commands/git/connect.d.ts +10 -0
  91. package/dist/commands/git/connect.js +60 -0
  92. package/dist/commands/git/connect.js.map +1 -0
  93. package/dist/commands/git/disconnect.d.ts +9 -0
  94. package/dist/commands/git/disconnect.js +45 -0
  95. package/dist/commands/git/disconnect.js.map +1 -0
  96. package/dist/commands/git.d.ts +6 -0
  97. package/dist/commands/git.js +17 -0
  98. package/dist/commands/git.js.map +1 -0
  99. package/dist/commands/link.d.ts +17 -0
  100. package/dist/commands/link.js +101 -0
  101. package/dist/commands/link.js.map +1 -0
  102. package/dist/commands/login.d.ts +6 -0
  103. package/dist/commands/login.js +21 -0
  104. package/dist/commands/login.js.map +1 -0
  105. package/dist/commands/logout.d.ts +6 -0
  106. package/dist/commands/logout.js +20 -0
  107. package/dist/commands/logout.js.map +1 -0
  108. package/dist/commands/logs.d.ts +16 -0
  109. package/dist/commands/logs.js +96 -0
  110. package/dist/commands/logs.js.map +1 -0
  111. package/dist/commands/publish.d.ts +15 -0
  112. package/dist/commands/publish.js +51 -0
  113. package/dist/commands/publish.js.map +1 -0
  114. package/dist/commands/telemetry/disable.d.ts +5 -0
  115. package/dist/commands/telemetry/disable.js +14 -0
  116. package/dist/commands/telemetry/disable.js.map +1 -0
  117. package/dist/commands/telemetry/enable.d.ts +5 -0
  118. package/dist/commands/telemetry/enable.js +13 -0
  119. package/dist/commands/telemetry/enable.js.map +1 -0
  120. package/dist/commands/telemetry/status.d.ts +5 -0
  121. package/dist/commands/telemetry/status.js +19 -0
  122. package/dist/commands/telemetry/status.js.map +1 -0
  123. package/dist/commands/tunnel.d.ts +9 -0
  124. package/dist/commands/tunnel.js +96 -0
  125. package/dist/commands/tunnel.js.map +1 -0
  126. package/dist/commands/whoami.d.ts +6 -0
  127. package/dist/commands/whoami.js +13 -0
  128. package/dist/commands/whoami.js.map +1 -0
  129. package/dist/env.d.ts +4 -0
  130. package/dist/env.js +10 -0
  131. package/dist/env.js.map +1 -0
  132. package/dist/lib/alpic-command.d.ts +6 -0
  133. package/dist/lib/alpic-command.js +27 -0
  134. package/dist/lib/alpic-command.js.map +1 -0
  135. package/dist/lib/archive.d.ts +3 -3
  136. package/dist/lib/archive.js +11 -15
  137. package/dist/lib/archive.js.map +1 -1
  138. package/dist/lib/auth/auth.d.ts +3 -0
  139. package/dist/lib/auth/auth.js +39 -0
  140. package/dist/lib/auth/auth.js.map +1 -0
  141. package/dist/lib/auth/oauth/client.d.ts +28 -0
  142. package/dist/lib/auth/oauth/client.js +110 -0
  143. package/dist/lib/auth/oauth/client.js.map +1 -0
  144. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  145. package/dist/lib/auth/oauth/constants.js +3 -0
  146. package/dist/lib/auth/oauth/constants.js.map +1 -0
  147. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  148. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  149. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  150. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  151. package/dist/lib/auth/oauth/server/index.js +105 -0
  152. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  153. package/dist/lib/auth/whoami.d.ts +1 -0
  154. package/dist/lib/auth/whoami.js +45 -0
  155. package/dist/lib/auth/whoami.js.map +1 -0
  156. package/dist/lib/base-workflow.d.ts +10 -0
  157. package/dist/lib/base-workflow.js +22 -0
  158. package/dist/lib/base-workflow.js.map +1 -0
  159. package/dist/lib/config.d.ts +3 -2
  160. package/dist/lib/config.js +8 -7
  161. package/dist/lib/config.js.map +1 -1
  162. package/dist/lib/deployment.d.ts +88 -0
  163. package/dist/lib/deployment.js +150 -0
  164. package/dist/lib/deployment.js.map +1 -0
  165. package/dist/lib/environment-variable.d.ts +37 -0
  166. package/dist/lib/environment-variable.js +299 -0
  167. package/dist/lib/environment-variable.js.map +1 -0
  168. package/dist/lib/git.d.ts +22 -0
  169. package/dist/lib/git.js +131 -0
  170. package/dist/lib/git.js.map +1 -0
  171. package/dist/lib/global-store.d.ts +28 -0
  172. package/dist/lib/global-store.js +76 -0
  173. package/dist/lib/global-store.js.map +1 -0
  174. package/dist/lib/link.d.ts +83 -0
  175. package/dist/lib/link.js +387 -0
  176. package/dist/lib/link.js.map +1 -0
  177. package/dist/lib/logs.d.ts +20 -0
  178. package/dist/lib/logs.js +86 -0
  179. package/dist/lib/logs.js.map +1 -0
  180. package/dist/lib/publish.d.ts +22 -0
  181. package/dist/lib/publish.js +185 -0
  182. package/dist/lib/publish.js.map +1 -0
  183. package/dist/lib/resolve.d.ts +6 -0
  184. package/dist/lib/resolve.js +26 -0
  185. package/dist/lib/resolve.js.map +1 -0
  186. package/dist/lib/table.d.ts +8 -0
  187. package/dist/lib/table.js +27 -0
  188. package/dist/lib/table.js.map +1 -0
  189. package/dist/lib/telemetry.d.ts +7 -0
  190. package/dist/lib/telemetry.js +66 -0
  191. package/dist/lib/telemetry.js.map +1 -0
  192. package/dist/lib/utils.d.ts +4 -0
  193. package/dist/lib/utils.js +45 -0
  194. package/dist/lib/utils.js.map +1 -0
  195. package/dist/lib/utils.test.d.ts +1 -0
  196. package/dist/lib/utils.test.js +27 -0
  197. package/dist/lib/utils.test.js.map +1 -0
  198. package/dist/posthog.d.ts +3 -0
  199. package/dist/posthog.js +10 -0
  200. package/dist/posthog.js.map +1 -0
  201. package/dist/types.d.ts +1 -34
  202. package/package.json +43 -14
  203. package/dist/lib/project.d.ts +0 -10
  204. package/dist/lib/project.js +0 -145
  205. package/dist/lib/project.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # Alpic CLI
2
+
3
+ Deploy and manage your MCP servers from the command line.
4
+
5
+ Full documentation: **https://docs.alpic.ai/cli/overview**
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g alpic
11
+ ```
12
+
13
+ ## Authenticate
14
+
15
+ ```bash
16
+ alpic login
17
+ ```
18
+
19
+ Or set an API key:
20
+
21
+ ```bash
22
+ export ALPIC_API_KEY=your_api_key_here
23
+ ```
24
+
25
+ ## Commands
26
+
27
+ | Command | Description |
28
+ |---------|-------------|
29
+ | `deploy` | Deploy a project |
30
+ | `deployment list\|inspect\|logs` | Manage deployments |
31
+ | `environment-variable add\|list\|remove\|update` | Manage env vars |
32
+ | `git connect\|disconnect` | Link/unlink git repositories |
33
+ | `link` | Connect directory to a project |
34
+ | `login` | Authenticate via browser |
35
+ | `logout` | Clear local credentials |
36
+ | `logs` | Monitor runtime logs |
37
+ | `publish` | Share an MCP server to the registry |
38
+ | `telemetry enable\|disable\|status` | Manage usage reporting |
39
+ | `tunnel` | Expose local server to the internet |
40
+ | `whoami` | Display current user |
package/bin/run.js CHANGED
@@ -1,5 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { execute } from "@oclif/core";
4
+ import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
5
+
6
+ // Node's native fetch ignores HTTP_PROXY/HTTPS_PROXY/NO_PROXY env vars.
7
+ // This patches global fetch to route requests through the proxy when set.
8
+ setGlobalDispatcher(new EnvHttpProxyAgent());
4
9
 
5
10
  await execute({ dir: import.meta.url });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,157 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
4
+ import { LOOPBACK_HOST, LOOPBACK_PORT } from "../lib/auth/oauth/constants.js";
5
+ import { MockApiServer } from "./mock-server.js";
6
+ import { cliSession, createOAuthEnv, setupTestDirectory } from "./utils.js";
7
+ describe("alpic login, logout, whoami (E2E)", () => {
8
+ let mockServer;
9
+ let serverUrl;
10
+ let cwd;
11
+ let binPath;
12
+ beforeEach(async () => {
13
+ mockServer = new MockApiServer();
14
+ serverUrl = await mockServer.start();
15
+ const setup = await setupTestDirectory();
16
+ cwd = setup.cwd;
17
+ binPath = setup.binPath;
18
+ });
19
+ afterEach(async () => {
20
+ await mockServer.stop();
21
+ if (cwd) {
22
+ rmSync(cwd, { recursive: true, force: true });
23
+ }
24
+ });
25
+ describe("whoami", () => {
26
+ it("shows not logged in when no API key and no OAuth credentials", async () => {
27
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
28
+ cwd,
29
+ env: {
30
+ ALPIC_API_BASE_URL: serverUrl,
31
+ },
32
+ }, async (cli) => {
33
+ await cli.expect("Not logged in");
34
+ await cli.expect("alpic login");
35
+ });
36
+ expect(exitCode).toBe(0);
37
+ expect(output).toContain("Not logged in. Run `alpic login` or set ALPIC_API_KEY.");
38
+ });
39
+ it("shows team when authenticated via API key", async () => {
40
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
41
+ cwd,
42
+ env: {
43
+ ALPIC_API_BASE_URL: serverUrl,
44
+ ALPIC_API_KEY: "test-api-key",
45
+ },
46
+ }, async (cli) => {
47
+ await cli.expect("API key");
48
+ await cli.expect("Team:");
49
+ await cli.expect("Mock Team");
50
+ });
51
+ expect(exitCode).toBe(0);
52
+ expect(output).toContain("Authenticated via API key");
53
+ expect(output).toContain("Mock Team");
54
+ });
55
+ it("shows user email and name when authenticated via OAuth", async () => {
56
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
57
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
58
+ cwd,
59
+ env: oauthEnv,
60
+ }, async (cli) => {
61
+ await cli.expect("Authenticated as");
62
+ await cli.expect("test@example.com");
63
+ await cli.expect("Test User");
64
+ });
65
+ expect(exitCode).toBe(0);
66
+ expect(output).toContain("Authenticated as");
67
+ expect(output).toContain("Test User");
68
+ expect(output).toContain("test@example.com");
69
+ });
70
+ it("deletes credentials file when it is not readable (e.g. corrupt)", async () => {
71
+ const alpicConfigDir = join(cwd, ".config", "alpic");
72
+ const credentialsPath = join(alpicConfigDir, "credentials.json");
73
+ mkdirSync(alpicConfigDir, { recursive: true });
74
+ writeFileSync(credentialsPath, "not valid json", "utf-8");
75
+ expect(existsSync(credentialsPath)).toBe(true);
76
+ const env = {
77
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
78
+ ALPIC_COGNITO_URL: serverUrl,
79
+ ALPIC_API_BASE_URL: serverUrl,
80
+ };
81
+ const { exitCode } = await cliSession(process.execPath, [binPath, "whoami"], { cwd, env }, async (cli) => {
82
+ await cli.expect("Not logged in");
83
+ });
84
+ expect(exitCode).toBe(0);
85
+ expect(existsSync(credentialsPath)).toBe(false);
86
+ });
87
+ });
88
+ describe("logout", () => {
89
+ it("says not logged in when no credentials", async () => {
90
+ const alpicConfigDir = join(cwd, ".config", "alpic");
91
+ const credentialsPath = join(alpicConfigDir, "credentials.json");
92
+ mkdirSync(alpicConfigDir, { recursive: true });
93
+ const oauthEnv = {
94
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
95
+ ALPIC_COGNITO_URL: serverUrl,
96
+ ALPIC_API_BASE_URL: serverUrl,
97
+ };
98
+ expect(existsSync(credentialsPath)).toBe(false);
99
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "logout"], {
100
+ cwd,
101
+ env: {
102
+ ...oauthEnv,
103
+ ALPIC_API_BASE_URL: serverUrl,
104
+ },
105
+ }, async (cli) => {
106
+ await cli.expect("not logged in");
107
+ });
108
+ expect(exitCode).toBe(0);
109
+ expect(output).toContain("You are not logged in");
110
+ });
111
+ it("clears OAuth credentials and shows logged out", async () => {
112
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
113
+ const credentialsPath = join(cwd, ".config", "alpic", "credentials.json");
114
+ expect(existsSync(credentialsPath)).toBe(true);
115
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "logout"], {
116
+ cwd,
117
+ env: oauthEnv,
118
+ }, async (cli) => {
119
+ await cli.expect("logged out");
120
+ await cli.expect("authentication cleared");
121
+ });
122
+ expect(exitCode).toBe(0);
123
+ expect(output).toContain("You are logged out");
124
+ expect(output).toContain("User authentication cleared");
125
+ expect(existsSync(credentialsPath)).toBe(false);
126
+ });
127
+ });
128
+ describe("login", () => {
129
+ it("displays the login URL in the terminal for manual copy", async () => {
130
+ const alpicConfigDir = join(cwd, ".config", "alpic");
131
+ const { output } = await cliSession(process.execPath, [binPath, "login"], {
132
+ cwd,
133
+ env: {
134
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
135
+ ALPIC_COGNITO_URL: serverUrl,
136
+ ALPIC_API_BASE_URL: serverUrl,
137
+ },
138
+ }, async (cli) => {
139
+ await cli.expect(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`);
140
+ cli.stop();
141
+ });
142
+ expect(output).toContain(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`);
143
+ });
144
+ it("says already logged in when OAuth credentials exist", async () => {
145
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
146
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "login"], {
147
+ cwd,
148
+ env: oauthEnv,
149
+ }, async (cli) => {
150
+ await cli.expect("Already logged in");
151
+ });
152
+ expect(exitCode).toBe(0);
153
+ expect(output).toContain("Already logged in");
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=auth.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,188 @@
1
+ import { mkdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
4
+ import { MockApiServer } from "./mock-server.js";
5
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, setupTestDirectory, verifyConfigFile, verifyDeploymentFlow, } from "./utils.js";
6
+ describe("alpic deploy (E2E, flags only)", () => {
7
+ let mockServer;
8
+ let serverUrl;
9
+ let cwd;
10
+ let binPath;
11
+ beforeEach(async () => {
12
+ mockServer = new MockApiServer();
13
+ serverUrl = await mockServer.start();
14
+ const setup = await setupTestDirectory();
15
+ cwd = setup.cwd;
16
+ binPath = setup.binPath;
17
+ });
18
+ afterEach(async () => {
19
+ await mockServer.stop();
20
+ if (cwd) {
21
+ rmSync(cwd, { recursive: true, force: true });
22
+ }
23
+ });
24
+ it("creates config and completes deployment with --non-interactive --project-name --runtime --root-dir", async () => {
25
+ mkdirSync(join(cwd, "app"), { recursive: true });
26
+ writeFileSync(join(cwd, "app", "package.json"), "{}");
27
+ const { exitCode } = await cliSession(process.execPath, [binPath, "deploy", "--non-interactive", "--project-name", "demo", "--runtime", "node24", "--root-dir", "app"], {
28
+ cwd,
29
+ env: {
30
+ ALPIC_API_BASE_URL: serverUrl,
31
+ ALPIC_API_KEY: "test-api-key",
32
+ },
33
+ }, async (cli) => {
34
+ await cli.expect("Project created.");
35
+ await verifyDeploymentFlow(cli, mockServer);
36
+ });
37
+ expect(exitCode).toBe(0);
38
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
39
+ expectSuccessfulApiCall(createProjectCall, (call) => {
40
+ expect(call.input).toMatchObject({
41
+ name: "demo",
42
+ runtime: "node24",
43
+ rootDirectory: "app",
44
+ teamId: "mock-team-id",
45
+ });
46
+ });
47
+ await verifyConfigFile(cwd, {
48
+ projectName: "demo",
49
+ teamName: "Mock Team",
50
+ environmentName: "production",
51
+ });
52
+ });
53
+ it("deploys with existing config file", async () => {
54
+ const existingProjectId = "existing-project-id";
55
+ const existingTeamId = "mock-team-id";
56
+ const existingEnvId = "existing-env-id";
57
+ const existingEnvName = "production";
58
+ mockServer.addProject(buildMockProject({
59
+ projectId: existingProjectId,
60
+ teamId: existingTeamId,
61
+ projectName: "existing-project",
62
+ environmentId: existingEnvId,
63
+ environmentName: existingEnvName,
64
+ }));
65
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
66
+ const { exitCode } = await cliSession(process.execPath, [binPath, "deploy", "--non-interactive"], {
67
+ cwd,
68
+ env: {
69
+ ALPIC_API_BASE_URL: serverUrl,
70
+ ALPIC_API_KEY: "test-api-key",
71
+ },
72
+ }, async (cli) => {
73
+ await verifyDeploymentFlow(cli, mockServer);
74
+ });
75
+ expect(exitCode).toBe(0);
76
+ await verifyDeploymentApiCalls(mockServer);
77
+ });
78
+ it("shows the resolved full path when --root-dir does not exist", async () => {
79
+ const missingDir = "missing-root-dir";
80
+ const expectedFullPath = resolve(realpathSync(cwd), missingDir);
81
+ const { output } = await cliSession(process.execPath, [
82
+ binPath,
83
+ "deploy",
84
+ "--non-interactive",
85
+ "--project-name",
86
+ "demo",
87
+ "--runtime",
88
+ "node24",
89
+ "--root-dir",
90
+ missingDir,
91
+ ], {
92
+ cwd,
93
+ env: {
94
+ ALPIC_API_BASE_URL: serverUrl,
95
+ ALPIC_API_KEY: "test-api-key",
96
+ },
97
+ });
98
+ expect(output).toContain(`Directory does not exist: ${expectedFullPath}`);
99
+ expect(output).not.toContain(`Directory does not exist: ${missingDir}`);
100
+ expect(mockServer.getCalls("POST", "/v1/projects")).toHaveLength(0);
101
+ });
102
+ it("deploys directly with --project-id and --environment-id flags", async () => {
103
+ const existingProjectId = "existing-project-id";
104
+ const existingTeamId = "mock-team-id";
105
+ const existingEnvId = "existing-env-id";
106
+ const existingEnvName = "production";
107
+ mockServer.addProject(buildMockProject({
108
+ projectId: existingProjectId,
109
+ teamId: existingTeamId,
110
+ projectName: "existing-project",
111
+ environmentId: existingEnvId,
112
+ environmentName: existingEnvName,
113
+ }));
114
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy", "--project-id", existingProjectId, "--environment-id", existingEnvId], {
115
+ cwd,
116
+ env: {
117
+ ALPIC_API_BASE_URL: serverUrl,
118
+ ALPIC_API_KEY: "test-api-key",
119
+ },
120
+ }, async (cli) => {
121
+ await verifyDeploymentFlow(cli, mockServer);
122
+ });
123
+ expect(exitCode).toBe(0);
124
+ expect(output).not.toContain("Use the current directory?");
125
+ expect(output).not.toContain("Choose a team");
126
+ expect(output).toContain("Deployment summary:");
127
+ expect(output).toContain("alpic deployment logs --deployment-id");
128
+ await verifyConfigFile(cwd, {
129
+ projectName: "existing-project",
130
+ projectId: existingProjectId,
131
+ teamId: existingTeamId,
132
+ teamName: "Mock Team",
133
+ environmentId: existingEnvId,
134
+ environmentName: existingEnvName,
135
+ });
136
+ });
137
+ it("creates config with --team-id flag in non-interactive mode", async () => {
138
+ mockServer.setTeams([
139
+ { id: "team-alpha", name: "Team Alpha" },
140
+ { id: "team-beta", name: "Team Beta" },
141
+ ]);
142
+ const { exitCode } = await cliSession(process.execPath, [
143
+ binPath,
144
+ "deploy",
145
+ "--non-interactive",
146
+ "--team-id",
147
+ "team-alpha",
148
+ "--project-name",
149
+ "demo",
150
+ "--runtime",
151
+ "node24",
152
+ ], {
153
+ cwd,
154
+ env: {
155
+ ALPIC_API_BASE_URL: serverUrl,
156
+ ALPIC_API_KEY: "test-api-key",
157
+ },
158
+ }, async (cli) => {
159
+ await cli.expect("Project created.");
160
+ await verifyDeploymentFlow(cli, mockServer);
161
+ });
162
+ expect(exitCode).toBe(0);
163
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
164
+ expectSuccessfulApiCall(createProjectCall, (call) => {
165
+ expect(call.input).toMatchObject({
166
+ name: "demo",
167
+ runtime: "node24",
168
+ teamId: "team-alpha",
169
+ });
170
+ });
171
+ await verifyConfigFile(cwd, {
172
+ projectName: "demo",
173
+ teamName: "Team Alpha",
174
+ environmentName: "production",
175
+ });
176
+ });
177
+ }, 15_000);
178
+ async function verifyDeploymentApiCalls(mockServer) {
179
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
180
+ expectSuccessfulApiCall(uploadCall);
181
+ const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
182
+ expectSuccessfulApiCall(deployCall);
183
+ const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
184
+ expect(deploymentStatusCalls.length).toBeGreaterThan(0);
185
+ const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
186
+ expectSuccessfulApiCall(envCall);
187
+ }
188
+ //# sourceMappingURL=deploy-flags.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-flags.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy-flags.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,180 @@
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, createOAuthEnv, expectSuccessfulApiCall, setupTestDirectory, verifyConfigFile, verifyDeploymentFlow, } from "./utils.js";
5
+ describe("alpic deploy (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("creates config from prompt flow and completes deployment", async () => {
24
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
25
+ cwd,
26
+ env: {
27
+ ALPIC_API_BASE_URL: serverUrl,
28
+ ALPIC_API_KEY: "test-api-key",
29
+ },
30
+ }, async (cli) => {
31
+ await cli.expect("Use the current directory?");
32
+ await cli.send("");
33
+ await cli.expect("Choose a team");
34
+ await cli.send("");
35
+ await cli.expect("Link to existing project?");
36
+ await cli.send("n");
37
+ await cli.expect("Project name");
38
+ await cli.send("demo");
39
+ await cli.expect("Runtime");
40
+ await cli.send("");
41
+ await cli.expect("Root directory");
42
+ await cli.send("");
43
+ await cli.expect("Project created.");
44
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
45
+ expectSuccessfulApiCall(createProjectCall, (call) => {
46
+ expect(call.input).toMatchObject({
47
+ name: "demo",
48
+ runtime: "node24",
49
+ teamId: "mock-team-id",
50
+ });
51
+ });
52
+ await verifyDeploymentFlow(cli, mockServer);
53
+ });
54
+ expect(exitCode).toBe(0);
55
+ expect(output).toContain("Deployment summary:");
56
+ expect(output).toContain("alpic deployment logs --deployment-id");
57
+ await verifyConfigFile(cwd, {
58
+ projectName: "demo",
59
+ teamName: "Mock Team",
60
+ environmentName: "production",
61
+ });
62
+ });
63
+ it("links to existing project and completes deployment", async () => {
64
+ const existingProjectId = "existing-project-id";
65
+ const existingTeamId = "mock-team-id";
66
+ const existingEnvId = "existing-env-id";
67
+ const existingEnvName = "production";
68
+ mockServer.addProject(buildMockProject({
69
+ projectId: existingProjectId,
70
+ teamId: existingTeamId,
71
+ projectName: "existing-project",
72
+ environmentId: existingEnvId,
73
+ environmentName: existingEnvName,
74
+ }));
75
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
76
+ cwd,
77
+ env: {
78
+ ALPIC_API_BASE_URL: serverUrl,
79
+ ALPIC_API_KEY: "test-api-key",
80
+ },
81
+ }, async (cli) => {
82
+ await cli.expect("Use the current directory?");
83
+ await cli.send("");
84
+ await cli.expect("Choose a team");
85
+ await cli.send("");
86
+ await cli.expect("Link to existing project?");
87
+ await cli.send("y");
88
+ await cli.expect("Choose a project");
89
+ await cli.send("");
90
+ await cli.expect("Choose an environment to deploy to");
91
+ await cli.send("");
92
+ await verifyDeploymentFlow(cli, mockServer);
93
+ });
94
+ expect(exitCode).toBe(0);
95
+ expect(output).toContain("Deployment summary:");
96
+ await verifyConfigFile(cwd, {
97
+ projectName: "existing-project",
98
+ projectId: existingProjectId,
99
+ teamId: existingTeamId,
100
+ teamName: "Mock Team",
101
+ environmentId: existingEnvId,
102
+ environmentName: existingEnvName,
103
+ });
104
+ const listProjectsCall = mockServer.getLastCall("GET", "/v1/projects");
105
+ expectSuccessfulApiCall(listProjectsCall);
106
+ });
107
+ it("deploys with existing config file", async () => {
108
+ const existingProjectId = "existing-project-id";
109
+ const existingTeamId = "mock-team-id";
110
+ const existingEnvId = "existing-env-id";
111
+ const existingEnvName = "production";
112
+ mockServer.addProject(buildMockProject({
113
+ projectId: existingProjectId,
114
+ teamId: existingTeamId,
115
+ projectName: "existing-project",
116
+ environmentId: existingEnvId,
117
+ environmentName: existingEnvName,
118
+ }));
119
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
120
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
121
+ cwd,
122
+ env: {
123
+ ALPIC_API_BASE_URL: serverUrl,
124
+ ALPIC_API_KEY: "test-api-key",
125
+ },
126
+ }, async (cli) => {
127
+ await cli.expect("Use the current directory?");
128
+ await cli.send("");
129
+ await cli.expect(`Use project "existing-project" to environment "production"?`);
130
+ await cli.send("");
131
+ await verifyDeploymentFlow(cli, mockServer);
132
+ });
133
+ expect(exitCode).toBe(0);
134
+ expect(output).toContain("Deployment summary:");
135
+ await verifyConfigFile(cwd, {
136
+ projectName: "existing-project",
137
+ projectId: existingProjectId,
138
+ teamId: existingTeamId,
139
+ environmentId: existingEnvId,
140
+ environmentName: existingEnvName,
141
+ });
142
+ });
143
+ it("deploys with existing config using OAuth auth (no API key)", async () => {
144
+ const existingProjectId = "existing-project-id";
145
+ const existingTeamId = "mock-team-id";
146
+ const existingEnvId = "existing-env-id";
147
+ const existingEnvName = "production";
148
+ mockServer.addProject(buildMockProject({
149
+ projectId: existingProjectId,
150
+ teamId: existingTeamId,
151
+ projectName: "existing-project",
152
+ environmentId: existingEnvId,
153
+ environmentName: existingEnvName,
154
+ }));
155
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
156
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
157
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
158
+ cwd,
159
+ env: {
160
+ ...oauthEnv,
161
+ },
162
+ }, async (cli) => {
163
+ await cli.expect("Use the current directory?");
164
+ await cli.send("");
165
+ await cli.expect(`Use project "existing-project" to environment "production"?`);
166
+ await cli.send("");
167
+ await verifyDeploymentFlow(cli, mockServer);
168
+ });
169
+ expect(exitCode).toBe(0);
170
+ expect(output).toContain("Deployment summary:");
171
+ await verifyConfigFile(cwd, {
172
+ projectName: "existing-project",
173
+ projectId: existingProjectId,
174
+ teamId: existingTeamId,
175
+ environmentId: existingEnvId,
176
+ environmentName: existingEnvName,
177
+ });
178
+ });
179
+ }, 15_000);
180
+ //# sourceMappingURL=deploy.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};