@glubean/cli 0.7.0 → 0.8.1

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 (42) hide show
  1. package/dist/commands/init.d.ts.map +1 -1
  2. package/dist/commands/init.js +24 -0
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/load.d.ts +65 -0
  5. package/dist/commands/load.d.ts.map +1 -0
  6. package/dist/commands/load.js +462 -0
  7. package/dist/commands/load.js.map +1 -0
  8. package/dist/commands/login.d.ts +14 -1
  9. package/dist/commands/login.d.ts.map +1 -1
  10. package/dist/commands/login.js +110 -49
  11. package/dist/commands/login.js.map +1 -1
  12. package/dist/commands/run.d.ts +14 -2
  13. package/dist/commands/run.d.ts.map +1 -1
  14. package/dist/commands/run.js +216 -122
  15. package/dist/commands/run.js.map +1 -1
  16. package/dist/lib/auth.d.ts +57 -0
  17. package/dist/lib/auth.d.ts.map +1 -1
  18. package/dist/lib/auth.js +134 -1
  19. package/dist/lib/auth.js.map +1 -1
  20. package/dist/lib/config.d.ts +17 -6
  21. package/dist/lib/config.d.ts.map +1 -1
  22. package/dist/lib/config.js +9 -2
  23. package/dist/lib/config.js.map +1 -1
  24. package/dist/lib/constants.d.ts +6 -1
  25. package/dist/lib/constants.d.ts.map +1 -1
  26. package/dist/lib/constants.js +6 -1
  27. package/dist/lib/constants.js.map +1 -1
  28. package/dist/lib/print-plan.d.ts.map +1 -1
  29. package/dist/lib/print-plan.js +4 -0
  30. package/dist/lib/print-plan.js.map +1 -1
  31. package/dist/lib/upload.d.ts +88 -10
  32. package/dist/lib/upload.d.ts.map +1 -1
  33. package/dist/lib/upload.js +117 -188
  34. package/dist/lib/upload.js.map +1 -1
  35. package/dist/main.d.ts.map +1 -1
  36. package/dist/main.js +57 -7
  37. package/dist/main.js.map +1 -1
  38. package/package.json +6 -6
  39. package/dist/lib/env.d.ts +0 -29
  40. package/dist/lib/env.d.ts.map +0 -1
  41. package/dist/lib/env.js +0 -59
  42. package/dist/lib/env.js.map +0 -1
@@ -1,8 +1,16 @@
1
1
  /**
2
- * glubean login — Authenticate with Glubean Cloud.
2
+ * glubean login — Sign the CLI in to Glubean Cloud via the device-authorization
3
+ * grant (RFC 8628). The CLI requests a code from the AUTH plane (server-hono),
4
+ * opens the browser to approve it, polls until a `glb_` token is minted, and
5
+ * saves it to ~/.glubean/credentials.json for `--upload`.
6
+ *
7
+ * Login talks to the AUTH url (server-hono); uploads talk to the platform API
8
+ * (`GLUBEAN_API_URL`) — two separate planes. The open platform is token-only and
9
+ * has no login of its own.
3
10
  */
4
- import { input, password } from "@inquirer/prompts";
5
- import { resolveApiUrl, writeCredentials } from "../lib/auth.js";
11
+ import { execFile } from "node:child_process";
12
+ import { resolveApiUrl, resolveAuthUrl, writeCredentials, } from "../lib/auth.js";
13
+ import { DEFAULT_API_URL, DEFAULT_AUTH_URL } from "../lib/constants.js";
6
14
  const colors = {
7
15
  reset: "\x1b[0m",
8
16
  green: "\x1b[32m",
@@ -10,66 +18,119 @@ const colors = {
10
18
  dim: "\x1b[2m",
11
19
  bold: "\x1b[1m",
12
20
  yellow: "\x1b[33m",
21
+ cyan: "\x1b[36m",
13
22
  };
23
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
24
+ /** Best-effort: open a URL in the default browser. Failures are ignored — the
25
+ * CLI always prints the URL so the user can open it manually. */
26
+ function openBrowser(url) {
27
+ try {
28
+ if (process.platform === "darwin") {
29
+ execFile("open", [url]);
30
+ }
31
+ else if (process.platform === "win32") {
32
+ execFile("cmd", ["/c", "start", "", url]);
33
+ }
34
+ else {
35
+ execFile("xdg-open", [url]);
36
+ }
37
+ }
38
+ catch {
39
+ // ignored — the URL is printed regardless
40
+ }
41
+ }
42
+ async function persist(token, options, apiUrl, authUrl, defaultProject) {
43
+ // --project wins; otherwise persist the project the grant bound the token to
44
+ // (the org's default), so `glubean run --upload` works without --project.
45
+ const projectId = options.project ?? defaultProject;
46
+ const savedPath = await writeCredentials({
47
+ token,
48
+ projectId,
49
+ apiUrl: apiUrl !== DEFAULT_API_URL ? apiUrl : undefined,
50
+ authUrl: authUrl !== DEFAULT_AUTH_URL ? authUrl : undefined,
51
+ });
52
+ console.log(`${colors.green}Logged in${colors.reset} ${colors.dim}→ credentials saved to ${savedPath}${colors.reset}`);
53
+ if (projectId) {
54
+ console.log(`${colors.dim}Default project: ${projectId}${colors.reset}`);
55
+ console.log(`\n${colors.dim}Run tests and upload: glubean run --upload${colors.reset}`);
56
+ }
57
+ else {
58
+ console.log(`\n${colors.dim}Run tests and upload: glubean run --upload --project <id> (or set GLUBEAN_PROJECT_ID).${colors.reset}`);
59
+ }
60
+ }
14
61
  export async function loginCommand(options) {
62
+ const authUrl = (await resolveAuthUrl(options)).replace(/\/+$/, "");
15
63
  const apiUrl = await resolveApiUrl(options);
16
- let token = options.token;
17
- if (!token) {
18
- const appUrl = apiUrl.replace("api.", "app.");
19
- console.log(`${colors.bold}Create a personal access token:${colors.reset}`);
20
- console.log(` ${colors.dim}${appUrl}/settings/tokens${colors.reset}`);
21
- console.log(` ${colors.dim}This token grants access to all your projects.${colors.reset}`);
22
- console.log(` ${colors.dim}For per-project tokens, use project settings → API keys.${colors.reset}`);
23
- console.log();
24
- token = await password({
25
- message: "Paste your token (gb_...)",
26
- mask: "*",
27
- });
64
+ // Non-interactive escape hatch: persist a token the user already created in the
65
+ // dashboard (Project → Tokens). The upload preflight validates it later.
66
+ if (options.token) {
67
+ await persist(options.token, options, apiUrl, authUrl);
68
+ return;
28
69
  }
29
- if (!token) {
30
- console.error(`${colors.red}Error: No token provided.${colors.reset}`);
31
- process.exit(1);
32
- }
33
- // Validate token via whoami
34
- console.log(`${colors.dim}Validating...${colors.reset}`);
70
+ // 1) Start the device grant.
71
+ let grant;
35
72
  try {
36
- const resp = await fetch(`${apiUrl}/open/v1/whoami`, {
37
- headers: { Authorization: `Bearer ${token}` },
73
+ const resp = await fetch(`${authUrl}/cli/device/code`, {
74
+ method: "POST",
75
+ headers: { "content-type": "application/json" },
38
76
  });
39
77
  if (!resp.ok) {
40
- const body = await resp.text();
41
- console.error(`${colors.red}Authentication failed (${resp.status}): ${body}${colors.reset}`);
78
+ console.error(`${colors.red}Could not start login (${resp.status}) at ${authUrl}.${colors.reset}`);
79
+ console.error(`${colors.dim}Check --auth-url / GLUBEAN_AUTH_URL points at the Glubean auth server.${colors.reset}`);
42
80
  process.exit(1);
43
81
  }
44
- const whoami = await resp.json();
45
- const identity = whoami.kind === "user"
46
- ? `user ${whoami.userId}`
47
- : `project ${whoami.projectName ?? whoami.projectId}`;
48
- console.log(`${colors.green}Authenticated as ${identity}${colors.reset}`);
82
+ grant = (await resp.json());
49
83
  }
50
84
  catch (err) {
51
- console.error(`${colors.red}Failed to reach ${apiUrl}: ${err instanceof Error ? err.message : err}${colors.reset}`);
85
+ console.error(`${colors.red}Cannot reach ${authUrl}: ${err instanceof Error ? err.message : err}${colors.reset}`);
52
86
  process.exit(1);
53
87
  }
54
- // Resolve project ID: flag interactive prompt
55
- let projectId = options.project;
56
- if (!projectId) {
57
- projectId = await input({
58
- message: "Project ID (optional, from project settings)",
59
- default: "",
60
- });
61
- if (projectId === "")
62
- projectId = undefined;
88
+ // 2) Show the code + open the browser.
89
+ const openUrl = grant.verification_uri_complete ?? grant.verification_uri;
90
+ console.log(`\n${colors.bold}Authorize the Glubean CLI${colors.reset}`);
91
+ console.log(` ${colors.dim}Open:${colors.reset} ${colors.cyan}${grant.verification_uri}${colors.reset}`);
92
+ console.log(` ${colors.dim}Code:${colors.reset} ${colors.bold}${grant.user_code}${colors.reset}\n`);
93
+ if (options.noBrowser) {
94
+ console.log(`${colors.dim}Open the URL above and enter the code.${colors.reset}`);
63
95
  }
64
- const savedPath = await writeCredentials({
65
- token,
66
- projectId,
67
- apiUrl: apiUrl !== "https://api.glubean.com" ? apiUrl : undefined,
68
- });
69
- console.log(`${colors.green}Credentials saved${colors.reset} ${colors.dim}→ ${savedPath}${colors.reset}`);
70
- if (projectId) {
71
- console.log(`${colors.dim}Default project: ${projectId}${colors.reset}`);
96
+ else {
97
+ console.log(`${colors.dim}Opening your browser…${colors.reset}`);
98
+ openBrowser(openUrl);
99
+ }
100
+ // 3) Poll until approved / denied / expired (or the grant times out).
101
+ const intervalMs = Math.max(1, grant.interval) * 1000;
102
+ const deadline = Date.now() + Math.max(1, grant.expires_in) * 1000;
103
+ console.log(`${colors.dim}Waiting for approval…${colors.reset}`);
104
+ while (Date.now() < deadline) {
105
+ await sleep(intervalMs);
106
+ let poll;
107
+ try {
108
+ const resp = await fetch(`${authUrl}/cli/device/token`, {
109
+ method: "POST",
110
+ headers: { "content-type": "application/json" },
111
+ body: JSON.stringify({ device_code: grant.device_code }),
112
+ });
113
+ if (!resp.ok)
114
+ continue; // transient — keep polling
115
+ poll = (await resp.json());
116
+ }
117
+ catch {
118
+ continue; // transient network blip — keep polling
119
+ }
120
+ if (poll.status === "approved" && poll.token) {
121
+ await persist(poll.token, options, apiUrl, authUrl, poll.projectId);
122
+ return;
123
+ }
124
+ if (poll.status === "denied") {
125
+ console.error(`${colors.red}Login denied in the browser.${colors.reset}`);
126
+ process.exit(1);
127
+ }
128
+ if (poll.status === "expired") {
129
+ console.error(`${colors.red}The login code expired. Run 'glubean login' again.${colors.reset}`);
130
+ process.exit(1);
131
+ }
72
132
  }
73
- console.log(`\n${colors.dim}Run tests and upload: glubean run --upload${colors.reset}`);
133
+ console.error(`${colors.red}Timed out waiting for approval. Run 'glubean login' again.${colors.reset}`);
134
+ process.exit(1);
74
135
  }
75
136
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { GlubeanFileKind } from "@glubean/scanner";
1
2
  interface RunOptions {
2
3
  filter?: string;
3
4
  pick?: string;
@@ -44,6 +45,13 @@ interface RunOptions {
44
45
  upload?: boolean;
45
46
  uploadReceiptJson?: string;
46
47
  project?: string;
48
+ /**
49
+ * Upload TARGET (the API/system under test the runs belong to). Resolved from
50
+ * the profile's `upload.targetId` (or `GLUBEAN_TARGET_ID`). When unset, the
51
+ * upload routes to the project's default target (resolved server-side at
52
+ * upload time). Runs live under a target — see auth.ts `resolveTargetId`.
53
+ */
54
+ target?: string;
47
55
  token?: string;
48
56
  /** Env var name holding this profile's upload token (from upload.tokenEnv). */
49
57
  tokenEnv?: string;
@@ -108,6 +116,10 @@ interface RunOptions {
108
116
  */
109
117
  thresholds?: import("@glubean/sdk").ThresholdConfig;
110
118
  }
119
+ export declare function findProjectConfig(startDir: string): Promise<{
120
+ rootDir: string;
121
+ configPath?: string;
122
+ }>;
111
123
  /**
112
124
  * Map a file path to its Glubean kind by extension.
113
125
  * - `.test.ts` → "test"
@@ -120,7 +132,7 @@ interface RunOptions {
120
132
  * Returns undefined for non-Glubean files. The suite.kinds filter in
121
133
  * resolveTestFiles uses this to keep only files whose kind matches.
122
134
  */
123
- export type GlubeanFileKind = "test" | "contract" | "flow" | "bootstrap";
135
+ export type { GlubeanFileKind };
124
136
  export declare function classifyGlubeanFile(filePath: string): GlubeanFileKind | undefined;
125
137
  /**
126
138
  * Per-suite resolution helper exposed for main.ts. Resolves a suite's
@@ -174,6 +186,7 @@ export declare function discoverTests(filePath: string): Promise<DiscoveredTest[
174
186
  export declare const __testing: {
175
187
  matchesTags: (testItem: DiscoveredTest, tags: string[], mode?: "or" | "and" | undefined) => boolean;
176
188
  matchesExcludeTags: (testItem: DiscoveredTest, excludeTags: string[]) => boolean;
189
+ isGlubeanTestFile: (name: string) => boolean;
177
190
  };
178
191
  declare function matchesTags(testItem: DiscoveredTest, tags: string[], mode?: "or" | "and"): boolean;
179
192
  /**
@@ -183,5 +196,4 @@ declare function matchesTags(testItem: DiscoveredTest, tags: string[], mode?: "o
183
196
  */
184
197
  declare function matchesExcludeTags(testItem: DiscoveredTest, excludeTags: string[]): boolean;
185
198
  export declare function runCommand(target: string | string[], options?: RunOptions): Promise<void>;
186
- export {};
187
199
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}