alpic 0.0.0-dev.d113fee → 0.0.0-dev.d1dc294

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 (36) hide show
  1. package/dist/__tests__/deploy.e2e.test.js +18 -100
  2. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  3. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  4. package/dist/__tests__/git.e2e.test.js +182 -0
  5. package/dist/__tests__/git.e2e.test.js.map +1 -0
  6. package/dist/__tests__/mock-server.js +136 -13
  7. package/dist/__tests__/mock-server.js.map +1 -1
  8. package/dist/__tests__/utils.d.ts +26 -0
  9. package/dist/__tests__/utils.js +87 -1
  10. package/dist/__tests__/utils.js.map +1 -1
  11. package/dist/commands/deploy.d.ts +2 -2
  12. package/dist/commands/deploy.js +4 -4
  13. package/dist/commands/deploy.js.map +1 -1
  14. package/dist/commands/git/connect.d.ts +9 -0
  15. package/dist/commands/git/connect.js +65 -0
  16. package/dist/commands/git/connect.js.map +1 -0
  17. package/dist/commands/git/disconnect.d.ts +9 -0
  18. package/dist/commands/git/disconnect.js +55 -0
  19. package/dist/commands/git/disconnect.js.map +1 -0
  20. package/dist/commands/git.d.ts +6 -0
  21. package/dist/commands/git.js +17 -0
  22. package/dist/commands/git.js.map +1 -0
  23. package/dist/lib/alpic-command.d.ts +4 -0
  24. package/dist/lib/alpic-command.js +20 -0
  25. package/dist/lib/alpic-command.js.map +1 -0
  26. package/dist/lib/auth.d.ts +1 -0
  27. package/dist/lib/auth.js +10 -0
  28. package/dist/lib/auth.js.map +1 -0
  29. package/dist/lib/deployment.js +3 -4
  30. package/dist/lib/deployment.js.map +1 -1
  31. package/dist/lib/git.d.ts +14 -0
  32. package/dist/lib/git.js +106 -0
  33. package/dist/lib/git.js.map +1 -0
  34. package/dist/lib/project.js +6 -2
  35. package/dist/lib/project.js.map +1 -1
  36. package/package.json +3 -12
@@ -1,13 +1,10 @@
1
- import { randomUUID } from "node:crypto";
2
- import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
- import { cp, mkdtemp, readFile } from "node:fs/promises";
4
- import { tmpdir } from "node:os";
5
- import { dirname, join } from "node:path";
6
- import { fileURLToPath } from "node:url";
1
+ import { rmSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
7
4
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
8
5
  import { MockApiServer } from "./mock-server";
6
+ import { buildMockProject, createConfigFile, expectSuccessfulApiCall, setupTestDirectory } from "./utils";
9
7
  import { cliSession } from "./utils";
10
- const __dirname = dirname(fileURLToPath(import.meta.url));
11
8
  describe("alpic deploy (E2E)", () => {
12
9
  let mockServer;
13
10
  let serverUrl;
@@ -33,7 +30,6 @@ describe("alpic deploy (E2E)", () => {
33
30
  ALPIC_API_BASE_URL: serverUrl,
34
31
  ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
35
32
  ALPIC_API_KEY: "test-api-key",
36
- ALPIC_POLL_INTERVAL: "1000",
37
33
  },
38
34
  }, async (cli) => {
39
35
  await cli.expect("Deploy the directory?");
@@ -67,44 +63,19 @@ describe("alpic deploy (E2E)", () => {
67
63
  const existingTeamId = "mock-team-id";
68
64
  const existingEnvId = "existing-env-id";
69
65
  const existingEnvName = "production";
70
- mockServer.addProject({
71
- id: existingProjectId,
72
- name: "existing-project",
66
+ mockServer.addProject(buildMockProject({
67
+ projectId: existingProjectId,
73
68
  teamId: existingTeamId,
74
- environments: [
75
- {
76
- id: existingEnvId,
77
- name: existingEnvName,
78
- sourceBranch: null,
79
- mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
80
- createdAt: new Date(),
81
- projectId: existingProjectId,
82
- latestDeployment: null,
83
- },
84
- ],
85
- productionEnvironment: {
86
- id: existingEnvId,
87
- name: existingEnvName,
88
- mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
89
- latestDeployment: null,
90
- },
91
- sourceRepository: null,
92
- runtime: "node24",
93
- transport: null,
94
- rootDirectory: null,
95
- buildCommand: null,
96
- buildOutputDir: null,
97
- installCommand: null,
98
- startCommand: null,
99
- createdAt: new Date(),
100
- });
69
+ projectName: "existing-project",
70
+ environmentId: existingEnvId,
71
+ environmentName: existingEnvName,
72
+ }));
101
73
  const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
102
74
  cwd,
103
75
  env: {
104
76
  ALPIC_API_BASE_URL: serverUrl,
105
77
  ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
106
78
  ALPIC_API_KEY: "test-api-key",
107
- ALPIC_POLL_INTERVAL: "1000",
108
79
  },
109
80
  }, async (cli) => {
110
81
  await cli.expect("Deploy the directory?");
@@ -133,37 +104,13 @@ describe("alpic deploy (E2E)", () => {
133
104
  const existingTeamId = "mock-team-id";
134
105
  const existingEnvId = "existing-env-id";
135
106
  const existingEnvName = "production";
136
- mockServer.addProject({
137
- id: existingProjectId,
138
- name: "existing-project",
107
+ mockServer.addProject(buildMockProject({
108
+ projectId: existingProjectId,
139
109
  teamId: existingTeamId,
140
- environments: [
141
- {
142
- id: existingEnvId,
143
- name: existingEnvName,
144
- sourceBranch: null,
145
- mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
146
- createdAt: new Date(),
147
- projectId: existingProjectId,
148
- latestDeployment: null,
149
- },
150
- ],
151
- productionEnvironment: {
152
- id: existingEnvId,
153
- name: existingEnvName,
154
- mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
155
- latestDeployment: null,
156
- },
157
- sourceRepository: null,
158
- runtime: "node24",
159
- transport: null,
160
- rootDirectory: null,
161
- buildCommand: null,
162
- buildOutputDir: null,
163
- installCommand: null,
164
- startCommand: null,
165
- createdAt: new Date(),
166
- });
110
+ projectName: "existing-project",
111
+ environmentId: existingEnvId,
112
+ environmentName: existingEnvName,
113
+ }));
167
114
  createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
168
115
  const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
169
116
  cwd,
@@ -171,8 +118,6 @@ describe("alpic deploy (E2E)", () => {
171
118
  ALPIC_API_BASE_URL: serverUrl,
172
119
  ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
173
120
  ALPIC_API_KEY: "test-api-key",
174
- ALPIC_POLL_INTERVAL: "1000",
175
- NO_COLOR: "1",
176
121
  },
177
122
  }, async (cli) => {
178
123
  await cli.expect("Deploy the directory?");
@@ -190,27 +135,7 @@ describe("alpic deploy (E2E)", () => {
190
135
  environmentName: existingEnvName,
191
136
  });
192
137
  });
193
- });
194
- async function setupTestDirectory() {
195
- const uniqueId = randomUUID();
196
- const cwd = await mkdtemp(join(tmpdir(), `alpic-cli-e2e-${uniqueId}-`));
197
- const fixturePath = join(__dirname, "fixtures", "demo-project");
198
- await cp(fixturePath, cwd, { recursive: true });
199
- const binPath = join(process.cwd(), "bin", "dev.js");
200
- return { cwd, binPath };
201
- }
202
- function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
203
- const configDir = join(cwd, ".alpic");
204
- mkdirSync(configDir, { recursive: true });
205
- const configPath = join(configDir, "project.json");
206
- writeFileSync(configPath, JSON.stringify({
207
- projectId,
208
- teamId,
209
- projectName,
210
- environmentId,
211
- environmentName,
212
- }));
213
- }
138
+ }, 15_000);
214
139
  async function verifyConfigFile(cwd, output, expected) {
215
140
  const cfgPath = join(cwd, ".alpic", "project.json");
216
141
  const cfg = await readFile(cfgPath, "utf8");
@@ -251,17 +176,10 @@ async function verifyDeploymentFlow(cli, mockServer) {
251
176
  const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
252
177
  expectSuccessfulApiCall(deployCall);
253
178
  await cli.expect("View deployment details:");
254
- await cli.expect(/Deployment completed|Deployment summary/);
179
+ await cli.expect("Deployment summary:");
255
180
  const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
256
181
  expect(deploymentStatusCalls.length).toBeGreaterThan(0);
257
182
  const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
258
183
  expectSuccessfulApiCall(envCall);
259
184
  }
260
- function expectSuccessfulApiCall(call, customAssertions) {
261
- expect(call).toBeDefined();
262
- expect(call?.responseStatus).toBe(200);
263
- if (customAssertions && call) {
264
- customAssertions(call);
265
- }
266
- }
267
185
  //# sourceMappingURL=deploy.e2e.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EAAsB,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAiB,CAAC;IACtB,IAAI,GAAW,CAAC;IAChB,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAChB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC9C,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,MAAM,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvB,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5B,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACnC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAErC,MAAM,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACzE,uBAAuB,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;oBAC/B,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,QAAQ;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,YAAY;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;QAChD,MAAM,cAAc,GAAG,cAAc,CAAC;QACtC,MAAM,aAAa,GAAG,iBAAiB,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC;QAErC,UAAU,CAAC,UAAU,CACnB,gBAAgB,CAAC;YACf,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,kBAAkB;YAC/B,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC9C,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACrC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACvE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;QAChD,MAAM,cAAc,GAAG,cAAc,CAAC;QACtC,MAAM,aAAa,GAAG,iBAAiB,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC;QAErC,UAAU,CAAC,UAAU,CACnB,gBAAgB,CAAC;YACf,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,kBAAkB;YAC/B,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CACH,CAAC;QAEF,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;QAE7G,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC;YACnF,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,EAAE,MAAM,CAAC,CAAC;AAEX,KAAK,UAAU,gBAAgB,CAC7B,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,KAAK,UAAU,oBAAoB,CAAC,GAAkB,EAAE,UAAyB;IAC/E,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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,182 @@
1
+ import { rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
4
+ import { MockApiServer } from "./mock-server";
5
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, runGit, setupTestDirectory, } from "./utils";
6
+ describe("alpic git connect/disconnect (E2E)", () => {
7
+ let mockServer;
8
+ let serverUrl;
9
+ let cwd;
10
+ let binPath;
11
+ const projectId = "project-id";
12
+ const teamId = "team-id";
13
+ const environmentId = "env-id";
14
+ function setupProject(overrides) {
15
+ mockServer.addProject(buildMockProject({
16
+ projectId,
17
+ teamId,
18
+ projectName: "demo",
19
+ environmentId,
20
+ environmentName: "production",
21
+ sourceRepository: null,
22
+ sourceBranch: "main",
23
+ ...overrides,
24
+ }));
25
+ createConfigFile(cwd, projectId, teamId, "demo", environmentId, "production");
26
+ }
27
+ beforeEach(async () => {
28
+ mockServer = new MockApiServer();
29
+ serverUrl = await mockServer.start();
30
+ const setup = await setupTestDirectory({ prefix: "alpic-cli-e2e-git", initGit: true });
31
+ cwd = setup.cwd;
32
+ binPath = setup.binPath;
33
+ });
34
+ afterEach(async () => {
35
+ await mockServer.stop();
36
+ if (cwd) {
37
+ rmSync(cwd, { recursive: true, force: true });
38
+ }
39
+ });
40
+ it("connects using selected remote source when multiple remotes are available", async () => {
41
+ setupProject();
42
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
43
+ cwd,
44
+ env: {
45
+ ALPIC_API_BASE_URL: serverUrl,
46
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
47
+ ALPIC_API_KEY: "test-api-key",
48
+ },
49
+ }, async (cli) => {
50
+ await cli.expect("Choose the remote source to connect");
51
+ await cli.send("\u001B[B"); // Move down one option
52
+ await cli.send("");
53
+ await cli.expect("Connected");
54
+ await cli.expect("every push");
55
+ });
56
+ expect(exitCode).toBe(0);
57
+ expect(output).toMatch(/Connected .*acme\/backend.* to project .*demo.*\./);
58
+ expect(output).toContain("make sure to install the Alpic GitHub App on this repository.");
59
+ const updateCall = mockServer.getLastCall("PATCH", "/v1/projects/");
60
+ expectSuccessfulApiCall(updateCall, (call) => {
61
+ expect(call.input).toMatchObject({
62
+ projectId,
63
+ sourceRepository: "acme/backend",
64
+ });
65
+ });
66
+ });
67
+ it("requires linked Alpic project config", async () => {
68
+ rmSync(join(cwd, ".alpic"), { recursive: true, force: true });
69
+ const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
70
+ cwd,
71
+ env: {
72
+ ALPIC_API_BASE_URL: serverUrl,
73
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
74
+ ALPIC_API_KEY: "test-api-key",
75
+ },
76
+ }, async (cli) => {
77
+ await cli.expect("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
78
+ });
79
+ expect(output).toContain("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
80
+ });
81
+ it("shows git setup instructions when directory is not a git repository", async () => {
82
+ setupProject();
83
+ rmSync(join(cwd, ".git"), { recursive: true, force: true });
84
+ const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
85
+ cwd,
86
+ env: {
87
+ ALPIC_API_BASE_URL: serverUrl,
88
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
89
+ ALPIC_API_KEY: "test-api-key",
90
+ },
91
+ }, async (cli) => {
92
+ await cli.expect("This directory is not a git repository.");
93
+ await cli.expect("To set up a git repository");
94
+ await cli.expect("git init");
95
+ });
96
+ expect(output).toContain("This directory is not a git repository.");
97
+ expect(output).toContain("To set up a git repository");
98
+ expect(output).toContain("git init");
99
+ });
100
+ it("shows git setup instructions when repository has no remotes", async () => {
101
+ setupProject();
102
+ runGit(["remote", "remove", "origin"], cwd);
103
+ runGit(["remote", "remove", "upstream"], cwd);
104
+ const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
105
+ cwd,
106
+ env: {
107
+ ALPIC_API_BASE_URL: serverUrl,
108
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
109
+ ALPIC_API_KEY: "test-api-key",
110
+ },
111
+ }, async (cli) => {
112
+ await cli.expect("This git repository has no remotes configured.");
113
+ await cli.expect("To set up a git repository");
114
+ await cli.expect("git init");
115
+ });
116
+ expect(output).toContain("This git repository has no remotes configured.");
117
+ expect(output).toContain("To set up a git repository");
118
+ expect(output).toContain("git init");
119
+ });
120
+ it("when project is already connected, prompts to link another and exits if user declines", async () => {
121
+ setupProject({ sourceRepository: "acme/backend" });
122
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
123
+ cwd,
124
+ env: {
125
+ ALPIC_API_BASE_URL: serverUrl,
126
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
127
+ ALPIC_API_KEY: "test-api-key",
128
+ },
129
+ }, async (cli) => {
130
+ await cli.expect(/Project .*demo.* is already connected to .*acme\/backend.*\./);
131
+ await cli.expect("Do you want to link another repository?");
132
+ await cli.send(""); // accept default (No)
133
+ await cli.expect("Git connect cancelled");
134
+ });
135
+ expect(exitCode).toBe(1);
136
+ expect(output).toMatch(/Project .*demo.* is already connected to .*acme\/backend.*\./);
137
+ expect(output).toContain("Git connect cancelled");
138
+ expect(mockServer.getCalls("PATCH", "/v1/projects/")).toHaveLength(0);
139
+ });
140
+ it("disconnect fails with clear message when project is not connected", async () => {
141
+ setupProject(); // sourceRepository is null by default
142
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "disconnect"], {
143
+ cwd,
144
+ env: {
145
+ ALPIC_API_BASE_URL: serverUrl,
146
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
147
+ ALPIC_API_KEY: "test-api-key",
148
+ },
149
+ }, async (cli) => {
150
+ await cli.expect(/Project .*demo.* is not connected to any repository\./);
151
+ });
152
+ expect(exitCode).toBe(1);
153
+ expect(output).toMatch(/Project .*demo.* is not connected to any repository\./);
154
+ expect(mockServer.getCalls("PATCH", "/v1/projects/")).toHaveLength(0);
155
+ });
156
+ it("disconnects an already connected project repository", async () => {
157
+ setupProject({ sourceRepository: "acme/frontend" });
158
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "disconnect"], {
159
+ cwd,
160
+ env: {
161
+ ALPIC_API_BASE_URL: serverUrl,
162
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
163
+ ALPIC_API_KEY: "test-api-key",
164
+ },
165
+ }, async (cli) => {
166
+ await cli.expect(/Are you sure you want to disconnect .*acme\/frontend.* from project .*demo.*\?/);
167
+ await cli.send("\u001B[A"); // arrow up to select Yes
168
+ await cli.send("");
169
+ await cli.expect(/Disconnected .*acme\/frontend.* from project .*demo.*\./);
170
+ });
171
+ expect(exitCode).toBe(0);
172
+ expect(output).toMatch(/Disconnected .*acme\/frontend.* from project .*demo.*\./);
173
+ const updateCall = mockServer.getLastCall("PATCH", "/v1/projects/");
174
+ expectSuccessfulApiCall(updateCall, (call) => {
175
+ expect(call.input).toMatchObject({
176
+ projectId,
177
+ sourceRepository: null,
178
+ });
179
+ });
180
+ });
181
+ }, 20_000);
182
+ //# sourceMappingURL=git.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/git.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -44,7 +44,51 @@ export class MockApiServer {
44
44
  res.status(200).end();
45
45
  });
46
46
  this.app.use(express.json());
47
- const router = {
47
+ const router = implement(contract).router({
48
+ teams: {
49
+ list: {
50
+ v1: implement(contract.teams.list.v1).handler(async () => {
51
+ return [
52
+ {
53
+ id: "mock-team-id",
54
+ name: "Mock Team",
55
+ createdAt: new Date(),
56
+ hasStripeAccount: false,
57
+ hasActiveSubscription: false,
58
+ },
59
+ ];
60
+ }),
61
+ },
62
+ },
63
+ analytics: {
64
+ get: {
65
+ v1: implement(contract.analytics.get.v1).handler(async ({ input }) => {
66
+ const project = this.mockData.projects.get(input.projectId);
67
+ if (!project) {
68
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
69
+ }
70
+ const emptyTimeSeries = {
71
+ sessions_count: [],
72
+ requests_count: [],
73
+ requests_latency_mean: [],
74
+ tool_errors: [],
75
+ mcp_errors: [],
76
+ output_token_mean: [],
77
+ task_count: [],
78
+ };
79
+ return {
80
+ metadata: {
81
+ startTimestamp: input.startTimestamp,
82
+ endTimestamp: input.endTimestamp,
83
+ timeZone: input.timeZone,
84
+ startDate: new Date(input.startTimestamp),
85
+ interval: "1h",
86
+ },
87
+ timeSeries: emptyTimeSeries,
88
+ };
89
+ }),
90
+ },
91
+ },
48
92
  projects: {
49
93
  list: {
50
94
  v1: implement(contract.projects.list.v1).handler(async () => {
@@ -134,8 +178,65 @@ export class MockApiServer {
134
178
  return project;
135
179
  }),
136
180
  },
181
+ update: {
182
+ v1: implement(contract.projects.update.v1).handler(async ({ input }) => {
183
+ const project = this.mockData.projects.get(input.projectId);
184
+ if (!project) {
185
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
186
+ }
187
+ if (input.sourceRepository !== undefined) {
188
+ project.sourceRepository = input.sourceRepository;
189
+ }
190
+ this.mockData.projects.set(input.projectId, project);
191
+ return project;
192
+ }),
193
+ },
137
194
  },
138
195
  environments: {
196
+ create: {
197
+ v1: implement(contract.environments.create.v1).handler(async ({ input }) => {
198
+ const project = this.mockData.projects.get(input.projectId);
199
+ if (!project) {
200
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
201
+ }
202
+ const environmentId = randomUUID();
203
+ const mcpServerUrl = `https://mcp-${environmentId}.alpic.ai`;
204
+ const createdAt = new Date();
205
+ const environment = {
206
+ id: environmentId,
207
+ name: input.name,
208
+ sourceBranch: input.sourceBranch,
209
+ mcpServerUrl,
210
+ domains: [mcpServerUrl],
211
+ createdAt,
212
+ projectId: input.projectId,
213
+ };
214
+ this.mockData.environments.set(environmentId, environment);
215
+ this.mockData.projects.set(input.projectId, {
216
+ ...project,
217
+ environments: [
218
+ ...project.environments,
219
+ {
220
+ id: environmentId,
221
+ name: input.name,
222
+ sourceBranch: input.sourceBranch,
223
+ mcpServerUrl,
224
+ createdAt,
225
+ projectId: input.projectId,
226
+ latestDeployment: null,
227
+ },
228
+ ],
229
+ });
230
+ return {
231
+ id: environmentId,
232
+ name: input.name,
233
+ sourceBranch: input.sourceBranch,
234
+ createdAt,
235
+ projectId: input.projectId,
236
+ urls: [mcpServerUrl],
237
+ };
238
+ }),
239
+ },
139
240
  get: {
140
241
  v1: implement(contract.environments.get.v1).handler(async ({ input }) => {
141
242
  const environment = this.mockData.environments.get(input.environmentId);
@@ -169,27 +270,49 @@ export class MockApiServer {
169
270
  },
170
271
  },
171
272
  deployments: {
273
+ list: {
274
+ v1: implement(contract.deployments.list.v1).handler(async ({ input }) => {
275
+ const project = this.mockData.projects.get(input.projectId);
276
+ if (!project) {
277
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
278
+ }
279
+ return Array.from(this.mockData.deployments.values()).map((deployment) => ({
280
+ ...deployment,
281
+ isCurrent: deployment.status === "deployed",
282
+ environmentId: project.productionEnvironment?.id ?? "",
283
+ }));
284
+ }),
285
+ },
172
286
  get: {
173
287
  v1: implement(contract.deployments.get.v1).handler(async ({ input }) => {
174
288
  const deployment = this.mockData.deployments.get(input.deploymentId);
175
289
  if (!deployment) {
176
290
  throw new ORPCError("NOT_FOUND", { message: "Deployment not found" });
177
291
  }
178
- if (deployment.status === "ongoing" && deployment.startedAt) {
179
- const elapsed = Date.now() - deployment.startedAt.getTime();
180
- if (elapsed > 2000) {
181
- const updatedDeployment = {
182
- ...deployment,
183
- status: "deployed",
184
- completedAt: new Date(),
185
- };
186
- this.mockData.deployments.set(input.deploymentId, updatedDeployment);
187
- return updatedDeployment;
188
- }
292
+ if (deployment.status === "ongoing") {
293
+ const updatedDeployment = {
294
+ ...deployment,
295
+ status: "deployed",
296
+ completedAt: new Date(),
297
+ };
298
+ this.mockData.deployments.set(input.deploymentId, updatedDeployment);
299
+ return updatedDeployment;
189
300
  }
190
301
  return deployment;
191
302
  }),
192
303
  },
304
+ getLogs: {
305
+ v1: implement(contract.deployments.getLogs.v1).handler(async ({ input }) => {
306
+ const deployment = this.mockData.deployments.get(input.deploymentId);
307
+ if (!deployment) {
308
+ throw new ORPCError("NOT_FOUND", { message: "Deployment not found" });
309
+ }
310
+ return {
311
+ logs: [{ timestamp: new Date(), content: "Mock log entry" }],
312
+ hasMoreLogs: false,
313
+ };
314
+ }),
315
+ },
193
316
  uploadArtifact: {
194
317
  v1: implement(contract.deployments.uploadArtifact.v1).handler(async () => {
195
318
  const token = randomUUID();
@@ -203,7 +326,7 @@ export class MockApiServer {
203
326
  }),
204
327
  },
205
328
  },
206
- };
329
+ });
207
330
  const handler = new OpenAPIHandler(router);
208
331
  this.app.use(async (req, res) => {
209
332
  const apiCall = {