alpic 0.0.0-dev.fdd9dcb → 0.0.0-dev.ff063bb

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,9 @@
1
+ import { type ApiDeployment, type ApiProject, type PresignedUploadResponse } from "./types.js";
2
+ export declare const api: {
3
+ listProjects: () => Promise<ApiProject[]>;
4
+ getProject: (projectId: string) => Promise<ApiProject>;
5
+ getPresignedUploadUrl: () => Promise<PresignedUploadResponse>;
6
+ deployEnvironment: (environmentId: string, body?: {
7
+ token?: string;
8
+ }) => Promise<ApiDeployment>;
9
+ };
package/dist/api.js ADDED
@@ -0,0 +1,33 @@
1
+ import {} from "./types.js";
2
+ function getApiBaseUrl() {
3
+ return process.env.ALPIC_API_BASE_URL ?? "https://api.alpic.ai";
4
+ }
5
+ const doFetch = async (path, options = {}) => {
6
+ const res = await fetch(`${getApiBaseUrl()}${path}`, {
7
+ ...options,
8
+ headers: {
9
+ Authorization: `Bearer ${process.env.ALPIC_API_KEY}`,
10
+ ...options.headers,
11
+ },
12
+ });
13
+ return res.json();
14
+ };
15
+ export const api = {
16
+ listProjects: async () => {
17
+ return doFetch("/v1/projects", { method: "GET" });
18
+ },
19
+ getProject: async (projectId) => {
20
+ return doFetch(`/v1/projects/${projectId}`, { method: "GET" });
21
+ },
22
+ getPresignedUploadUrl: async () => {
23
+ return doFetch("/v1/deployments/upload", { method: "POST" });
24
+ },
25
+ deployEnvironment: async (environmentId, body) => {
26
+ return doFetch(`/v1/environments/${environmentId}/deploy`, {
27
+ method: "POST",
28
+ body: JSON.stringify(body ?? {}),
29
+ headers: { "Content-Type": "application/json" },
30
+ });
31
+ },
32
+ };
33
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqE,MAAM,YAAY,CAAC;AAE/F,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,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"}
@@ -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,68 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Args, Command } from "@oclif/core";
3
+ import { api } from "../api.js";
4
+ import { createTarArchive, getFilesToPack } from "../lib/archive.js";
5
+ import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
6
+ import { uploadToPresignedUrl } from "../lib/upload.js";
7
+ import { readFileSync, rmSync } from "node:fs";
8
+ export class Deploy extends Command {
9
+ static description = "Deploy a project to Alpic";
10
+ static examples = ["<%= config.bin %> deploy", "<%= config.bin %> deploy ./my-app"];
11
+ static args = {
12
+ directory: Args.string({
13
+ description: "Directory to deploy (default: current directory)",
14
+ required: false,
15
+ }),
16
+ };
17
+ async run() {
18
+ const { args } = await this.parse(Deploy);
19
+ p.intro("Deploying to Alpic");
20
+ const apiKey = process.env.ALPIC_API_KEY;
21
+ if (!apiKey) {
22
+ p.cancel("ALPIC_API_KEY environment variable is required");
23
+ this.exit(1);
24
+ return;
25
+ }
26
+ const deployDir = resolveDeployDir(args.directory);
27
+ const config = await resolveProjectForDeploy(deployDir);
28
+ if (!config) {
29
+ p.cancel("Deploy cancelled");
30
+ this.exit(1);
31
+ return;
32
+ }
33
+ const spinner = p.spinner();
34
+ let tmpDir;
35
+ try {
36
+ spinner.start("Collecting source files...");
37
+ const files = getFilesToPack(deployDir);
38
+ spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
39
+ spinner.start("Creating archive...");
40
+ const result = await createTarArchive(files, deployDir);
41
+ tmpDir = result.tmpDir;
42
+ const archivePath = result.archivePath;
43
+ spinner.stop("Archive created");
44
+ spinner.start("Getting upload URL...");
45
+ const { uploadUrl, token } = await api.getPresignedUploadUrl();
46
+ spinner.stop("Upload URL received");
47
+ spinner.start("Uploading source...");
48
+ const buffer = readFileSync(archivePath);
49
+ await uploadToPresignedUrl(uploadUrl, buffer);
50
+ spinner.stop("Upload complete");
51
+ spinner.start("Triggering deployment...");
52
+ const deployment = await api.deployEnvironment(config.environmentId, { token });
53
+ spinner.stop("Deployment started");
54
+ p.outro(`Deployment ${deployment.id} is ${deployment.status}`);
55
+ }
56
+ catch (error) {
57
+ spinner.stop();
58
+ p.cancel(`Error: ${error instanceof Error ? error.message : String(error)}`);
59
+ this.exit(1);
60
+ }
61
+ finally {
62
+ if (tmpDir) {
63
+ rmSync(tmpDir, { recursive: true, force: true });
64
+ }
65
+ }
66
+ }
67
+ }
68
+ //# 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,10 @@
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>;
4
+ export declare function selectEnvironmentFromList(environments: ApiEnvironment[]): Promise<ApiEnvironment | null>;
5
+ export declare function confirmDeployWithoutConfig(deployDir: string): Promise<boolean>;
6
+ export declare function confirmLinkExisting(): Promise<boolean>;
7
+ export declare function selectProjectFromList(projects: ApiProject[]): Promise<ApiProject | null>;
8
+ export declare function resolveProjectForDeploy(deployDir: string): Promise<(ProjectConfig & {
9
+ environmentId: string;
10
+ }) | null>;
@@ -0,0 +1,145 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { existsSync, 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 false;
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.name} (${env.sourceBranch})`,
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 confirmDeployWithoutConfig(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 selectProjectFromList(projects) {
62
+ if (projects.length === 0) {
63
+ return null;
64
+ }
65
+ const choice = await p.select({
66
+ message: chalk.bold("Choose a project"),
67
+ options: projects.map((proj) => ({ value: proj.id, label: proj.name })),
68
+ });
69
+ if (p.isCancel(choice))
70
+ return null;
71
+ const project = projects.find((proj) => proj.id === choice);
72
+ return project ?? null;
73
+ }
74
+ async function resolveEnvironmentForProject(projectId) {
75
+ const project = await api.getProject(projectId);
76
+ const environments = project.environments ?? [];
77
+ if (environments.length === 0) {
78
+ throw new Error("No environments found for this project.");
79
+ }
80
+ const environment = await selectEnvironmentFromList(environments);
81
+ if (!environment)
82
+ return null;
83
+ return { environmentId: environment.id, environmentName: environment.name };
84
+ }
85
+ export async function resolveProjectForDeploy(deployDir) {
86
+ const existingConfig = config.load(deployDir);
87
+ if (existingConfig) {
88
+ const ok = await confirmDeployWithExistingConfig(existingConfig);
89
+ if (!ok)
90
+ return null;
91
+ if (existingConfig.environmentId) {
92
+ return {
93
+ projectId: existingConfig.projectId,
94
+ teamId: existingConfig.teamId,
95
+ projectName: existingConfig.projectName,
96
+ environmentId: existingConfig.environmentId,
97
+ environmentName: existingConfig.environmentName,
98
+ };
99
+ }
100
+ const env = await resolveEnvironmentForProject(existingConfig.projectId);
101
+ if (!env)
102
+ return null;
103
+ const updatedConfig = {
104
+ ...existingConfig,
105
+ environmentId: env.environmentId,
106
+ environmentName: env.environmentName,
107
+ };
108
+ config.save(updatedConfig, deployDir);
109
+ p.note(`Environment "${env.environmentName}" will be used for future deploys.`);
110
+ return updatedConfig;
111
+ }
112
+ const ok = await confirmDeployWithoutConfig(deployDir);
113
+ if (!ok)
114
+ return null;
115
+ const linkExisting = await confirmLinkExisting();
116
+ if (!linkExisting) {
117
+ p.note("Creating a new project is not implemented yet.", "Not yet implemented");
118
+ return null;
119
+ }
120
+ const projects = await api.listProjects();
121
+ if (projects.length === 0) {
122
+ throw new Error("No projects found. Create a project in the Alpic dashboard first.");
123
+ }
124
+ const project = await selectProjectFromList(projects);
125
+ if (!project)
126
+ return null;
127
+ const environments = project.environments ?? [];
128
+ if (environments.length === 0) {
129
+ throw new Error("No environments found for this project.");
130
+ }
131
+ const environment = await selectEnvironmentFromList(environments);
132
+ if (!environment)
133
+ return null;
134
+ const newConfig = {
135
+ projectId: project.id,
136
+ teamId: project.teamId,
137
+ projectName: project.name,
138
+ environmentId: environment.id,
139
+ environmentName: environment.name,
140
+ };
141
+ config.save(newConfig, deployDir);
142
+ p.note(`Linked to project "${project.name}", environment "${environment.name}".`);
143
+ return newConfig;
144
+ }
145
+ //# 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,41 @@
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
+ };
24
+ export type ProjectConfig = {
25
+ projectId: string;
26
+ teamId: string;
27
+ projectName: string;
28
+ environmentId?: string;
29
+ environmentName?: string;
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/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.fdd9dcb",
3
+ "version": "0.0.0-dev.ff063bb",
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
+ "dependencies": {
28
+ "@clack/prompts": "^0.8.2",
29
+ "chalk": "^5.6.2",
30
+ "tar": "^7.4.0"
31
+ },
27
32
  "devDependencies": {
28
33
  "@oclif/core": "^4.8.0",
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"}