alpic 0.0.0-dev.f693d22 → 0.0.0-dev.f703fe0

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 (104) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +144 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy-flags.e2e.test.js +87 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/deploy.e2e.test.js +168 -0
  9. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  11. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  12. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  13. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  15. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  16. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  17. package/dist/__tests__/git.e2e.test.js +221 -0
  18. package/dist/__tests__/git.e2e.test.js.map +1 -0
  19. package/dist/__tests__/mock-server.d.ts +22 -0
  20. package/dist/__tests__/mock-server.js +493 -0
  21. package/dist/__tests__/mock-server.js.map +1 -0
  22. package/dist/__tests__/utils.d.ts +67 -0
  23. package/dist/__tests__/utils.js +244 -0
  24. package/dist/__tests__/utils.js.map +1 -0
  25. package/dist/api.d.ts +3 -13
  26. package/dist/api.js +14 -52
  27. package/dist/api.js.map +1 -1
  28. package/dist/commands/deploy.d.ts +8 -2
  29. package/dist/commands/deploy.js +62 -21
  30. package/dist/commands/deploy.js.map +1 -1
  31. package/dist/commands/git/connect.d.ts +13 -0
  32. package/dist/commands/git/connect.js +70 -0
  33. package/dist/commands/git/connect.js.map +1 -0
  34. package/dist/commands/git/disconnect.d.ts +12 -0
  35. package/dist/commands/git/disconnect.js +57 -0
  36. package/dist/commands/git/disconnect.js.map +1 -0
  37. package/dist/commands/git.d.ts +6 -0
  38. package/dist/commands/git.js +17 -0
  39. package/dist/commands/git.js.map +1 -0
  40. package/dist/commands/login.d.ts +6 -0
  41. package/dist/commands/login.js +39 -0
  42. package/dist/commands/login.js.map +1 -0
  43. package/dist/commands/logout.d.ts +6 -0
  44. package/dist/commands/logout.js +20 -0
  45. package/dist/commands/logout.js.map +1 -0
  46. package/dist/commands/telemetry/disable.d.ts +5 -0
  47. package/dist/commands/telemetry/disable.js +14 -0
  48. package/dist/commands/telemetry/disable.js.map +1 -0
  49. package/dist/commands/telemetry/enable.d.ts +5 -0
  50. package/dist/commands/telemetry/enable.js +13 -0
  51. package/dist/commands/telemetry/enable.js.map +1 -0
  52. package/dist/commands/telemetry/status.d.ts +5 -0
  53. package/dist/commands/telemetry/status.js +19 -0
  54. package/dist/commands/telemetry/status.js.map +1 -0
  55. package/dist/commands/whoami.d.ts +6 -0
  56. package/dist/commands/whoami.js +25 -0
  57. package/dist/commands/whoami.js.map +1 -0
  58. package/dist/env.d.ts +4 -0
  59. package/dist/env.js +10 -0
  60. package/dist/env.js.map +1 -0
  61. package/dist/lib/alpic-command.d.ts +6 -0
  62. package/dist/lib/alpic-command.js +27 -0
  63. package/dist/lib/alpic-command.js.map +1 -0
  64. package/dist/lib/auth/auth.d.ts +2 -0
  65. package/dist/lib/auth/auth.js +21 -0
  66. package/dist/lib/auth/auth.js.map +1 -0
  67. package/dist/lib/auth/oauth/client.d.ts +28 -0
  68. package/dist/lib/auth/oauth/client.js +110 -0
  69. package/dist/lib/auth/oauth/client.js.map +1 -0
  70. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  71. package/dist/lib/auth/oauth/constants.js +3 -0
  72. package/dist/lib/auth/oauth/constants.js.map +1 -0
  73. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  74. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  75. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  76. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  77. package/dist/lib/auth/oauth/server/index.js +102 -0
  78. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  79. package/dist/lib/auth/whoami.d.ts +28 -0
  80. package/dist/lib/auth/whoami.js +35 -0
  81. package/dist/lib/auth/whoami.js.map +1 -0
  82. package/dist/lib/base-workflow.d.ts +10 -0
  83. package/dist/lib/base-workflow.js +22 -0
  84. package/dist/lib/base-workflow.js.map +1 -0
  85. package/dist/lib/deployment.d.ts +21 -0
  86. package/dist/lib/deployment.js +54 -0
  87. package/dist/lib/deployment.js.map +1 -0
  88. package/dist/lib/git.d.ts +22 -0
  89. package/dist/lib/git.js +134 -0
  90. package/dist/lib/git.js.map +1 -0
  91. package/dist/lib/global-store.d.ts +28 -0
  92. package/dist/lib/global-store.js +75 -0
  93. package/dist/lib/global-store.js.map +1 -0
  94. package/dist/lib/project.d.ts +71 -10
  95. package/dist/lib/project.js +278 -124
  96. package/dist/lib/project.js.map +1 -1
  97. package/dist/lib/telemetry.d.ts +7 -0
  98. package/dist/lib/telemetry.js +66 -0
  99. package/dist/lib/telemetry.js.map +1 -0
  100. package/dist/posthog.d.ts +3 -0
  101. package/dist/posthog.js +10 -0
  102. package/dist/posthog.js.map +1 -0
  103. package/dist/types.d.ts +0 -34
  104. package/package.json +32 -10
@@ -0,0 +1,134 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { execFileSync } from "node:child_process";
4
+ import { BaseWorkflow } from "./base-workflow.js";
5
+ function runGit(args, cwd) {
6
+ return execFileSync("git", args, {
7
+ cwd,
8
+ encoding: "utf8",
9
+ stdio: ["ignore", "pipe", "pipe"],
10
+ }).trim();
11
+ }
12
+ export function isGitRepository(cwd) {
13
+ try {
14
+ return runGit(["rev-parse", "--is-inside-work-tree"], cwd) === "true";
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export function listGithubRemotes(cwd) {
21
+ let output;
22
+ try {
23
+ output = runGit(["remote", "-v"], cwd);
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ const remotes = new Map();
29
+ for (const line of output.split(/\r?\n/)) {
30
+ const match = line.match(/^(\S+)\s+(\S+)\s+\((fetch|push)\)$/);
31
+ if (!match)
32
+ continue;
33
+ const name = match[1];
34
+ const url = match[2];
35
+ const kind = match[3];
36
+ if (!name || !url || !kind)
37
+ continue;
38
+ if (kind !== "fetch")
39
+ continue;
40
+ const key = `${name}:${url}`;
41
+ const sourceRepository = parseGitHubSourceRepository(url);
42
+ if (sourceRepository) {
43
+ remotes.set(key, {
44
+ name,
45
+ url,
46
+ sourceRepository,
47
+ });
48
+ }
49
+ }
50
+ return [...remotes.values()];
51
+ }
52
+ export async function confirmLinkAnotherIfAlreadyConnected(project) {
53
+ if (!project.sourceRepository) {
54
+ return true;
55
+ }
56
+ p.log.info(`Project "${project.name}" is already connected to "${project.sourceRepository}".`);
57
+ const confirm = await p.confirm({
58
+ message: chalk.bold("Do you want to link another repository?"),
59
+ initialValue: false,
60
+ });
61
+ if (p.isCancel(confirm) || !confirm) {
62
+ p.cancel("Git connect cancelled");
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ export class GitWorkflow extends BaseWorkflow {
68
+ async confirmDisconnect(sourceRepository, projectName) {
69
+ const confirmed = await this.confirm({
70
+ message: `Are you sure you want to disconnect ${chalk.bold(sourceRepository)} from project ${chalk.bold(projectName)}?`,
71
+ initialValue: false,
72
+ });
73
+ if (p.isCancel(confirmed))
74
+ return false;
75
+ return confirmed === true;
76
+ }
77
+ async selectRemoteSourceRepository(remotes) {
78
+ if (remotes.length === 0) {
79
+ return null;
80
+ }
81
+ if (this.flags.remoteName) {
82
+ const remote = remotes.find((remote) => remote.name === this.flags.remoteName);
83
+ if (!remote) {
84
+ const available = remotes.map((remote) => remote.name).join(", ");
85
+ throw new Error(`Remote "${this.flags.remoteName}" not found. Available remotes: ${available}`);
86
+ }
87
+ return remote.sourceRepository;
88
+ }
89
+ if (this.isNonInteractive()) {
90
+ if (remotes.length !== 1) {
91
+ throw new Error("Multiple remotes found. Use --remote-name to select a specific remote.");
92
+ }
93
+ const singleRemote = remotes.at(0);
94
+ if (!singleRemote) {
95
+ throw new Error("No remote found.");
96
+ }
97
+ return singleRemote.sourceRepository;
98
+ }
99
+ const selected = await p.select({
100
+ message: chalk.bold("Choose the remote source to connect"),
101
+ options: remotes.map((remote) => ({
102
+ value: remote.sourceRepository,
103
+ label: `${remote.sourceRepository} (${remote.name})`,
104
+ hint: remote.url,
105
+ })),
106
+ });
107
+ if (p.isCancel(selected)) {
108
+ return null;
109
+ }
110
+ return selected;
111
+ }
112
+ }
113
+ export function showGitSetupInstructions() {
114
+ p.note([
115
+ `Run ${chalk.cyan("git init")} in this directory`,
116
+ `Add a remote: ${chalk.cyan("git remote add origin <your-repo-url>")}`,
117
+ `Then run ${chalk.cyan("alpic git connect")} again`,
118
+ ].join("\n"), "To set up a git repository:", { format: (line) => line });
119
+ }
120
+ function parseGitHubSourceRepository(url) {
121
+ const patterns = [
122
+ /^git@github\.com:([^/\s]+\/[^/\s]+?)(?:\.git)?$/,
123
+ /^https:\/\/github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
124
+ /^ssh:\/\/git@github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
125
+ ];
126
+ for (const pattern of patterns) {
127
+ const match = url.match(pattern);
128
+ if (match) {
129
+ return match[1] ?? null;
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ //# 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,71 @@
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>;
1
+ import type { RouterOutput, Runtime } from "@alpic-ai/api";
2
+ import type { ProjectConfig } from "../types.js";
3
+ import { BaseWorkflow } from "./base-workflow.js";
4
+ export type ProjectFlags = {
5
+ yes?: boolean;
6
+ projectName?: string;
7
+ runtime?: Runtime;
8
+ rootDir?: string;
9
+ };
10
+ export declare class ProjectWorkflow extends BaseWorkflow<ProjectFlags> {
11
+ selectEnvironmentFromList(environments: RouterOutput["projects"]["get"]["v1"]["environments"]): Promise<(typeof environments)[number] | null>;
12
+ selectProjectFromList(projects: RouterOutput["projects"]["list"]["v1"]): Promise<{
13
+ id: string;
14
+ name: string;
15
+ teamId: string;
16
+ sourceRepository: string | null;
17
+ runtime: "python3.13" | "python3.14" | "node22" | "node24";
18
+ transport: "stdio" | "sse" | "streamablehttp" | null;
19
+ rootDirectory: string | null;
20
+ buildCommand: string | null;
21
+ buildOutputDir: string | null;
22
+ installCommand: string | null;
23
+ startCommand: string | null;
24
+ createdAt: Date;
25
+ productionEnvironment: {
26
+ id: string;
27
+ name: string;
28
+ mcpServerUrl: string;
29
+ domains: {
30
+ domain: string;
31
+ status: "ongoing" | "deployed" | "failed";
32
+ createdAt: Date;
33
+ }[];
34
+ latestDeployment: {
35
+ id: string;
36
+ status: "ongoing" | "deployed" | "failed" | "canceled";
37
+ sourceCommitId: string | null;
38
+ sourceCommitMessage: string | null;
39
+ completedAt: Date | null;
40
+ } | null;
41
+ } | null;
42
+ environments: {
43
+ id: string;
44
+ name: string;
45
+ sourceBranch: string | null;
46
+ mcpServerUrl: string;
47
+ createdAt: Date;
48
+ projectId: string;
49
+ latestDeployment: {
50
+ id: string;
51
+ status: "ongoing" | "deployed" | "failed" | "canceled";
52
+ sourceCommitId: string | null;
53
+ sourceCommitMessage: string | null;
54
+ completedAt: Date | null;
55
+ } | null;
56
+ }[];
57
+ } | null>;
58
+ promptRootDirectory(deployDir: string): Promise<string | null>;
59
+ private directoryExists;
60
+ private detectRuntime;
61
+ confirmDeployWithExistingConfig(existingConfig: ProjectConfig): Promise<boolean | null>;
62
+ confirmDeployDirectory(deployDir: string): Promise<boolean>;
63
+ confirmLinkExisting(): Promise<boolean>;
64
+ confirmLinkToAnotherProject(): Promise<boolean>;
65
+ resolveProjectForDeploy(deployDir: string): Promise<(ProjectConfig & {
66
+ environmentId: string;
67
+ }) | null>;
68
+ private resolveEnvironmentForProject;
69
+ private runCreateProjectFlow;
70
+ private runLinkingFlow;
71
+ }