badgr-shared 0.1.0
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/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/package.json +30 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type CheckStatus = "pass" | "fail" | "warn" | "info";
|
|
2
|
+
export type ReportStatus = "passed" | "warning" | "failed";
|
|
3
|
+
export type FindingSeverity = "info" | "warning" | "error";
|
|
4
|
+
export interface DiagnosticCheck {
|
|
5
|
+
name: string;
|
|
6
|
+
status: CheckStatus;
|
|
7
|
+
message: string;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface ReportFinding {
|
|
11
|
+
severity: FindingSeverity;
|
|
12
|
+
code: string;
|
|
13
|
+
message: string;
|
|
14
|
+
details?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface JsonReport {
|
|
17
|
+
tool: string;
|
|
18
|
+
reportId: string;
|
|
19
|
+
status: ReportStatus;
|
|
20
|
+
summary: string;
|
|
21
|
+
findings: ReportFinding[];
|
|
22
|
+
recommendedActions: string[];
|
|
23
|
+
nextCommand?: string;
|
|
24
|
+
actionUrl?: string;
|
|
25
|
+
generatedAt: string;
|
|
26
|
+
metadata?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export declare class BadgrToolError extends Error {
|
|
29
|
+
readonly code: string;
|
|
30
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
31
|
+
constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
|
|
32
|
+
}
|
|
33
|
+
export declare function formatCheck(check: DiagnosticCheck): string;
|
|
34
|
+
export declare function formatChecks(checks: DiagnosticCheck[]): string;
|
|
35
|
+
export declare function createReport(input: Omit<JsonReport, "generatedAt" | "reportId"> & {
|
|
36
|
+
reportId?: string;
|
|
37
|
+
}): JsonReport;
|
|
38
|
+
export declare function reportStatusFromFindings(findings: ReportFinding[]): ReportStatus;
|
|
39
|
+
export declare function checkToFinding(check: DiagnosticCheck, codePrefix?: string): ReportFinding;
|
|
40
|
+
export declare function overallStatus(checks: DiagnosticCheck[]): CheckStatus;
|
|
41
|
+
export declare function createLogger(json?: boolean): {
|
|
42
|
+
line(message: string): void;
|
|
43
|
+
error(message: string): void;
|
|
44
|
+
report(report: JsonReport): void;
|
|
45
|
+
};
|
|
46
|
+
export declare function createRequestId(prefix?: string): string;
|
|
47
|
+
export declare function parseNumber(value: string | undefined): number | undefined;
|
|
48
|
+
export declare function fireTelemetry(event: {
|
|
49
|
+
package: string;
|
|
50
|
+
command?: string;
|
|
51
|
+
}): void;
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AASD,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAE9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAMpH;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,YAAY,CAIhF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,SAAU,GAAG,aAAa,CAO1F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,WAAW,CAIpE;AAED,wBAAgB,YAAY,CAAC,IAAI,UAAQ;kBAEvB,MAAM;mBAGL,MAAM;mBAGN,UAAU;EAI5B;AAED,wBAAgB,eAAe,CAAC,MAAM,SAAQ,GAAG,MAAM,CAGtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIzE;AAoBD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA6BhF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
export class BadgrToolError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
constructor(message, code, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.details = details;
|
|
10
|
+
this.name = "BadgrToolError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const symbols = {
|
|
14
|
+
pass: "✓",
|
|
15
|
+
fail: "✗",
|
|
16
|
+
warn: "!",
|
|
17
|
+
info: "•",
|
|
18
|
+
};
|
|
19
|
+
export function formatCheck(check) {
|
|
20
|
+
return `${symbols[check.status]} ${check.message}`;
|
|
21
|
+
}
|
|
22
|
+
export function formatChecks(checks) {
|
|
23
|
+
return checks.map(formatCheck).join("\n");
|
|
24
|
+
}
|
|
25
|
+
export function createReport(input) {
|
|
26
|
+
return {
|
|
27
|
+
...input,
|
|
28
|
+
reportId: input.reportId ?? createRequestId("rpt"),
|
|
29
|
+
generatedAt: new Date().toISOString(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function reportStatusFromFindings(findings) {
|
|
33
|
+
if (findings.some((finding) => finding.severity === "error"))
|
|
34
|
+
return "failed";
|
|
35
|
+
if (findings.some((finding) => finding.severity === "warning"))
|
|
36
|
+
return "warning";
|
|
37
|
+
return "passed";
|
|
38
|
+
}
|
|
39
|
+
export function checkToFinding(check, codePrefix = "CHECK") {
|
|
40
|
+
return {
|
|
41
|
+
severity: check.status === "fail" ? "error" : check.status === "warn" ? "warning" : "info",
|
|
42
|
+
code: `${codePrefix}_${check.name.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}`,
|
|
43
|
+
message: check.message,
|
|
44
|
+
details: check.details,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function overallStatus(checks) {
|
|
48
|
+
if (checks.some((check) => check.status === "fail"))
|
|
49
|
+
return "fail";
|
|
50
|
+
if (checks.some((check) => check.status === "warn"))
|
|
51
|
+
return "warn";
|
|
52
|
+
return "pass";
|
|
53
|
+
}
|
|
54
|
+
export function createLogger(json = false) {
|
|
55
|
+
return {
|
|
56
|
+
line(message) {
|
|
57
|
+
if (!json)
|
|
58
|
+
console.log(message);
|
|
59
|
+
},
|
|
60
|
+
error(message) {
|
|
61
|
+
if (!json)
|
|
62
|
+
console.error(message);
|
|
63
|
+
},
|
|
64
|
+
report(report) {
|
|
65
|
+
console.log(JSON.stringify(report, null, 2));
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function createRequestId(prefix = "req") {
|
|
70
|
+
const random = Math.random().toString(36).slice(2, 10);
|
|
71
|
+
return `${prefix}_${Date.now().toString(36)}_${random}`;
|
|
72
|
+
}
|
|
73
|
+
export function parseNumber(value) {
|
|
74
|
+
if (value === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
const parsed = Number(value);
|
|
77
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
78
|
+
}
|
|
79
|
+
// ── Telemetry ─────────────────────────────────────────────────────────────────
|
|
80
|
+
// Fire-and-forget PostHog event. Opt out via BADGR_TELEMETRY=0.
|
|
81
|
+
// POSTHOG_KEY is a write-only project ingest key — safe to ship in the package.
|
|
82
|
+
const POSTHOG_KEY = "phc_badgr_replace_with_project_key";
|
|
83
|
+
const POSTHOG_HOST = "https://app.posthog.com";
|
|
84
|
+
function buildAnonymousId() {
|
|
85
|
+
// Stable per-machine ID derived from hostname + username. Never leaves the process.
|
|
86
|
+
try {
|
|
87
|
+
return createHash("sha256")
|
|
88
|
+
.update(`${hostname()}${process.env.USER ?? process.env.USERNAME ?? ""}`)
|
|
89
|
+
.digest("hex")
|
|
90
|
+
.slice(0, 16);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return "unknown";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function fireTelemetry(event) {
|
|
97
|
+
// Respect standard opt-out signals before doing any work.
|
|
98
|
+
if (process.env.BADGR_TELEMETRY === "0" ||
|
|
99
|
+
process.env.BADGR_NO_TELEMETRY === "1" ||
|
|
100
|
+
process.env.DO_NOT_TRACK === "1")
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
const payload = JSON.stringify({
|
|
104
|
+
api_key: POSTHOG_KEY,
|
|
105
|
+
event: "cli_invocation",
|
|
106
|
+
distinct_id: buildAnonymousId(),
|
|
107
|
+
properties: {
|
|
108
|
+
...event,
|
|
109
|
+
node_version: process.version,
|
|
110
|
+
platform: process.platform,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
// AbortSignal.timeout is available in Node 17.3+ (engines >= 18 here).
|
|
114
|
+
fetch(`${POSTHOG_HOST}/capture/`, {
|
|
115
|
+
method: "POST",
|
|
116
|
+
headers: { "content-type": "application/json" },
|
|
117
|
+
body: payload,
|
|
118
|
+
signal: AbortSignal.timeout(3000),
|
|
119
|
+
}).catch(() => { }); // fire-and-forget — never block or surface errors
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// silently ignore — telemetry must never break the CLI
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "badgr-shared",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared utilities for small AI Badgr npm diagnostics tools.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": ["dist"],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc -b",
|
|
17
|
+
"typecheck": "tsc -b --pretty false",
|
|
18
|
+
"test": "vitest run"
|
|
19
|
+
},
|
|
20
|
+
"engines": { "node": ">=18.0.0" },
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/michaelmanly/gpu-ai.git",
|
|
25
|
+
"directory": "packages/shared"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
}
|
|
30
|
+
}
|