alpic 0.0.0-dev.f71cfeb → 0.0.0-dev.fa5b169

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 ADDED
@@ -0,0 +1,17 @@
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
+ };
package/dist/api.js ADDED
@@ -0,0 +1,69 @@
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
+ };
69
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ export declare class Deploy extends Command {
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,86 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Args, Command } from "@oclif/core";
3
+ import chalk from "chalk";
4
+ import { readFileSync, rmSync } from "node:fs";
5
+ import { api, getFrontendBaseUrl } from "../api.js";
6
+ import { createTarArchive, getFilesToPack } from "../lib/archive.js";
7
+ import { deployAndWait, formatElapsed } from "../lib/deployment.js";
8
+ import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
9
+ import { uploadToPresignedUrl } from "../lib/upload.js";
10
+ export class Deploy extends Command {
11
+ static description = "Deploy a project to Alpic";
12
+ static examples = ["<%= config.bin %> deploy", "<%= config.bin %> deploy ./my-app"];
13
+ static args = {
14
+ directory: Args.string({
15
+ description: "Directory to deploy (default: current directory)",
16
+ required: false,
17
+ }),
18
+ };
19
+ async run() {
20
+ const { args } = await this.parse(Deploy);
21
+ 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);
26
+ return;
27
+ }
28
+ const deployDir = resolveDeployDir(args.directory);
29
+ const config = await resolveProjectForDeploy(deployDir);
30
+ if (!config) {
31
+ p.cancel("Deploy cancelled");
32
+ this.exit(1);
33
+ return;
34
+ }
35
+ const spinner = p.spinner();
36
+ let tmpDir;
37
+ try {
38
+ spinner.start("Collecting source files...");
39
+ const files = getFilesToPack(deployDir);
40
+ spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
41
+ const result = await createTarArchive(files, deployDir);
42
+ tmpDir = result.tmpDir;
43
+ const archivePath = result.archivePath;
44
+ const { uploadUrl, token } = await api.getPresignedUploadUrl();
45
+ spinner.start("Uploading source...");
46
+ const buffer = readFileSync(archivePath);
47
+ await uploadToPresignedUrl(uploadUrl, buffer);
48
+ spinner.stop("Upload complete");
49
+ spinner.start("Triggering deployment...");
50
+ const deployStartedAt = Date.now();
51
+ const initialDeployment = await api.deployEnvironment(config.environmentId, { token });
52
+ spinner.stop("Deployment started");
53
+ const { deployment, elapsedMs } = await deployAndWait({
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.getEnvironment(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
+ });
72
+ }
73
+ catch (error) {
74
+ spinner.stop();
75
+ const message = error instanceof Error ? error.message : String(error);
76
+ p.cancel(`Error: ${message}`);
77
+ this.exit(1);
78
+ }
79
+ finally {
80
+ if (tmpDir) {
81
+ rmSync(tmpDir, { recursive: true, force: true });
82
+ }
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function ensureGitAvailable(): void;
2
+ export declare function getGitFiles(deployDir: string): string[];
3
+ export declare function getFilesToPack(deployDir: string): string[];
4
+ export declare function createTarArchive(files: string[], deployDir: string): Promise<{
5
+ tmpDir: string;
6
+ archivePath: string;
7
+ }>;
@@ -0,0 +1,55 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { create as tarCreate } from "tar";
6
+ const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
7
+ function isGitRepository(dir) {
8
+ return existsSync(join(resolve(dir), ".git"));
9
+ }
10
+ export function ensureGitAvailable() {
11
+ try {
12
+ execSync("git --version", { stdio: "ignore" });
13
+ }
14
+ catch {
15
+ throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
16
+ }
17
+ }
18
+ export function getGitFiles(deployDir) {
19
+ const dir = resolve(deployDir);
20
+ const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
21
+ cwd: dir,
22
+ encoding: "utf8",
23
+ maxBuffer: GIT_FILES_MAX_BUFFER,
24
+ });
25
+ const files = output.split("\0").filter(Boolean);
26
+ if (files.length === 0) {
27
+ throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
28
+ }
29
+ return files;
30
+ }
31
+ export function getFilesToPack(deployDir) {
32
+ const dir = resolve(deployDir);
33
+ if (isGitRepository(dir)) {
34
+ return getGitFiles(deployDir);
35
+ }
36
+ ensureGitAvailable();
37
+ execSync("git init", { cwd: dir });
38
+ try {
39
+ return getGitFiles(deployDir);
40
+ }
41
+ finally {
42
+ rmSync(join(dir, ".git"), { recursive: true });
43
+ }
44
+ }
45
+ export async function createTarArchive(files, deployDir) {
46
+ const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
47
+ const archivePath = join(tmpDir, "source.tar.gz");
48
+ await tarCreate({
49
+ gzip: true,
50
+ file: archivePath,
51
+ cwd: deployDir,
52
+ }, files);
53
+ return { tmpDir, archivePath };
54
+ }
55
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,GAAG,EAAE,GAAG;QACR,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,oBAAoB;KAChC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe,EAAE,SAAiB;IACvE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,MAAM,SAAS,CACb;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,SAAS;KACf,EACD,KAAK,CACN,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProjectConfig } from "../types.js";
2
+ export declare const config: {
3
+ load: (deployDir: string) => {
4
+ projectId: string;
5
+ teamId: string;
6
+ projectName: string;
7
+ environmentId: string | undefined;
8
+ environmentName: string | undefined;
9
+ } | null;
10
+ save: (config: ProjectConfig, deployDir: string) => void;
11
+ };
@@ -0,0 +1,31 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const getProjectJsonPath = (deployDir) => join(deployDir, ".alpic", "project.json");
4
+ export const config = {
5
+ load: (deployDir) => {
6
+ const path = getProjectJsonPath(deployDir);
7
+ if (!existsSync(path)) {
8
+ return null;
9
+ }
10
+ let raw;
11
+ try {
12
+ raw = JSON.parse(readFileSync(path, "utf8"));
13
+ }
14
+ catch (error) {
15
+ throw new Error(`Failed to load project config: ${error.message}`);
16
+ }
17
+ return {
18
+ projectId: raw.projectId,
19
+ teamId: raw.teamId,
20
+ projectName: raw.projectName ?? raw.projectId,
21
+ environmentId: raw.environmentId,
22
+ environmentName: raw.environmentName,
23
+ };
24
+ },
25
+ save: (config, deployDir) => {
26
+ const path = getProjectJsonPath(deployDir);
27
+ mkdirSync(join(deployDir, ".alpic"), { recursive: true });
28
+ writeFileSync(path, JSON.stringify(config, null, 2));
29
+ },
30
+ };
31
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,SAAiB,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ApiDeployment } from "../types.js";
2
+ export declare function formatElapsed(ms: number): string;
3
+ export declare function deployAndWait({ initial, startedAt, teamId, projectId, }: {
4
+ initial: ApiDeployment;
5
+ startedAt: number;
6
+ teamId: string;
7
+ projectId: string;
8
+ }): Promise<{
9
+ deployment: ApiDeployment;
10
+ elapsedMs: number;
11
+ }>;
@@ -0,0 +1,38 @@
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.getDeployment(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
@@ -0,0 +1 @@
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;AAE1B,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,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,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtD,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"}
@@ -0,0 +1,12 @@
1
+ import type { ApiEnvironment, ApiProject, ProjectConfig } from "../types.js";
2
+ export declare function resolveDeployDir(raw: string | undefined): string;
3
+ export declare function confirmDeployWithExistingConfig(existingConfig: ProjectConfig): Promise<boolean | null>;
4
+ export declare function selectEnvironmentFromList(environments: ApiEnvironment[]): Promise<ApiEnvironment | null>;
5
+ export declare function confirmDeployDirectory(deployDir: string): Promise<boolean>;
6
+ export declare function confirmLinkExisting(): Promise<boolean>;
7
+ export declare function confirmLinkToAnotherProject(): Promise<boolean>;
8
+ export declare function selectProjectFromList(projects: ApiProject[]): Promise<ApiProject | null>;
9
+ export declare function promptRootDirectory(deployDir: string): Promise<string | null | undefined>;
10
+ export declare function resolveProjectForDeploy(deployDir: string): Promise<(ProjectConfig & {
11
+ environmentId: string;
12
+ }) | null>;
@@ -0,0 +1,283 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { existsSync, readFileSync, statSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { api } from "../api.js";
6
+ import { config } from "./config.js";
7
+ export function resolveDeployDir(raw) {
8
+ const dir = resolve((raw ?? "").trim() || process.cwd());
9
+ if (!existsSync(dir)) {
10
+ throw new Error(`Path does not exist: ${dir}`);
11
+ }
12
+ if (!statSync(dir).isDirectory()) {
13
+ throw new Error(`Path is not a directory: ${dir}`);
14
+ }
15
+ return dir;
16
+ }
17
+ export async function confirmDeployWithExistingConfig(existingConfig) {
18
+ const envLabel = existingConfig.environmentName ? ` to environment "${existingConfig.environmentName}"` : "";
19
+ const confirm = await p.confirm({
20
+ message: chalk.bold(`Deploy project "${existingConfig.projectName}"${envLabel}?`),
21
+ initialValue: true,
22
+ });
23
+ if (p.isCancel(confirm))
24
+ return null;
25
+ return confirm === true;
26
+ }
27
+ export async function selectEnvironmentFromList(environments) {
28
+ if (environments.length === 0) {
29
+ return null;
30
+ }
31
+ const choice = await p.select({
32
+ message: chalk.bold("Choose an environment to deploy to"),
33
+ options: environments.map((env) => ({
34
+ value: env.id,
35
+ label: env.sourceBranch ? `${env.name} (${env.sourceBranch})` : env.name,
36
+ })),
37
+ });
38
+ if (p.isCancel(choice))
39
+ return null;
40
+ const environment = environments.find((e) => e.id === choice);
41
+ return environment ?? null;
42
+ }
43
+ export async function confirmDeployDirectory(deployDir) {
44
+ const confirm = await p.confirm({
45
+ message: chalk.bold(`Deploy the directory? `) + chalk.cyan(deployDir),
46
+ initialValue: true,
47
+ });
48
+ if (p.isCancel(confirm))
49
+ return false;
50
+ return confirm === true;
51
+ }
52
+ export async function confirmLinkExisting() {
53
+ const link = await p.confirm({
54
+ message: chalk.bold("Link to existing project?"),
55
+ initialValue: true,
56
+ });
57
+ if (p.isCancel(link))
58
+ return false;
59
+ return link === true;
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
+ export async function selectProjectFromList(projects) {
71
+ if (projects.length === 0) {
72
+ return null;
73
+ }
74
+ const choice = await p.select({
75
+ message: chalk.bold("Choose a project"),
76
+ options: projects.map((proj) => ({ value: proj.id, label: proj.name })),
77
+ });
78
+ if (p.isCancel(choice))
79
+ return null;
80
+ const project = projects.find((proj) => proj.id === choice);
81
+ return project ?? null;
82
+ }
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
+ async function resolveEnvironmentForProject(projectId) {
113
+ const project = await api.getProject(projectId);
114
+ const environments = project.environments ?? [];
115
+ if (environments.length === 0) {
116
+ throw new Error("No environments found for this project.");
117
+ }
118
+ const environment = await selectEnvironmentFromList(environments);
119
+ if (!environment)
120
+ return null;
121
+ return { environmentId: environment.id, environmentName: environment.name };
122
+ }
123
+ export async function resolveProjectForDeploy(deployDir) {
124
+ const ok = await confirmDeployDirectory(deployDir);
125
+ if (!ok)
126
+ return null;
127
+ const existingConfig = config.load(deployDir);
128
+ if (existingConfig) {
129
+ let confirm;
130
+ while (true) {
131
+ confirm = await confirmDeployWithExistingConfig(existingConfig);
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
+ }
147
+ if (existingConfig.environmentId) {
148
+ return {
149
+ projectId: existingConfig.projectId,
150
+ teamId: existingConfig.teamId,
151
+ projectName: existingConfig.projectName,
152
+ environmentId: existingConfig.environmentId,
153
+ environmentName: existingConfig.environmentName,
154
+ };
155
+ }
156
+ const env = await resolveEnvironmentForProject(existingConfig.projectId);
157
+ if (!env)
158
+ return null;
159
+ const updatedConfig = {
160
+ ...existingConfig,
161
+ environmentId: env.environmentId,
162
+ environmentName: env.environmentName,
163
+ };
164
+ config.save(updatedConfig, deployDir);
165
+ p.note(`Environment "${env.environmentName}" will be used for future deploys.`);
166
+ return updatedConfig;
167
+ }
168
+ const linkExisting = await confirmLinkExisting();
169
+ if (!linkExisting) {
170
+ return runCreateProjectFlow(deployDir);
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))
187
+ 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.13", label: "Python 3.13" },
195
+ ],
196
+ initialValue: detectedRuntime ?? "node24",
197
+ });
198
+ if (p.isCancel(runtime))
199
+ return null;
200
+ const rootDirectory = await promptRootDirectory(deployDir);
201
+ const spin = p.spinner();
202
+ spin.start("Creating project...");
203
+ try {
204
+ const projectInput = {
205
+ name: name.trim(),
206
+ runtime,
207
+ };
208
+ if (rootDirectory) {
209
+ projectInput.rootDirectory = rootDirectory;
210
+ }
211
+ const created = await api.createProject(projectInput);
212
+ spin.stop("Project created.");
213
+ const productionEnv = created.productionEnvironment;
214
+ if (!productionEnv) {
215
+ throw new Error("Project was created but has no Production environment.");
216
+ }
217
+ const teamId = "teamId" in created && typeof created.teamId === "string"
218
+ ? created.teamId
219
+ : (await api.getProject(created.id)).teamId;
220
+ const newConfig = {
221
+ projectId: created.id,
222
+ teamId,
223
+ projectName: created.name,
224
+ environmentId: productionEnv.id,
225
+ environmentName: productionEnv.name,
226
+ };
227
+ config.save(newConfig, deployDir);
228
+ return newConfig;
229
+ }
230
+ catch (error) {
231
+ spin.stop();
232
+ throw error;
233
+ }
234
+ }
235
+ async function runLinkingFlow(deployDir) {
236
+ const projects = await api.listProjects();
237
+ if (projects.length === 0) {
238
+ throw new Error("No projects found. Create a project in the Alpic dashboard first.");
239
+ }
240
+ const project = await selectProjectFromList(projects);
241
+ if (!project)
242
+ return null;
243
+ const environments = project.environments ?? [];
244
+ if (environments.length === 0) {
245
+ throw new Error("No environments found for this project.");
246
+ }
247
+ const environment = await selectEnvironmentFromList(environments);
248
+ if (!environment)
249
+ return null;
250
+ const newConfig = {
251
+ projectId: project.id,
252
+ teamId: project.teamId,
253
+ projectName: project.name,
254
+ environmentId: environment.id,
255
+ environmentName: environment.name,
256
+ };
257
+ config.save(newConfig, deployDir);
258
+ p.note(`Linked to project "${project.name}", environment "${environment.name}".`);
259
+ return newConfig;
260
+ }
261
+ function detectRuntime(dir) {
262
+ const has = (file) => existsSync(resolve(dir, file));
263
+ const read = (file) => {
264
+ try {
265
+ return readFileSync(resolve(dir, file), "utf8");
266
+ }
267
+ catch {
268
+ return "";
269
+ }
270
+ };
271
+ if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
272
+ return "python3.13";
273
+ }
274
+ if (has("package.json")) {
275
+ const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
276
+ const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
277
+ if (major === "22")
278
+ return "node22";
279
+ return "node24";
280
+ }
281
+ return null;
282
+ }
283
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function uploadToPresignedUrl(uploadUrl: string, buffer: Buffer): Promise<void>;
@@ -0,0 +1,14 @@
1
+ export async function uploadToPresignedUrl(uploadUrl, buffer) {
2
+ const res = await fetch(uploadUrl, {
3
+ method: "PUT",
4
+ headers: {
5
+ "Content-Type": "application/gzip",
6
+ "Content-Length": String(buffer.byteLength),
7
+ },
8
+ body: new Uint8Array(buffer),
9
+ });
10
+ if (!res.ok) {
11
+ throw new Error(`Upload failed: ${res.status} ${res.statusText}`);
12
+ }
13
+ }
14
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAc;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;SAC5C;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,61 @@
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
+ domains: string[];
24
+ };
25
+ export type ProjectConfig = {
26
+ projectId: string;
27
+ teamId: string;
28
+ projectName: string;
29
+ environmentId?: string;
30
+ environmentName?: string;
31
+ };
32
+ export type ApiDeployment = {
33
+ id: string;
34
+ status: "ongoing" | "deployed" | "failed" | "canceled";
35
+ sourceRef: string;
36
+ sourceCommitId?: string;
37
+ sourceCommitMessage?: string;
38
+ authorUsername: string | null;
39
+ authorAvatarUrl: string | null;
40
+ startedAt: string | null;
41
+ completedAt: string | null;
42
+ };
43
+ export type Runtime = "node22" | "node24" | "python3.13";
44
+ export type CreateProjectInput = {
45
+ name: string;
46
+ runtime: Runtime;
47
+ rootDirectory?: string;
48
+ };
49
+ export type ApiCreateProjectOutput = {
50
+ id: string;
51
+ name: string;
52
+ teamId: string;
53
+ productionEnvironment: {
54
+ id: string;
55
+ name: string;
56
+ } | null;
57
+ environments: {
58
+ id: string;
59
+ name: string;
60
+ }[];
61
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alpic",
3
- "version": "0.0.0-dev.f71cfeb",
3
+ "version": "0.0.0-dev.fa5b169",
4
4
  "description": "The command-line interface for Alpic",
5
5
  "homepage": "https://alpic.ai",
6
6
  "preferGlobal": true,
@@ -24,10 +24,15 @@
24
24
  ],
25
25
  "author": "Alpic",
26
26
  "license": "ISC",
27
- "devDependencies": {
27
+ "dependencies": {
28
+ "@clack/prompts": "^1.0.0",
28
29
  "@oclif/core": "^4.8.0",
30
+ "chalk": "^5.6.2",
31
+ "tar": "^7.4.0"
32
+ },
33
+ "devDependencies": {
29
34
  "@total-typescript/tsconfig": "^1.0.4",
30
- "@types/node": "^25.0.10",
35
+ "@types/node": "^25.1.0",
31
36
  "biome": "^0.3.3",
32
37
  "jsdom": "^27.4.0",
33
38
  "shx": "^0.4.0",
@@ -1,6 +0,0 @@
1
- import { Command } from "@oclif/core";
2
- export declare class Hello extends Command {
3
- static description: string;
4
- static examples: string[];
5
- run(): Promise<void>;
6
- }
@@ -1,10 +0,0 @@
1
- import { Command } from "@oclif/core";
2
- export class Hello extends Command {
3
- static description = "A simple hello world command for testing";
4
- static examples = ["<%= config.bin %> hello"];
5
- async run() {
6
- await this.parse(Hello);
7
- this.log("Hello, world! 👋");
8
- }
9
- }
10
- //# sourceMappingURL=hello.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hello.js","sourceRoot":"","sources":["../../src/commands/hello.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,OAAO,KAAM,SAAQ,OAAO;IAChC,MAAM,CAAU,WAAW,GAAG,0CAA0C,CAAC;IAEzE,MAAM,CAAU,QAAQ,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/B,CAAC"}