alpic 0.0.0-dev.afa2b2c → 0.0.0-dev.afd7c2a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +142 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy.e2e.test.js +217 -0
  6. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  7. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  8. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  9. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  10. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/git.e2e.test.js +218 -0
  12. package/dist/__tests__/git.e2e.test.js.map +1 -0
  13. package/dist/__tests__/mock-server.d.ts +22 -0
  14. package/dist/__tests__/mock-server.js +492 -0
  15. package/dist/__tests__/mock-server.js.map +1 -0
  16. package/dist/__tests__/utils.d.ts +61 -0
  17. package/dist/__tests__/utils.js +197 -0
  18. package/dist/__tests__/utils.js.map +1 -0
  19. package/dist/api.d.ts +3 -9
  20. package/dist/api.js +14 -32
  21. package/dist/api.js.map +1 -1
  22. package/dist/commands/deploy.d.ts +2 -2
  23. package/dist/commands/deploy.js +30 -16
  24. package/dist/commands/deploy.js.map +1 -1
  25. package/dist/commands/git/connect.d.ts +9 -0
  26. package/dist/commands/git/connect.js +59 -0
  27. package/dist/commands/git/connect.js.map +1 -0
  28. package/dist/commands/git/disconnect.d.ts +9 -0
  29. package/dist/commands/git/disconnect.js +51 -0
  30. package/dist/commands/git/disconnect.js.map +1 -0
  31. package/dist/commands/git.d.ts +6 -0
  32. package/dist/commands/git.js +17 -0
  33. package/dist/commands/git.js.map +1 -0
  34. package/dist/commands/login.d.ts +6 -0
  35. package/dist/commands/login.js +38 -0
  36. package/dist/commands/login.js.map +1 -0
  37. package/dist/commands/logout.d.ts +6 -0
  38. package/dist/commands/logout.js +20 -0
  39. package/dist/commands/logout.js.map +1 -0
  40. package/dist/commands/telemetry/disable.d.ts +5 -0
  41. package/dist/commands/telemetry/disable.js +14 -0
  42. package/dist/commands/telemetry/disable.js.map +1 -0
  43. package/dist/commands/telemetry/enable.d.ts +5 -0
  44. package/dist/commands/telemetry/enable.js +13 -0
  45. package/dist/commands/telemetry/enable.js.map +1 -0
  46. package/dist/commands/telemetry/status.d.ts +5 -0
  47. package/dist/commands/telemetry/status.js +19 -0
  48. package/dist/commands/telemetry/status.js.map +1 -0
  49. package/dist/commands/whoami.d.ts +6 -0
  50. package/dist/commands/whoami.js +25 -0
  51. package/dist/commands/whoami.js.map +1 -0
  52. package/dist/env.d.ts +4 -0
  53. package/dist/env.js +10 -0
  54. package/dist/env.js.map +1 -0
  55. package/dist/lib/alpic-command.d.ts +4 -0
  56. package/dist/lib/alpic-command.js +17 -0
  57. package/dist/lib/alpic-command.js.map +1 -0
  58. package/dist/lib/auth/auth.d.ts +2 -0
  59. package/dist/lib/auth/auth.js +21 -0
  60. package/dist/lib/auth/auth.js.map +1 -0
  61. package/dist/lib/auth/oauth/client.d.ts +29 -0
  62. package/dist/lib/auth/oauth/client.js +112 -0
  63. package/dist/lib/auth/oauth/client.js.map +1 -0
  64. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  65. package/dist/lib/auth/oauth/constants.js +3 -0
  66. package/dist/lib/auth/oauth/constants.js.map +1 -0
  67. package/dist/lib/auth/oauth/server.d.ts +6 -0
  68. package/dist/lib/auth/oauth/server.js +88 -0
  69. package/dist/lib/auth/oauth/server.js.map +1 -0
  70. package/dist/lib/auth/whoami.d.ts +28 -0
  71. package/dist/lib/auth/whoami.js +35 -0
  72. package/dist/lib/auth/whoami.js.map +1 -0
  73. package/dist/lib/deployment.d.ts +20 -0
  74. package/dist/lib/deployment.js +43 -0
  75. package/dist/lib/deployment.js.map +1 -0
  76. package/dist/lib/git.d.ts +14 -0
  77. package/dist/lib/git.js +105 -0
  78. package/dist/lib/git.js.map +1 -0
  79. package/dist/lib/global-store.d.ts +28 -0
  80. package/dist/lib/global-store.js +75 -0
  81. package/dist/lib/global-store.js.map +1 -0
  82. package/dist/lib/project.d.ts +62 -5
  83. package/dist/lib/project.js +155 -15
  84. package/dist/lib/project.js.map +1 -1
  85. package/dist/lib/telemetry.d.ts +7 -0
  86. package/dist/lib/telemetry.js +66 -0
  87. package/dist/lib/telemetry.js.map +1 -0
  88. package/dist/posthog.d.ts +3 -0
  89. package/dist/posthog.js +10 -0
  90. package/dist/posthog.js.map +1 -0
  91. package/dist/types.d.ts +0 -34
  92. package/package.json +29 -7
@@ -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;AAI1B,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,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,GAIV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,MAAM,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;IACvD,IAAI,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,EAAE,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC3D,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;IACT,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,qBAAqB,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,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,14 @@
1
+ export type GitRemote = {
2
+ name: string;
3
+ url: string;
4
+ sourceRepository: string;
5
+ };
6
+ export declare function isGitRepository(cwd: string): boolean;
7
+ export declare function listGithubRemotes(cwd: string): GitRemote[];
8
+ export type ProjectWithSourceRepository = {
9
+ name: string;
10
+ sourceRepository: string | null;
11
+ };
12
+ export declare function confirmLinkAnotherIfAlreadyConnected(project: ProjectWithSourceRepository): Promise<boolean>;
13
+ export declare function selectRemoteSourceRepository(remotes: GitRemote[]): Promise<string | null>;
14
+ export declare function showGitSetupInstructions(): void;
@@ -0,0 +1,105 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { execFileSync } from "node:child_process";
4
+ function runGit(args, cwd) {
5
+ return execFileSync("git", args, {
6
+ cwd,
7
+ encoding: "utf8",
8
+ stdio: ["ignore", "pipe", "pipe"],
9
+ }).trim();
10
+ }
11
+ export function isGitRepository(cwd) {
12
+ try {
13
+ return runGit(["rev-parse", "--is-inside-work-tree"], cwd) === "true";
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ export function listGithubRemotes(cwd) {
20
+ let output;
21
+ try {
22
+ output = runGit(["remote", "-v"], cwd);
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ const remotes = new Map();
28
+ for (const line of output.split(/\r?\n/)) {
29
+ const match = line.match(/^(\S+)\s+(\S+)\s+\((fetch|push)\)$/);
30
+ if (!match)
31
+ continue;
32
+ const name = match[1];
33
+ const url = match[2];
34
+ const kind = match[3];
35
+ if (!name || !url || !kind)
36
+ continue;
37
+ if (kind !== "fetch")
38
+ continue;
39
+ const key = `${name}:${url}`;
40
+ const sourceRepository = parseGitHubSourceRepository(url);
41
+ if (sourceRepository) {
42
+ remotes.set(key, {
43
+ name,
44
+ url,
45
+ sourceRepository,
46
+ });
47
+ }
48
+ }
49
+ return [...remotes.values()];
50
+ }
51
+ export async function confirmLinkAnotherIfAlreadyConnected(project) {
52
+ if (!project.sourceRepository) {
53
+ return true;
54
+ }
55
+ p.log.info(`Project "${project.name}" is already connected to "${project.sourceRepository}".`);
56
+ const confirm = await p.confirm({
57
+ message: chalk.bold("Do you want to link another repository?"),
58
+ initialValue: false,
59
+ });
60
+ if (p.isCancel(confirm) || !confirm) {
61
+ p.cancel("Git connect cancelled");
62
+ return false;
63
+ }
64
+ return true;
65
+ }
66
+ export async function selectRemoteSourceRepository(remotes) {
67
+ if (remotes.length === 0) {
68
+ return null;
69
+ }
70
+ const selected = await p.select({
71
+ message: chalk.bold("Choose the remote source to connect"),
72
+ options: remotes.map((remote) => ({
73
+ value: remote.sourceRepository,
74
+ label: `${remote.sourceRepository} (${remote.name})`,
75
+ hint: remote.url,
76
+ })),
77
+ });
78
+ if (p.isCancel(selected)) {
79
+ p.cancel("Git connect cancelled");
80
+ return null;
81
+ }
82
+ return selected;
83
+ }
84
+ export function showGitSetupInstructions() {
85
+ p.note([
86
+ `Run ${chalk.cyan("git init")} in this directory`,
87
+ `Add a remote: ${chalk.cyan("git remote add origin <your-repo-url>")}`,
88
+ `Then run ${chalk.cyan("alpic git connect")} again`,
89
+ ].join("\n"), "To set up a git repository:", { format: (line) => line });
90
+ }
91
+ function parseGitHubSourceRepository(url) {
92
+ const patterns = [
93
+ /^git@github\.com:([^/\s]+\/[^/\s]+?)(?:\.git)?$/,
94
+ /^https:\/\/github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
95
+ /^ssh:\/\/git@github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
96
+ ];
97
+ for (const pattern of patterns) {
98
+ const match = url.match(pattern);
99
+ if (match) {
100
+ return match[1] ?? null;
101
+ }
102
+ }
103
+ return null;
104
+ }
105
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface Credentials {
2
+ access_token: string;
3
+ refresh_token: string;
4
+ expires_at: number;
5
+ sub: string;
6
+ }
7
+ export interface Config {
8
+ machineId: string;
9
+ telemetry: {
10
+ enabled: boolean;
11
+ };
12
+ }
13
+ export declare class GlobalStore {
14
+ private readonly configDir;
15
+ constructor(configDir?: string);
16
+ getCredentials(): Credentials | null;
17
+ saveCredentials(credentials: Credentials): void;
18
+ clearCredentials(): void;
19
+ getConfig(): Config;
20
+ saveConfig(config: Config): void;
21
+ clearConfig(): void;
22
+ private getCredentialsFilePath;
23
+ private getConfigFilePath;
24
+ private parseJsonFile;
25
+ private saveJsonFile;
26
+ private clear;
27
+ }
28
+ export declare const globalStore: GlobalStore;
@@ -0,0 +1,75 @@
1
+ import crypto from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import XDGAppPaths from "xdg-app-paths";
5
+ export class GlobalStore {
6
+ configDir;
7
+ constructor(configDir) {
8
+ this.configDir = configDir ?? XDGAppPaths({ name: "alpic" }).config();
9
+ }
10
+ getCredentials() {
11
+ const token = this.parseJsonFile(this.getCredentialsFilePath());
12
+ if (!token) {
13
+ return null;
14
+ }
15
+ return token;
16
+ }
17
+ saveCredentials(credentials) {
18
+ this.saveJsonFile(this.getCredentialsFilePath(), credentials);
19
+ }
20
+ clearCredentials() {
21
+ this.clear(this.getCredentialsFilePath());
22
+ }
23
+ getConfig() {
24
+ const existing = this.parseJsonFile(this.getConfigFilePath());
25
+ if (existing?.machineId && existing?.telemetry !== undefined) {
26
+ return existing;
27
+ }
28
+ const config = {
29
+ machineId: existing?.machineId ?? crypto.randomUUID(),
30
+ telemetry: {
31
+ enabled: existing?.telemetry?.enabled ?? true,
32
+ },
33
+ };
34
+ this.saveConfig(config);
35
+ return config;
36
+ }
37
+ saveConfig(config) {
38
+ this.saveJsonFile(this.getConfigFilePath(), config);
39
+ }
40
+ clearConfig() {
41
+ this.clear(this.getConfigFilePath());
42
+ }
43
+ getCredentialsFilePath() {
44
+ return join(this.configDir, "credentials.json");
45
+ }
46
+ getConfigFilePath() {
47
+ return join(this.configDir, "config.json");
48
+ }
49
+ parseJsonFile(filePath) {
50
+ if (!existsSync(filePath)) {
51
+ return null;
52
+ }
53
+ try {
54
+ return JSON.parse(readFileSync(filePath, "utf-8"));
55
+ }
56
+ catch {
57
+ this.clear(filePath);
58
+ return null;
59
+ }
60
+ }
61
+ saveJsonFile(filePath, data) {
62
+ mkdirSync(this.configDir, { recursive: true });
63
+ writeFileSync(filePath, JSON.stringify(data, null, 2), {
64
+ encoding: "utf-8",
65
+ mode: 0o600,
66
+ });
67
+ }
68
+ clear(filePath) {
69
+ if (existsSync(filePath)) {
70
+ unlinkSync(filePath);
71
+ }
72
+ }
73
+ }
74
+ export const globalStore = new GlobalStore();
75
+ //# sourceMappingURL=global-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-store.js","sourceRoot":"","sources":["../../src/lib/global-store.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,67 @@
1
- import type { ApiEnvironment, ApiProject, ProjectConfig } from "../types.js";
1
+ import type { RouterOutput } from "@alpic-ai/api";
2
+ import type { ProjectConfig } from "../types.js";
2
3
  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>;
4
+ export declare function confirmDeployWithExistingConfig(existingConfig: ProjectConfig): Promise<boolean | null>;
5
+ export declare function selectEnvironmentFromList(environments: RouterOutput["projects"]["get"]["v1"]["environments"]): Promise<{
6
+ id: string;
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>;
6
21
  export declare function confirmLinkExisting(): Promise<boolean>;
7
- export declare function selectProjectFromList(projects: ApiProject[]): Promise<ApiProject | null>;
22
+ export declare function confirmLinkToAnotherProject(): Promise<boolean>;
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>;
8
65
  export declare function resolveProjectForDeploy(deployDir: string): Promise<(ProjectConfig & {
9
66
  environmentId: string;
10
67
  }) | null>;
@@ -1,6 +1,6 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import chalk from "chalk";
3
- import { existsSync, statSync } from "node:fs";
3
+ import { existsSync, readFileSync, 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 false;
24
+ return null;
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: `${env.name} (${env.sourceBranch})`,
35
+ label: env.sourceBranch ? `${env.name} (${env.sourceBranch})` : env.name,
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 confirmDeployWithoutConfig(deployDir) {
43
+ export async function confirmDeployDirectory(deployDir) {
44
44
  const confirm = await p.confirm({
45
45
  message: chalk.bold(`Deploy the directory? `) + chalk.cyan(deployDir),
46
46
  initialValue: true,
@@ -58,6 +58,15 @@ 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
+ }
61
70
  export async function selectProjectFromList(projects) {
62
71
  if (projects.length === 0) {
63
72
  return null;
@@ -71,8 +80,37 @@ export async function selectProjectFromList(projects) {
71
80
  const project = projects.find((proj) => proj.id === choice);
72
81
  return project ?? null;
73
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
+ }
74
112
  async function resolveEnvironmentForProject(projectId) {
75
- const project = await api.getProject(projectId);
113
+ const project = await api.projects.get.v1({ projectId });
76
114
  const environments = project.environments ?? [];
77
115
  if (environments.length === 0) {
78
116
  throw new Error("No environments found for this project.");
@@ -83,11 +121,29 @@ async function resolveEnvironmentForProject(projectId) {
83
121
  return { environmentId: environment.id, environmentName: environment.name };
84
122
  }
85
123
  export async function resolveProjectForDeploy(deployDir) {
124
+ const ok = await confirmDeployDirectory(deployDir);
125
+ if (!ok)
126
+ return null;
86
127
  const existingConfig = config.load(deployDir);
87
128
  if (existingConfig) {
88
- const ok = await confirmDeployWithExistingConfig(existingConfig);
89
- if (!ok)
90
- return null;
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
+ }
91
147
  if (existingConfig.environmentId) {
92
148
  return {
93
149
  projectId: existingConfig.projectId,
@@ -106,18 +162,78 @@ export async function resolveProjectForDeploy(deployDir) {
106
162
  environmentName: env.environmentName,
107
163
  };
108
164
  config.save(updatedConfig, deployDir);
109
- p.note(`Environment "${env.environmentName}" will be used for future deploys.`);
165
+ p.note(`Environment "${env.environmentName}" will be used for future deploys.`, undefined, {
166
+ format: (line) => line,
167
+ });
110
168
  return updatedConfig;
111
169
  }
112
- const ok = await confirmDeployWithoutConfig(deployDir);
113
- if (!ok)
114
- return null;
115
170
  const linkExisting = await confirmLinkExisting();
116
171
  if (!linkExisting) {
117
- p.note("Creating a new project is not implemented yet.", "Not yet implemented");
172
+ return runCreateProjectFlow(deployDir);
173
+ }
174
+ return runLinkingFlow(deployDir);
175
+ }
176
+ async function runCreateProjectFlow(deployDir) {
177
+ const name = await p.text({
178
+ message: chalk.bold("Project name"),
179
+ placeholder: "my-app",
180
+ validate: (value) => {
181
+ if (!value?.trim())
182
+ return "Project name is required.";
183
+ if (value.length > 100)
184
+ return "Project name must be at most 100 characters.";
185
+ return undefined;
186
+ },
187
+ });
188
+ if (p.isCancel(name))
189
+ return null;
190
+ const detectedRuntime = detectRuntime(deployDir);
191
+ const runtime = await p.select({
192
+ message: chalk.bold("Runtime"),
193
+ options: [
194
+ { value: "node24", label: "Node.js 24" },
195
+ { value: "node22", label: "Node.js 22" },
196
+ { value: "python3.14", label: "Python 3.14" },
197
+ { value: "python3.13", label: "Python 3.13" },
198
+ ],
199
+ initialValue: detectedRuntime ?? "node24",
200
+ });
201
+ if (p.isCancel(runtime))
118
202
  return null;
203
+ const rootDirectory = await promptRootDirectory(deployDir);
204
+ const spin = p.spinner();
205
+ spin.start("Creating project...");
206
+ try {
207
+ const projectInput = {
208
+ name: name.trim(),
209
+ runtime,
210
+ };
211
+ if (rootDirectory) {
212
+ projectInput.rootDirectory = rootDirectory;
213
+ }
214
+ const created = await api.projects.create.v1(projectInput);
215
+ spin.stop("Project created.");
216
+ const productionEnv = created.productionEnvironment;
217
+ if (!productionEnv) {
218
+ throw new Error("Project was created but has no Production environment.");
219
+ }
220
+ const newConfig = {
221
+ projectId: created.id,
222
+ teamId: created.teamId,
223
+ projectName: created.name,
224
+ environmentId: productionEnv.id,
225
+ environmentName: productionEnv.name,
226
+ };
227
+ config.save(newConfig, deployDir);
228
+ return newConfig;
119
229
  }
120
- const projects = await api.listProjects();
230
+ catch (error) {
231
+ spin.stop();
232
+ throw error;
233
+ }
234
+ }
235
+ async function runLinkingFlow(deployDir) {
236
+ const projects = await api.projects.list.v1();
121
237
  if (projects.length === 0) {
122
238
  throw new Error("No projects found. Create a project in the Alpic dashboard first.");
123
239
  }
@@ -139,7 +255,31 @@ export async function resolveProjectForDeploy(deployDir) {
139
255
  environmentName: environment.name,
140
256
  };
141
257
  config.save(newConfig, deployDir);
142
- p.note(`Linked to project "${project.name}", environment "${environment.name}".`);
258
+ p.note(`Linked to project "${project.name}", environment "${environment.name}".`, undefined, {
259
+ format: (line) => line,
260
+ });
143
261
  return newConfig;
144
262
  }
263
+ function detectRuntime(dir) {
264
+ const has = (file) => existsSync(resolve(dir, file));
265
+ const read = (file) => {
266
+ try {
267
+ return readFileSync(resolve(dir, file), "utf8");
268
+ }
269
+ catch {
270
+ return "";
271
+ }
272
+ };
273
+ if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
274
+ return "python3.13";
275
+ }
276
+ if (has("package.json")) {
277
+ const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
278
+ const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
279
+ if (major === "22")
280
+ return "node22";
281
+ return "node24";
282
+ }
283
+ return null;
284
+ }
145
285
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
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,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,gBAAgB,CAAC,GAAuB;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,cAA6B;IACjF,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,cAAc,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAC9B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,cAAc,CAAC,WAAW,IAAI,QAAQ,GAAG,CAAC;QACjF,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,OAAO,KAAK,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,YAAmE;IACjH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACzD,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI;SACzE,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC9D,OAAO,WAAW,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAC9B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACrE,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,OAAO,KAAK,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC;QAChD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC;QAC/C,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgD;IAC1F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KACxE,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC5D,OAAO,OAAO,IAAI,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACrC,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,GAAG;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO,sCAAsC,CAAC;gBACvF,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,MAAM,OAAO,GAAI,OAAkB,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QAExD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,SAAiB;IAC3D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAChD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,EAAE,eAAe,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB;IAEjB,MAAM,EAAE,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAErB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,OAAuB,CAAC;QAC5B,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,GAAG,MAAM,+BAA+B,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAClC,IAAI,OAAO;gBAAE,MAAM;YACnB,MAAM,WAAW,GAAG,MAAM,2BAA2B,EAAE,CAAC;YACxD,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;gBACjD,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO;gBACL,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,WAAW,EAAE,cAAc,CAAC,WAAW;gBACvC,aAAa,EAAE,cAAc,CAAC,aAAa;gBAC3C,eAAe,EAAE,cAAc,CAAC,eAAe;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,4BAA4B,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,MAAM,aAAa,GAAkB;YACnC,GAAG,cAAc;YACjB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,eAAe,oCAAoC,EAAE,SAAS,EAAE;YACzF,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,aAA0D,CAAC;IACpE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACjD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACxB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QACnC,WAAW,EAAE,QAAQ;QACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;gBAAE,OAAO,2BAA2B,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,8CAA8C,CAAC;YAC9E,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,MAAM,CAAU;QACtC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;YACxC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;YACxC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE;YAC7C,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE;SAC9C;QACD,YAAY,EAAE,eAAe,IAAI,QAAQ;KAC1C,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,YAAY,GAA4C;YAC5D,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,OAAO;SACR,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC;QAC7C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE9B,MAAM,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAA8C;YAC3D,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,aAAa,EAAE,aAAa,CAAC,EAAE;YAC/B,eAAe,EAAE,aAAa,CAAC,IAAI;SACpC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAChD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,SAAS,GAA8C;QAC3D,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,eAAe,EAAE,WAAW,CAAC,IAAI;KAClC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,IAAI,mBAAmB,WAAW,CAAC,IAAI,IAAI,EAAE,SAAS,EAAE;QAC3F,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;KACvB,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClG,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
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;
@@ -0,0 +1,66 @@
1
+ import ci from "ci-info";
2
+ import crypto from "node:crypto";
3
+ import posthog from "../posthog.js";
4
+ import { globalStore } from "./global-store.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 = globalStore.getConfig();
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 = globalStore.getConfig();
26
+ config.telemetry.enabled = enabled;
27
+ globalStore.saveConfig(config);
28
+ }
29
+ export function getMachineId() {
30
+ if (ci.isCI) {
31
+ return ci.name ?? "unknown-ci";
32
+ }
33
+ return globalStore.getConfig().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 {
62
+ // Silently ignore telemetry errors - never block CLI operation
63
+ }
64
+ };
65
+ export default hook;
66
+ //# sourceMappingURL=telemetry.js.map