@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.
- package/bin/gb.js +2 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +842 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +75 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/patch.d.ts +8 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +73 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/run.d.ts +26 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +1093 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +6 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +62 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/spec_split.d.ts +5 -0
- package/dist/commands/spec_split.d.ts.map +1 -0
- package/dist/commands/spec_split.js +56 -0
- package/dist/commands/spec_split.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +252 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/trigger.d.ts +13 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +213 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/validate_metadata.d.ts +6 -0
- package/dist/commands/validate_metadata.d.ts.map +1 -0
- package/dist/commands/validate_metadata.js +103 -0
- package/dist/commands/validate_metadata.js.map +1 -0
- package/dist/commands/worker.d.ts +14 -0
- package/dist/commands/worker.d.ts.map +1 -0
- package/dist/commands/worker.js +10 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/lib/auth.d.ts +39 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +82 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/ci.d.ts +12 -0
- package/dist/lib/ci.d.ts.map +1 -0
- package/dist/lib/ci.js +42 -0
- package/dist/lib/ci.js.map +1 -0
- package/dist/lib/config.d.ts +116 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +264 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +6 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +6 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/env.d.ts +19 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +40 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/git.d.ts +8 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +68 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/openapi_patch.d.ts +23 -0
- package/dist/lib/openapi_patch.d.ts.map +1 -0
- package/dist/lib/openapi_patch.js +232 -0
- package/dist/lib/openapi_patch.js.map +1 -0
- package/dist/lib/openapi_split.d.ts +16 -0
- package/dist/lib/openapi_split.d.ts.map +1 -0
- package/dist/lib/openapi_split.js +188 -0
- package/dist/lib/openapi_split.js.map +1 -0
- package/dist/lib/upload.d.ts +44 -0
- package/dist/lib/upload.d.ts.map +1 -0
- package/dist/lib/upload.js +297 -0
- package/dist/lib/upload.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +319 -0
- package/dist/main.js.map +1 -0
- package/dist/metadata.d.ts +17 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +61 -0
- package/dist/metadata.js.map +1 -0
- package/dist/update_check.d.ts +14 -0
- package/dist/update_check.d.ts.map +1 -0
- package/dist/update_check.js +130 -0
- package/dist/update_check.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +34 -0
- package/templates/AI-INSTRUCTIONS.md +163 -0
- package/templates/README.md +226 -0
- package/templates/claude-skill-glubean-test.md +382 -0
- package/templates/data/create-user.json +14 -0
- package/templates/data/endpoints.csv +5 -0
- package/templates/data/scenarios.yaml +19 -0
- package/templates/data/search-examples.json +14 -0
- package/templates/data/users.json +17 -0
- package/templates/data-driven.test.ts.tpl +118 -0
- package/templates/demo.test.result.json +398 -0
- package/templates/demo.test.ts.tpl +226 -0
- package/templates/explore-api.test.result.json +79 -0
- package/templates/minimal/README.md +42 -0
- package/templates/minimal-api.test.ts.tpl +42 -0
- package/templates/minimal-auth.test.ts.tpl +45 -0
- package/templates/minimal-search.test.ts.tpl +34 -0
- package/templates/openapi.sample.json +97 -0
- package/templates/pick.test.result.json +165 -0
- 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 @@
|
|
|
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"}
|
package/dist/lib/auth.js
ADDED
|
@@ -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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"}
|
package/dist/lib/ci.d.ts
ADDED
|
@@ -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"}
|