alpic 0.0.0-dev.f1a6945 → 0.0.0-dev.f1f9e99

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 (179) hide show
  1. package/README.md +40 -0
  2. package/bin/run.js +5 -0
  3. package/dist/__tests__/audit.e2e.test.d.ts +1 -0
  4. package/dist/__tests__/audit.e2e.test.js +562 -0
  5. package/dist/__tests__/audit.e2e.test.js.map +1 -0
  6. package/dist/__tests__/auth.e2e.test.js +38 -18
  7. package/dist/__tests__/auth.e2e.test.js.map +1 -1
  8. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  9. package/dist/__tests__/deploy-flags.e2e.test.js +228 -0
  10. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  11. package/dist/__tests__/deploy.e2e.test.js +34 -66
  12. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  13. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/deployment-inspect.e2e.test.js +119 -0
  15. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  16. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  17. package/dist/__tests__/deployment-list.e2e.test.js +121 -0
  18. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  19. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  20. package/dist/__tests__/deployment-logs.e2e.test.js +260 -0
  21. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +264 -0
  24. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  25. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  26. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +144 -0
  27. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  28. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  29. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +155 -0
  30. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  31. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  32. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +347 -0
  33. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  34. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  35. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  36. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  37. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  38. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  39. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  40. package/dist/__tests__/git-flags.e2e.test.js +129 -0
  41. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  42. package/dist/__tests__/git.e2e.test.js +25 -17
  43. package/dist/__tests__/git.e2e.test.js.map +1 -1
  44. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  45. package/dist/__tests__/link.e2e.test.js +284 -0
  46. package/dist/__tests__/link.e2e.test.js.map +1 -0
  47. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  48. package/dist/__tests__/logs.e2e.test.js +231 -0
  49. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  50. package/dist/__tests__/mock-server.d.ts +23 -0
  51. package/dist/__tests__/mock-server.js +330 -21
  52. package/dist/__tests__/mock-server.js.map +1 -1
  53. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  54. package/dist/__tests__/publish.e2e.test.js +510 -0
  55. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  56. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  57. package/dist/__tests__/tunnel.e2e.test.js +66 -0
  58. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  59. package/dist/__tests__/utils.d.ts +17 -5
  60. package/dist/__tests__/utils.js +118 -24
  61. package/dist/__tests__/utils.js.map +1 -1
  62. package/dist/api.d.ts +1 -1
  63. package/dist/api.js +10 -3
  64. package/dist/api.js.map +1 -1
  65. package/dist/commands/audit.d.ts +14 -0
  66. package/dist/commands/audit.js +49 -0
  67. package/dist/commands/audit.js.map +1 -0
  68. package/dist/commands/deploy.d.ts +8 -2
  69. package/dist/commands/deploy.js +64 -25
  70. package/dist/commands/deploy.js.map +1 -1
  71. package/dist/commands/deployment/inspect.d.ts +11 -0
  72. package/dist/commands/deployment/inspect.js +91 -0
  73. package/dist/commands/deployment/inspect.js.map +1 -0
  74. package/dist/commands/deployment/list.d.ts +11 -0
  75. package/dist/commands/deployment/list.js +97 -0
  76. package/dist/commands/deployment/list.js.map +1 -0
  77. package/dist/commands/deployment/logs.d.ts +12 -0
  78. package/dist/commands/deployment/logs.js +50 -0
  79. package/dist/commands/deployment/logs.js.map +1 -0
  80. package/dist/commands/environment-variable/add.d.ts +14 -0
  81. package/dist/commands/environment-variable/add.js +47 -0
  82. package/dist/commands/environment-variable/add.js.map +1 -0
  83. package/dist/commands/environment-variable/list.d.ts +9 -0
  84. package/dist/commands/environment-variable/list.js +45 -0
  85. package/dist/commands/environment-variable/list.js.map +1 -0
  86. package/dist/commands/environment-variable/remove.d.ts +11 -0
  87. package/dist/commands/environment-variable/remove.js +33 -0
  88. package/dist/commands/environment-variable/remove.js.map +1 -0
  89. package/dist/commands/environment-variable/update.d.ts +13 -0
  90. package/dist/commands/environment-variable/update.js +41 -0
  91. package/dist/commands/environment-variable/update.js.map +1 -0
  92. package/dist/commands/git/connect.d.ts +3 -2
  93. package/dist/commands/git/connect.js +29 -28
  94. package/dist/commands/git/connect.js.map +1 -1
  95. package/dist/commands/git/disconnect.d.ts +2 -2
  96. package/dist/commands/git/disconnect.js +20 -26
  97. package/dist/commands/git/disconnect.js.map +1 -1
  98. package/dist/commands/git.js +2 -2
  99. package/dist/commands/git.js.map +1 -1
  100. package/dist/commands/link.d.ts +17 -0
  101. package/dist/commands/link.js +101 -0
  102. package/dist/commands/link.js.map +1 -0
  103. package/dist/commands/login.js +4 -22
  104. package/dist/commands/login.js.map +1 -1
  105. package/dist/commands/logs.d.ts +16 -0
  106. package/dist/commands/logs.js +96 -0
  107. package/dist/commands/logs.js.map +1 -0
  108. package/dist/commands/publish.d.ts +15 -0
  109. package/dist/commands/publish.js +51 -0
  110. package/dist/commands/publish.js.map +1 -0
  111. package/dist/commands/tunnel.d.ts +10 -0
  112. package/dist/commands/tunnel.js +132 -0
  113. package/dist/commands/tunnel.js.map +1 -0
  114. package/dist/commands/whoami.js +2 -14
  115. package/dist/commands/whoami.js.map +1 -1
  116. package/dist/lib/alpic-command.d.ts +2 -0
  117. package/dist/lib/alpic-command.js +13 -5
  118. package/dist/lib/alpic-command.js.map +1 -1
  119. package/dist/lib/archive.d.ts +3 -3
  120. package/dist/lib/archive.js +21 -19
  121. package/dist/lib/archive.js.map +1 -1
  122. package/dist/lib/audit.d.ts +16 -0
  123. package/dist/lib/audit.js +245 -0
  124. package/dist/lib/audit.js.map +1 -0
  125. package/dist/lib/auth/auth.d.ts +3 -0
  126. package/dist/lib/auth/auth.js +23 -0
  127. package/dist/lib/auth/auth.js.map +1 -1
  128. package/dist/lib/auth/oauth/server/index.d.ts +2 -1
  129. package/dist/lib/auth/oauth/server/index.js +33 -7
  130. package/dist/lib/auth/oauth/server/index.js.map +1 -1
  131. package/dist/lib/auth/whoami.d.ts +1 -28
  132. package/dist/lib/auth/whoami.js +27 -17
  133. package/dist/lib/auth/whoami.js.map +1 -1
  134. package/dist/lib/base-workflow.d.ts +10 -0
  135. package/dist/lib/base-workflow.js +22 -0
  136. package/dist/lib/base-workflow.js.map +1 -0
  137. package/dist/lib/config.d.ts +3 -2
  138. package/dist/lib/config.js +8 -7
  139. package/dist/lib/config.js.map +1 -1
  140. package/dist/lib/deployment.d.ts +69 -1
  141. package/dist/lib/deployment.js +113 -5
  142. package/dist/lib/deployment.js.map +1 -1
  143. package/dist/lib/environment-variable.d.ts +37 -0
  144. package/dist/lib/environment-variable.js +299 -0
  145. package/dist/lib/environment-variable.js.map +1 -0
  146. package/dist/lib/git.d.ts +12 -4
  147. package/dist/lib/git.js +52 -26
  148. package/dist/lib/git.js.map +1 -1
  149. package/dist/lib/global-store.d.ts +1 -1
  150. package/dist/lib/global-store.js +4 -3
  151. package/dist/lib/global-store.js.map +1 -1
  152. package/dist/lib/link.d.ts +83 -0
  153. package/dist/lib/link.js +387 -0
  154. package/dist/lib/link.js.map +1 -0
  155. package/dist/lib/logs.d.ts +20 -0
  156. package/dist/lib/logs.js +87 -0
  157. package/dist/lib/logs.js.map +1 -0
  158. package/dist/lib/publish.d.ts +22 -0
  159. package/dist/lib/publish.js +185 -0
  160. package/dist/lib/publish.js.map +1 -0
  161. package/dist/lib/resolve.d.ts +6 -0
  162. package/dist/lib/resolve.js +26 -0
  163. package/dist/lib/resolve.js.map +1 -0
  164. package/dist/lib/table.d.ts +8 -0
  165. package/dist/lib/table.js +27 -0
  166. package/dist/lib/table.js.map +1 -0
  167. package/dist/lib/telemetry.js +1 -1
  168. package/dist/lib/telemetry.js.map +1 -1
  169. package/dist/lib/utils.d.ts +5 -0
  170. package/dist/lib/utils.js +53 -0
  171. package/dist/lib/utils.js.map +1 -0
  172. package/dist/lib/utils.test.d.ts +1 -0
  173. package/dist/lib/utils.test.js +27 -0
  174. package/dist/lib/utils.test.js.map +1 -0
  175. package/dist/types.d.ts +1 -0
  176. package/package.json +27 -20
  177. package/dist/lib/project.d.ts +0 -67
  178. package/dist/lib/project.js +0 -285
  179. package/dist/lib/project.js.map +0 -1
@@ -0,0 +1,132 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Flags } from "@oclif/core";
3
+ import chalk from "chalk";
4
+ import { pipenet } from "pipenet";
5
+ import { api } from "../api.js";
6
+ import { AlpicCommand } from "../lib/alpic-command.js";
7
+ import { oauthLogin } from "../lib/auth/auth.js";
8
+ import { oAuthClient } from "../lib/auth/oauth/client.js";
9
+ export class Tunnel extends AlpicCommand {
10
+ static description = "Expose a local server to the internet through an Alpic tunnel";
11
+ static examples = ["<%= config.bin %> tunnel --port 3000"];
12
+ static flags = {
13
+ port: Flags.integer({
14
+ description: "Local port to tunnel",
15
+ required: true,
16
+ }),
17
+ plain: Flags.boolean({
18
+ description: "Disable rich formatting",
19
+ required: false,
20
+ }),
21
+ };
22
+ async run() {
23
+ const { flags } = await this.parse(Tunnel);
24
+ const isPlain = flags.plain;
25
+ let token = await oAuthClient.getValidAccessToken();
26
+ if (!token) {
27
+ const msg = "You need to be logged in to use the Alpic tunnel";
28
+ if (isPlain) {
29
+ console.log(msg);
30
+ }
31
+ else {
32
+ p.log.step(msg);
33
+ }
34
+ await oauthLogin({ isPlain });
35
+ token = await oAuthClient.getValidAccessToken();
36
+ }
37
+ if (!token) {
38
+ throw new Error("Cannot get valid access token");
39
+ }
40
+ let spinner;
41
+ const intro = "Opening tunnel...";
42
+ if (isPlain) {
43
+ console.log(intro);
44
+ }
45
+ else {
46
+ spinner = p.spinner();
47
+ spinner.start(intro);
48
+ }
49
+ const { ticket, tunnelHost, subdomain } = await api.tunnels.getTicket.v1(undefined, {
50
+ context: {
51
+ request: {
52
+ headers: {
53
+ Authorization: `Bearer ${token?.access_token}`,
54
+ },
55
+ },
56
+ },
57
+ });
58
+ // terrible ux but pipenet client retries forever on error
59
+ // I'll probably open an issue/pr on their repo once I'm sure about the fix
60
+ const proto = tunnelHost.startsWith("localhost") ? "http" : "https";
61
+ const tunnel = await Promise.race([
62
+ pipenet({
63
+ port: flags.port,
64
+ host: `${proto}://${tunnelHost}`,
65
+ subdomain: subdomain,
66
+ headers: { Authorization: `Bearer ${ticket}` },
67
+ }),
68
+ new Promise((_, reject) => {
69
+ const id = setTimeout(() => reject(new Error("Failed to connect to tunnel server")), 10_000);
70
+ id.unref?.(); // don't keep the event loop alive just for this timer
71
+ }),
72
+ ]);
73
+ const url = `${proto}://${subdomain}.${tunnelHost}`;
74
+ const message = `Forwarding: ${proto}://${subdomain}.${tunnelHost} -> http://localhost:${flags.port}`;
75
+ if (isPlain) {
76
+ console.log(message);
77
+ }
78
+ else {
79
+ spinner?.stop(message);
80
+ p.log.step(`Test it live at ${url}/try`);
81
+ p.log.info("Press Ctrl+C to close the tunnel");
82
+ }
83
+ let activities = [];
84
+ let cursor = 0;
85
+ const pushActivity = (message) => {
86
+ const d = new Date();
87
+ const now = `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}:${String(d.getSeconds()).padStart(2, "0")}.${String(d.getMilliseconds()).padStart(3, "0")}`;
88
+ const activity = `${now} ${message}`;
89
+ activities = [activity, ...activities].slice(0, 5);
90
+ if (process.stdout.isTTY) {
91
+ // Move cursor up and clear previous note box so the next one renders in place
92
+ if (cursor > 0) {
93
+ process.stdout.write(`\x1b[${cursor}A\x1b[J`);
94
+ }
95
+ p.note(activities.join("\n"), "Tunnel activity:");
96
+ // p.note renders 5 extra lines: leading bar, title bar, padding top, padding bottom, bottom bar
97
+ cursor = activities.length + 5;
98
+ }
99
+ else {
100
+ p.log.info(activity);
101
+ }
102
+ };
103
+ // Keep the process alive until Ctrl+C
104
+ await new Promise((resolve) => {
105
+ process.once("SIGINT", () => {
106
+ tunnel.close();
107
+ resolve();
108
+ });
109
+ process.once("SIGTERM", () => {
110
+ tunnel.close();
111
+ resolve();
112
+ });
113
+ tunnel.on("request", (req) => {
114
+ const message = `${req.method} ${req.path}`;
115
+ isPlain ? console.log(message) : pushActivity(message);
116
+ });
117
+ tunnel.on("error", (err) => {
118
+ const message = err.message;
119
+ isPlain ? console.error(message) : pushActivity(chalk.red(message));
120
+ });
121
+ tunnel.on("close", resolve);
122
+ });
123
+ const outro = "Tunnel closed";
124
+ if (isPlain) {
125
+ console.log(outro);
126
+ }
127
+ else {
128
+ p.outro(outro);
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,13 @@
1
1
  import * as p from "@clack/prompts";
2
- import chalk from "chalk";
3
2
  import { AlpicCommand } from "../lib/alpic-command.js";
4
- import { getWhoamiInfo } from "../lib/auth/whoami.js";
3
+ import { getWhoamiInfoMessage } from "../lib/auth/whoami.js";
5
4
  export class Whoami extends AlpicCommand {
6
5
  static description = "Show the current Alpic identity (API key or logged-in user)";
7
6
  static examples = ["<%= config.bin %> whoami"];
8
7
  async run() {
9
8
  await this.parse(Whoami);
10
9
  p.intro("Reading authentication status…");
11
- const info = await getWhoamiInfo();
12
- if (!info) {
13
- p.cancel("Not logged in. Run `alpic login` or set ALPIC_API_KEY.");
14
- return;
15
- }
16
- if (info.method === "api_key") {
17
- const msg = `Authenticated via API key — Team: ${chalk.green(info.team?.name ?? "unknown")}`;
18
- p.outro(msg);
19
- return;
20
- }
21
- const msg = `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
22
- p.outro(msg);
10
+ p.outro(await getWhoamiInfoMessage());
23
11
  }
24
12
  }
25
13
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,CAAC,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YAC7F,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE1C,CAAC,CAAC,KAAK,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACxC,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { Command } from "@oclif/core";
2
2
  export declare abstract class AlpicCommand extends Command {
3
3
  catch(error: unknown): Promise<void>;
4
+ ensureAuthenticated(): Promise<void>;
5
+ protected exitWithErrorMessage(message: string): never;
4
6
  }
@@ -1,17 +1,25 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import { Command } from "@oclif/core";
3
3
  import { ORPCError } from "@orpc/client";
4
+ import { isAuthenticated } from "./auth/auth.js";
4
5
  export class AlpicCommand extends Command {
5
6
  async catch(error) {
6
7
  if (error instanceof ORPCError) {
7
- p.cancel(`An error occurred while connecting to Alpic: ${error.message}`);
8
- return;
8
+ this.exitWithErrorMessage(`An error occurred while connecting to Alpic: ${error.message}`);
9
9
  }
10
10
  if (error instanceof Error) {
11
- p.cancel(error.message);
12
- return;
11
+ this.exitWithErrorMessage(error.message);
13
12
  }
14
- p.cancel(String(error));
13
+ this.exitWithErrorMessage(String(error));
14
+ }
15
+ async ensureAuthenticated() {
16
+ if (!(await isAuthenticated())) {
17
+ this.exitWithErrorMessage("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
18
+ }
19
+ }
20
+ exitWithErrorMessage(message) {
21
+ p.cancel(message);
22
+ this.exit(1);
15
23
  }
16
24
  }
17
25
  //# sourceMappingURL=alpic-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAgB,YAAa,SAAQ,OAAO;IACvC,KAAK,CAAC,KAAK,CAAC,KAAc;QACjC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,gDAAgD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,OAAgB,YAAa,SAAQ,OAAO;IACvC,KAAK,CAAC,KAAK,CAAC,KAAc;QACjC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,gDAAgD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CACvB,sHAAsH,CACvH,CAAC;QACJ,CAAC;IACH,CAAC;IAES,oBAAoB,CAAC,OAAe;QAC5C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
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<{
2
+ export declare function getGitFiles(): string[];
3
+ export declare function getFilesToPack(): string[];
4
+ export declare function createTarArchive(files: string[]): Promise<{
5
5
  tmpDir: string;
6
6
  archivePath: string;
7
7
  }>;
@@ -1,11 +1,11 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
- import { join, resolve } from "node:path";
4
+ import { join } from "node:path";
5
5
  import { create as tarCreate } from "tar";
6
6
  const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
7
- function isGitRepository(dir) {
8
- return existsSync(join(resolve(dir), ".git"));
7
+ function isGitRepository() {
8
+ return existsSync(join(process.cwd(), ".git"));
9
9
  }
10
10
  export function ensureGitAvailable() {
11
11
  try {
@@ -15,10 +15,8 @@ export function ensureGitAvailable() {
15
15
  throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
16
16
  }
17
17
  }
18
- export function getGitFiles(deployDir) {
19
- const dir = resolve(deployDir);
18
+ export function getGitFiles() {
20
19
  const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
21
- cwd: dir,
22
20
  encoding: "utf8",
23
21
  maxBuffer: GIT_FILES_MAX_BUFFER,
24
22
  });
@@ -28,28 +26,32 @@ export function getGitFiles(deployDir) {
28
26
  }
29
27
  return files;
30
28
  }
31
- export function getFilesToPack(deployDir) {
32
- const dir = resolve(deployDir);
33
- if (isGitRepository(dir)) {
34
- return getGitFiles(deployDir);
29
+ export function getFilesToPack() {
30
+ if (isGitRepository()) {
31
+ return getGitFiles();
35
32
  }
36
33
  ensureGitAvailable();
37
- execSync("git init", { cwd: dir });
34
+ execSync("git init", { stdio: "ignore" });
38
35
  try {
39
- return getGitFiles(deployDir);
36
+ return getGitFiles();
40
37
  }
41
38
  finally {
42
- rmSync(join(dir, ".git"), { recursive: true });
39
+ rmSync(join(process.cwd(), ".git"), { recursive: true, force: true });
43
40
  }
44
41
  }
45
- export async function createTarArchive(files, deployDir) {
42
+ export async function createTarArchive(files) {
46
43
  const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
47
44
  const archivePath = join(tmpDir, "source.tar.gz");
48
- await tarCreate({
49
- gzip: true,
50
- file: archivePath,
51
- cwd: deployDir,
52
- }, files);
45
+ try {
46
+ await tarCreate({
47
+ gzip: true,
48
+ file: archivePath,
49
+ }, files);
50
+ }
51
+ catch (error) {
52
+ rmSync(tmpDir, { recursive: true, force: true });
53
+ throw error;
54
+ }
53
55
  return { tmpDir, archivePath };
54
56
  }
55
57
  //# sourceMappingURL=archive.js.map
@@ -1 +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"}
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,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe;IACtB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACjD,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;IACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,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;IAC5B,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,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,IAAI,CAAC;QACH,MAAM,SAAS,CACb;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;SAClB,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { BaseWorkflow } from "./base-workflow.js";
2
+ export type AuditFlags = {
3
+ url?: URL;
4
+ json?: boolean;
5
+ "team-id"?: string;
6
+ "project-id"?: string;
7
+ "environment-id"?: string;
8
+ "non-interactive"?: boolean;
9
+ };
10
+ export declare class AuditWorkflow extends BaseWorkflow<AuditFlags> {
11
+ runAudit(): Promise<number>;
12
+ private validateFlags;
13
+ private resolveStandalone;
14
+ private resolveFromProject;
15
+ private resolveProjectEnvironmentUrl;
16
+ }
@@ -0,0 +1,245 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { api } from "../api.js";
4
+ import { BaseWorkflow } from "./base-workflow.js";
5
+ import { config } from "./config.js";
6
+ import { pollIntervalMs } from "./utils.js";
7
+ const DEFAULT_POLL_INTERVAL_MS = pollIntervalMs(2_000);
8
+ const MAX_POLL_MS = 120_000;
9
+ export class AuditWorkflow extends BaseWorkflow {
10
+ async runAudit() {
11
+ this.validateFlags();
12
+ const target = this.flags.url
13
+ ? this.resolveStandalone()
14
+ : await this.resolveFromProject(this.flags["environment-id"]);
15
+ if (!target) {
16
+ p.cancel("Audit cancelled");
17
+ return 0;
18
+ }
19
+ const { targetUrl, teamId, projectId } = target;
20
+ const spinner = p.spinner();
21
+ p.log.info(`Target URL ${chalk.dim(targetUrl)}`);
22
+ spinner.start("Starting analysis...");
23
+ const { id } = await api.beacon.create.v1({
24
+ targetUrl,
25
+ teamId,
26
+ projectId,
27
+ });
28
+ spinner.stop(`Analysis created ${chalk.dim(id)}`);
29
+ spinner.start("Running checks...");
30
+ const startedAt = Date.now();
31
+ let analysis = await api.beacon.get.v1({ analysisId: id });
32
+ while (analysis.status === "pending" || analysis.status === "partial") {
33
+ if (Date.now() - startedAt > MAX_POLL_MS) {
34
+ spinner.stop("Timed out");
35
+ throw new Error("Analysis timed out after 2 minutes");
36
+ }
37
+ await new Promise((resolve) => setTimeout(resolve, DEFAULT_POLL_INTERVAL_MS));
38
+ analysis = await api.beacon.get.v1({ analysisId: id });
39
+ }
40
+ if (analysis.status === "failed") {
41
+ spinner.stop("Analysis failed");
42
+ throw new Error("The analysis failed. The MCP server may be unreachable.");
43
+ }
44
+ spinner.stop(`Analysis completed in ${chalk.bold(`${analysis.durationMs ?? 0}ms`)}`);
45
+ const report = analysis.report;
46
+ if (!report) {
47
+ throw new Error("Report not available");
48
+ }
49
+ if (this.flags.json) {
50
+ console.log(JSON.stringify(report, null, 2));
51
+ return 0;
52
+ }
53
+ if (report.requiresAuth) {
54
+ p.log.warning(chalk.yellow("This server returned HTTP 401 and requires credentials to connect. Beacon cannot audit authenticated servers yet — all checks have been skipped."));
55
+ return 0;
56
+ }
57
+ return renderReport(report);
58
+ }
59
+ validateFlags() {
60
+ if (this.flags.url && this.flags["project-id"]) {
61
+ throw new Error("--url and --project-id cannot be used together. Use --url for standalone audits or --project-id to audit a project's deployed server.");
62
+ }
63
+ if (this.flags["team-id"] && !this.flags.url) {
64
+ throw new Error("--team-id can only be used with --url for standalone audits.");
65
+ }
66
+ if (this.flags["environment-id"] && this.flags.url) {
67
+ throw new Error("--environment-id cannot be used with --url. Use --environment-id in project mode only.");
68
+ }
69
+ }
70
+ resolveStandalone() {
71
+ const url = this.flags.url;
72
+ if (!url) {
73
+ throw new Error("--url is required in standalone mode.");
74
+ }
75
+ return {
76
+ targetUrl: url.toString(),
77
+ teamId: this.flags["team-id"],
78
+ projectId: undefined,
79
+ };
80
+ }
81
+ async resolveFromProject(environmentId) {
82
+ if (this.flags["project-id"]) {
83
+ return this.resolveProjectEnvironmentUrl(this.flags["project-id"], environmentId, this.isNonInteractive());
84
+ }
85
+ const projectConfig = config.load();
86
+ if (projectConfig) {
87
+ p.log.info(`Using project config from .alpic: project "${projectConfig.projectName}" (team: "${projectConfig.teamName}")`);
88
+ const confirmed = await this.confirm({
89
+ message: `Run audit for project "${projectConfig.projectName}"?`,
90
+ initialValue: true,
91
+ });
92
+ if (p.isCancel(confirmed) || !confirmed) {
93
+ return null;
94
+ }
95
+ return this.resolveProjectEnvironmentUrl(projectConfig.projectId, environmentId ?? projectConfig.environmentId, this.isNonInteractive());
96
+ }
97
+ if (this.isNonInteractive()) {
98
+ throw new Error("Either --url or --project-id is required when using --non-interactive without a linked project");
99
+ }
100
+ const teams = await api.teams.list.v1();
101
+ if (teams.length === 0) {
102
+ throw new Error("No teams found. Create a team in the Alpic dashboard first.");
103
+ }
104
+ const selectedTeamId = await p.select({
105
+ message: chalk.bold("Choose a team"),
106
+ options: teams.map((team) => ({ value: team.id, label: team.name })),
107
+ });
108
+ if (p.isCancel(selectedTeamId)) {
109
+ return null;
110
+ }
111
+ const projects = await api.projects.list.v1({ teamId: selectedTeamId });
112
+ if (projects.length === 0) {
113
+ throw new Error("No projects found for this team.");
114
+ }
115
+ const selectedProjectId = await p.select({
116
+ message: chalk.bold("Choose a project"),
117
+ options: projects.map((project) => ({ value: project.id, label: project.name })),
118
+ });
119
+ if (p.isCancel(selectedProjectId)) {
120
+ return null;
121
+ }
122
+ return this.resolveProjectEnvironmentUrl(selectedProjectId, environmentId, this.isNonInteractive());
123
+ }
124
+ async resolveProjectEnvironmentUrl(projectId, environmentId, nonInteractive) {
125
+ const project = await api.projects.get.v1({ projectId });
126
+ if (project.environments.length === 0) {
127
+ throw new Error("No environments found for this project.");
128
+ }
129
+ if (environmentId) {
130
+ const environment = project.environments.find((env) => env.id === environmentId);
131
+ if (!environment) {
132
+ throw new Error(`Environment "${environmentId}" not found in project "${project.name}".`);
133
+ }
134
+ return { targetUrl: environment.mcpServerUrl, teamId: project.teamId, projectId };
135
+ }
136
+ if (project.environments.length === 1) {
137
+ const environment = project.environments[0];
138
+ if (!environment) {
139
+ throw new Error("No environments found for this project.");
140
+ }
141
+ p.log.info(`Using environment "${environment.name}"`);
142
+ return { targetUrl: environment.mcpServerUrl, teamId: project.teamId, projectId };
143
+ }
144
+ if (nonInteractive) {
145
+ const targetUrl = project.productionEnvironment?.mcpServerUrl;
146
+ if (!targetUrl) {
147
+ throw new Error("Multiple environments found. Use --environment-id to specify which one to audit.");
148
+ }
149
+ p.log.info("Using production environment");
150
+ return { targetUrl, teamId: project.teamId, projectId };
151
+ }
152
+ const selectedEnvironmentId = await p.select({
153
+ message: chalk.bold("Choose an environment"),
154
+ options: project.environments.map((env) => ({ value: env.id, label: env.name })),
155
+ });
156
+ if (p.isCancel(selectedEnvironmentId)) {
157
+ return null;
158
+ }
159
+ const selectedEnvironment = project.environments.find((env) => env.id === selectedEnvironmentId);
160
+ if (!selectedEnvironment) {
161
+ throw new Error("Selected environment not found.");
162
+ }
163
+ return { targetUrl: selectedEnvironment.mcpServerUrl, teamId: project.teamId, projectId };
164
+ }
165
+ }
166
+ const PLATFORM_LABELS = {
167
+ chatgpt: "ChatGPT",
168
+ claudeai: "Claude.ai",
169
+ };
170
+ const CATEGORY_LABELS = {
171
+ connectivity: "Connectivity",
172
+ "tool-metadata": "Tool Metadata",
173
+ "resource-metadata": "Resource Metadata",
174
+ performance: "Performance",
175
+ e2e: "End-to-End",
176
+ };
177
+ function readinessIcon(ready) {
178
+ return ready ? chalk.green("✔ Ready") : chalk.red("✖ Not ready");
179
+ }
180
+ function formatCheckLine(result) {
181
+ const icon = result.severity === "error" ? chalk.red("✖") : chalk.yellow("⚠");
182
+ const lines = [` ${icon} ${result.message}`];
183
+ if (result.hint) {
184
+ lines.push(` ${chalk.dim(result.hint.text)}`);
185
+ }
186
+ return lines.join("\n");
187
+ }
188
+ function renderReport(report) {
189
+ const passed = report.results.filter((result) => result.status === "pass");
190
+ const errors = report.results.filter((result) => result.status === "fail" && result.severity === "error");
191
+ const warnings = report.results.filter((result) => result.status === "fail" && result.severity === "warning");
192
+ const skipped = report.results.filter((result) => result.status === "skip");
193
+ const platformEntries = Object.entries(report.isReadyForPlatform).map(([platform, ready]) => ({
194
+ label: PLATFORM_LABELS[platform] ?? platform,
195
+ ready,
196
+ }));
197
+ const maxLabelLength = platformEntries.reduce((max, entry) => Math.max(max, entry.label.length), 0);
198
+ const platforms = platformEntries
199
+ .map((entry) => `${entry.label.padEnd(maxLabelLength)} ${readinessIcon(entry.ready)}`)
200
+ .join("\n");
201
+ const score = `${chalk.bold(`${passed.length}/${report.results.length}`)} checks passed`;
202
+ const duration = chalk.dim(`${(report.durationMs / 1000).toFixed(1)}s`);
203
+ const summary = [`${score} ${duration}`, "", platforms].join("\n");
204
+ p.box(summary, "Beacon Report", {
205
+ contentAlign: "left",
206
+ titleAlign: "center",
207
+ width: "auto",
208
+ rounded: true,
209
+ contentPadding: 2,
210
+ });
211
+ if (errors.length > 0) {
212
+ p.log.error(chalk.red(`${errors.length} error${errors.length === 1 ? "" : "s"} — must fix before shipping`));
213
+ renderGroupedChecks(errors);
214
+ }
215
+ if (warnings.length > 0) {
216
+ p.log.warning(chalk.yellow(`${warnings.length} warning${warnings.length === 1 ? "" : "s"}`));
217
+ renderGroupedChecks(warnings);
218
+ }
219
+ if (errors.length === 0 && warnings.length === 0) {
220
+ p.log.success("All checks passed");
221
+ }
222
+ if (skipped.length > 0) {
223
+ p.log.info(chalk.dim(`${skipped.length} check${skipped.length === 1 ? "" : "s"} skipped`));
224
+ }
225
+ p.log.info(chalk.dim(report.targetUrl));
226
+ return errors.length > 0 ? 1 : 0;
227
+ }
228
+ function renderGroupedChecks(results) {
229
+ const byCategory = new Map();
230
+ for (const result of results) {
231
+ const existing = byCategory.get(result.category) ?? [];
232
+ existing.push(result);
233
+ byCategory.set(result.category, existing);
234
+ }
235
+ const lines = [];
236
+ for (const [category, categoryResults] of byCategory) {
237
+ const label = CATEGORY_LABELS[category] ?? category;
238
+ lines.push(chalk.dim(` ${label}`));
239
+ for (const result of categoryResults) {
240
+ lines.push(formatCheckLine(result));
241
+ }
242
+ }
243
+ p.log.message(lines.join("\n"));
244
+ }
245
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,5 @@
1
1
  export declare function getApiToken(): Promise<string | undefined>;
2
2
  export declare function isAuthenticated(): Promise<boolean>;
3
+ export declare function oauthLogin(opts?: {
4
+ isPlain?: boolean;
5
+ }): Promise<void>;
@@ -1,4 +1,9 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import open from "open";
4
+ import { globalStore } from "../global-store.js";
1
5
  import { oAuthClient } from "./oauth/client.js";
6
+ import { getLoginPageUrl, listenToOAuthCallback } from "./oauth/server/index.js";
2
7
  export async function getApiToken() {
3
8
  const token = process.env.ALPIC_API_KEY ?? (await oAuthClient.getValidAccessToken())?.access_token;
4
9
  return token;
@@ -18,4 +23,22 @@ function hasApiKey() {
18
23
  async function hasValidAccessToken() {
19
24
  return (await oAuthClient.getValidAccessToken()) !== null;
20
25
  }
26
+ export async function oauthLogin(opts) {
27
+ const { authorizeUrl, state, nonce, codeVerifier } = await oAuthClient.prepareOAuthConfig();
28
+ const loginUrl = getLoginPageUrl();
29
+ if (opts?.isPlain) {
30
+ console.log(`Opening browser to log in: ${loginUrl}`);
31
+ }
32
+ else {
33
+ p.log.message(`Opening browser to log in…\n\nIf the browser does not open, copy this URL: ${chalk.cyan(loginUrl)}`);
34
+ }
35
+ await open(loginUrl);
36
+ const storedToken = await listenToOAuthCallback({
37
+ state,
38
+ nonce,
39
+ codeVerifier,
40
+ authorizeUrl: authorizeUrl.toString(),
41
+ });
42
+ globalStore.saveCredentials(storedToken);
43
+ }
21
44
  //# sourceMappingURL=auth.js.map