alpic 0.0.0-dev.6080dc8 → 0.0.0-dev.62e57db
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.
- package/dist/api.d.ts +13 -4
- package/dist/api.js +48 -14
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.js +8 -25
- package/dist/commands/deploy.js.map +1 -1
- package/dist/lib/project.d.ts +5 -62
- package/dist/lib/project.js +13 -149
- package/dist/lib/project.js.map +1 -1
- package/dist/types.d.ts +34 -0
- package/package.json +6 -24
- package/dist/commands/telemetry/disable.d.ts +0 -5
- package/dist/commands/telemetry/disable.js +0 -14
- package/dist/commands/telemetry/disable.js.map +0 -1
- package/dist/commands/telemetry/enable.d.ts +0 -5
- package/dist/commands/telemetry/enable.js +0 -13
- package/dist/commands/telemetry/enable.js.map +0 -1
- package/dist/commands/telemetry/status.d.ts +0 -5
- package/dist/commands/telemetry/status.js +0 -19
- package/dist/commands/telemetry/status.js.map +0 -1
- package/dist/lib/deployment.d.ts +0 -21
- package/dist/lib/deployment.js +0 -38
- package/dist/lib/deployment.js.map +0 -1
- package/dist/lib/global-config.d.ts +0 -9
- package/dist/lib/global-config.js +0 -48
- package/dist/lib/global-config.js.map +0 -1
- package/dist/lib/telemetry.d.ts +0 -7
- package/dist/lib/telemetry.js +0 -66
- package/dist/lib/telemetry.js.map +0 -1
- package/dist/posthog.d.ts +0 -3
- package/dist/posthog.js +0 -10
- package/dist/posthog.js.map +0 -1
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { type ApiDeployment, type ApiProject, 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 const api: {
|
|
7
|
+
listProjects: () => Promise<ApiProject[]>;
|
|
8
|
+
getProject: (projectId: string) => Promise<ApiProject>;
|
|
9
|
+
getPresignedUploadUrl: () => Promise<PresignedUploadResponse>;
|
|
10
|
+
deployEnvironment: (environmentId: string, body?: {
|
|
11
|
+
token?: string;
|
|
12
|
+
}) => Promise<ApiDeployment>;
|
|
13
|
+
};
|
package/dist/api.js
CHANGED
|
@@ -1,19 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
+
}
|
|
5
11
|
function getApiBaseUrl() {
|
|
6
12
|
return process.env.ALPIC_API_BASE_URL ?? "https://api.alpic.ai";
|
|
7
13
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const doFetch = async (path, options = {}) => {
|
|
15
|
+
const res = await fetch(`${getApiBaseUrl()}${path}`, {
|
|
16
|
+
...options,
|
|
17
|
+
headers: {
|
|
18
|
+
Authorization: `Bearer ${process.env.ALPIC_API_KEY}`,
|
|
19
|
+
...options.headers,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
try {
|
|
24
|
+
const body = await res.json();
|
|
25
|
+
throw new ApiError(`${res.status} ${res.statusText}: ${body.message}`, res.status);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error instanceof ApiError)
|
|
29
|
+
throw error;
|
|
30
|
+
throw new ApiError(res.statusText, res.status);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return res.json();
|
|
34
|
+
};
|
|
35
|
+
export const api = {
|
|
36
|
+
listProjects: async () => {
|
|
37
|
+
return doFetch("/v1/projects", { method: "GET" });
|
|
38
|
+
},
|
|
39
|
+
getProject: async (projectId) => {
|
|
40
|
+
return doFetch(`/v1/projects/${projectId}`, { method: "GET" });
|
|
41
|
+
},
|
|
42
|
+
getPresignedUploadUrl: async () => {
|
|
43
|
+
return doFetch("/v1/deployments/upload", { method: "POST" });
|
|
44
|
+
},
|
|
45
|
+
deployEnvironment: async (environmentId, body) => {
|
|
46
|
+
return doFetch(`/v1/environments/${environmentId}/deploy`, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
body: JSON.stringify(body ?? {}),
|
|
49
|
+
headers: { "Content-Type": "application/json" },
|
|
50
|
+
});
|
|
15
51
|
},
|
|
16
|
-
|
|
17
|
-
});
|
|
18
|
-
export const api = createORPCClient(link);
|
|
52
|
+
};
|
|
19
53
|
//# 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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqE,MAAM,YAAY,CAAC;AAE/F,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IAFlB,YACE,OAAe,EACC,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACF;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,sBAAsB,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,GAAG,KAAK,EAAK,IAAY,EAAE,UAAuB,EAAE,EAAc,EAAE;IAC/E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,EAAE,GAAG,IAAI,EAAE,EAAE;QACnD,GAAG,OAAO;QACV,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;YACpD,GAAI,OAAO,CAAC,OAAkC;SAC/C;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ;gBAAE,MAAM,KAAK,CAAC;YAC3C,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,IAAI,EAAE;QACvB,OAAO,OAAO,CAAe,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,UAAU,EAAE,KAAK,EAAE,SAAiB,EAAE,EAAE;QACtC,OAAO,OAAO,CAAa,gBAAgB,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,qBAAqB,EAAE,KAAK,IAAI,EAAE;QAChC,OAAO,OAAO,CAA0B,wBAAwB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,iBAAiB,EAAE,KAAK,EAAE,aAAqB,EAAE,IAAyB,EAA0B,EAAE;QACpG,OAAO,OAAO,CAAgB,oBAAoB,aAAa,SAAS,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { Args, Command } from "@oclif/core";
|
|
3
|
-
import chalk from "chalk";
|
|
4
3
|
import { readFileSync, rmSync } from "node:fs";
|
|
5
4
|
import { api } from "../api.js";
|
|
6
5
|
import { createTarArchive, getFilesToPack } from "../lib/archive.js";
|
|
7
|
-
import { deployAndWait, formatElapsed } from "../lib/deployment.js";
|
|
8
6
|
import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
|
|
9
7
|
import { uploadToPresignedUrl } from "../lib/upload.js";
|
|
10
8
|
export class Deploy extends Command {
|
|
@@ -21,7 +19,7 @@ export class Deploy extends Command {
|
|
|
21
19
|
p.intro("Deploying to Alpic");
|
|
22
20
|
const apiKey = process.env.ALPIC_API_KEY;
|
|
23
21
|
if (!apiKey) {
|
|
24
|
-
p.cancel("ALPIC_API_KEY environment variable is required
|
|
22
|
+
p.cancel("ALPIC_API_KEY environment variable is required");
|
|
25
23
|
this.exit(1);
|
|
26
24
|
return;
|
|
27
25
|
}
|
|
@@ -38,37 +36,22 @@ export class Deploy extends Command {
|
|
|
38
36
|
spinner.start("Collecting source files...");
|
|
39
37
|
const files = getFilesToPack(deployDir);
|
|
40
38
|
spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
|
|
39
|
+
spinner.start("Creating archive...");
|
|
41
40
|
const result = await createTarArchive(files, deployDir);
|
|
42
41
|
tmpDir = result.tmpDir;
|
|
43
42
|
const archivePath = result.archivePath;
|
|
44
|
-
|
|
43
|
+
spinner.stop("Archive created");
|
|
44
|
+
spinner.start("Getting upload URL...");
|
|
45
|
+
const { uploadUrl, token } = await api.getPresignedUploadUrl();
|
|
46
|
+
spinner.stop("Upload URL received");
|
|
45
47
|
spinner.start("Uploading source...");
|
|
46
48
|
const buffer = readFileSync(archivePath);
|
|
47
49
|
await uploadToPresignedUrl(uploadUrl, buffer);
|
|
48
50
|
spinner.stop("Upload complete");
|
|
49
51
|
spinner.start("Triggering deployment...");
|
|
50
|
-
const
|
|
51
|
-
const initialDeployment = await api.environments.deploy.v1({ environmentId: config.environmentId, token });
|
|
52
|
+
const deployment = await api.deployEnvironment(config.environmentId, { token });
|
|
52
53
|
spinner.stop("Deployment started");
|
|
53
|
-
|
|
54
|
-
initial: initialDeployment,
|
|
55
|
-
startedAt: deployStartedAt,
|
|
56
|
-
teamId: config.teamId,
|
|
57
|
-
projectId: config.projectId,
|
|
58
|
-
});
|
|
59
|
-
const elapsedStr = formatElapsed(elapsedMs);
|
|
60
|
-
if (deployment.status !== "deployed") {
|
|
61
|
-
throw new Error("Deployment failed");
|
|
62
|
-
}
|
|
63
|
-
const environment = await api.environments.get.v1({ environmentId: config.environmentId });
|
|
64
|
-
const urls = environment.mcpServerUrl ? [environment.mcpServerUrl] : environment.domains;
|
|
65
|
-
p.box([...urls.map((url) => chalk.bold(`🔗 ${url}`)), "", `Completed in ${elapsedStr}`].join("\n"), "Deployment summary:", {
|
|
66
|
-
contentAlign: "center",
|
|
67
|
-
titleAlign: "center",
|
|
68
|
-
width: "auto",
|
|
69
|
-
rounded: true,
|
|
70
|
-
contentPadding: 3,
|
|
71
|
-
});
|
|
54
|
+
p.outro(`Deployment ${deployment.id} is ${deployment.status}`);
|
|
72
55
|
}
|
|
73
56
|
catch (error) {
|
|
74
57
|
spinner.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/project.d.ts
CHANGED
|
@@ -1,67 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ProjectConfig } from "../types.js";
|
|
1
|
+
import type { ApiEnvironment, ApiProject, ProjectConfig } from "../types.js";
|
|
3
2
|
export declare function resolveDeployDir(raw: string | undefined): string;
|
|
4
|
-
export declare function confirmDeployWithExistingConfig(existingConfig: ProjectConfig): Promise<boolean
|
|
5
|
-
export declare function selectEnvironmentFromList(environments:
|
|
6
|
-
|
|
7
|
-
name: string;
|
|
8
|
-
sourceBranch: string | null;
|
|
9
|
-
mcpServerUrl: string;
|
|
10
|
-
createdAt: Date;
|
|
11
|
-
projectId: string;
|
|
12
|
-
latestDeployment: {
|
|
13
|
-
id: string;
|
|
14
|
-
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
15
|
-
sourceCommitId: string | null;
|
|
16
|
-
sourceCommitMessage: string | null;
|
|
17
|
-
completedAt: Date | null;
|
|
18
|
-
} | null;
|
|
19
|
-
} | null>;
|
|
20
|
-
export declare function confirmDeployDirectory(deployDir: string): Promise<boolean>;
|
|
3
|
+
export declare function confirmDeployWithExistingConfig(existingConfig: ProjectConfig): Promise<boolean>;
|
|
4
|
+
export declare function selectEnvironmentFromList(environments: ApiEnvironment[]): Promise<ApiEnvironment | null>;
|
|
5
|
+
export declare function confirmDeployWithoutConfig(deployDir: string): Promise<boolean>;
|
|
21
6
|
export declare function confirmLinkExisting(): Promise<boolean>;
|
|
22
|
-
export declare function
|
|
23
|
-
export declare function selectProjectFromList(projects: RouterOutput["projects"]["list"]["v1"]): Promise<{
|
|
24
|
-
id: string;
|
|
25
|
-
name: string;
|
|
26
|
-
teamId: string;
|
|
27
|
-
sourceRepository: string | null;
|
|
28
|
-
runtime: "python3.13" | "python3.14" | "node22" | "node24";
|
|
29
|
-
transport: "stdio" | "sse" | "streamablehttp" | null;
|
|
30
|
-
rootDirectory: string | null;
|
|
31
|
-
buildCommand: string | null;
|
|
32
|
-
buildOutputDir: string | null;
|
|
33
|
-
installCommand: string | null;
|
|
34
|
-
startCommand: string | null;
|
|
35
|
-
createdAt: Date;
|
|
36
|
-
productionEnvironment: {
|
|
37
|
-
id: string;
|
|
38
|
-
name: string;
|
|
39
|
-
mcpServerUrl: string;
|
|
40
|
-
latestDeployment: {
|
|
41
|
-
id: string;
|
|
42
|
-
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
43
|
-
sourceCommitId: string | null;
|
|
44
|
-
sourceCommitMessage: string | null;
|
|
45
|
-
completedAt: Date | null;
|
|
46
|
-
} | null;
|
|
47
|
-
} | null;
|
|
48
|
-
environments: {
|
|
49
|
-
id: string;
|
|
50
|
-
name: string;
|
|
51
|
-
sourceBranch: string | null;
|
|
52
|
-
mcpServerUrl: string;
|
|
53
|
-
createdAt: Date;
|
|
54
|
-
projectId: string;
|
|
55
|
-
latestDeployment: {
|
|
56
|
-
id: string;
|
|
57
|
-
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
58
|
-
sourceCommitId: string | null;
|
|
59
|
-
sourceCommitMessage: string | null;
|
|
60
|
-
completedAt: Date | null;
|
|
61
|
-
} | null;
|
|
62
|
-
}[];
|
|
63
|
-
} | null>;
|
|
64
|
-
export declare function promptRootDirectory(deployDir: string): Promise<string | null | undefined>;
|
|
7
|
+
export declare function selectProjectFromList(projects: ApiProject[]): Promise<ApiProject | null>;
|
|
65
8
|
export declare function resolveProjectForDeploy(deployDir: string): Promise<(ProjectConfig & {
|
|
66
9
|
environmentId: string;
|
|
67
10
|
}) | null>;
|
package/dist/lib/project.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
-
import { existsSync,
|
|
3
|
+
import { existsSync, statSync } from "node:fs";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import { api } from "../api.js";
|
|
6
6
|
import { config } from "./config.js";
|
|
@@ -21,7 +21,7 @@ export async function confirmDeployWithExistingConfig(existingConfig) {
|
|
|
21
21
|
initialValue: true,
|
|
22
22
|
});
|
|
23
23
|
if (p.isCancel(confirm))
|
|
24
|
-
return
|
|
24
|
+
return false;
|
|
25
25
|
return confirm === true;
|
|
26
26
|
}
|
|
27
27
|
export async function selectEnvironmentFromList(environments) {
|
|
@@ -32,7 +32,7 @@ export async function selectEnvironmentFromList(environments) {
|
|
|
32
32
|
message: chalk.bold("Choose an environment to deploy to"),
|
|
33
33
|
options: environments.map((env) => ({
|
|
34
34
|
value: env.id,
|
|
35
|
-
label:
|
|
35
|
+
label: `${env.name} (${env.sourceBranch})`,
|
|
36
36
|
})),
|
|
37
37
|
});
|
|
38
38
|
if (p.isCancel(choice))
|
|
@@ -40,7 +40,7 @@ export async function selectEnvironmentFromList(environments) {
|
|
|
40
40
|
const environment = environments.find((e) => e.id === choice);
|
|
41
41
|
return environment ?? null;
|
|
42
42
|
}
|
|
43
|
-
export async function
|
|
43
|
+
export async function confirmDeployWithoutConfig(deployDir) {
|
|
44
44
|
const confirm = await p.confirm({
|
|
45
45
|
message: chalk.bold(`Deploy the directory? `) + chalk.cyan(deployDir),
|
|
46
46
|
initialValue: true,
|
|
@@ -58,15 +58,6 @@ export async function confirmLinkExisting() {
|
|
|
58
58
|
return false;
|
|
59
59
|
return link === true;
|
|
60
60
|
}
|
|
61
|
-
export async function confirmLinkToAnotherProject() {
|
|
62
|
-
const link = await p.confirm({
|
|
63
|
-
message: chalk.bold("Link to another project?"),
|
|
64
|
-
initialValue: true,
|
|
65
|
-
});
|
|
66
|
-
if (p.isCancel(link))
|
|
67
|
-
return false;
|
|
68
|
-
return link === true;
|
|
69
|
-
}
|
|
70
61
|
export async function selectProjectFromList(projects) {
|
|
71
62
|
if (projects.length === 0) {
|
|
72
63
|
return null;
|
|
@@ -80,37 +71,8 @@ export async function selectProjectFromList(projects) {
|
|
|
80
71
|
const project = projects.find((proj) => proj.id === choice);
|
|
81
72
|
return project ?? null;
|
|
82
73
|
}
|
|
83
|
-
export async function promptRootDirectory(deployDir) {
|
|
84
|
-
while (true) {
|
|
85
|
-
const rootDir = await p.text({
|
|
86
|
-
message: chalk.bold("Root directory"),
|
|
87
|
-
placeholder: ".",
|
|
88
|
-
initialValue: ".",
|
|
89
|
-
validate: (value) => {
|
|
90
|
-
if (value != null && value.length > 512)
|
|
91
|
-
return "Path must be at most 512 characters.";
|
|
92
|
-
return undefined;
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
if (p.isCancel(rootDir))
|
|
96
|
-
return null;
|
|
97
|
-
const trimmed = rootDir.trim();
|
|
98
|
-
if (trimmed === "" || trimmed === ".")
|
|
99
|
-
return undefined;
|
|
100
|
-
const resolved = resolve(deployDir, trimmed);
|
|
101
|
-
if (!existsSync(resolved)) {
|
|
102
|
-
p.log.error(`Path does not exist: ${resolved}`);
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
if (!statSync(resolved).isDirectory()) {
|
|
106
|
-
p.log.error(`Path is not a directory: ${resolved}`);
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
return trimmed;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
74
|
async function resolveEnvironmentForProject(projectId) {
|
|
113
|
-
const project = await api.
|
|
75
|
+
const project = await api.getProject(projectId);
|
|
114
76
|
const environments = project.environments ?? [];
|
|
115
77
|
if (environments.length === 0) {
|
|
116
78
|
throw new Error("No environments found for this project.");
|
|
@@ -121,29 +83,11 @@ async function resolveEnvironmentForProject(projectId) {
|
|
|
121
83
|
return { environmentId: environment.id, environmentName: environment.name };
|
|
122
84
|
}
|
|
123
85
|
export async function resolveProjectForDeploy(deployDir) {
|
|
124
|
-
const ok = await confirmDeployDirectory(deployDir);
|
|
125
|
-
if (!ok)
|
|
126
|
-
return null;
|
|
127
86
|
const existingConfig = config.load(deployDir);
|
|
128
87
|
if (existingConfig) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (confirm === null)
|
|
133
|
-
return null;
|
|
134
|
-
if (confirm)
|
|
135
|
-
break;
|
|
136
|
-
const linkAnother = await confirmLinkToAnotherProject();
|
|
137
|
-
if (p.isCancel(linkAnother))
|
|
138
|
-
return null;
|
|
139
|
-
if (linkAnother) {
|
|
140
|
-
const linkExisting = await confirmLinkExisting();
|
|
141
|
-
if (!linkExisting) {
|
|
142
|
-
return runCreateProjectFlow(deployDir);
|
|
143
|
-
}
|
|
144
|
-
return runLinkingFlow(deployDir);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
88
|
+
const ok = await confirmDeployWithExistingConfig(existingConfig);
|
|
89
|
+
if (!ok)
|
|
90
|
+
return null;
|
|
147
91
|
if (existingConfig.environmentId) {
|
|
148
92
|
return {
|
|
149
93
|
projectId: existingConfig.projectId,
|
|
@@ -165,73 +109,15 @@ export async function resolveProjectForDeploy(deployDir) {
|
|
|
165
109
|
p.note(`Environment "${env.environmentName}" will be used for future deploys.`);
|
|
166
110
|
return updatedConfig;
|
|
167
111
|
}
|
|
112
|
+
const ok = await confirmDeployWithoutConfig(deployDir);
|
|
113
|
+
if (!ok)
|
|
114
|
+
return null;
|
|
168
115
|
const linkExisting = await confirmLinkExisting();
|
|
169
116
|
if (!linkExisting) {
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
return runLinkingFlow(deployDir);
|
|
173
|
-
}
|
|
174
|
-
async function runCreateProjectFlow(deployDir) {
|
|
175
|
-
const name = await p.text({
|
|
176
|
-
message: chalk.bold("Project name"),
|
|
177
|
-
placeholder: "my-app",
|
|
178
|
-
validate: (value) => {
|
|
179
|
-
if (!value?.trim())
|
|
180
|
-
return "Project name is required.";
|
|
181
|
-
if (value.length > 100)
|
|
182
|
-
return "Project name must be at most 100 characters.";
|
|
183
|
-
return undefined;
|
|
184
|
-
},
|
|
185
|
-
});
|
|
186
|
-
if (p.isCancel(name))
|
|
117
|
+
p.note("Creating a new project is not implemented yet.", "Not yet implemented");
|
|
187
118
|
return null;
|
|
188
|
-
const detectedRuntime = detectRuntime(deployDir);
|
|
189
|
-
const runtime = await p.select({
|
|
190
|
-
message: chalk.bold("Runtime"),
|
|
191
|
-
options: [
|
|
192
|
-
{ value: "node24", label: "Node.js 24" },
|
|
193
|
-
{ value: "node22", label: "Node.js 22" },
|
|
194
|
-
{ value: "python3.14", label: "Python 3.14" },
|
|
195
|
-
{ value: "python3.13", label: "Python 3.13" },
|
|
196
|
-
],
|
|
197
|
-
initialValue: detectedRuntime ?? "node24",
|
|
198
|
-
});
|
|
199
|
-
if (p.isCancel(runtime))
|
|
200
|
-
return null;
|
|
201
|
-
const rootDirectory = await promptRootDirectory(deployDir);
|
|
202
|
-
const spin = p.spinner();
|
|
203
|
-
spin.start("Creating project...");
|
|
204
|
-
try {
|
|
205
|
-
const projectInput = {
|
|
206
|
-
name: name.trim(),
|
|
207
|
-
runtime,
|
|
208
|
-
};
|
|
209
|
-
if (rootDirectory) {
|
|
210
|
-
projectInput.rootDirectory = rootDirectory;
|
|
211
|
-
}
|
|
212
|
-
const created = await api.projects.create.v1(projectInput);
|
|
213
|
-
spin.stop("Project created.");
|
|
214
|
-
const productionEnv = created.productionEnvironment;
|
|
215
|
-
if (!productionEnv) {
|
|
216
|
-
throw new Error("Project was created but has no Production environment.");
|
|
217
|
-
}
|
|
218
|
-
const newConfig = {
|
|
219
|
-
projectId: created.id,
|
|
220
|
-
teamId: created.teamId,
|
|
221
|
-
projectName: created.name,
|
|
222
|
-
environmentId: productionEnv.id,
|
|
223
|
-
environmentName: productionEnv.name,
|
|
224
|
-
};
|
|
225
|
-
config.save(newConfig, deployDir);
|
|
226
|
-
return newConfig;
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
spin.stop();
|
|
230
|
-
throw error;
|
|
231
119
|
}
|
|
232
|
-
|
|
233
|
-
async function runLinkingFlow(deployDir) {
|
|
234
|
-
const projects = await api.projects.list.v1();
|
|
120
|
+
const projects = await api.listProjects();
|
|
235
121
|
if (projects.length === 0) {
|
|
236
122
|
throw new Error("No projects found. Create a project in the Alpic dashboard first.");
|
|
237
123
|
}
|
|
@@ -256,26 +142,4 @@ async function runLinkingFlow(deployDir) {
|
|
|
256
142
|
p.note(`Linked to project "${project.name}", environment "${environment.name}".`);
|
|
257
143
|
return newConfig;
|
|
258
144
|
}
|
|
259
|
-
function detectRuntime(dir) {
|
|
260
|
-
const has = (file) => existsSync(resolve(dir, file));
|
|
261
|
-
const read = (file) => {
|
|
262
|
-
try {
|
|
263
|
-
return readFileSync(resolve(dir, file), "utf8");
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
return "";
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
|
-
if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
|
|
270
|
-
return "python3.13";
|
|
271
|
-
}
|
|
272
|
-
if (has("package.json")) {
|
|
273
|
-
const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
|
|
274
|
-
const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
|
|
275
|
-
if (major === "22")
|
|
276
|
-
return "node22";
|
|
277
|
-
return "node24";
|
|
278
|
-
}
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
145
|
//# sourceMappingURL=project.js.map
|
package/dist/lib/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
export type ApiProject = {
|
|
2
|
+
id: string;
|
|
3
|
+
teamId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
productionEnvironment?: {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
mcpServerUrl: string;
|
|
9
|
+
} | null;
|
|
10
|
+
environments?: ApiEnvironment[];
|
|
11
|
+
};
|
|
12
|
+
export type PresignedUploadResponse = {
|
|
13
|
+
uploadUrl: string;
|
|
14
|
+
token: string;
|
|
15
|
+
expiresAt: string;
|
|
16
|
+
};
|
|
17
|
+
export type ApiEnvironment = {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
sourceBranch: string;
|
|
21
|
+
mcpServerUrl: string;
|
|
22
|
+
projectId: string;
|
|
23
|
+
};
|
|
1
24
|
export type ProjectConfig = {
|
|
2
25
|
projectId: string;
|
|
3
26
|
teamId: string;
|
|
@@ -5,3 +28,14 @@ export type ProjectConfig = {
|
|
|
5
28
|
environmentId?: string;
|
|
6
29
|
environmentName?: string;
|
|
7
30
|
};
|
|
31
|
+
export type ApiDeployment = {
|
|
32
|
+
id: string;
|
|
33
|
+
status: string;
|
|
34
|
+
sourceRef: string;
|
|
35
|
+
sourceCommitId?: string;
|
|
36
|
+
sourceCommitMessage?: string;
|
|
37
|
+
authorUsername: string | null;
|
|
38
|
+
authorAvatarUrl: string | null;
|
|
39
|
+
startedAt: string | null;
|
|
40
|
+
completedAt: string | null;
|
|
41
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alpic",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.62e57db",
|
|
4
4
|
"description": "The command-line interface for Alpic",
|
|
5
5
|
"homepage": "https://alpic.ai",
|
|
6
6
|
"preferGlobal": true,
|
|
@@ -14,16 +14,7 @@
|
|
|
14
14
|
"dist"
|
|
15
15
|
],
|
|
16
16
|
"engines": {
|
|
17
|
-
"node": ">= 18
|
|
18
|
-
},
|
|
19
|
-
"nx": {
|
|
20
|
-
"targets": {
|
|
21
|
-
"build": {
|
|
22
|
-
"dependsOn": [
|
|
23
|
-
"@alpic-ai/api:build"
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
}
|
|
17
|
+
"node": ">= 18"
|
|
27
18
|
},
|
|
28
19
|
"keywords": [
|
|
29
20
|
"chatgpt",
|
|
@@ -34,20 +25,14 @@
|
|
|
34
25
|
"author": "Alpic",
|
|
35
26
|
"license": "ISC",
|
|
36
27
|
"dependencies": {
|
|
37
|
-
"@clack/prompts": "^1.0.0",
|
|
38
28
|
"@oclif/core": "^4.8.0",
|
|
39
|
-
"@
|
|
40
|
-
"@orpc/contract": "^1.13.4",
|
|
41
|
-
"@orpc/openapi-client": "^1.13.4",
|
|
29
|
+
"@clack/prompts": "^0.8.2",
|
|
42
30
|
"chalk": "^5.6.2",
|
|
43
|
-
"
|
|
44
|
-
"posthog-node": "^5.24.11",
|
|
45
|
-
"tar": "^7.4.0",
|
|
46
|
-
"@alpic-ai/api": "0.0.0-dev.6080dc8"
|
|
31
|
+
"tar": "^7.4.0"
|
|
47
32
|
},
|
|
48
33
|
"devDependencies": {
|
|
49
34
|
"@total-typescript/tsconfig": "^1.0.4",
|
|
50
|
-
"@types/node": "^25.
|
|
35
|
+
"@types/node": "^25.1.0",
|
|
51
36
|
"biome": "^0.3.3",
|
|
52
37
|
"jsdom": "^27.4.0",
|
|
53
38
|
"shx": "^0.4.0",
|
|
@@ -62,10 +47,7 @@
|
|
|
62
47
|
"bin": "alpic",
|
|
63
48
|
"commands": "./dist/commands",
|
|
64
49
|
"dirname": "alpic",
|
|
65
|
-
"topicSeparator": " "
|
|
66
|
-
"hooks": {
|
|
67
|
-
"finally": "./dist/lib/telemetry.js"
|
|
68
|
-
}
|
|
50
|
+
"topicSeparator": " "
|
|
69
51
|
},
|
|
70
52
|
"scripts": {
|
|
71
53
|
"build": "shx rm -rf dist && tsc",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Command } from "@oclif/core";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { setEnabled } from "../../lib/telemetry.js";
|
|
4
|
-
export default class TelemetryDisable extends Command {
|
|
5
|
-
static description = "Disable Alpic telemetry on this machine";
|
|
6
|
-
async run() {
|
|
7
|
-
await this.parse(TelemetryDisable);
|
|
8
|
-
setEnabled(false);
|
|
9
|
-
console.log(chalk.yellow("✓"), "Telemetry has been", chalk.yellow.bold("disabled"));
|
|
10
|
-
console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
|
|
11
|
-
console.log(chalk.gray("Alpic never collects Personally Identifiable Information (PII). If you'd like to help us improve Alpic by allowing anonymous CLI usage data, please re-enable telemetry with: alpic telemetry enable"));
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=disable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/disable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAU,WAAW,GAAG,yCAAyC,CAAC;IAExE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,sMAAsM,CACvM,CACF,CAAC;IACJ,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Command } from "@oclif/core";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { setEnabled } from "../../lib/telemetry.js";
|
|
4
|
-
export default class TelemetryEnable extends Command {
|
|
5
|
-
static description = "Enable Alpic telemetry on this machine";
|
|
6
|
-
async run() {
|
|
7
|
-
await this.parse(TelemetryEnable);
|
|
8
|
-
setEnabled(true);
|
|
9
|
-
console.log(chalk.green("✓"), "Telemetry has been", chalk.green.bold("enabled"));
|
|
10
|
-
console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=enable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/enable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,wCAAwC,CAAC;IAEvE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAClE,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Command } from "@oclif/core";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { getMachineId, isEnabled } from "../../lib/telemetry.js";
|
|
4
|
-
export default class TelemetryStatus extends Command {
|
|
5
|
-
static description = "Show Alpic telemetry settings for this machine";
|
|
6
|
-
async run() {
|
|
7
|
-
await this.parse(TelemetryStatus);
|
|
8
|
-
const enabled = isEnabled();
|
|
9
|
-
console.log(chalk.bold.underline("Alpic Telemetry"));
|
|
10
|
-
console.log();
|
|
11
|
-
console.log("Status:", enabled ? chalk.green.bold("Enabled") : chalk.yellow.bold("Disabled"));
|
|
12
|
-
console.log(chalk.gray("Machine ID:"), getMachineId());
|
|
13
|
-
console.log();
|
|
14
|
-
console.log(chalk.gray("To opt out, run: alpic telemetry disable"));
|
|
15
|
-
console.log(chalk.gray("Or set: ALPIC_TELEMETRY_DISABLED=1"));
|
|
16
|
-
console.log(chalk.gray("Debug mode: ALPIC_TELEMETRY_DEBUG=1"));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/telemetry/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,gDAAgD,CAAC;IAE/E,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,CAAC"}
|
package/dist/lib/deployment.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
-
export declare function formatElapsed(ms: number): string;
|
|
3
|
-
export declare function deployAndWait({ initial, startedAt, teamId, projectId, }: {
|
|
4
|
-
initial: RouterOutput["deployments"]["get"]["v1"];
|
|
5
|
-
startedAt: number;
|
|
6
|
-
teamId: string;
|
|
7
|
-
projectId: string;
|
|
8
|
-
}): Promise<{
|
|
9
|
-
deployment: {
|
|
10
|
-
id: string;
|
|
11
|
-
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
12
|
-
sourceRef: string | null;
|
|
13
|
-
sourceCommitId: string | null;
|
|
14
|
-
sourceCommitMessage: string | null;
|
|
15
|
-
authorUsername: string | null;
|
|
16
|
-
authorAvatarUrl: string | null;
|
|
17
|
-
startedAt: Date | null;
|
|
18
|
-
completedAt: Date | null;
|
|
19
|
-
};
|
|
20
|
-
elapsedMs: number;
|
|
21
|
-
}>;
|
package/dist/lib/deployment.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import * as p from "@clack/prompts";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { api, getFrontendBaseUrl } from "../api.js";
|
|
4
|
-
export function formatElapsed(ms) {
|
|
5
|
-
const totalSeconds = Math.floor(ms / 1000);
|
|
6
|
-
const minutes = Math.floor(totalSeconds / 60);
|
|
7
|
-
const seconds = totalSeconds % 60;
|
|
8
|
-
return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
9
|
-
}
|
|
10
|
-
export async function deployAndWait({ initial, startedAt, teamId, projectId, }) {
|
|
11
|
-
const spinner = p.spinner();
|
|
12
|
-
spinner.start("Deployment in progress");
|
|
13
|
-
const deploymentPageUrl = `${getFrontendBaseUrl()}/team/${teamId}/project/${projectId}/deployments/${initial.id}`;
|
|
14
|
-
p.note(deploymentPageUrl, "View deployment details:");
|
|
15
|
-
const elapsedInterval = setInterval(() => {
|
|
16
|
-
const elapsed = formatElapsed(Date.now() - startedAt);
|
|
17
|
-
spinner.message(`Deployment in progress — ${elapsed}`);
|
|
18
|
-
}, 1000);
|
|
19
|
-
const timeoutMs = 15 * 60 * 1000; // 15 minutes
|
|
20
|
-
let deployment = initial;
|
|
21
|
-
try {
|
|
22
|
-
while (deployment.status === "ongoing") {
|
|
23
|
-
const elapsedMs = Date.now() - startedAt;
|
|
24
|
-
if (elapsedMs >= timeoutMs) {
|
|
25
|
-
throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
|
|
26
|
-
}
|
|
27
|
-
await new Promise((resolve) => setTimeout(resolve, 10_000));
|
|
28
|
-
deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
|
|
29
|
-
}
|
|
30
|
-
return { deployment, elapsedMs: Date.now() - startedAt };
|
|
31
|
-
}
|
|
32
|
-
finally {
|
|
33
|
-
const message = deployment.status === "deployed" ? chalk.green("Deployment completed") : chalk.red("Deployment failed");
|
|
34
|
-
spinner.stop(message);
|
|
35
|
-
clearInterval(elapsedInterval);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=deployment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GAMV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,EAAE,SAAS,MAAM,YAAY,SAAS,gBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;IAEtD,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC/C,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,aAAa,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare const GLOBAL_CONFIG_FILE: string;
|
|
2
|
-
export interface GlobalConfig {
|
|
3
|
-
machineId: string;
|
|
4
|
-
telemetry: {
|
|
5
|
-
enabled: boolean;
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export declare function getGlobalConfig(): GlobalConfig;
|
|
9
|
-
export declare function saveGlobalConfig(config: GlobalConfig): void;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
const GLOBAL_CONFIG_DIR = join(homedir(), ".alpic");
|
|
6
|
-
export const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, "config.json");
|
|
7
|
-
function readJsonFile(filePath) {
|
|
8
|
-
try {
|
|
9
|
-
if (existsSync(filePath)) {
|
|
10
|
-
const content = readFileSync(filePath, "utf-8");
|
|
11
|
-
return JSON.parse(content);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
// Ignore errors reading config
|
|
16
|
-
}
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
function writeJsonFile(filePath, data) {
|
|
20
|
-
try {
|
|
21
|
-
const dir = join(filePath, "..");
|
|
22
|
-
if (!existsSync(dir)) {
|
|
23
|
-
mkdirSync(dir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
// Ignore errors writing config
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export function getGlobalConfig() {
|
|
32
|
-
const existing = readJsonFile(GLOBAL_CONFIG_FILE);
|
|
33
|
-
if (existing?.machineId && existing?.telemetry !== undefined) {
|
|
34
|
-
return existing;
|
|
35
|
-
}
|
|
36
|
-
const config = {
|
|
37
|
-
machineId: existing?.machineId ?? crypto.randomUUID(),
|
|
38
|
-
telemetry: {
|
|
39
|
-
enabled: existing?.telemetry?.enabled ?? true,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
writeJsonFile(GLOBAL_CONFIG_FILE, config);
|
|
43
|
-
return config;
|
|
44
|
-
}
|
|
45
|
-
export function saveGlobalConfig(config) {
|
|
46
|
-
writeJsonFile(GLOBAL_CONFIG_FILE, config);
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=global-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/lib/global-config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AASzE,SAAS,YAAY,CAAI,QAAgB;IACvC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAa;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,YAAY,CAAe,kBAAkB,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE,SAAS,IAAI,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAiB;QAC3B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE;QACrD,SAAS,EAAE;YACT,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI;SAC9C;KACF,CAAC;IACF,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/lib/telemetry.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Hook } from "@oclif/core";
|
|
2
|
-
export declare function isEnabled(): boolean;
|
|
3
|
-
export declare function isDebugMode(): boolean;
|
|
4
|
-
export declare function setEnabled(enabled: boolean): void;
|
|
5
|
-
export declare function getMachineId(): string;
|
|
6
|
-
declare const hook: Hook<"finally">;
|
|
7
|
-
export default hook;
|
package/dist/lib/telemetry.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import ci from "ci-info";
|
|
2
|
-
import crypto from "node:crypto";
|
|
3
|
-
import posthog from "../posthog.js";
|
|
4
|
-
import { getGlobalConfig, saveGlobalConfig } from "./global-config.js";
|
|
5
|
-
const ENV_TELEMETRY_DISABLED = "ALPIC_TELEMETRY_DISABLED";
|
|
6
|
-
const ENV_TELEMETRY_DEBUG = "ALPIC_TELEMETRY_DEBUG";
|
|
7
|
-
const ENV_DO_NOT_TRACK = "DO_NOT_TRACK";
|
|
8
|
-
export function isEnabled() {
|
|
9
|
-
if (process.env[ENV_TELEMETRY_DISABLED] === "1" || process.env[ENV_TELEMETRY_DISABLED]?.toLowerCase() === "true") {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
if (process.env[ENV_DO_NOT_TRACK] === "1" || process.env[ENV_DO_NOT_TRACK]?.toLowerCase() === "true") {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
if (ci.isCI) {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
const config = getGlobalConfig();
|
|
19
|
-
return config.telemetry.enabled;
|
|
20
|
-
}
|
|
21
|
-
export function isDebugMode() {
|
|
22
|
-
return process.env[ENV_TELEMETRY_DEBUG] === "1" || process.env[ENV_TELEMETRY_DEBUG]?.toLowerCase() === "true";
|
|
23
|
-
}
|
|
24
|
-
export function setEnabled(enabled) {
|
|
25
|
-
const config = getGlobalConfig();
|
|
26
|
-
config.telemetry.enabled = enabled;
|
|
27
|
-
saveGlobalConfig(config);
|
|
28
|
-
}
|
|
29
|
-
export function getMachineId() {
|
|
30
|
-
if (ci.isCI) {
|
|
31
|
-
return ci.name ?? "unknown-ci";
|
|
32
|
-
}
|
|
33
|
-
return getGlobalConfig().machineId;
|
|
34
|
-
}
|
|
35
|
-
const hook = async ({ id: command, config: { version }, error, }) => {
|
|
36
|
-
if (!isEnabled()) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const event = {
|
|
40
|
-
command,
|
|
41
|
-
version,
|
|
42
|
-
machineId: getMachineId(),
|
|
43
|
-
sessionId: crypto.randomUUID(),
|
|
44
|
-
isCI: ci.isCI,
|
|
45
|
-
nodeVersion: process.version,
|
|
46
|
-
platform: process.platform,
|
|
47
|
-
outcome: error ? "failure" : "success",
|
|
48
|
-
error: error?.message,
|
|
49
|
-
};
|
|
50
|
-
if (isDebugMode()) {
|
|
51
|
-
console.error("[Telemetry Debug] Would send event:", JSON.stringify(event, null, 2));
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
try {
|
|
55
|
-
posthog.capture({
|
|
56
|
-
distinctId: event.machineId,
|
|
57
|
-
event: command,
|
|
58
|
-
properties: event,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch (e) {
|
|
62
|
-
// Silently ignore telemetry errors - never block CLI operation
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
export default hook;
|
|
66
|
-
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/posthog.d.ts
DELETED
package/dist/posthog.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { PostHog } from "posthog-node";
|
|
2
|
-
const POSTHOG_API_KEY = "phc_ksTmveDgBWGdJb7tlb8Vz6eeKsOl0UkdpCqUaSU2ypg";
|
|
3
|
-
const POSTHOG_HOST = "https://us.i.posthog.com";
|
|
4
|
-
const posthog = new PostHog(POSTHOG_API_KEY, {
|
|
5
|
-
host: POSTHOG_HOST,
|
|
6
|
-
flushAt: 1,
|
|
7
|
-
flushInterval: 0,
|
|
8
|
-
});
|
|
9
|
-
export default posthog;
|
|
10
|
-
//# sourceMappingURL=posthog.js.map
|
package/dist/posthog.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../src/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,eAAe,GAAG,iDAAiD,CAAC;AAC1E,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,eAAe,EAAE;IAC3C,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;CACjB,CAAC,CAAC;AAEH,eAAe,OAAO,CAAC"}
|