@beignet/cli 0.0.31 → 0.0.32

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 (68) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +49 -6
  3. package/dist/check.d.ts +2 -0
  4. package/dist/check.d.ts.map +1 -1
  5. package/dist/check.js +16 -0
  6. package/dist/check.js.map +1 -1
  7. package/dist/choices.d.ts +22 -2
  8. package/dist/choices.d.ts.map +1 -1
  9. package/dist/choices.js +60 -0
  10. package/dist/choices.js.map +1 -1
  11. package/dist/config.d.ts +1 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +1 -0
  14. package/dist/config.js.map +1 -1
  15. package/dist/create-prompts.d.ts +6 -2
  16. package/dist/create-prompts.d.ts.map +1 -1
  17. package/dist/create-prompts.js +1 -1
  18. package/dist/create-prompts.js.map +1 -1
  19. package/dist/db.d.ts +5 -5
  20. package/dist/db.d.ts.map +1 -1
  21. package/dist/db.js +4 -4
  22. package/dist/db.js.map +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +107 -26
  25. package/dist/index.js.map +1 -1
  26. package/dist/inspect.d.ts +5 -0
  27. package/dist/inspect.d.ts.map +1 -1
  28. package/dist/inspect.js +8 -4
  29. package/dist/inspect.js.map +1 -1
  30. package/dist/make/shared.d.ts +1 -1
  31. package/dist/make/shared.d.ts.map +1 -1
  32. package/dist/make/shared.js +8 -1
  33. package/dist/make/shared.js.map +1 -1
  34. package/dist/make.d.ts.map +1 -1
  35. package/dist/make.js +7 -10
  36. package/dist/make.js.map +1 -1
  37. package/dist/preflight.d.ts +90 -0
  38. package/dist/preflight.d.ts.map +1 -0
  39. package/dist/preflight.js +423 -0
  40. package/dist/preflight.js.map +1 -0
  41. package/dist/provider-add.d.ts +10 -1
  42. package/dist/provider-add.d.ts.map +1 -1
  43. package/dist/provider-add.js +209 -16
  44. package/dist/provider-add.js.map +1 -1
  45. package/dist/templates/base.d.ts.map +1 -1
  46. package/dist/templates/base.js +2 -8
  47. package/dist/templates/base.js.map +1 -1
  48. package/dist/templates/server.js +4 -4
  49. package/dist/templates/shared.d.ts +2 -0
  50. package/dist/templates/shared.d.ts.map +1 -1
  51. package/dist/templates/shared.js +2 -0
  52. package/dist/templates/shared.js.map +1 -1
  53. package/package.json +2 -2
  54. package/skills/app-structure/SKILL.md +1 -1
  55. package/src/check.ts +23 -0
  56. package/src/choices.ts +81 -0
  57. package/src/config.ts +2 -0
  58. package/src/create-prompts.ts +8 -2
  59. package/src/db.ts +11 -11
  60. package/src/index.ts +155 -36
  61. package/src/inspect.ts +8 -4
  62. package/src/make/shared.ts +9 -2
  63. package/src/make.ts +7 -11
  64. package/src/preflight.ts +596 -0
  65. package/src/provider-add.ts +223 -16
  66. package/src/templates/base.ts +2 -10
  67. package/src/templates/server.ts +4 -4
  68. package/src/templates/shared.ts +2 -0
@@ -0,0 +1,90 @@
1
+ import { type InspectDiagnostic } from "./inspect.js";
2
+ /**
3
+ * One preflight finding. Errors fail the gate; warnings and notes do not.
4
+ */
5
+ export interface PreflightFinding {
6
+ severity: "error" | "warning" | "note";
7
+ code: string;
8
+ message: string;
9
+ }
10
+ export interface PreflightOptions {
11
+ cwd: string;
12
+ /**
13
+ * Environment to validate. Defaults to `process.env` so the command checks
14
+ * the environment the deploy pipeline actually runs with.
15
+ */
16
+ env?: Record<string, string | undefined>;
17
+ /**
18
+ * Optional dotenv-style file merged under the environment (existing env
19
+ * keys win) for local rehearsal of a deploy environment.
20
+ */
21
+ envFile?: string;
22
+ /**
23
+ * App env module validated by importing it (default `lib/env.ts`). The
24
+ * module's `createEnv(...)` call performs the validation.
25
+ */
26
+ envModule?: string;
27
+ /**
28
+ * Fold doctor's production hardening diagnostics into the gate. Defaults
29
+ * to `true`.
30
+ */
31
+ doctor?: boolean;
32
+ /**
33
+ * Boot the app server and run every port's `checkHealth()`. Needs network
34
+ * access and real credentials, so it is opt-in.
35
+ */
36
+ connect?: boolean;
37
+ /**
38
+ * Module exporting `getServer` (or `server`), used by `connect`. Defaults
39
+ * to `server/index.ts`.
40
+ */
41
+ serverModule?: string;
42
+ /**
43
+ * Per-dependency health check timeout in milliseconds. Defaults to 5000.
44
+ */
45
+ connectTimeoutMs?: number;
46
+ }
47
+ export interface PreflightResult {
48
+ findings: PreflightFinding[];
49
+ /**
50
+ * Provider packages whose manifests were checked.
51
+ */
52
+ checkedProviders: string[];
53
+ /**
54
+ * Whether the app env module was found and imported.
55
+ */
56
+ envModuleChecked: boolean;
57
+ /**
58
+ * Whether doctor's production hardening diagnostics were folded in.
59
+ */
60
+ doctorChecked: boolean;
61
+ /**
62
+ * Ports whose `checkHealth()` ran during a `connect` pass.
63
+ */
64
+ checkedDependencies: string[];
65
+ }
66
+ /**
67
+ * Map doctor diagnostics to preflight findings: only production hardening
68
+ * codes are kept, and their severities are promoted for the deploy gate —
69
+ * doctor errors and warnings both fail preflight; hints become warnings.
70
+ */
71
+ export declare function productionFindingsFromDiagnostics(diagnostics: readonly InspectDiagnostic[]): PreflightFinding[];
72
+ /**
73
+ * Parse a dotenv-style file: KEY=VALUE lines, `#` comments, optional single
74
+ * or double quotes around the value.
75
+ */
76
+ export declare function parseEnvFile(source: string): Record<string, string>;
77
+ /**
78
+ * Validate the deploy environment against installed provider manifests, the
79
+ * app's `.env.example` placeholders, and the app env schema module.
80
+ *
81
+ * This is a runtime gate, unlike `beignet doctor`: it reads the actual
82
+ * environment the process runs with, so run it in the deploy pipeline where
83
+ * production configuration is present.
84
+ */
85
+ export declare function runPreflight(options: PreflightOptions): Promise<PreflightResult>;
86
+ /**
87
+ * Format a preflight result for terminal output.
88
+ */
89
+ export declare function formatPreflight(result: PreflightResult, cwd: string): string;
90
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,cAAc,CAAC;AAQtB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B;;OAEG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;OAEG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,SAAS,iBAAiB,EAAE,GACxC,gBAAgB,EAAE,CAUpB;AAOD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBnE;AAgDD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA8J1B;AAgJD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA0C5E"}
@@ -0,0 +1,423 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parseProviderPackageMetadata } from "@beignet/core/providers";
4
+ import { createJiti } from "jiti";
5
+ import { inspectApp, productionHardeningDiagnosticCodes, } from "./inspect.js";
6
+ import { installedPackageNames, providerDoctorRulesForInstalledPackages, readProviderPackageMetadataSource, } from "./provider-audit.js";
7
+ /**
8
+ * Map doctor diagnostics to preflight findings: only production hardening
9
+ * codes are kept, and their severities are promoted for the deploy gate —
10
+ * doctor errors and warnings both fail preflight; hints become warnings.
11
+ */
12
+ export function productionFindingsFromDiagnostics(diagnostics) {
13
+ return diagnostics
14
+ .filter((diagnostic) => productionHardeningDiagnosticCodes.has(diagnostic.code))
15
+ .map((diagnostic) => ({
16
+ severity: diagnostic.severity === "hint" ? "warning" : "error",
17
+ code: diagnostic.code,
18
+ message: diagnostic.message,
19
+ }));
20
+ }
21
+ const SECRET_KEY_PATTERN = /SECRET|TOKEN|KEY|PASS|PASSWORD|DSN/i;
22
+ const PLACEHOLDER_VALUE_PATTERN = /^(changeme|change-me|todo|placeholder|xxx+)$|replace-with|replace-me|dev-placeholder|your-[a-z]/i;
23
+ /**
24
+ * Parse a dotenv-style file: KEY=VALUE lines, `#` comments, optional single
25
+ * or double quotes around the value.
26
+ */
27
+ export function parseEnvFile(source) {
28
+ const values = {};
29
+ for (const rawLine of source.split("\n")) {
30
+ const line = rawLine.trim();
31
+ if (!line || line.startsWith("#"))
32
+ continue;
33
+ const eq = line.indexOf("=");
34
+ if (eq <= 0)
35
+ continue;
36
+ const key = line.slice(0, eq).trim();
37
+ let value = line.slice(eq + 1).trim();
38
+ if ((value.startsWith('"') && value.endsWith('"')) ||
39
+ (value.startsWith("'") && value.endsWith("'"))) {
40
+ value = value.slice(1, -1);
41
+ }
42
+ values[key] = value;
43
+ }
44
+ return values;
45
+ }
46
+ async function readFileIfExists(filePath) {
47
+ try {
48
+ return await readFile(filePath, "utf8");
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ async function readPackageJson(cwd) {
55
+ const source = await readFileIfExists(path.join(cwd, "package.json"));
56
+ if (!source)
57
+ return undefined;
58
+ try {
59
+ return JSON.parse(source);
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ function isSecretish(key) {
66
+ return SECRET_KEY_PATTERN.test(key);
67
+ }
68
+ function applyEnvToProcess(env) {
69
+ const previousValues = new Map();
70
+ for (const [key, value] of Object.entries(env)) {
71
+ if (value === undefined)
72
+ continue;
73
+ previousValues.set(key, process.env[key]);
74
+ process.env[key] = value;
75
+ }
76
+ return () => {
77
+ for (const [key, value] of previousValues) {
78
+ if (value === undefined) {
79
+ delete process.env[key];
80
+ }
81
+ else {
82
+ process.env[key] = value;
83
+ }
84
+ }
85
+ };
86
+ }
87
+ /**
88
+ * Validate the deploy environment against installed provider manifests, the
89
+ * app's `.env.example` placeholders, and the app env schema module.
90
+ *
91
+ * This is a runtime gate, unlike `beignet doctor`: it reads the actual
92
+ * environment the process runs with, so run it in the deploy pipeline where
93
+ * production configuration is present.
94
+ */
95
+ export async function runPreflight(options) {
96
+ const findings = [];
97
+ const env = {
98
+ ...(options.env ?? process.env),
99
+ };
100
+ if (options.envFile) {
101
+ const source = await readFileIfExists(path.resolve(options.cwd, options.envFile));
102
+ if (source === undefined) {
103
+ findings.push({
104
+ severity: "error",
105
+ code: "BEIGNET_PREFLIGHT_ENV_FILE_MISSING",
106
+ message: `Env file "${options.envFile}" does not exist.`,
107
+ });
108
+ }
109
+ else {
110
+ for (const [key, value] of Object.entries(parseEnvFile(source))) {
111
+ if (env[key] === undefined)
112
+ env[key] = value;
113
+ }
114
+ }
115
+ }
116
+ const packageJson = await readPackageJson(options.cwd);
117
+ if (!packageJson) {
118
+ findings.push({
119
+ severity: "error",
120
+ code: "BEIGNET_PREFLIGHT_PACKAGE_JSON_MISSING",
121
+ message: `No package.json found in ${options.cwd}.`,
122
+ });
123
+ return {
124
+ findings,
125
+ checkedProviders: [],
126
+ envModuleChecked: false,
127
+ doctorChecked: false,
128
+ checkedDependencies: [],
129
+ };
130
+ }
131
+ const rules = await providerDoctorRulesForInstalledPackages(options.cwd, packageJson);
132
+ const checkedProviders = rules.map((rule) => rule.packageName);
133
+ const requiredEnvKeys = new Set();
134
+ for (const rule of rules) {
135
+ for (const key of rule.requiredEnv ?? []) {
136
+ requiredEnvKeys.add(key);
137
+ const value = env[key];
138
+ if (value === undefined || value.trim() === "") {
139
+ findings.push({
140
+ severity: "error",
141
+ code: "BEIGNET_PREFLIGHT_ENV_MISSING",
142
+ message: `${key} is required by ${rule.packageName} but is not set.`,
143
+ });
144
+ }
145
+ }
146
+ }
147
+ const exampleSource = await readFileIfExists(path.join(options.cwd, ".env.example"));
148
+ const exampleValues = exampleSource ? parseEnvFile(exampleSource) : {};
149
+ for (const [key, value] of Object.entries(env)) {
150
+ if (value === undefined || value === "")
151
+ continue;
152
+ const guarded = requiredEnvKeys.has(key) || isSecretish(key);
153
+ if (!guarded)
154
+ continue;
155
+ if (Object.hasOwn(exampleValues, key) &&
156
+ exampleValues[key] !== "" &&
157
+ exampleValues[key] === value) {
158
+ findings.push({
159
+ severity: "error",
160
+ code: "BEIGNET_PREFLIGHT_ENV_PLACEHOLDER",
161
+ message: `${key} still has its .env.example value. Set a real value in the deploy environment.`,
162
+ });
163
+ continue;
164
+ }
165
+ if (PLACEHOLDER_VALUE_PATTERN.test(value)) {
166
+ findings.push({
167
+ severity: "error",
168
+ code: "BEIGNET_PREFLIGHT_ENV_PLACEHOLDER",
169
+ message: `${key} looks like a placeholder value ("${value}"). Set a real value in the deploy environment.`,
170
+ });
171
+ }
172
+ }
173
+ await checkObservabilityWiring(options.cwd, packageJson, env, findings);
174
+ findings.push({
175
+ severity: "note",
176
+ code: "BEIGNET_PREFLIGHT_MANUAL_REVIEW",
177
+ message: "Manual review (no framework primitives yet): CSRF protection, secure headers, and tracing export — see the deployment docs hardening checklist.",
178
+ });
179
+ let envModuleChecked = false;
180
+ let doctorChecked = false;
181
+ const checkedDependencies = [];
182
+ const restoreProcessEnv = applyEnvToProcess(env);
183
+ try {
184
+ const envModule = options.envModule ?? "lib/env.ts";
185
+ const envModulePath = path.resolve(options.cwd, envModule);
186
+ const envModuleSource = await readFileIfExists(envModulePath);
187
+ if (envModuleSource === undefined) {
188
+ findings.push({
189
+ severity: "note",
190
+ code: "BEIGNET_PREFLIGHT_ENV_MODULE_MISSING",
191
+ message: `No app env module at ${envModule}; skipping app env schema validation.`,
192
+ });
193
+ }
194
+ else {
195
+ try {
196
+ const jiti = createJiti(envModulePath, {
197
+ interopDefault: true,
198
+ moduleCache: false,
199
+ });
200
+ await jiti.import(envModulePath);
201
+ envModuleChecked = true;
202
+ }
203
+ catch (error) {
204
+ findings.push({
205
+ severity: "error",
206
+ code: "BEIGNET_PREFLIGHT_APP_ENV_INVALID",
207
+ message: `App env schema validation failed (${envModule}): ${error instanceof Error ? error.message : String(error)}`,
208
+ });
209
+ }
210
+ }
211
+ if (options.doctor !== false) {
212
+ const inspected = await inspectApp({ cwd: options.cwd });
213
+ findings.push(...productionFindingsFromDiagnostics(inspected.diagnostics));
214
+ doctorChecked = true;
215
+ }
216
+ if (options.connect) {
217
+ await runDependencyChecks(options, findings, checkedDependencies);
218
+ }
219
+ }
220
+ finally {
221
+ restoreProcessEnv();
222
+ }
223
+ return {
224
+ findings,
225
+ checkedProviders,
226
+ envModuleChecked,
227
+ doctorChecked,
228
+ checkedDependencies,
229
+ };
230
+ }
231
+ function isHealthCheckable(value) {
232
+ return (typeof value === "object" &&
233
+ value !== null &&
234
+ typeof value.checkHealth === "function");
235
+ }
236
+ function healthResultOk(result) {
237
+ if (typeof result !== "object" || result === null)
238
+ return true;
239
+ const ok = result.ok;
240
+ return ok === undefined || ok === true;
241
+ }
242
+ async function withTimeout(work, ms, label) {
243
+ let timer;
244
+ try {
245
+ return await Promise.race([
246
+ work,
247
+ new Promise((_, reject) => {
248
+ timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
249
+ }),
250
+ ]);
251
+ }
252
+ finally {
253
+ if (timer !== undefined)
254
+ clearTimeout(timer);
255
+ }
256
+ }
257
+ /**
258
+ * Boot the app server through the same jiti loading the operational commands
259
+ * use, then run `checkHealth()` on every port that exposes one.
260
+ */
261
+ async function runDependencyChecks(options, findings, checkedDependencies) {
262
+ const serverModule = options.serverModule ?? "server/index.ts";
263
+ const serverModulePath = path.resolve(options.cwd, serverModule);
264
+ const timeoutMs = options.connectTimeoutMs ?? 5000;
265
+ if ((await readFileIfExists(serverModulePath)) === undefined) {
266
+ findings.push({
267
+ severity: "error",
268
+ code: "BEIGNET_PREFLIGHT_SERVER_MODULE_MISSING",
269
+ message: `--connect needs a server module at ${serverModule} (override with --server-module).`,
270
+ });
271
+ return;
272
+ }
273
+ let server;
274
+ try {
275
+ const jiti = createJiti(serverModulePath, {
276
+ interopDefault: true,
277
+ moduleCache: false,
278
+ });
279
+ const loaded = (await jiti.import(serverModulePath));
280
+ const candidate = loaded.getServer ?? loaded.server;
281
+ const resolved = typeof candidate === "function" ? await candidate() : await candidate;
282
+ if (typeof resolved !== "object" ||
283
+ resolved === null ||
284
+ typeof resolved.ports !== "object") {
285
+ findings.push({
286
+ severity: "error",
287
+ code: "BEIGNET_PREFLIGHT_SERVER_EXPORT_MISSING",
288
+ message: `${serverModule} must export getServer (or server) resolving to a server with ports.`,
289
+ });
290
+ return;
291
+ }
292
+ server = resolved;
293
+ }
294
+ catch (error) {
295
+ findings.push({
296
+ severity: "error",
297
+ code: "BEIGNET_PREFLIGHT_SERVER_BOOT_FAILED",
298
+ message: `Booting the app server failed: ${error instanceof Error ? error.message : String(error)}`,
299
+ });
300
+ return;
301
+ }
302
+ try {
303
+ for (const [name, port] of Object.entries(server.ports)) {
304
+ if (!isHealthCheckable(port))
305
+ continue;
306
+ checkedDependencies.push(name);
307
+ try {
308
+ const result = await withTimeout(port.checkHealth(), timeoutMs, `${name}.checkHealth()`);
309
+ if (!healthResultOk(result)) {
310
+ const message = result.message;
311
+ findings.push({
312
+ severity: "error",
313
+ code: "BEIGNET_PREFLIGHT_DEPENDENCY_UNHEALTHY",
314
+ message: `${name} reported unhealthy${typeof message === "string" ? `: ${message}` : "."}`,
315
+ });
316
+ }
317
+ }
318
+ catch (error) {
319
+ findings.push({
320
+ severity: "error",
321
+ code: "BEIGNET_PREFLIGHT_DEPENDENCY_UNHEALTHY",
322
+ message: `${name} health check failed: ${error instanceof Error ? error.message : String(error)}`,
323
+ });
324
+ }
325
+ }
326
+ }
327
+ finally {
328
+ try {
329
+ await server.stop?.();
330
+ }
331
+ catch {
332
+ // Shutdown failures do not change readiness results.
333
+ }
334
+ }
335
+ }
336
+ /**
337
+ * Format a preflight result for terminal output.
338
+ */
339
+ export function formatPreflight(result, cwd) {
340
+ const lines = [];
341
+ const errors = result.findings.filter((f) => f.severity === "error");
342
+ const warnings = result.findings.filter((f) => f.severity === "warning");
343
+ const notes = result.findings.filter((f) => f.severity === "note");
344
+ for (const finding of [...errors, ...warnings, ...notes]) {
345
+ const tag = finding.severity === "error"
346
+ ? "error"
347
+ : finding.severity === "warning"
348
+ ? "warning"
349
+ : "note";
350
+ lines.push(`${tag} ${finding.code}: ${finding.message}`);
351
+ }
352
+ if (lines.length > 0)
353
+ lines.push("");
354
+ const providerSummary = result.checkedProviders.length
355
+ ? `${result.checkedProviders.length} provider manifest(s)`
356
+ : "no provider manifests";
357
+ const envSummary = result.envModuleChecked
358
+ ? "app env schema validated"
359
+ : "app env schema not validated";
360
+ const doctorSummary = result.doctorChecked
361
+ ? "production hardening checks folded in"
362
+ : "production hardening checks skipped";
363
+ const dependencySummary = result.checkedDependencies.length
364
+ ? `, ${result.checkedDependencies.length} dependency health check(s) run`
365
+ : "";
366
+ if (errors.length === 0) {
367
+ lines.push(`Preflight passed in ${cwd}: ${providerSummary} checked, ${envSummary}, ${doctorSummary}${dependencySummary}.`);
368
+ }
369
+ else {
370
+ lines.push(`Preflight failed in ${cwd}: ${errors.length} error(s) across ${providerSummary}, ${envSummary}, ${doctorSummary}${dependencySummary}.`);
371
+ }
372
+ return `${lines.join("\n")}\n`;
373
+ }
374
+ const DSN_KEY_PATTERN = /DSN/i;
375
+ /**
376
+ * Warn when logging or error reporting is absent or inert: no installed
377
+ * provider contributes a `logger` or `errorReporter` port, or an error
378
+ * reporting provider is installed but its DSN-style env var is unset.
379
+ */
380
+ async function checkObservabilityWiring(cwd, packageJson, env, findings) {
381
+ let hasLogger = false;
382
+ let hasErrorReporter = false;
383
+ for (const packageName of installedPackageNames(packageJson)) {
384
+ const source = await readProviderPackageMetadataSource(cwd, packageName);
385
+ if (!source)
386
+ continue;
387
+ const parsed = parseProviderPackageMetadata(source.metadata);
388
+ if (!parsed.success)
389
+ continue;
390
+ const ports = parsed.metadata.ports ?? [];
391
+ if (ports.includes("logger"))
392
+ hasLogger = true;
393
+ if (ports.includes("errorReporter")) {
394
+ hasErrorReporter = true;
395
+ const dsnKeys = (parsed.metadata.env ?? []).filter((key) => DSN_KEY_PATTERN.test(key));
396
+ for (const key of dsnKeys) {
397
+ const value = env[key];
398
+ if (value === undefined || value.trim() === "") {
399
+ findings.push({
400
+ severity: "warning",
401
+ code: "BEIGNET_PREFLIGHT_ERROR_REPORTING_INERT",
402
+ message: `${packageName} is installed but ${key} is not set, so error reporting will be inert.`,
403
+ });
404
+ }
405
+ }
406
+ }
407
+ }
408
+ if (!hasLogger) {
409
+ findings.push({
410
+ severity: "warning",
411
+ code: "BEIGNET_PREFLIGHT_LOGGING_NOT_CONFIGURED",
412
+ message: "No installed provider contributes a logger port; production logs need a real logger provider such as @beignet/provider-logger-pino.",
413
+ });
414
+ }
415
+ if (!hasErrorReporter) {
416
+ findings.push({
417
+ severity: "warning",
418
+ code: "BEIGNET_PREFLIGHT_ERROR_REPORTING_NOT_CONFIGURED",
419
+ message: "No installed provider contributes an errorReporter port; production error capture needs a provider such as @beignet/provider-error-reporting-sentry.",
420
+ });
421
+ }
422
+ }
423
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type ProviderPresetName } from "./choices.js";
1
+ import { type IntegrationName, type ProviderPresetName } from "./choices.js";
2
2
  export type AddProviderPresetOptions = {
3
3
  name: ProviderPresetName | string;
4
4
  cwd?: string;
@@ -15,5 +15,14 @@ export type AddProviderPresetResult = {
15
15
  skippedFiles: string[];
16
16
  nextSteps: string[];
17
17
  };
18
+ /**
19
+ * Whether a preset ships `.env.example` entries the user must fill in.
20
+ */
21
+ export declare function providerPresetNeedsEnv(name: ProviderPresetName): boolean;
22
+ /**
23
+ * Fail fast when a create-time selection combines presets or template
24
+ * integrations that fill the same app port, before any files are written.
25
+ */
26
+ export declare function assertCompatibleCreatePresets(presetNames: readonly ProviderPresetName[], integrations: readonly IntegrationName[]): void;
18
27
  export declare function addProviderPreset(options: AddProviderPresetOptions): Promise<AddProviderPresetResult>;
19
28
  //# sourceMappingURL=provider-add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-add.d.ts","sourceRoot":"","sources":["../src/provider-add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,cAAc,CAAC;AAgB9E,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAgdF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CA0FlC"}
1
+ {"version":3,"file":"provider-add.d.ts","sourceRoot":"","sources":["../src/provider-add.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EAExB,MAAM,cAAc,CAAC;AAgBtB,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAwnBF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAExE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAC1C,YAAY,EAAE,SAAS,eAAe,EAAE,GACvC,IAAI,CAmBN;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CA0FlC"}