@glubean/cli 0.1.2

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 (113) hide show
  1. package/bin/gb.js +2 -0
  2. package/dist/commands/init.d.ts +19 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +842 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/login.d.ts +10 -0
  7. package/dist/commands/login.d.ts.map +1 -0
  8. package/dist/commands/login.js +75 -0
  9. package/dist/commands/login.js.map +1 -0
  10. package/dist/commands/patch.d.ts +8 -0
  11. package/dist/commands/patch.d.ts.map +1 -0
  12. package/dist/commands/patch.js +73 -0
  13. package/dist/commands/patch.js.map +1 -0
  14. package/dist/commands/run.d.ts +26 -0
  15. package/dist/commands/run.d.ts.map +1 -0
  16. package/dist/commands/run.js +1093 -0
  17. package/dist/commands/run.js.map +1 -0
  18. package/dist/commands/scan.d.ts +6 -0
  19. package/dist/commands/scan.d.ts.map +1 -0
  20. package/dist/commands/scan.js +62 -0
  21. package/dist/commands/scan.js.map +1 -0
  22. package/dist/commands/spec_split.d.ts +5 -0
  23. package/dist/commands/spec_split.d.ts.map +1 -0
  24. package/dist/commands/spec_split.js +56 -0
  25. package/dist/commands/spec_split.js.map +1 -0
  26. package/dist/commands/sync.d.ts +13 -0
  27. package/dist/commands/sync.d.ts.map +1 -0
  28. package/dist/commands/sync.js +252 -0
  29. package/dist/commands/sync.js.map +1 -0
  30. package/dist/commands/trigger.d.ts +13 -0
  31. package/dist/commands/trigger.d.ts.map +1 -0
  32. package/dist/commands/trigger.js +213 -0
  33. package/dist/commands/trigger.js.map +1 -0
  34. package/dist/commands/validate_metadata.d.ts +6 -0
  35. package/dist/commands/validate_metadata.d.ts.map +1 -0
  36. package/dist/commands/validate_metadata.js +103 -0
  37. package/dist/commands/validate_metadata.js.map +1 -0
  38. package/dist/commands/worker.d.ts +14 -0
  39. package/dist/commands/worker.d.ts.map +1 -0
  40. package/dist/commands/worker.js +10 -0
  41. package/dist/commands/worker.js.map +1 -0
  42. package/dist/lib/auth.d.ts +39 -0
  43. package/dist/lib/auth.d.ts.map +1 -0
  44. package/dist/lib/auth.js +82 -0
  45. package/dist/lib/auth.js.map +1 -0
  46. package/dist/lib/ci.d.ts +12 -0
  47. package/dist/lib/ci.d.ts.map +1 -0
  48. package/dist/lib/ci.js +42 -0
  49. package/dist/lib/ci.js.map +1 -0
  50. package/dist/lib/config.d.ts +116 -0
  51. package/dist/lib/config.d.ts.map +1 -0
  52. package/dist/lib/config.js +264 -0
  53. package/dist/lib/config.js.map +1 -0
  54. package/dist/lib/constants.d.ts +6 -0
  55. package/dist/lib/constants.d.ts.map +1 -0
  56. package/dist/lib/constants.js +6 -0
  57. package/dist/lib/constants.js.map +1 -0
  58. package/dist/lib/env.d.ts +19 -0
  59. package/dist/lib/env.d.ts.map +1 -0
  60. package/dist/lib/env.js +40 -0
  61. package/dist/lib/env.js.map +1 -0
  62. package/dist/lib/git.d.ts +8 -0
  63. package/dist/lib/git.d.ts.map +1 -0
  64. package/dist/lib/git.js +68 -0
  65. package/dist/lib/git.js.map +1 -0
  66. package/dist/lib/openapi_patch.d.ts +23 -0
  67. package/dist/lib/openapi_patch.d.ts.map +1 -0
  68. package/dist/lib/openapi_patch.js +232 -0
  69. package/dist/lib/openapi_patch.js.map +1 -0
  70. package/dist/lib/openapi_split.d.ts +16 -0
  71. package/dist/lib/openapi_split.d.ts.map +1 -0
  72. package/dist/lib/openapi_split.js +188 -0
  73. package/dist/lib/openapi_split.js.map +1 -0
  74. package/dist/lib/upload.d.ts +44 -0
  75. package/dist/lib/upload.d.ts.map +1 -0
  76. package/dist/lib/upload.js +297 -0
  77. package/dist/lib/upload.js.map +1 -0
  78. package/dist/main.d.ts +8 -0
  79. package/dist/main.d.ts.map +1 -0
  80. package/dist/main.js +319 -0
  81. package/dist/main.js.map +1 -0
  82. package/dist/metadata.d.ts +17 -0
  83. package/dist/metadata.d.ts.map +1 -0
  84. package/dist/metadata.js +61 -0
  85. package/dist/metadata.js.map +1 -0
  86. package/dist/update_check.d.ts +14 -0
  87. package/dist/update_check.d.ts.map +1 -0
  88. package/dist/update_check.js +130 -0
  89. package/dist/update_check.js.map +1 -0
  90. package/dist/version.d.ts +5 -0
  91. package/dist/version.d.ts.map +1 -0
  92. package/dist/version.js +11 -0
  93. package/dist/version.js.map +1 -0
  94. package/package.json +34 -0
  95. package/templates/AI-INSTRUCTIONS.md +163 -0
  96. package/templates/README.md +226 -0
  97. package/templates/claude-skill-glubean-test.md +382 -0
  98. package/templates/data/create-user.json +14 -0
  99. package/templates/data/endpoints.csv +5 -0
  100. package/templates/data/scenarios.yaml +19 -0
  101. package/templates/data/search-examples.json +14 -0
  102. package/templates/data/users.json +17 -0
  103. package/templates/data-driven.test.ts.tpl +118 -0
  104. package/templates/demo.test.result.json +398 -0
  105. package/templates/demo.test.ts.tpl +226 -0
  106. package/templates/explore-api.test.result.json +79 -0
  107. package/templates/minimal/README.md +42 -0
  108. package/templates/minimal-api.test.ts.tpl +42 -0
  109. package/templates/minimal-auth.test.ts.tpl +45 -0
  110. package/templates/minimal-search.test.ts.tpl +34 -0
  111. package/templates/openapi.sample.json +97 -0
  112. package/templates/pick.test.result.json +165 -0
  113. package/templates/pick.test.ts.tpl +126 -0
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Trigger command - triggers a remote run on Glubean Cloud.
3
+ */
4
+ import { resolveApiUrl, resolveProjectId, resolveToken } from "../lib/auth.js";
5
+ import { loadConfig } from "../lib/config.js";
6
+ import { loadProjectEnv } from "../lib/env.js";
7
+ const colors = {
8
+ reset: "\x1b[0m",
9
+ bold: "\x1b[1m",
10
+ dim: "\x1b[2m",
11
+ green: "\x1b[32m",
12
+ yellow: "\x1b[33m",
13
+ blue: "\x1b[34m",
14
+ red: "\x1b[31m",
15
+ cyan: "\x1b[36m",
16
+ };
17
+ async function createRun(projectId, apiUrl, token, bundleId, jobId) {
18
+ const headers = {
19
+ "Content-Type": "application/json",
20
+ };
21
+ if (token)
22
+ headers["Authorization"] = `Bearer ${token}`;
23
+ const body = { projectId };
24
+ if (bundleId)
25
+ body.bundleId = bundleId;
26
+ if (jobId)
27
+ body.jobId = jobId;
28
+ const response = await fetch(`${apiUrl}/data-plane/runs`, {
29
+ method: "POST",
30
+ headers,
31
+ body: JSON.stringify(body),
32
+ });
33
+ if (!response.ok) {
34
+ const error = await response.text();
35
+ throw new Error(`Failed to create run: ${response.status} - ${error}`);
36
+ }
37
+ return response.json();
38
+ }
39
+ async function getRunStatus(runId, apiUrl, token) {
40
+ const headers = {};
41
+ if (token)
42
+ headers["Authorization"] = `Bearer ${token}`;
43
+ const response = await fetch(`${apiUrl}/data-plane/runs/${runId}`, {
44
+ method: "GET",
45
+ headers,
46
+ });
47
+ if (!response.ok) {
48
+ const error = await response.text();
49
+ throw new Error(`Failed to get run status: ${response.status} - ${error}`);
50
+ }
51
+ return response.json();
52
+ }
53
+ async function getRunEvents(runId, apiUrl, token, afterSeq) {
54
+ const headers = {};
55
+ if (token)
56
+ headers["Authorization"] = `Bearer ${token}`;
57
+ const params = new URLSearchParams();
58
+ if (afterSeq !== undefined)
59
+ params.set("afterSeq", String(afterSeq));
60
+ params.set("limit", "100");
61
+ const url = `${apiUrl}/data-plane/runs/${runId}/events?${params.toString()}`;
62
+ const response = await fetch(url, { method: "GET", headers });
63
+ if (!response.ok) {
64
+ const error = await response.text();
65
+ throw new Error(`Failed to get run events: ${response.status} - ${error}`);
66
+ }
67
+ return response.json();
68
+ }
69
+ function formatEvent(event) {
70
+ switch (event.type) {
71
+ case "log":
72
+ return `${colors.dim}${event.message}${colors.reset}`;
73
+ case "assertion": {
74
+ const icon = event.passed ? `${colors.green}✓${colors.reset}` : `${colors.red}✗${colors.reset}`;
75
+ let line = `${icon} ${event.message}`;
76
+ if (!event.passed &&
77
+ (event.expected !== undefined || event.actual !== undefined)) {
78
+ if (event.expected !== undefined) {
79
+ line += `\n ${colors.dim}Expected: ${JSON.stringify(event.expected)}${colors.reset}`;
80
+ }
81
+ if (event.actual !== undefined) {
82
+ line += `\n ${colors.dim}Actual: ${JSON.stringify(event.actual)}${colors.reset}`;
83
+ }
84
+ }
85
+ return line;
86
+ }
87
+ case "trace": {
88
+ const data = event.data;
89
+ if (data) {
90
+ return `${colors.cyan}→ ${data.method} ${data.url} → ${data.status} (${data.duration}ms)${colors.reset}`;
91
+ }
92
+ return null;
93
+ }
94
+ case "step_start":
95
+ return `${colors.blue}▶ ${event.message || "Step started"}${colors.reset}`;
96
+ case "step_end":
97
+ return `${colors.blue}◼ ${event.message || "Step ended"}${colors.reset}`;
98
+ case "error":
99
+ return `${colors.red}✗ Error: ${event.message}${colors.reset}`;
100
+ default:
101
+ return null;
102
+ }
103
+ }
104
+ async function tailEvents(runId, apiUrl, token) {
105
+ let cursor = undefined;
106
+ const terminalStatuses = ["passed", "failed", "cancelled", "exhausted"];
107
+ while (true) {
108
+ try {
109
+ const { events, nextCursor } = await getRunEvents(runId, apiUrl, token, cursor);
110
+ for (const event of events) {
111
+ const formatted = formatEvent(event);
112
+ if (formatted) {
113
+ console.log(` ${formatted}`);
114
+ }
115
+ }
116
+ if (nextCursor !== undefined) {
117
+ cursor = nextCursor;
118
+ }
119
+ }
120
+ catch {
121
+ console.log(`${colors.dim} (polling...)${colors.reset}`);
122
+ }
123
+ const status = await getRunStatus(runId, apiUrl, token);
124
+ if (terminalStatuses.includes(status.status)) {
125
+ return status;
126
+ }
127
+ await new Promise((resolve) => setTimeout(resolve, 2000));
128
+ }
129
+ }
130
+ export async function triggerCommand(options = {}) {
131
+ console.log(`\n${colors.bold}${colors.blue}🚀 Glubean Trigger${colors.reset}\n`);
132
+ const rootDir = process.cwd();
133
+ const config = await loadConfig(rootDir);
134
+ const envFileVars = await loadProjectEnv(rootDir, config.run.envFile);
135
+ const sources = { envFileVars, cloudConfig: config.cloud };
136
+ const authOpts = {
137
+ token: options.token,
138
+ project: options.project,
139
+ apiUrl: options.apiUrl,
140
+ };
141
+ const projectId = await resolveProjectId(authOpts, sources);
142
+ if (!projectId) {
143
+ console.log(`${colors.red}✗ Error: No project ID found.${colors.reset}`);
144
+ console.log(`${colors.dim} Use --project, set GLUBEAN_PROJECT_ID, add to .env, or configure in package.json glubean.cloud.${colors.reset}\n`);
145
+ process.exit(1);
146
+ }
147
+ const apiUrl = (await resolveApiUrl(authOpts, sources)).replace(/\/$/, "");
148
+ const appUrl = apiUrl.replace("api.", "app.").replace(/\/$/, "");
149
+ const token = await resolveToken(authOpts, sources);
150
+ console.log(`${colors.dim}Project: ${colors.reset}${projectId}`);
151
+ if (options.bundle) {
152
+ console.log(`${colors.dim}Bundle: ${colors.reset}${options.bundle}`);
153
+ }
154
+ else {
155
+ console.log(`${colors.dim}Bundle: ${colors.reset}(latest)`);
156
+ }
157
+ if (options.job) {
158
+ console.log(`${colors.dim}Job: ${colors.reset}${options.job}`);
159
+ }
160
+ console.log();
161
+ try {
162
+ console.log(`${colors.cyan}→ Creating run...${colors.reset}`);
163
+ const result = await createRun(projectId, apiUrl, token ?? undefined, options.bundle, options.job);
164
+ console.log(`${colors.green}✓ Run created${colors.reset}`);
165
+ console.log(`${colors.dim} Run ID: ${colors.reset}${result.runId}`);
166
+ console.log(`${colors.dim} Bundle ID: ${colors.reset}${result.bundleId}`);
167
+ console.log();
168
+ const runUrl = `${appUrl}/runs/${result.runId}`;
169
+ console.log(`${colors.bold}View in browser:${colors.reset}`);
170
+ console.log(` ${colors.cyan}${runUrl}${colors.reset}`);
171
+ console.log();
172
+ if (options.follow) {
173
+ console.log(`${colors.bold}Live output:${colors.reset}`);
174
+ console.log(`${colors.dim}─────────────────────────────────────${colors.reset}`);
175
+ const finalStatus = await tailEvents(result.runId, apiUrl, token ?? undefined);
176
+ console.log(`${colors.dim}─────────────────────────────────────${colors.reset}`);
177
+ console.log();
178
+ const statusColor = finalStatus.status === "passed" ? colors.green : colors.red;
179
+ console.log(`${colors.bold}Result:${colors.reset} ${statusColor}${finalStatus.status.toUpperCase()}${colors.reset}`);
180
+ if (finalStatus.summary) {
181
+ const s = finalStatus.summary;
182
+ const parts = [];
183
+ if (s.passed !== undefined) {
184
+ parts.push(`${colors.green}${s.passed} passed${colors.reset}`);
185
+ }
186
+ if (s.failed !== undefined) {
187
+ parts.push(`${colors.red}${s.failed} failed${colors.reset}`);
188
+ }
189
+ if (s.skipped !== undefined) {
190
+ parts.push(`${colors.yellow}${s.skipped} skipped${colors.reset}`);
191
+ }
192
+ if (parts.length > 0) {
193
+ console.log(`${colors.bold}Tests:${colors.reset} ${parts.join(", ")}`);
194
+ }
195
+ if (s.durationMs !== undefined) {
196
+ console.log(`${colors.bold}Time:${colors.reset} ${s.durationMs}ms`);
197
+ }
198
+ }
199
+ console.log();
200
+ if (finalStatus.status !== "passed") {
201
+ process.exit(1);
202
+ }
203
+ }
204
+ else {
205
+ console.log(`${colors.dim}Tip: Use --follow to tail logs in real-time${colors.reset}\n`);
206
+ }
207
+ }
208
+ catch (error) {
209
+ console.log(`${colors.red}✗ ${error instanceof Error ? error.message : error}${colors.reset}`);
210
+ process.exit(1);
211
+ }
212
+ }
213
+ //# sourceMappingURL=trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ValidateMetadataOptions {
2
+ dir?: string;
3
+ metadata?: string;
4
+ }
5
+ export declare function validateMetadataCommand(options?: ValidateMetadataOptions): Promise<void>;
6
+ //# sourceMappingURL=validate_metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_metadata.d.ts","sourceRoot":"","sources":["../../src/commands/validate_metadata.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAqHf"}
@@ -0,0 +1,103 @@
1
+ import { resolve } from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import { createHash } from "node:crypto";
4
+ import { computeRootHash, deriveMetadataStats, normalizeFileMap, normalizeFilePath } from "../metadata.js";
5
+ const colors = {
6
+ reset: "\x1b[0m",
7
+ bold: "\x1b[1m",
8
+ dim: "\x1b[2m",
9
+ green: "\x1b[32m",
10
+ red: "\x1b[31m",
11
+ blue: "\x1b[34m",
12
+ };
13
+ async function sha256(content) {
14
+ const hash = createHash("sha256").update(content).digest("hex");
15
+ return `sha256-${hash}`;
16
+ }
17
+ function compareTags(a, b) {
18
+ if (a.length !== b.length)
19
+ return false;
20
+ const sortedA = [...a].sort();
21
+ const sortedB = [...b].sort();
22
+ return sortedA.every((tag, index) => tag === sortedB[index]);
23
+ }
24
+ export async function validateMetadataCommand(options = {}) {
25
+ const dir = options.dir ? resolve(options.dir) : process.cwd();
26
+ const metadataPath = options.metadata ? resolve(options.metadata) : resolve(dir, "metadata.json");
27
+ console.log(`\n${colors.bold}${colors.blue}🧭 Glubean Metadata Validation${colors.reset}\n`);
28
+ console.log(`${colors.dim}Directory: ${dir}${colors.reset}`);
29
+ console.log(`${colors.dim}Metadata: ${metadataPath}${colors.reset}\n`);
30
+ let metadata;
31
+ try {
32
+ const raw = await readFile(metadataPath, "utf-8");
33
+ metadata = JSON.parse(raw);
34
+ }
35
+ catch (error) {
36
+ console.error(`${colors.red}✗ Failed to read metadata.json${colors.reset}`);
37
+ console.error(`${colors.dim}${error instanceof Error ? error.message : String(error)}${colors.reset}`);
38
+ process.exit(1);
39
+ return;
40
+ }
41
+ if (!metadata || metadata.schemaVersion !== "1") {
42
+ console.error(`${colors.red}✗ Unsupported metadata schemaVersion${colors.reset}`);
43
+ process.exit(1);
44
+ }
45
+ if (!metadata.files || typeof metadata.files !== "object") {
46
+ console.error(`${colors.red}✗ Invalid metadata: files missing${colors.reset}`);
47
+ process.exit(1);
48
+ }
49
+ let normalizedFiles;
50
+ try {
51
+ normalizedFiles = normalizeFileMap(metadata.files);
52
+ }
53
+ catch (error) {
54
+ console.error(`${colors.red}✗ Invalid metadata file paths${colors.reset}`);
55
+ console.error(`${colors.dim}${error instanceof Error ? error.message : String(error)}${colors.reset}`);
56
+ process.exit(1);
57
+ }
58
+ for (const [rawPath, meta] of Object.entries(normalizedFiles)) {
59
+ const filePath = normalizeFilePath(rawPath);
60
+ const absolutePath = resolve(dir, filePath);
61
+ let content;
62
+ try {
63
+ content = await readFile(absolutePath);
64
+ }
65
+ catch (error) {
66
+ console.error(`${colors.red}✗ Missing file referenced in metadata: ${filePath}${colors.reset}`);
67
+ console.error(`${colors.dim}${error instanceof Error ? error.message : String(error)}${colors.reset}`);
68
+ process.exit(1);
69
+ return;
70
+ }
71
+ const actualHash = await sha256(content);
72
+ if (actualHash !== meta.hash) {
73
+ console.error(`${colors.red}✗ File hash mismatch for ${filePath}${colors.reset}`);
74
+ console.error(`${colors.dim}Expected: ${meta.hash}\nActual: ${actualHash}${colors.reset}`);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ const computedRootHash = await computeRootHash(normalizedFiles);
79
+ if (computedRootHash !== metadata.rootHash) {
80
+ console.error(`${colors.red}✗ Root hash mismatch${colors.reset}`);
81
+ console.error(`${colors.dim}Expected: ${metadata.rootHash}\nActual: ${computedRootHash}${colors.reset}`);
82
+ process.exit(1);
83
+ }
84
+ const derived = deriveMetadataStats(normalizedFiles);
85
+ if (metadata.fileCount !== derived.fileCount) {
86
+ console.error(`${colors.red}✗ fileCount mismatch${colors.reset}`);
87
+ console.error(`${colors.dim}Expected: ${metadata.fileCount}\nActual: ${derived.fileCount}${colors.reset}`);
88
+ process.exit(1);
89
+ }
90
+ if (metadata.testCount !== derived.testCount) {
91
+ console.error(`${colors.red}✗ testCount mismatch${colors.reset}`);
92
+ console.error(`${colors.dim}Expected: ${metadata.testCount}\nActual: ${derived.testCount}${colors.reset}`);
93
+ process.exit(1);
94
+ }
95
+ if (!compareTags(metadata.tags || [], derived.tags)) {
96
+ console.error(`${colors.red}✗ tags mismatch${colors.reset}`);
97
+ console.error(`${colors.dim}Expected: ${metadata.tags?.join(", ") || "(none)"}\nActual: ${derived.tags.join(", ") || "(none)"}${colors.reset}`);
98
+ process.exit(1);
99
+ }
100
+ console.log(`${colors.green}✓ metadata.json is valid${colors.reset}`);
101
+ console.log(`${colors.dim} Files: ${derived.fileCount}, Tests: ${derived.testCount}${colors.reset}\n`);
102
+ }
103
+ //# sourceMappingURL=validate_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_metadata.js","sourceRoot":"","sources":["../../src/commands/validate_metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Worker command — self-hosted worker management.
3
+ * Stub: full implementation deferred to future work.
4
+ */
5
+ export interface WorkerOptions {
6
+ instances?: number | "auto";
7
+ config?: string;
8
+ apiUrl?: string;
9
+ token?: string;
10
+ logLevel?: string;
11
+ workerId?: string;
12
+ }
13
+ export declare function workerCommand(subcommand: string, _options?: WorkerOptions): Promise<void>;
14
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/commands/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,aAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Worker command — self-hosted worker management.
3
+ * Stub: full implementation deferred to future work.
4
+ */
5
+ export async function workerCommand(subcommand, _options = {}) {
6
+ console.error(`Worker command "${subcommand}" is not yet implemented in the Node.js CLI.\n` +
7
+ "Self-hosted worker support is coming in a future release.");
8
+ process.exit(1);
9
+ }
10
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/commands/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,WAA0B,EAAE;IAE5B,OAAO,CAAC,KAAK,CACX,mBAAmB,UAAU,gDAAgD;QAC3E,2DAA2D,CAC9D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shared credential resolution for Glubean Cloud auth.
3
+ *
4
+ * Priority order:
5
+ * 1. CLI flag (--token / --project / --api-url)
6
+ * 2. System environment variable (GLUBEAN_TOKEN / GLUBEAN_PROJECT_ID / GLUBEAN_API_URL)
7
+ * 3. .env + .env.secrets file vars (project-level)
8
+ * 4. package.json glubean.cloud config (projectId, apiUrl, token)
9
+ * 5. ~/.glubean/credentials.json (global fallback)
10
+ */
11
+ export interface Credentials {
12
+ token: string;
13
+ projectId?: string;
14
+ apiUrl?: string;
15
+ }
16
+ export interface AuthOptions {
17
+ token?: string;
18
+ project?: string;
19
+ apiUrl?: string;
20
+ }
21
+ /**
22
+ * Additional auth sources from the project context.
23
+ */
24
+ export interface ProjectAuthSources {
25
+ /** Merged vars from .env + .env.secrets */
26
+ envFileVars?: Record<string, string>;
27
+ /** Cloud section from package.json glubean config */
28
+ cloudConfig?: {
29
+ apiUrl?: string;
30
+ projectId?: string;
31
+ token?: string;
32
+ };
33
+ }
34
+ export declare function readCredentials(): Promise<Credentials | null>;
35
+ export declare function writeCredentials(creds: Credentials): Promise<string>;
36
+ export declare function resolveToken(options: AuthOptions, sources?: ProjectAuthSources): Promise<string | null>;
37
+ export declare function resolveProjectId(options: AuthOptions, sources?: ProjectAuthSources): Promise<string | null>;
38
+ export declare function resolveApiUrl(options: AuthOptions, sources?: ProjectAuthSources): Promise<string>;
39
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qDAAqD;IACrD,WAAW,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAQD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CASnE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1E;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Shared credential resolution for Glubean Cloud auth.
3
+ *
4
+ * Priority order:
5
+ * 1. CLI flag (--token / --project / --api-url)
6
+ * 2. System environment variable (GLUBEAN_TOKEN / GLUBEAN_PROJECT_ID / GLUBEAN_API_URL)
7
+ * 3. .env + .env.secrets file vars (project-level)
8
+ * 4. package.json glubean.cloud config (projectId, apiUrl, token)
9
+ * 5. ~/.glubean/credentials.json (global fallback)
10
+ */
11
+ import { dirname, join } from "node:path";
12
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
13
+ import { DEFAULT_API_URL } from "./constants.js";
14
+ function getCredentialsPath() {
15
+ const home = process.env.HOME || process.env.USERPROFILE;
16
+ if (!home)
17
+ return null;
18
+ return join(home, ".glubean", "credentials.json");
19
+ }
20
+ export async function readCredentials() {
21
+ const path = getCredentialsPath();
22
+ if (!path)
23
+ return null;
24
+ try {
25
+ const text = await readFile(path, "utf-8");
26
+ return JSON.parse(text);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ export async function writeCredentials(creds) {
33
+ const path = getCredentialsPath();
34
+ if (!path)
35
+ throw new Error("Cannot determine home directory");
36
+ await mkdir(dirname(path), { recursive: true });
37
+ await writeFile(path, JSON.stringify(creds, null, 2) + "\n", "utf-8");
38
+ return path;
39
+ }
40
+ export async function resolveToken(options, sources) {
41
+ if (options.token)
42
+ return options.token;
43
+ const env = process.env.GLUBEAN_TOKEN;
44
+ if (env)
45
+ return env;
46
+ const fileVar = sources?.envFileVars?.["GLUBEAN_TOKEN"];
47
+ if (fileVar)
48
+ return fileVar;
49
+ if (sources?.cloudConfig?.token)
50
+ return sources.cloudConfig.token;
51
+ const creds = await readCredentials();
52
+ return creds?.token ?? null;
53
+ }
54
+ export async function resolveProjectId(options, sources) {
55
+ if (options.project)
56
+ return options.project;
57
+ const env = process.env.GLUBEAN_PROJECT_ID;
58
+ if (env)
59
+ return env;
60
+ const fileVar = sources?.envFileVars?.["GLUBEAN_PROJECT_ID"];
61
+ if (fileVar)
62
+ return fileVar;
63
+ if (sources?.cloudConfig?.projectId)
64
+ return sources.cloudConfig.projectId;
65
+ const creds = await readCredentials();
66
+ return creds?.projectId ?? null;
67
+ }
68
+ export async function resolveApiUrl(options, sources) {
69
+ if (options.apiUrl)
70
+ return options.apiUrl;
71
+ const env = process.env.GLUBEAN_API_URL;
72
+ if (env)
73
+ return env;
74
+ const fileVar = sources?.envFileVars?.["GLUBEAN_API_URL"];
75
+ if (fileVar)
76
+ return fileVar;
77
+ if (sources?.cloudConfig?.apiUrl)
78
+ return sources.cloudConfig.apiUrl;
79
+ const creds = await readCredentials();
80
+ return creds?.apiUrl ?? DEFAULT_API_URL;
81
+ }
82
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CI environment detection and context harvesting.
3
+ */
4
+ export interface CiContext {
5
+ isCI: boolean;
6
+ source: "cli" | "ci";
7
+ gitRef?: string;
8
+ commitSha?: string;
9
+ runUrl?: string;
10
+ }
11
+ export declare function detectCiContext(): CiContext;
12
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../src/lib/ci.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,IAAI,SAAS,CAyC3C"}
package/dist/lib/ci.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * CI environment detection and context harvesting.
3
+ */
4
+ export function detectCiContext() {
5
+ const env = process.env;
6
+ const isCI = !!(env.CI ||
7
+ env.GITHUB_ACTIONS ||
8
+ env.GITLAB_CI ||
9
+ env.CIRCLECI ||
10
+ env.JENKINS_URL ||
11
+ env.BUILDKITE);
12
+ if (!isCI) {
13
+ return { isCI: false, source: "cli" };
14
+ }
15
+ let gitRef;
16
+ let commitSha;
17
+ let runUrl;
18
+ if (env.GITHUB_ACTIONS) {
19
+ gitRef = env.GITHUB_REF_NAME || env.GITHUB_REF;
20
+ commitSha = env.GITHUB_SHA;
21
+ if (env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY && env.GITHUB_RUN_ID) {
22
+ runUrl = `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}`;
23
+ }
24
+ }
25
+ else if (env.GITLAB_CI) {
26
+ gitRef = env.CI_COMMIT_REF_NAME;
27
+ commitSha = env.CI_COMMIT_SHA;
28
+ runUrl = env.CI_PIPELINE_URL;
29
+ }
30
+ else if (env.CIRCLECI) {
31
+ gitRef = env.CIRCLE_BRANCH || env.CIRCLE_TAG;
32
+ commitSha = env.CIRCLE_SHA1;
33
+ runUrl = env.CIRCLE_BUILD_URL;
34
+ }
35
+ else if (env.BUILDKITE) {
36
+ gitRef = env.BUILDKITE_BRANCH;
37
+ commitSha = env.BUILDKITE_COMMIT;
38
+ runUrl = env.BUILDKITE_BUILD_URL;
39
+ }
40
+ return { isCI: true, source: "ci", gitRef, commitSha, runUrl };
41
+ }
42
+ //# sourceMappingURL=ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/lib/ci.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAExB,MAAM,IAAI,GAAG,CAAC,CAAC,CACb,GAAG,CAAC,EAAE;QACN,GAAG,CAAC,cAAc;QAClB,GAAG,CAAC,SAAS;QACb,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,SAAS,CACd,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,SAA6B,CAAC;IAClC,IAAI,MAA0B,CAAC;IAE/B,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC;QAC/C,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;QAC3B,IAAI,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACxE,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,iBAAiB,iBAAiB,GAAG,CAAC,aAAa,EAAE,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC;QAChC,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC;IAC/B,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC;QAC7C,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAChC,CAAC;SAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAC9B,SAAS,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACjE,CAAC"}