badgr-config-doctor 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/README.md +149 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +60 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/package.json +16 -0
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# badgr-config-doctor
|
|
2
|
+
|
|
3
|
+
Validate your environment variables, JSON/YAML configs, file paths, and runtime versions before running — so you catch misconfig before it breaks production.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx badgr-config-doctor --required-env API_KEY,DATABASE_URL
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Free. No signup required.** Runs entirely on your machine.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## The problem it solves
|
|
14
|
+
|
|
15
|
+
Deployments fail because a `.env` variable is missing, a JSON config is malformed, or `node` is the wrong version. You only find out after the container starts. `badgr-config-doctor` runs these checks in under a second — before you deploy.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Check that required env vars are set
|
|
23
|
+
npx badgr-config-doctor --required-env API_KEY,DATABASE_URL
|
|
24
|
+
|
|
25
|
+
# Validate a JSON config string
|
|
26
|
+
npx badgr-config-doctor --json-text '{"port": 3000, "debug": true}'
|
|
27
|
+
|
|
28
|
+
# Validate a YAML config string
|
|
29
|
+
npx badgr-config-doctor --yaml-text "$(cat config.yaml)"
|
|
30
|
+
|
|
31
|
+
# Check runtime version
|
|
32
|
+
npx badgr-config-doctor --runtime node@20
|
|
33
|
+
|
|
34
|
+
# Combine checks and output JSON
|
|
35
|
+
npx badgr-config-doctor \
|
|
36
|
+
--required-env API_KEY,DATABASE_URL \
|
|
37
|
+
--runtime node@20 \
|
|
38
|
+
--json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## CLI flags
|
|
44
|
+
|
|
45
|
+
| Flag | Description |
|
|
46
|
+
|------|-------------|
|
|
47
|
+
| `--required-env <keys>` | Comma-separated env var names that must be set and non-empty |
|
|
48
|
+
| `--json-text <str>` | JSON config string to parse and validate |
|
|
49
|
+
| `--yaml-text <str>` | YAML config string to parse and validate |
|
|
50
|
+
| `--runtime <str>` | Runtime version requirement, e.g. `node@20`, `python@3.11` |
|
|
51
|
+
| `--json` | Output machine-readable JSON |
|
|
52
|
+
|
|
53
|
+
**Exit codes:** `0` = all checks passed or warnings only, `1` = one or more failures
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## What it checks
|
|
58
|
+
|
|
59
|
+
| Check | What it validates |
|
|
60
|
+
|---|---|
|
|
61
|
+
| **Required env vars** | Each key exists in `process.env` and is non-empty |
|
|
62
|
+
| **JSON config** | String parses as valid JSON without errors |
|
|
63
|
+
| **YAML config** | String has valid `key: value` structure |
|
|
64
|
+
| **Runtime version** | Installed Node/Python version meets the requirement |
|
|
65
|
+
| **Package versions** | `react` and `react-dom` major versions match (prevents mismatch crashes) |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Example output
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
badgr-config-doctor
|
|
73
|
+
|
|
74
|
+
✓ API_KEY set
|
|
75
|
+
✗ DATABASE_URL missing — add to .env or CI secrets
|
|
76
|
+
✓ JSON config valid
|
|
77
|
+
✗ Runtime node@18 found, node@20 required
|
|
78
|
+
|
|
79
|
+
2 failures. Fix before deploying.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
badgr-config-doctor
|
|
84
|
+
|
|
85
|
+
✓ API_KEY set
|
|
86
|
+
✓ DATABASE_URL set
|
|
87
|
+
✓ JSON config valid
|
|
88
|
+
✓ Runtime node@20.x found ✓
|
|
89
|
+
|
|
90
|
+
All checks passed.
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## TypeScript API
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
import { runConfigDoctor } from "badgr-config-doctor";
|
|
99
|
+
|
|
100
|
+
const result = runConfigDoctor({
|
|
101
|
+
env: process.env,
|
|
102
|
+
requiredEnv: ["API_KEY", "DATABASE_URL"],
|
|
103
|
+
jsonText: '{"port": 3000}',
|
|
104
|
+
runtime: "node@20",
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
for (const check of result.checks) {
|
|
108
|
+
console.log(check.status, check.label, check.detail);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Fail CI if any check fails
|
|
112
|
+
const failed = result.checks.filter(c => c.status === "fail");
|
|
113
|
+
if (failed.length > 0) process.exit(1);
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Types:**
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
interface ConfigDoctorOptions {
|
|
120
|
+
env?: Record<string, string | undefined>;
|
|
121
|
+
requiredEnv?: string[];
|
|
122
|
+
jsonText?: string;
|
|
123
|
+
yamlText?: string;
|
|
124
|
+
paths?: Record<string, boolean>; // { "/path/to/file": true } = must exist
|
|
125
|
+
packageVersions?: Record<string, string>;
|
|
126
|
+
runtime?: string; // e.g. "node@20", "python@3.11"
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface ConfigDoctorResult {
|
|
130
|
+
checks: DiagnosticCheck[];
|
|
131
|
+
report: JsonReport;
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Use before deploying to AI Badgr
|
|
138
|
+
|
|
139
|
+
Run a config preflight before launching a GPU job — so the job doesn't fail 5 minutes in because of a missing env var:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npx badgr-config-doctor --required-env HF_TOKEN,WANDB_API_KEY && badgr run python train.py
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Requirements
|
|
148
|
+
|
|
149
|
+
- Node.js 18+
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createLogger, fireTelemetry } from "badgr-shared";
|
|
3
|
+
import { runConfigDoctor } from "./index.js";
|
|
4
|
+
fireTelemetry({ package: "badgr-config-doctor" });
|
|
5
|
+
function readArg(name) {
|
|
6
|
+
const index = process.argv.indexOf(name);
|
|
7
|
+
return index >= 0 ? process.argv[index + 1] : undefined;
|
|
8
|
+
}
|
|
9
|
+
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
10
|
+
console.log(`badgr-config-doctor — local config and environment preflight
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
npx badgr-config-doctor --required-env API_KEY,DATABASE_URL
|
|
14
|
+
npx badgr-config-doctor --required-env API_KEY --json-text '{"port":3000}' --json
|
|
15
|
+
npx badgr-config-doctor --runtime node@20
|
|
16
|
+
|
|
17
|
+
Flags:
|
|
18
|
+
--required-env <keys> Comma-separated env var names to check (e.g. API_KEY,DB_URL)
|
|
19
|
+
--json-text <str> JSON config string to parse-validate
|
|
20
|
+
--yaml-text <str> YAML config string to parse-validate
|
|
21
|
+
--runtime <str> Runtime version to check (e.g. node@20, python@3.11)
|
|
22
|
+
--json Output machine-readable JSON
|
|
23
|
+
|
|
24
|
+
Exit codes:
|
|
25
|
+
0 All checks passed or warnings only
|
|
26
|
+
1 One or more checks failed
|
|
27
|
+
|
|
28
|
+
No signup required. Running on AI Badgr after setup passes is optional.
|
|
29
|
+
|
|
30
|
+
Environment:
|
|
31
|
+
BADGR_TELEMETRY=0 Disable anonymous usage telemetry`);
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
const json = process.argv.includes("--json");
|
|
35
|
+
const requiredEnv = (readArg("--required-env") ?? "").split(",").map((v) => v.trim()).filter(Boolean);
|
|
36
|
+
const result = runConfigDoctor({
|
|
37
|
+
env: process.env,
|
|
38
|
+
requiredEnv,
|
|
39
|
+
jsonText: readArg("--json-text"),
|
|
40
|
+
yamlText: readArg("--yaml-text"),
|
|
41
|
+
runtime: readArg("--runtime"),
|
|
42
|
+
});
|
|
43
|
+
const logger = createLogger(json);
|
|
44
|
+
if (json) {
|
|
45
|
+
logger.report(result.report);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
logger.line("badgr-config-doctor report");
|
|
49
|
+
logger.line("");
|
|
50
|
+
for (const check of result.checks) {
|
|
51
|
+
const sym = check.status === "pass" ? "✓" : check.status === "fail" ? "✗" : "!";
|
|
52
|
+
logger.line(`${sym} ${check.message}`);
|
|
53
|
+
}
|
|
54
|
+
logger.line("");
|
|
55
|
+
logger.line(`Status: ${result.report.status}`);
|
|
56
|
+
logger.line("");
|
|
57
|
+
logger.line("Optional: run your workload through AI Badgr after setup passes.");
|
|
58
|
+
}
|
|
59
|
+
process.exitCode = result.report.status === "failed" ? 1 : 0;
|
|
60
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,aAAa,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAElD,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;2DAqB6C,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACtG,MAAM,MAAM,GAAG,eAAe,CAAC;IAC7B,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,WAAW;IACX,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC;CAC9B,CAAC,CAAC;AACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AAClC,IAAI,IAAI,EAAE,CAAC;IACT,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;KAAM,CAAC;IACN,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC;AACD,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type DiagnosticCheck, type JsonReport } from "badgr-shared";
|
|
2
|
+
export interface ConfigDoctorOptions {
|
|
3
|
+
env?: Record<string, string | undefined>;
|
|
4
|
+
requiredEnv?: string[];
|
|
5
|
+
jsonText?: string;
|
|
6
|
+
yamlText?: string;
|
|
7
|
+
paths?: Record<string, boolean>;
|
|
8
|
+
packageVersions?: Record<string, string>;
|
|
9
|
+
runtime?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ConfigDoctorResult {
|
|
12
|
+
checks: DiagnosticCheck[];
|
|
13
|
+
report: JsonReport;
|
|
14
|
+
}
|
|
15
|
+
export declare function runConfigDoctor(options?: ConfigDoctorOptions): ConfigDoctorResult;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE7H,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAqDrF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { checkToFinding, createReport, reportStatusFromFindings } from "badgr-shared";
|
|
2
|
+
export function runConfigDoctor(options = {}) {
|
|
3
|
+
const checks = [];
|
|
4
|
+
const env = options.env ?? {};
|
|
5
|
+
for (const key of options.requiredEnv ?? []) {
|
|
6
|
+
const value = env[key];
|
|
7
|
+
checks.push({
|
|
8
|
+
name: `env-${key}`,
|
|
9
|
+
status: value && value.trim() ? "pass" : "fail",
|
|
10
|
+
message: value && value.trim() ? `${key} is set` : `${key} is missing from environment`,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
if (options.jsonText !== undefined) {
|
|
14
|
+
try {
|
|
15
|
+
JSON.parse(options.jsonText);
|
|
16
|
+
checks.push({ name: "json", status: "pass", message: "JSON config parsed successfully" });
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
checks.push({ name: "json", status: "fail", message: "JSON config is malformed", details: { error: String(error) } });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (options.yamlText !== undefined) {
|
|
23
|
+
checks.push(validateYamlLike(options.yamlText));
|
|
24
|
+
}
|
|
25
|
+
for (const [path, exists] of Object.entries(options.paths ?? {})) {
|
|
26
|
+
checks.push({ name: `path-${path}`, status: exists ? "pass" : "fail", message: exists ? `${path} exists` : `${path} is missing` });
|
|
27
|
+
}
|
|
28
|
+
const versions = options.packageVersions ?? {};
|
|
29
|
+
if (versions.react && versions["react-dom"] && versions.react.split(".")[0] !== versions["react-dom"].split(".")[0]) {
|
|
30
|
+
checks.push({ name: "package-conflict", status: "warn", message: "react and react-dom major versions do not match" });
|
|
31
|
+
}
|
|
32
|
+
if (options.runtime && !/^node-(18|20|22|24)\b/.test(options.runtime)) {
|
|
33
|
+
checks.push({ name: "runtime", status: "warn", message: `${options.runtime} may be unsupported; prefer Node 18 or newer` });
|
|
34
|
+
}
|
|
35
|
+
if (checks.length === 0)
|
|
36
|
+
checks.push({ name: "config-input", status: "info", message: "No config checks were requested" });
|
|
37
|
+
const findings = checks.map((check) => checkToFinding(check, "CONFIG"));
|
|
38
|
+
const status = reportStatusFromFindings(findings);
|
|
39
|
+
return {
|
|
40
|
+
checks,
|
|
41
|
+
report: createReport({
|
|
42
|
+
tool: "config-doctor",
|
|
43
|
+
status,
|
|
44
|
+
summary: status === "failed" ? "Configuration has blocking setup issues" : status === "warning" ? "Configuration has warnings" : "Configuration checks passed",
|
|
45
|
+
findings,
|
|
46
|
+
recommendedActions: buildConfigActions(checks),
|
|
47
|
+
nextCommand: "npx @aibadgr/config-doctor --json",
|
|
48
|
+
actionUrl: "https://aibadgr.com/gpu/setup",
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function validateYamlLike(text) {
|
|
53
|
+
const badLine = text.split(/\r?\n/).find((line) => {
|
|
54
|
+
const trimmed = line.trim();
|
|
55
|
+
return trimmed.length > 0 && !trimmed.startsWith("#") && !trimmed.startsWith("-") && !trimmed.includes(":");
|
|
56
|
+
});
|
|
57
|
+
return badLine
|
|
58
|
+
? { name: "yaml", status: "fail", message: "YAML config appears malformed", details: { line: badLine } }
|
|
59
|
+
: { name: "yaml", status: "pass", message: "YAML config looks structurally valid" };
|
|
60
|
+
}
|
|
61
|
+
function buildConfigActions(checks) {
|
|
62
|
+
const actions = [];
|
|
63
|
+
if (checks.some((check) => check.name.startsWith("env-") && check.status === "fail"))
|
|
64
|
+
actions.push("Set missing environment variables before runtime");
|
|
65
|
+
if (checks.some((check) => check.name === "json" && check.status === "fail"))
|
|
66
|
+
actions.push("Fix malformed JSON before deploying or running jobs");
|
|
67
|
+
if (checks.some((check) => check.name === "package-conflict"))
|
|
68
|
+
actions.push("Align conflicting package major versions");
|
|
69
|
+
actions.push("Run config preflight before badgr run or badgr serve");
|
|
70
|
+
return actions;
|
|
71
|
+
}
|
|
72
|
+
//# 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,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "badgr-config-doctor",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first setup preflight for .env, JSON/YAML config, paths, package conflicts, and runtimes.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": { "badgr-config-doctor": "dist/cli.js" },
|
|
9
|
+
"exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" } },
|
|
10
|
+
"files": ["dist", "README.md"],
|
|
11
|
+
"scripts": { "build": "tsc -b", "typecheck": "tsc -b --pretty false", "test": "vitest run" },
|
|
12
|
+
"dependencies": { "badgr-shared": "0.1.1" },
|
|
13
|
+
"engines": { "node": ">=18.0.0" },
|
|
14
|
+
"keywords": ["config", "env", "preflight", "dotenv", "yaml", "local-first"],
|
|
15
|
+
"license": "MIT"
|
|
16
|
+
}
|