alpic 0.0.0-dev.6fbb4e5 → 0.0.0-dev.6fe75df

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 (101) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +142 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy-flags.e2e.test.js +87 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/deploy.e2e.test.js +168 -0
  9. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  11. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  12. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  13. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/git.e2e.test.js +218 -0
  15. package/dist/__tests__/git.e2e.test.js.map +1 -0
  16. package/dist/__tests__/mock-server.d.ts +22 -0
  17. package/dist/__tests__/mock-server.js +492 -0
  18. package/dist/__tests__/mock-server.js.map +1 -0
  19. package/dist/__tests__/utils.d.ts +69 -0
  20. package/dist/__tests__/utils.js +243 -0
  21. package/dist/__tests__/utils.js.map +1 -0
  22. package/dist/api.d.ts +3 -17
  23. package/dist/api.js +14 -68
  24. package/dist/api.js.map +1 -1
  25. package/dist/commands/deploy.d.ts +8 -2
  26. package/dist/commands/deploy.js +47 -19
  27. package/dist/commands/deploy.js.map +1 -1
  28. package/dist/commands/git/connect.d.ts +9 -0
  29. package/dist/commands/git/connect.js +59 -0
  30. package/dist/commands/git/connect.js.map +1 -0
  31. package/dist/commands/git/disconnect.d.ts +9 -0
  32. package/dist/commands/git/disconnect.js +51 -0
  33. package/dist/commands/git/disconnect.js.map +1 -0
  34. package/dist/commands/git.d.ts +6 -0
  35. package/dist/commands/git.js +17 -0
  36. package/dist/commands/git.js.map +1 -0
  37. package/dist/commands/login.d.ts +6 -0
  38. package/dist/commands/login.js +39 -0
  39. package/dist/commands/login.js.map +1 -0
  40. package/dist/commands/logout.d.ts +6 -0
  41. package/dist/commands/logout.js +20 -0
  42. package/dist/commands/logout.js.map +1 -0
  43. package/dist/commands/telemetry/disable.d.ts +5 -0
  44. package/dist/commands/telemetry/disable.js +14 -0
  45. package/dist/commands/telemetry/disable.js.map +1 -0
  46. package/dist/commands/telemetry/enable.d.ts +5 -0
  47. package/dist/commands/telemetry/enable.js +13 -0
  48. package/dist/commands/telemetry/enable.js.map +1 -0
  49. package/dist/commands/telemetry/status.d.ts +5 -0
  50. package/dist/commands/telemetry/status.js +19 -0
  51. package/dist/commands/telemetry/status.js.map +1 -0
  52. package/dist/commands/whoami.d.ts +6 -0
  53. package/dist/commands/whoami.js +25 -0
  54. package/dist/commands/whoami.js.map +1 -0
  55. package/dist/env.d.ts +4 -0
  56. package/dist/env.js +10 -0
  57. package/dist/env.js.map +1 -0
  58. package/dist/lib/alpic-command.d.ts +4 -0
  59. package/dist/lib/alpic-command.js +17 -0
  60. package/dist/lib/alpic-command.js.map +1 -0
  61. package/dist/lib/auth/auth.d.ts +2 -0
  62. package/dist/lib/auth/auth.js +21 -0
  63. package/dist/lib/auth/auth.js.map +1 -0
  64. package/dist/lib/auth/oauth/client.d.ts +28 -0
  65. package/dist/lib/auth/oauth/client.js +110 -0
  66. package/dist/lib/auth/oauth/client.js.map +1 -0
  67. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  68. package/dist/lib/auth/oauth/constants.js +3 -0
  69. package/dist/lib/auth/oauth/constants.js.map +1 -0
  70. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  71. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  72. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  73. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  74. package/dist/lib/auth/oauth/server/index.js +102 -0
  75. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  76. package/dist/lib/auth/whoami.d.ts +28 -0
  77. package/dist/lib/auth/whoami.js +35 -0
  78. package/dist/lib/auth/whoami.js.map +1 -0
  79. package/dist/lib/base-workflow.d.ts +10 -0
  80. package/dist/lib/base-workflow.js +22 -0
  81. package/dist/lib/base-workflow.js.map +1 -0
  82. package/dist/lib/deployment.d.ts +16 -6
  83. package/dist/lib/deployment.js +25 -9
  84. package/dist/lib/deployment.js.map +1 -1
  85. package/dist/lib/git.d.ts +14 -0
  86. package/dist/lib/git.js +105 -0
  87. package/dist/lib/git.js.map +1 -0
  88. package/dist/lib/global-store.d.ts +28 -0
  89. package/dist/lib/global-store.js +75 -0
  90. package/dist/lib/global-store.js.map +1 -0
  91. package/dist/lib/project.d.ts +66 -12
  92. package/dist/lib/project.js +268 -252
  93. package/dist/lib/project.js.map +1 -1
  94. package/dist/lib/telemetry.d.ts +7 -0
  95. package/dist/lib/telemetry.js +66 -0
  96. package/dist/lib/telemetry.js.map +1 -0
  97. package/dist/posthog.d.ts +3 -0
  98. package/dist/posthog.js +10 -0
  99. package/dist/posthog.js.map +1 -0
  100. package/dist/types.d.ts +0 -54
  101. package/package.json +32 -10
@@ -0,0 +1,243 @@
1
+ import pty from "node-pty";
2
+ import { execFileSync } from "node:child_process";
3
+ import { randomUUID } from "node:crypto";
4
+ import { mkdirSync, writeFileSync } from "node:fs";
5
+ import { cp, mkdtemp, readFile } from "node:fs/promises";
6
+ import { tmpdir } from "node:os";
7
+ import { dirname, join } from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ import { expect } from "vitest";
10
+ const __testDirname = dirname(fileURLToPath(import.meta.url));
11
+ export async function cliSession(cmd, args, options, fn) {
12
+ const { cwd, env, cols = 100, rows = 30, timeoutMs = 8000 } = options;
13
+ const mergedEnv = {
14
+ ...process.env,
15
+ NO_COLOR: "1",
16
+ // Resolve @alpic-ai/api to TypeScript source via the "development" export condition,
17
+ // so e2e tests run without building the api package first.
18
+ NODE_OPTIONS: [process.env.NODE_OPTIONS, "--conditions=development"].filter(Boolean).join(" "),
19
+ NODE_TLS_REJECT_UNAUTHORIZED: "0",
20
+ ...Object.fromEntries(Object.entries(env ?? {}).filter(([, v]) => v !== undefined)),
21
+ };
22
+ for (const [k, v] of Object.entries(mergedEnv)) {
23
+ if (typeof v !== "string") {
24
+ console.error("[pty] bad env entry:", k, v, typeof v);
25
+ throw new Error(`env value for ${k} is not a string`);
26
+ }
27
+ }
28
+ const term = pty.spawn(cmd, args, {
29
+ cwd,
30
+ env: mergedEnv,
31
+ name: "xterm-256color",
32
+ cols,
33
+ rows,
34
+ });
35
+ let buf = "";
36
+ const append = (data) => {
37
+ buf += data;
38
+ };
39
+ term.onData(append);
40
+ let exitCode = null;
41
+ const exitPromise = new Promise((resolve) => {
42
+ term.onExit((e) => {
43
+ exitCode = e.exitCode ?? null;
44
+ resolve();
45
+ });
46
+ });
47
+ const controller = {
48
+ expect: (pattern, opts) => waitFor(() => matches(buf, pattern), opts?.timeoutMs ?? timeoutMs, () => buf, pattern),
49
+ send: async (line) => {
50
+ term.write(line + "\r");
51
+ },
52
+ write: (data) => term.write(data),
53
+ output: () => buf,
54
+ clear: () => {
55
+ buf = "";
56
+ },
57
+ stop: () => {
58
+ try {
59
+ term.kill();
60
+ }
61
+ catch {
62
+ // ignore
63
+ }
64
+ },
65
+ };
66
+ try {
67
+ await fn(controller);
68
+ }
69
+ finally {
70
+ await Promise.race([exitPromise, sleep(1500)]);
71
+ controller.stop();
72
+ await Promise.race([exitPromise, sleep(200)]);
73
+ }
74
+ return { exitCode, output: buf };
75
+ }
76
+ function matches(text, pattern) {
77
+ if (typeof pattern === "string")
78
+ return text.includes(pattern);
79
+ return pattern.test(text);
80
+ }
81
+ async function waitFor(predicate, timeoutMs, getOutput, pattern) {
82
+ const start = Date.now();
83
+ while (true) {
84
+ if (predicate())
85
+ return;
86
+ if (Date.now() - start > timeoutMs) {
87
+ const out = getOutput();
88
+ throw new Error(`Timed out after ${timeoutMs}ms waiting for: ${patternToString(pattern)}\n\n` +
89
+ `--- current output ---\n${out}\n--- end output ---\n`);
90
+ }
91
+ await sleep(20);
92
+ }
93
+ }
94
+ function patternToString(p) {
95
+ return typeof p === "string" ? JSON.stringify(p) : `/${p.source}/${p.flags}`;
96
+ }
97
+ function sleep(ms) {
98
+ return new Promise((r) => setTimeout(r, ms));
99
+ }
100
+ export function buildMockProject(params) {
101
+ const { projectId, teamId, projectName, environmentId, environmentName, sourceRepository = null, sourceBranch = null, } = params;
102
+ const mcpServerUrl = `https://mcp-${projectId}.alpic.ai`;
103
+ return {
104
+ id: projectId,
105
+ name: projectName,
106
+ teamId,
107
+ environments: [
108
+ {
109
+ id: environmentId,
110
+ name: environmentName,
111
+ sourceBranch,
112
+ mcpServerUrl,
113
+ createdAt: new Date(),
114
+ projectId,
115
+ latestDeployment: null,
116
+ },
117
+ ],
118
+ productionEnvironment: {
119
+ id: environmentId,
120
+ name: environmentName,
121
+ mcpServerUrl,
122
+ latestDeployment: null,
123
+ },
124
+ sourceRepository,
125
+ runtime: "node24",
126
+ transport: null,
127
+ rootDirectory: null,
128
+ buildCommand: null,
129
+ buildOutputDir: null,
130
+ installCommand: null,
131
+ startCommand: null,
132
+ createdAt: new Date(),
133
+ };
134
+ }
135
+ export async function setupTestDirectory(options = {}) {
136
+ const { prefix = "alpic-cli-e2e", initGit = false } = options;
137
+ const uniqueId = randomUUID();
138
+ const cwd = await mkdtemp(join(tmpdir(), `${prefix}-${uniqueId}-`));
139
+ const fixturePath = join(__testDirname, "fixtures", "demo-project");
140
+ await cp(fixturePath, cwd, { recursive: true });
141
+ if (initGit) {
142
+ runGit(["init"], cwd);
143
+ runGit(["remote", "add", "origin", "git@github.com:acme/frontend.git"], cwd);
144
+ runGit(["remote", "add", "upstream", "https://github.com/acme/backend.git"], cwd);
145
+ }
146
+ const binPath = join(process.cwd(), "bin", "dev.js");
147
+ return { cwd, binPath };
148
+ }
149
+ export function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
150
+ const configDir = join(cwd, ".alpic");
151
+ mkdirSync(configDir, { recursive: true });
152
+ const configPath = join(configDir, "project.json");
153
+ writeFileSync(configPath, JSON.stringify({
154
+ projectId,
155
+ teamId,
156
+ projectName,
157
+ environmentId,
158
+ environmentName,
159
+ }));
160
+ }
161
+ export function runGit(args, cwd) {
162
+ execFileSync("git", args, {
163
+ cwd,
164
+ stdio: ["ignore", "pipe", "pipe"],
165
+ });
166
+ }
167
+ export function expectSuccessfulApiCall(call, customAssertions) {
168
+ expect(call).toBeDefined();
169
+ expect(call?.responseStatus).toBe(200);
170
+ if (customAssertions && call) {
171
+ customAssertions(call);
172
+ }
173
+ }
174
+ /**
175
+ * Create OAuth credentials in a temp config dir and return env for CLI subprocess.
176
+ * Use this to run commands with OAuth auth (no ALPIC_API_KEY).
177
+ * Caller must pass serverUrl so userinfo can be pointed at the mock server.
178
+ */
179
+ export function createOAuthEnv(cwd, serverUrl) {
180
+ const configHome = join(cwd, ".config");
181
+ const alpicConfigDir = join(configHome, "alpic");
182
+ mkdirSync(alpicConfigDir, { recursive: true });
183
+ const credentialsPath = join(alpicConfigDir, "credentials.json");
184
+ const expiresAt = Math.floor(Date.now() / 1000) + 3600; // seconds
185
+ writeFileSync(credentialsPath, JSON.stringify({
186
+ access_token: "test-oauth-token",
187
+ refresh_token: "test-refresh-token",
188
+ expires_at: expiresAt,
189
+ sub: "test-sub",
190
+ }), "utf-8");
191
+ return {
192
+ XDG_CONFIG_HOME: configHome,
193
+ ALPIC_COGNITO_URL: serverUrl,
194
+ ALPIC_API_BASE_URL: serverUrl,
195
+ };
196
+ }
197
+ export async function verifyConfigFile(cwd, output, expected) {
198
+ const cfgPath = join(cwd, ".alpic", "project.json");
199
+ const cfg = await readFile(cfgPath, "utf8");
200
+ const config = JSON.parse(cfg);
201
+ expect(config.projectName).toBe(expected.projectName);
202
+ if (expected.projectId !== undefined) {
203
+ expect(config.projectId).toBe(expected.projectId);
204
+ }
205
+ else {
206
+ expect(config.projectId).toBeDefined();
207
+ }
208
+ if (expected.teamId !== undefined) {
209
+ expect(config.teamId).toBe(expected.teamId);
210
+ }
211
+ else {
212
+ expect(config.teamId).toBeDefined();
213
+ }
214
+ if (expected.environmentId !== undefined) {
215
+ expect(config.environmentId).toBe(expected.environmentId);
216
+ }
217
+ else {
218
+ expect(config.environmentId).toBeDefined();
219
+ }
220
+ if (expected.environmentName !== undefined) {
221
+ expect(config.environmentName).toBe(expected.environmentName);
222
+ }
223
+ else {
224
+ expect(config.environmentName).toBeDefined();
225
+ }
226
+ expect(output).toMatch(/Deployment completed|Deployment summary/);
227
+ }
228
+ export async function verifyDeploymentFlow(cli, mockServer) {
229
+ await cli.expect(/Collected \d+ file/);
230
+ await cli.expect("Upload complete");
231
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
232
+ expectSuccessfulApiCall(uploadCall);
233
+ await cli.expect("Deployment started");
234
+ const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
235
+ expectSuccessfulApiCall(deployCall);
236
+ await cli.expect("View deployment details:");
237
+ await cli.expect("Deployment summary:");
238
+ const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
239
+ expect(deploymentStatusCalls.length).toBeGreaterThan(0);
240
+ const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
241
+ expectSuccessfulApiCall(envCall);
242
+ }
243
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/__tests__/utils.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAShC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAyB9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,IAAc,EACd,OAA0B,EAC1B,EAAyC;IAEzC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEtE,MAAM,SAAS,GAA2B;QACxC,GAAG,OAAO,CAAC,GAAG;QACd,QAAQ,EAAE,GAAG;QACb,qFAAqF;QACrF,2DAA2D;QAC3D,YAAY,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9F,4BAA4B,EAAE,GAAG;QACjC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAA4B,CAAC;KAC/G,CAAC;IAEF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;QAChC,GAAG;QACH,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,gBAAgB;QACtB,IAAI;QACJ,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9B,GAAG,IAAI,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEpB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAkB;QAChC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CACxB,OAAO,CACL,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAC3B,IAAI,EAAE,SAAS,IAAI,SAAS,EAC5B,GAAG,EAAE,CAAC,GAAG,EACT,OAAO,CACR;QACH,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;QACjB,KAAK,EAAE,GAAG,EAAE;YACV,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,UAAU,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAmB;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,SAAwB,EACxB,SAAiB,EACjB,SAAuB,EACvB,OAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,SAAS,EAAE;YAAE,OAAO;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,mBAAmB,SAAS,mBAAmB,eAAe,CAAC,OAAO,CAAC,MAAM;gBAC3E,2BAA2B,GAAG,wBAAwB,CACzD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,CAAa;IACpC,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAYD,MAAM,UAAU,gBAAgB,CAAC,MAA8B;IAC7D,MAAM,EACJ,SAAS,EACT,MAAM,EACN,WAAW,EACX,aAAa,EACb,eAAe,EACf,gBAAgB,GAAG,IAAI,EACvB,YAAY,GAAG,IAAI,GACpB,GAAG,MAAM,CAAC;IACX,MAAM,YAAY,GAAG,eAAe,SAAS,WAAW,CAAC;IACzD,OAAO;QACL,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,WAAW;QACjB,MAAM;QACN,YAAY,EAAE;YACZ;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,eAAe;gBACrB,YAAY;gBACZ,YAAY;gBACZ,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,SAAS;gBACT,gBAAgB,EAAE,IAAI;aACvB;SACF;QACD,qBAAqB,EAAE;YACrB,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,eAAe;YACrB,YAAY;YACZ,gBAAgB,EAAE,IAAI;SACvB;QACD,gBAAgB;QAChB,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,IAAI,IAAI,EAAE;KACC,CAAC;AAC3B,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAqC,EAAE;IAEvC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,kCAAkC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7E,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,qCAAqC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,SAAiB,EACjB,MAAc,EACd,WAAmB,EACnB,aAAqB,EACrB,eAAuB;IAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACnD,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC;QACb,SAAS;QACT,MAAM;QACN,WAAW;QACX,aAAa;QACb,eAAe;KAChB,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,GAAW;IAChD,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QACxB,GAAG;QACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAyB,EACzB,gBAA0C;IAE1C,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3B,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,SAAiB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU;IAClE,aAAa,CACX,eAAe,EACf,IAAI,CAAC,SAAS,CAAC;QACb,YAAY,EAAE,kBAAkB;QAChC,aAAa,EAAE,oBAAoB;QACnC,UAAU,EAAE,SAAS;QACrB,GAAG,EAAE,UAAU;KAChB,CAAC,EACF,OAAO,CACR,CAAC;IACF,OAAO;QACL,eAAe,EAAE,UAAU;QAC3B,iBAAiB,EAAE,SAAS;QAC5B,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,MAAc,EACd,QAMC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAkB,EAAE,UAAyB;IACtF,MAAM,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEvC,MAAM,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAC5E,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IACpF,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,GAAG,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAE7C,MAAM,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAExC,MAAM,qBAAqB,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAClF,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACxE,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
package/dist/api.d.ts CHANGED
@@ -1,17 +1,3 @@
1
- import { type ApiCreateProjectOutput, type ApiDeployment, type ApiEnvironment, type ApiProject, type CreateProjectInput, type PresignedUploadResponse } from "./types.js";
2
- export declare class ApiError extends Error {
3
- readonly statusCode: number;
4
- constructor(message: string, statusCode: number);
5
- }
6
- export declare function getFrontendBaseUrl(): string;
7
- export declare const api: {
8
- listProjects: () => Promise<ApiProject[]>;
9
- getProject: (projectId: string) => Promise<ApiProject>;
10
- createProject: (input: CreateProjectInput) => Promise<ApiCreateProjectOutput>;
11
- getPresignedUploadUrl: () => Promise<PresignedUploadResponse>;
12
- deployEnvironment: (environmentId: string, body?: {
13
- token?: string;
14
- }) => Promise<ApiDeployment>;
15
- getDeployment: (deploymentId: string) => Promise<ApiDeployment>;
16
- getEnvironment: (environmentId: string) => Promise<ApiEnvironment>;
17
- };
1
+ import type { ContractRouterClient } from "@orpc/contract";
2
+ import { contract } from "@alpic-ai/api";
3
+ export declare const api: ContractRouterClient<typeof contract>;
package/dist/api.js CHANGED
@@ -1,69 +1,15 @@
1
- import {} from "./types.js";
2
- export class ApiError extends Error {
3
- statusCode;
4
- constructor(message, statusCode) {
5
- super(message);
6
- this.statusCode = statusCode;
7
- this.name = "ApiError";
8
- Object.setPrototypeOf(this, ApiError.prototype);
9
- }
10
- }
11
- function getApiBaseUrl() {
12
- return process.env.ALPIC_API_BASE_URL ?? "https://api.alpic.ai";
13
- }
14
- export function getFrontendBaseUrl() {
15
- return process.env.ALPIC_FRONTEND_BASE_URL ?? "https://app.alpic.ai";
16
- }
17
- const doFetch = async (path, options = {}) => {
18
- const res = await fetch(`${getApiBaseUrl()}${path}`, {
19
- ...options,
20
- headers: {
21
- Authorization: `Bearer ${process.env.ALPIC_API_KEY}`,
22
- ...options.headers,
23
- },
24
- });
25
- if (!res.ok) {
26
- try {
27
- const body = await res.json();
28
- throw new ApiError(`${res.status} ${res.statusText}: ${body.message}`, res.status);
29
- }
30
- catch (error) {
31
- if (error instanceof ApiError)
32
- throw error;
33
- throw new ApiError(res.statusText, res.status);
34
- }
35
- }
36
- return res.json();
37
- };
38
- export const api = {
39
- listProjects: async () => {
40
- return doFetch("/v1/projects", { method: "GET" });
41
- },
42
- getProject: async (projectId) => {
43
- return doFetch(`/v1/projects/${projectId}`, { method: "GET" });
44
- },
45
- createProject: async (input) => {
46
- return doFetch("/v1/projects", {
47
- method: "POST",
48
- body: JSON.stringify(input),
49
- headers: { "Content-Type": "application/json" },
50
- });
51
- },
52
- getPresignedUploadUrl: async () => {
53
- return doFetch("/v1/deployments/upload", { method: "POST" });
54
- },
55
- deployEnvironment: async (environmentId, body) => {
56
- return doFetch(`/v1/environments/${environmentId}/deploy`, {
57
- method: "POST",
58
- body: JSON.stringify(body ?? {}),
59
- headers: { "Content-Type": "application/json" },
60
- });
61
- },
62
- getDeployment: async (deploymentId) => {
63
- return doFetch(`/v1/deployments/${deploymentId}`, { method: "GET" });
64
- },
65
- getEnvironment: async (environmentId) => {
66
- return doFetch(`/v1/environments/${environmentId}`, { method: "GET" });
67
- },
68
- };
1
+ import { createORPCClient } from "@orpc/client";
2
+ import { ResponseValidationPlugin } from "@orpc/contract/plugins";
3
+ import { OpenAPILink } from "@orpc/openapi-client/fetch";
4
+ import { contract } from "@alpic-ai/api";
5
+ import { env } from "./env.js";
6
+ import { getApiToken } from "./lib/auth/auth.js";
7
+ const link = new OpenAPILink(contract, {
8
+ url: env.ALPIC_API_BASE_URL,
9
+ headers: async () => {
10
+ return getApiToken().then((token) => (token ? { Authorization: `Bearer ${token}` } : {}));
11
+ },
12
+ plugins: [new ResponseValidationPlugin(contract)],
13
+ });
14
+ export const api = createORPCClient(link);
69
15
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,GAAG,CAAC,kBAAkB;IAC3B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAA0C,gBAAgB,CAAC,IAAI,CAAC,CAAC"}
@@ -1,9 +1,15 @@
1
- import { Command } from "@oclif/core";
2
- export declare class Deploy extends Command {
1
+ import { AlpicCommand } from "../lib/alpic-command.js";
2
+ export declare class Deploy extends AlpicCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static args: {
6
6
  directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
7
  };
8
+ static flags: {
9
+ yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ runtime: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ "root-dir": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ "project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
8
14
  run(): Promise<void>;
9
15
  }
@@ -1,35 +1,66 @@
1
1
  import * as p from "@clack/prompts";
2
- import { Args, Command } from "@oclif/core";
2
+ import { Args, Flags } from "@oclif/core";
3
3
  import chalk from "chalk";
4
4
  import { readFileSync, rmSync } from "node:fs";
5
- import { api, getFrontendBaseUrl } from "../api.js";
5
+ import { api } from "../api.js";
6
+ import { AlpicCommand } from "../lib/alpic-command.js";
6
7
  import { createTarArchive, getFilesToPack } from "../lib/archive.js";
7
- import { deployAndWait, formatElapsed } from "../lib/deployment.js";
8
- import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
8
+ import { isAuthenticated } from "../lib/auth/auth.js";
9
+ import { deployAndWait, formatElapsed, resolveDeployDir } from "../lib/deployment.js";
10
+ import { ProjectWorkflow } from "../lib/project.js";
9
11
  import { uploadToPresignedUrl } from "../lib/upload.js";
10
- export class Deploy extends Command {
12
+ const RUNTIMES = ["node24", "node22", "python3.14", "python3.13"];
13
+ export class Deploy extends AlpicCommand {
11
14
  static description = "Deploy a project to Alpic";
12
- static examples = ["<%= config.bin %> deploy", "<%= config.bin %> deploy ./my-app"];
15
+ static examples = [
16
+ "<%= config.bin %> deploy",
17
+ "<%= config.bin %> deploy ./my-app",
18
+ "<%= config.bin %> deploy --yes --project-name my-app --runtime node24",
19
+ ];
13
20
  static args = {
14
21
  directory: Args.string({
15
22
  description: "Directory to deploy (default: current directory)",
16
23
  required: false,
17
24
  }),
18
25
  };
26
+ static flags = {
27
+ yes: Flags.boolean({
28
+ char: "y",
29
+ description: "Skip all confirmation prompts",
30
+ required: false,
31
+ }),
32
+ runtime: Flags.string({
33
+ description: "Runtime (node24, node22, python3.14, python3.13)",
34
+ required: false,
35
+ options: RUNTIMES,
36
+ }),
37
+ "root-dir": Flags.string({
38
+ description: "Root directory (defaults to .)",
39
+ required: false,
40
+ }),
41
+ "project-name": Flags.string({
42
+ description: "Name for a new project",
43
+ required: false,
44
+ }),
45
+ };
19
46
  async run() {
20
- const { args } = await this.parse(Deploy);
47
+ const { args, flags } = await this.parse(Deploy);
48
+ const projectFlags = {
49
+ yes: flags.yes,
50
+ projectName: flags["project-name"],
51
+ runtime: flags.runtime,
52
+ rootDir: flags["root-dir"],
53
+ };
21
54
  p.intro("Deploying to Alpic");
22
- const apiKey = process.env.ALPIC_API_KEY;
23
- if (!apiKey) {
24
- p.cancel("ALPIC_API_KEY environment variable is required. Get your API key from Team settings in the Alpic dashboard.");
25
- this.exit(1);
55
+ if (!(await isAuthenticated())) {
56
+ p.cancel("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
26
57
  return;
27
58
  }
28
59
  const deployDir = resolveDeployDir(args.directory);
29
- const config = await resolveProjectForDeploy(deployDir);
60
+ const workflow = new ProjectWorkflow(projectFlags);
61
+ const config = await workflow.resolveProjectForDeploy(deployDir);
30
62
  if (!config) {
31
63
  p.cancel("Deploy cancelled");
32
- this.exit(1);
33
64
  return;
34
65
  }
35
66
  const spinner = p.spinner();
@@ -41,26 +72,24 @@ export class Deploy extends Command {
41
72
  const result = await createTarArchive(files, deployDir);
42
73
  tmpDir = result.tmpDir;
43
74
  const archivePath = result.archivePath;
44
- const { uploadUrl, token } = await api.getPresignedUploadUrl();
75
+ const { uploadUrl, token } = await api.deployments.uploadArtifact.v1();
45
76
  spinner.start("Uploading source...");
46
77
  const buffer = readFileSync(archivePath);
47
78
  await uploadToPresignedUrl(uploadUrl, buffer);
48
79
  spinner.stop("Upload complete");
49
80
  spinner.start("Triggering deployment...");
50
81
  const deployStartedAt = Date.now();
51
- const initialDeployment = await api.deployEnvironment(config.environmentId, { token });
82
+ const initialDeployment = await api.environments.deploy.v1({ environmentId: config.environmentId, token });
52
83
  spinner.stop("Deployment started");
53
84
  const { deployment, elapsedMs } = await deployAndWait({
54
85
  initial: initialDeployment,
55
86
  startedAt: deployStartedAt,
56
- teamId: config.teamId,
57
- projectId: config.projectId,
58
87
  });
59
88
  const elapsedStr = formatElapsed(elapsedMs);
60
89
  if (deployment.status !== "deployed") {
61
90
  throw new Error("Deployment failed");
62
91
  }
63
- const environment = await api.getEnvironment(config.environmentId);
92
+ const environment = await api.environments.get.v1({ environmentId: config.environmentId });
64
93
  const urls = environment.mcpServerUrl ? [environment.mcpServerUrl] : environment.domains;
65
94
  p.box([...urls.map((url) => chalk.bold(`🔗 ${url}`)), "", `Completed in ${elapsedStr}`].join("\n"), "Deployment summary:", {
66
95
  contentAlign: "center",
@@ -74,7 +103,6 @@ export class Deploy extends Command {
74
103
  spinner.stop();
75
104
  const message = error instanceof Error ? error.message : String(error);
76
105
  p.cancel(`Error: ${message}`);
77
- this.exit(1);
78
106
  }
79
107
  finally {
80
108
  if (tmpDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AlpicCommand } from "../../lib/alpic-command.js";
2
+ export default class GitConnect extends AlpicCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,59 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Args } from "@oclif/core";
3
+ import chalk from "chalk";
4
+ import { api } from "../../api.js";
5
+ import { AlpicCommand } from "../../lib/alpic-command.js";
6
+ import { isAuthenticated } from "../../lib/auth/auth.js";
7
+ import { config } from "../../lib/config.js";
8
+ import { resolveDeployDir } from "../../lib/deployment.js";
9
+ import { confirmLinkAnotherIfAlreadyConnected, isGitRepository, listGithubRemotes, selectRemoteSourceRepository, showGitSetupInstructions, } from "../../lib/git.js";
10
+ export default class GitConnect extends AlpicCommand {
11
+ static description = "Connect a linked Alpic project to a git remote source";
12
+ static examples = ["<%= config.bin %> git connect", "<%= config.bin %> git connect ./my-app"];
13
+ static args = {
14
+ directory: Args.string({
15
+ description: "Directory to connect (default: current directory)",
16
+ required: false,
17
+ }),
18
+ };
19
+ async run() {
20
+ const { args } = await this.parse(GitConnect);
21
+ p.intro("Connecting git repository to Alpic");
22
+ if (!(await isAuthenticated())) {
23
+ p.cancel("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
24
+ return;
25
+ }
26
+ const deployDir = resolveDeployDir(args.directory);
27
+ const linkedConfig = config.load(deployDir);
28
+ if (!linkedConfig) {
29
+ p.cancel("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
30
+ return;
31
+ }
32
+ if (!isGitRepository(deployDir)) {
33
+ p.log.message("This directory is not a git repository.");
34
+ showGitSetupInstructions();
35
+ return;
36
+ }
37
+ const remotes = listGithubRemotes(deployDir);
38
+ if (remotes.length === 0) {
39
+ p.log.message("This git repository has no remotes configured.");
40
+ showGitSetupInstructions();
41
+ return;
42
+ }
43
+ const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
44
+ if (!(await confirmLinkAnotherIfAlreadyConnected(project))) {
45
+ return;
46
+ }
47
+ const selectedSourceRepository = await selectRemoteSourceRepository(remotes);
48
+ if (selectedSourceRepository === null) {
49
+ return;
50
+ }
51
+ await api.projects.update.v1({
52
+ projectId: linkedConfig.projectId,
53
+ sourceRepository: selectedSourceRepository,
54
+ });
55
+ p.log.info("To automatically trigger deployments on every push,\nmake sure to install the Alpic GitHub App on this repository.");
56
+ p.outro(`✅ Connected ${chalk.bold(selectedSourceRepository)} to project ${chalk.bold(project.name)}.`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/git/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AlpicCommand } from "../../lib/alpic-command.js";
2
+ export default class GitDisconnect extends AlpicCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }