@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
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BundleMetadata, FileMeta, ScanResult } from "@glubean/scanner";
|
|
2
|
+
export declare const METADATA_SCHEMA_VERSION = "1";
|
|
3
|
+
export declare function normalizeFilePath(path: string): string;
|
|
4
|
+
export declare function normalizeFileMap(files: Record<string, FileMeta>): Record<string, FileMeta>;
|
|
5
|
+
export declare function deriveMetadataStats(files: Record<string, FileMeta>): {
|
|
6
|
+
testCount: number;
|
|
7
|
+
fileCount: number;
|
|
8
|
+
tags: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare function computeRootHash(files: Record<string, FileMeta>): Promise<string>;
|
|
11
|
+
export declare function buildMetadata(scanResult: ScanResult, options: {
|
|
12
|
+
generatedBy: string;
|
|
13
|
+
generatedAt?: string;
|
|
14
|
+
projectId?: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
}): Promise<BundleMetadata>;
|
|
17
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE7E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAU1B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAkBA;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const METADATA_SCHEMA_VERSION = "1";
|
|
3
|
+
export function normalizeFilePath(path) {
|
|
4
|
+
return path.replaceAll("\\", "/");
|
|
5
|
+
}
|
|
6
|
+
export function normalizeFileMap(files) {
|
|
7
|
+
const normalized = {};
|
|
8
|
+
for (const [path, meta] of Object.entries(files)) {
|
|
9
|
+
const normalizedPath = normalizeFilePath(path);
|
|
10
|
+
if (normalized[normalizedPath]) {
|
|
11
|
+
throw new Error(`Duplicate file path after normalization: ${path}`);
|
|
12
|
+
}
|
|
13
|
+
normalized[normalizedPath] = meta;
|
|
14
|
+
}
|
|
15
|
+
return normalized;
|
|
16
|
+
}
|
|
17
|
+
export function deriveMetadataStats(files) {
|
|
18
|
+
let testCount = 0;
|
|
19
|
+
const allTags = new Set();
|
|
20
|
+
for (const fileMeta of Object.values(files)) {
|
|
21
|
+
for (const exp of fileMeta.exports) {
|
|
22
|
+
if (exp.tags) {
|
|
23
|
+
exp.tags.forEach((tag) => allTags.add(tag));
|
|
24
|
+
}
|
|
25
|
+
testCount += 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
testCount,
|
|
30
|
+
fileCount: Object.keys(files).length,
|
|
31
|
+
tags: Array.from(allTags).sort(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export async function computeRootHash(files) {
|
|
35
|
+
const entries = Object.entries(files).sort(([a], [b]) => a.localeCompare(b));
|
|
36
|
+
const payload = entries
|
|
37
|
+
.map(([path, meta]) => `${path}:${meta.hash}`)
|
|
38
|
+
.join("\n");
|
|
39
|
+
const hash = createHash("sha256").update(payload).digest("hex");
|
|
40
|
+
return `sha256-${hash}`;
|
|
41
|
+
}
|
|
42
|
+
export async function buildMetadata(scanResult, options) {
|
|
43
|
+
const normalizedFiles = normalizeFileMap(scanResult.files);
|
|
44
|
+
const stats = deriveMetadataStats(normalizedFiles);
|
|
45
|
+
const rootHash = await computeRootHash(normalizedFiles);
|
|
46
|
+
return {
|
|
47
|
+
schemaVersion: METADATA_SCHEMA_VERSION,
|
|
48
|
+
specVersion: scanResult.specVersion,
|
|
49
|
+
generatedBy: options.generatedBy,
|
|
50
|
+
generatedAt: options.generatedAt || new Date().toISOString(),
|
|
51
|
+
rootHash,
|
|
52
|
+
files: normalizedFiles,
|
|
53
|
+
testCount: stats.testCount,
|
|
54
|
+
fileCount: stats.fileCount,
|
|
55
|
+
tags: stats.tags,
|
|
56
|
+
warnings: scanResult.warnings,
|
|
57
|
+
projectId: options.projectId,
|
|
58
|
+
version: options.version,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @internal Exported for testing. */
|
|
2
|
+
export declare function parseSemver(version: string): {
|
|
3
|
+
parts: number[];
|
|
4
|
+
pre: string | null;
|
|
5
|
+
} | null;
|
|
6
|
+
/** @internal Exported for testing. */
|
|
7
|
+
export declare function isNewer(latest: string, current: string): boolean;
|
|
8
|
+
export declare function abortUpdateCheck(): void;
|
|
9
|
+
export declare function checkForUpdates(currentVersion: string, options?: {
|
|
10
|
+
cachePath?: string;
|
|
11
|
+
now?: number;
|
|
12
|
+
fetchFn?: typeof fetch;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=update_check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update_check.d.ts","sourceRoot":"","sources":["../src/update_check.ts"],"names":[],"mappings":"AAWA,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAM3F;AAyBD,sCAAsC;AACtC,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYhE;AAUD,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
const UPDATE_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
4
|
+
const UPDATE_URL = "https://registry.npmjs.org/@glubean/cli/latest";
|
|
5
|
+
/** @internal Exported for testing. */
|
|
6
|
+
export function parseSemver(version) {
|
|
7
|
+
const noBuild = version.split("+")[0];
|
|
8
|
+
const [core, ...rest] = noBuild.split("-");
|
|
9
|
+
const parts = core.split(".").map((p) => Number(p));
|
|
10
|
+
if (parts.length < 3 || parts.some((p) => Number.isNaN(p)))
|
|
11
|
+
return null;
|
|
12
|
+
return { parts: parts.slice(0, 3), pre: rest.length > 0 ? rest.join("-") : null };
|
|
13
|
+
}
|
|
14
|
+
function comparePrerelease(a, b) {
|
|
15
|
+
const segsA = a.split(".");
|
|
16
|
+
const segsB = b.split(".");
|
|
17
|
+
const len = Math.max(segsA.length, segsB.length);
|
|
18
|
+
for (let i = 0; i < len; i++) {
|
|
19
|
+
if (i >= segsA.length)
|
|
20
|
+
return -1;
|
|
21
|
+
if (i >= segsB.length)
|
|
22
|
+
return 1;
|
|
23
|
+
const na = Number(segsA[i]);
|
|
24
|
+
const nb = Number(segsB[i]);
|
|
25
|
+
const aIsNum = !Number.isNaN(na);
|
|
26
|
+
const bIsNum = !Number.isNaN(nb);
|
|
27
|
+
if (aIsNum && bIsNum) {
|
|
28
|
+
if (na !== nb)
|
|
29
|
+
return na - nb;
|
|
30
|
+
}
|
|
31
|
+
else if (aIsNum !== bIsNum) {
|
|
32
|
+
return aIsNum ? -1 : 1;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (segsA[i] < segsB[i])
|
|
36
|
+
return -1;
|
|
37
|
+
if (segsA[i] > segsB[i])
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
/** @internal Exported for testing. */
|
|
44
|
+
export function isNewer(latest, current) {
|
|
45
|
+
const l = parseSemver(latest);
|
|
46
|
+
const c = parseSemver(current);
|
|
47
|
+
if (!l || !c)
|
|
48
|
+
return false;
|
|
49
|
+
for (let i = 0; i < 3; i += 1) {
|
|
50
|
+
if (l.parts[i] > c.parts[i])
|
|
51
|
+
return true;
|
|
52
|
+
if (l.parts[i] < c.parts[i])
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (c.pre !== null && l.pre === null)
|
|
56
|
+
return true;
|
|
57
|
+
if (c.pre === null && l.pre !== null)
|
|
58
|
+
return false;
|
|
59
|
+
if (c.pre !== null && l.pre !== null)
|
|
60
|
+
return comparePrerelease(l.pre, c.pre) > 0;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
function getDefaultCachePath() {
|
|
64
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
65
|
+
if (!home)
|
|
66
|
+
return null;
|
|
67
|
+
return join(home, ".glubean", "update-check.json");
|
|
68
|
+
}
|
|
69
|
+
let _activeController;
|
|
70
|
+
export function abortUpdateCheck() {
|
|
71
|
+
_activeController?.abort();
|
|
72
|
+
_activeController = undefined;
|
|
73
|
+
}
|
|
74
|
+
export async function checkForUpdates(currentVersion, options) {
|
|
75
|
+
try {
|
|
76
|
+
const cachePath = options?.cachePath ?? getDefaultCachePath();
|
|
77
|
+
if (!cachePath)
|
|
78
|
+
return;
|
|
79
|
+
const now = options?.now ?? Date.now();
|
|
80
|
+
const fetchFn = options?.fetchFn ?? fetch;
|
|
81
|
+
let cache = null;
|
|
82
|
+
try {
|
|
83
|
+
cache = JSON.parse(await readFile(cachePath, "utf-8"));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
cache = null;
|
|
87
|
+
}
|
|
88
|
+
if (cache && now - cache.lastChecked < UPDATE_INTERVAL_MS) {
|
|
89
|
+
if (cache.latest && isNewer(cache.latest, currentVersion)) {
|
|
90
|
+
console.error(`Update available: glubean v${cache.latest} (current v${currentVersion}). ` +
|
|
91
|
+
"Run: npm update -g @glubean/cli");
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let latest;
|
|
96
|
+
try {
|
|
97
|
+
const controller = new AbortController();
|
|
98
|
+
_activeController = controller;
|
|
99
|
+
const timeout = setTimeout(() => controller.abort(), 3_000);
|
|
100
|
+
timeout.unref?.();
|
|
101
|
+
const response = await fetchFn(UPDATE_URL, { signal: controller.signal });
|
|
102
|
+
clearTimeout(timeout);
|
|
103
|
+
_activeController = undefined;
|
|
104
|
+
if (!response.ok)
|
|
105
|
+
return;
|
|
106
|
+
const data = (await response.json());
|
|
107
|
+
latest = data.version;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
_activeController = undefined;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await mkdir(dirname(cachePath), { recursive: true });
|
|
115
|
+
const payload = { lastChecked: now, latest };
|
|
116
|
+
await writeFile(cachePath, JSON.stringify(payload), "utf-8");
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Ignore cache write errors
|
|
120
|
+
}
|
|
121
|
+
if (latest && isNewer(latest, currentVersion)) {
|
|
122
|
+
console.error(`Update available: glubean v${latest} (current v${currentVersion}). ` +
|
|
123
|
+
"Run: npm update -g @glubean/cli");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Ignore update check errors
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=update_check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update_check.js","sourceRoot":"","sources":["../src/update_check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAoB,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const pkg = require(resolve(__dirname, "../package.json"));
|
|
7
|
+
/**
|
|
8
|
+
* Current Glubean CLI version from this package's `package.json`.
|
|
9
|
+
*/
|
|
10
|
+
export const CLI_VERSION = pkg.version;
|
|
11
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAW,GAAG,CAAC,OAAO,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@glubean/cli",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"gb": "./bin/gb.js",
|
|
7
|
+
"glubean": "./bin/gb.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"dist",
|
|
12
|
+
"templates"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"commander": "^13.0.0",
|
|
16
|
+
"@inquirer/prompts": "^7.0.0",
|
|
17
|
+
"archiver": "^7.0.0",
|
|
18
|
+
"dotenv": "^16.4.0",
|
|
19
|
+
"yaml": "^2.7.0",
|
|
20
|
+
"tsx": "^4.19.0",
|
|
21
|
+
"@glubean/scanner": "0.1.2",
|
|
22
|
+
"@glubean/runner": "0.1.2",
|
|
23
|
+
"@glubean/redaction": "0.1.2",
|
|
24
|
+
"@glubean/sdk": "0.1.2"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^22.0.0",
|
|
28
|
+
"@types/archiver": "^6.0.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.build.json",
|
|
32
|
+
"test": "vitest run"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Glubean Test Project
|
|
2
|
+
|
|
3
|
+
API test automation project using `@glubean/sdk`. Runtime is **Deno**. Packages are from **JSR**.
|
|
4
|
+
|
|
5
|
+
## Project Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
tests/ # Permanent test files — run in CI and Cloud
|
|
9
|
+
explore/ # Exploratory tests — quick iteration in your editor
|
|
10
|
+
data/ # Test data files (JSON, CSV, YAML)
|
|
11
|
+
context/ # API specs and reference docs for AI and tooling
|
|
12
|
+
.env # Public variables (BASE_URL)
|
|
13
|
+
.env.secrets # Credentials — gitignored
|
|
14
|
+
deno.json # Runtime config, imports, glubean settings
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
If `deno check` or `glubean run` fails with module-not-found errors, run:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
deno install
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## BEFORE Writing or Modifying Any Test (MANDATORY)
|
|
26
|
+
|
|
27
|
+
You MUST complete these steps before writing any test code. Do NOT skip this — not even for "simple" tests.
|
|
28
|
+
|
|
29
|
+
1. Search `context/` for the API you are testing. Check OpenAPI specs (`context/*.json`) for exact paths, methods,
|
|
30
|
+
request/response schemas. **Do NOT guess endpoint paths or response shapes.**
|
|
31
|
+
2. Check `.glubean/docs/` exists. If missing, download:
|
|
32
|
+
```bash
|
|
33
|
+
mkdir -p .glubean/docs
|
|
34
|
+
curl -sL https://raw.githubusercontent.com/glubean/cheatsheet/main/sdk-reference.md -o .glubean/docs/sdk-reference.md
|
|
35
|
+
curl -sL https://raw.githubusercontent.com/glubean/cheatsheet/main/patterns.md -o .glubean/docs/patterns.md
|
|
36
|
+
curl -sL https://raw.githubusercontent.com/glubean/cheatsheet/main/cli-reference.md -o .glubean/docs/cli-reference.md
|
|
37
|
+
```
|
|
38
|
+
3. Read `.glubean/docs/sdk-reference.md` — all exports, signatures, options.
|
|
39
|
+
4. Read `.glubean/docs/patterns.md` — runnable examples for every test type.
|
|
40
|
+
5. THEN write the test using only patterns from those docs and API details from step 1.
|
|
41
|
+
|
|
42
|
+
**If you write test code without completing steps 1-4, you are violating this rule.** Do NOT guess — the endpoint paths,
|
|
43
|
+
response schemas, and SDK API are all documented.
|
|
44
|
+
|
|
45
|
+
**If `context/` has no spec or docs for the API under test:** Unless it is a well-known public API (e.g. GitHub,
|
|
46
|
+
Stripe), STOP and ask the user for the endpoint path, method, and response schema. Do NOT hallucinate paths or response
|
|
47
|
+
shapes.
|
|
48
|
+
|
|
49
|
+
**If the OpenAPI spec exists but lacks response schemas:** Warn the user that response structure will be inferred at
|
|
50
|
+
runtime, which lowers first-pass accuracy. Suggest adding response examples to `context/` to enable one-shot test
|
|
51
|
+
generation.
|
|
52
|
+
|
|
53
|
+
## Quick Checklist
|
|
54
|
+
|
|
55
|
+
Before submitting any test, verify:
|
|
56
|
+
|
|
57
|
+
- [ ] Checked `context/` for endpoint spec + response schema
|
|
58
|
+
- [ ] Response schema available? If not, warned user about reduced accuracy
|
|
59
|
+
- [ ] Test ID is kebab-case and unique across the project
|
|
60
|
+
- [ ] Tags are set (e.g. `["api"]`, `["smoke"]`, `["e2e"]`)
|
|
61
|
+
- [ ] Creates resources → has `.teardown()` cleanup
|
|
62
|
+
- [ ] No hardcoded secrets or test data in the test file
|
|
63
|
+
|
|
64
|
+
## Coverage Expectations
|
|
65
|
+
|
|
66
|
+
Do not stop at a single happy-path test unless the user explicitly asks for only one case.
|
|
67
|
+
|
|
68
|
+
- For authentication/identity endpoints, include:
|
|
69
|
+
- one authenticated success case
|
|
70
|
+
- one unauthenticated or invalid-credential case
|
|
71
|
+
- For protected resources, include authorization failure cases (`401` or `403`) when applicable.
|
|
72
|
+
- For create/update endpoints, include at least one invalid-input case when the contract documents validation rules.
|
|
73
|
+
- If the OpenAPI spec lacks enough detail for a negative case, say so explicitly and choose the safest verifiable case.
|
|
74
|
+
|
|
75
|
+
## Definition of Done for API Tests
|
|
76
|
+
|
|
77
|
+
Before considering an API test complete, verify whether the endpoint has:
|
|
78
|
+
|
|
79
|
+
- a success path
|
|
80
|
+
- an auth boundary
|
|
81
|
+
- a validation boundary
|
|
82
|
+
- a not-found or forbidden boundary
|
|
83
|
+
|
|
84
|
+
Cover all applicable boundaries unless the user asked for a narrower scope.
|
|
85
|
+
|
|
86
|
+
## Import Convention
|
|
87
|
+
|
|
88
|
+
Always use the import map alias defined in `deno.json`, never hardcoded JSR URLs:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Correct
|
|
92
|
+
import { test } from "@glubean/sdk";
|
|
93
|
+
|
|
94
|
+
// Wrong — breaks tooling features like trace grouping
|
|
95
|
+
import { test } from "jsr:@glubean/sdk@^X.Y.Z";
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Conventions
|
|
99
|
+
|
|
100
|
+
- **One test export per behavior.** Each `export const` is a test case.
|
|
101
|
+
- **Tags:** `["smoke"]` for health checks, `["api"]` for API tests, `["e2e"]` for browser tests.
|
|
102
|
+
- **IDs:** kebab-case, unique across the project. Used for history tracking.
|
|
103
|
+
- **Data separation:** keep test data in `data/`, never hardcode payloads in test files.
|
|
104
|
+
- **Secrets:** use `secrets.require("KEY")` or configure's secret binding. Never hardcode credentials.
|
|
105
|
+
- **Cleanup:** use `.teardown()` for any resource created during the test.
|
|
106
|
+
- **Imports:** use `.ts` extensions for local files.
|
|
107
|
+
|
|
108
|
+
## Running Tests
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
glubean run # Run all tests in tests/
|
|
112
|
+
glubean run tests/ # Run a specific directory
|
|
113
|
+
glubean run --filter smoke # Run by tag
|
|
114
|
+
glubean run --explore # Run explore/ tests
|
|
115
|
+
glubean run --upload # Run and upload results to Cloud
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For all CLI options, run `glubean --help` or `glubean run --help`.
|
|
119
|
+
|
|
120
|
+
## MCP Setup (enables AI closed-loop)
|
|
121
|
+
|
|
122
|
+
Without MCP, the AI can only write tests. With MCP, the AI can: **write → run → read failures → fix → rerun → pass** —
|
|
123
|
+
without human intervention.
|
|
124
|
+
|
|
125
|
+
### Claude Code
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
claude mcp add glubean -- deno run -A jsr:@glubean/mcp
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Cursor
|
|
132
|
+
|
|
133
|
+
Add to `~/.cursor/mcp.json`:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"mcpServers": {
|
|
138
|
+
"glubean": {
|
|
139
|
+
"command": "deno",
|
|
140
|
+
"args": ["run", "-A", "jsr:@glubean/mcp"]
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Available MCP Tools
|
|
147
|
+
|
|
148
|
+
- `glubean_run_local_file` — run a test file locally, returns structured results (assertions, logs, traces)
|
|
149
|
+
- `glubean_discover_tests` — scan a file and return test export metadata (id, name, tags)
|
|
150
|
+
- `glubean_list_test_files` — list all test files in the project
|
|
151
|
+
- `glubean_diagnose_config` — check project config for common issues (.env, deno.json, dirs)
|
|
152
|
+
- `glubean_get_last_run_summary` — get summary of the most recent local run
|
|
153
|
+
- `glubean_get_local_events` — get filtered events (assertions, logs, traces) from the last run; useful for debugging
|
|
154
|
+
failures
|
|
155
|
+
|
|
156
|
+
## Type Definitions
|
|
157
|
+
|
|
158
|
+
For full API details beyond the cheatsheet, go to the import source:
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import { configure, fromDir, test } from "@glubean/sdk";
|
|
162
|
+
// Go-to-definition on these for exact signatures and options
|
|
163
|
+
```
|