@empline/preflight 1.1.14 → 1.1.15

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 (49) hide show
  1. package/dist/checks/auth/session-provider-wrapper.d.ts +47 -0
  2. package/dist/checks/auth/session-provider-wrapper.d.ts.map +1 -0
  3. package/dist/checks/auth/session-provider-wrapper.js +286 -0
  4. package/dist/checks/auth/session-provider-wrapper.js.map +1 -0
  5. package/dist/checks/database/prisma-upsert-safety.d.ts +39 -0
  6. package/dist/checks/database/prisma-upsert-safety.d.ts.map +1 -0
  7. package/dist/checks/database/prisma-upsert-safety.js +220 -0
  8. package/dist/checks/database/prisma-upsert-safety.js.map +1 -0
  9. package/dist/checks/dependencies/dependency-health-monitor.d.ts +49 -0
  10. package/dist/checks/dependencies/dependency-health-monitor.d.ts.map +1 -0
  11. package/dist/checks/dependencies/dependency-health-monitor.js +323 -0
  12. package/dist/checks/dependencies/dependency-health-monitor.js.map +1 -0
  13. package/dist/checks/file-hygiene-validation.d.ts +31 -0
  14. package/dist/checks/file-hygiene-validation.d.ts.map +1 -0
  15. package/dist/checks/file-hygiene-validation.js +934 -0
  16. package/dist/checks/file-hygiene-validation.js.map +1 -0
  17. package/dist/checks/organization/file-cleanup-validation.d.ts +22 -0
  18. package/dist/checks/organization/file-cleanup-validation.d.ts.map +1 -0
  19. package/dist/checks/organization/file-cleanup-validation.js +1121 -0
  20. package/dist/checks/organization/file-cleanup-validation.js.map +1 -0
  21. package/dist/checks/runtime/tailwind-runtime-check.d.ts +36 -0
  22. package/dist/checks/runtime/tailwind-runtime-check.d.ts.map +1 -0
  23. package/dist/checks/runtime/tailwind-runtime-check.js +264 -0
  24. package/dist/checks/runtime/tailwind-runtime-check.js.map +1 -0
  25. package/dist/checks/shipping-integration-validation.d.ts +28 -0
  26. package/dist/checks/shipping-integration-validation.d.ts.map +1 -0
  27. package/dist/checks/shipping-integration-validation.js +409 -0
  28. package/dist/checks/shipping-integration-validation.js.map +1 -0
  29. package/dist/checks/system/layout-constants-sync.d.ts +36 -0
  30. package/dist/checks/system/layout-constants-sync.d.ts.map +1 -0
  31. package/dist/checks/system/layout-constants-sync.js +642 -0
  32. package/dist/checks/system/layout-constants-sync.js.map +1 -0
  33. package/dist/checks/system/preflight-circular-dependency-detector.d.ts +26 -0
  34. package/dist/checks/system/preflight-circular-dependency-detector.d.ts.map +1 -0
  35. package/dist/checks/system/preflight-circular-dependency-detector.js +310 -0
  36. package/dist/checks/system/preflight-circular-dependency-detector.js.map +1 -0
  37. package/dist/checks/system/preflight-execution-benchmarks.d.ts +24 -0
  38. package/dist/checks/system/preflight-execution-benchmarks.d.ts.map +1 -0
  39. package/dist/checks/system/preflight-execution-benchmarks.js +282 -0
  40. package/dist/checks/system/preflight-execution-benchmarks.js.map +1 -0
  41. package/dist/checks/system/preflight-tag-taxonomy-validator.d.ts +27 -0
  42. package/dist/checks/system/preflight-tag-taxonomy-validator.d.ts.map +1 -0
  43. package/dist/checks/system/preflight-tag-taxonomy-validator.js +361 -0
  44. package/dist/checks/system/preflight-tag-taxonomy-validator.js.map +1 -0
  45. package/dist/utils/console-chars.d.ts +16 -0
  46. package/dist/utils/console-chars.d.ts.map +1 -1
  47. package/dist/utils/console-chars.js +10 -0
  48. package/dist/utils/console-chars.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Dependency Health Monitor
4
+ *
5
+ * Lightweight, mostly-offline dependency checks intended for preflight usage.
6
+ *
7
+ * Goals:
8
+ * - Flag risky/non-reproducible version ranges (e.g. "*", "latest")
9
+ * - Flag disallowed dependency specifiers (e.g. git/file/link where undesired)
10
+ * - Provide lockfile duplication signals (same package resolved to many versions)
11
+ *
12
+ * Notes:
13
+ * - pnpm lockfile is YAML; we parse it using conservative line-based extraction
14
+ * to avoid adding new deps just for YAML parsing.
15
+ */
16
+ import type { PreflightResult } from "../../utils/preflight-runner";
17
+ export declare const id = "dependencies/dependency-health-monitor";
18
+ export declare const name = "Dependency Health Monitor";
19
+ export declare const category = "dependencies";
20
+ export declare const blocking = false;
21
+ export declare const description = "Dependency Health Monitor";
22
+ export declare const tags: string[];
23
+ export type DependencyIssueSeverity = "error" | "warning" | "info";
24
+ export interface DependencyIssue {
25
+ severity: DependencyIssueSeverity;
26
+ message: string;
27
+ dependencyName?: string;
28
+ }
29
+ export interface DependencyHealthMonitorOptions {
30
+ workspaceRoot?: string;
31
+ packageJsonPath?: string;
32
+ lockfilePath?: string;
33
+ checkVersionSpecifiers?: boolean;
34
+ checkLockfileDupes?: boolean;
35
+ maxDistinctVersionsWarning?: number;
36
+ maxDistinctVersionsError?: number;
37
+ }
38
+ export interface DependencyHealthReport {
39
+ issues: DependencyIssue[];
40
+ metrics: {
41
+ durationMs: number;
42
+ totalDirectDeps: number;
43
+ totalLockPackages: number;
44
+ packagesWithMultipleVersions: number;
45
+ };
46
+ }
47
+ export declare function runDependencyHealthMonitor(options?: DependencyHealthMonitorOptions): Promise<PreflightResult>;
48
+ export declare function run(): Promise<PreflightResult>;
49
+ //# sourceMappingURL=dependency-health-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-health-monitor.d.ts","sourceRoot":"","sources":["../../../src/checks/dependencies/dependency-health-monitor.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIpE,eAAO,MAAM,EAAE,2CAA2C,CAAC;AAC3D,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AACvC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,IAAI,UAAmB,CAAC;AAErC,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAG7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;CACH;AA+GD,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,eAAe,CAAC,CAsJ1B;AAGD,wBAAsB,GAAG,6BAkCxB"}
@@ -0,0 +1,323 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ /**
4
+ * Dependency Health Monitor
5
+ *
6
+ * Lightweight, mostly-offline dependency checks intended for preflight usage.
7
+ *
8
+ * Goals:
9
+ * - Flag risky/non-reproducible version ranges (e.g. "*", "latest")
10
+ * - Flag disallowed dependency specifiers (e.g. git/file/link where undesired)
11
+ * - Provide lockfile duplication signals (same package resolved to many versions)
12
+ *
13
+ * Notes:
14
+ * - pnpm lockfile is YAML; we parse it using conservative line-based extraction
15
+ * to avoid adding new deps just for YAML parsing.
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.tags = exports.description = exports.blocking = exports.category = exports.name = exports.id = void 0;
52
+ exports.runDependencyHealthMonitor = runDependencyHealthMonitor;
53
+ exports.run = run;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const console_chars_1 = require("../../utils/console-chars");
57
+ const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
58
+ // Check metadata
59
+ exports.id = "dependencies/dependency-health-monitor";
60
+ exports.name = "Dependency Health Monitor";
61
+ exports.category = "dependencies";
62
+ exports.blocking = false;
63
+ exports.description = "Dependency Health Monitor";
64
+ exports.tags = ["dependencies"];
65
+ const DEFAULTS = {
66
+ checkVersionSpecifiers: true,
67
+ checkLockfileDupes: true,
68
+ maxDistinctVersionsWarning: 2,
69
+ maxDistinctVersionsError: 5,
70
+ };
71
+ function readJsonFile(filePath) {
72
+ const raw = fs.readFileSync(filePath, "utf-8");
73
+ return JSON.parse(raw);
74
+ }
75
+ function getLastAtIndex(value) {
76
+ // Handles scoped packages like "@types/node@20.11.0" (last '@' splits version)
77
+ return value.lastIndexOf("@");
78
+ }
79
+ function splitNameAndVersion(nameAtVersion) {
80
+ const idx = getLastAtIndex(nameAtVersion);
81
+ if (idx <= 0 || idx === nameAtVersion.length - 1)
82
+ return null;
83
+ return {
84
+ name: nameAtVersion.slice(0, idx),
85
+ version: nameAtVersion.slice(idx + 1),
86
+ };
87
+ }
88
+ function extractPnpmLockPackageKeys(lockText) {
89
+ // pnpm-lock.yaml contains a top-level "packages:" section.
90
+ // lockfileVersion 9 (current) uses quoted keys like:
91
+ // packages:
92
+ //
93
+ // '@scope/name@1.2.3':
94
+ // 'react@19.2.3':
95
+ //
96
+ // Older pnpm lock formats may use:
97
+ // /react@18.3.1:
98
+ // /@scope/name@1.2.3:
99
+ // /pkg@1.0.0(react@18.3.1):
100
+ //
101
+ // We conservatively extract both styles.
102
+ const keys = [];
103
+ const lines = lockText.split(/\r?\n/);
104
+ let inPackagesSection = false;
105
+ for (const line of lines) {
106
+ if (!inPackagesSection) {
107
+ if (line.trim() === "packages:") {
108
+ inPackagesSection = true;
109
+ }
110
+ continue;
111
+ }
112
+ // Exit when we hit another top-level section
113
+ if (/^[^\s]/.test(line))
114
+ break;
115
+ // Style A: two spaces, then quoted key
116
+ const quotedMatch = line.match(/^\s{2}['"]([^'"]+)['"]:\s*$/);
117
+ // Style B: two spaces, then /key
118
+ const slashMatch = line.match(/^\s{2}\/([^:]+):\s*$/);
119
+ const rawKey = quotedMatch?.[1] ?? slashMatch?.[1];
120
+ if (!rawKey)
121
+ continue;
122
+ if (!rawKey)
123
+ continue;
124
+ // Strip peer/dependency suffix in parentheses: "pkg@1.0.0(react@18...)" → "pkg@1.0.0"
125
+ const keyWithoutPeers = rawKey.split("(")[0] ?? rawKey;
126
+ keys.push(keyWithoutPeers);
127
+ }
128
+ return keys;
129
+ }
130
+ function toPreflightResult(report) {
131
+ const errors = [];
132
+ const warnings = [];
133
+ const info = [];
134
+ for (const issue of report.issues) {
135
+ const prefix = issue.dependencyName ? `[${issue.dependencyName}] ` : "";
136
+ const message = `${prefix}${issue.message}`;
137
+ if (issue.severity === "error")
138
+ errors.push(message);
139
+ else if (issue.severity === "warning")
140
+ warnings.push(message);
141
+ else
142
+ info.push(message);
143
+ }
144
+ return {
145
+ passed: errors.length === 0,
146
+ errors,
147
+ warnings,
148
+ info,
149
+ metrics: {
150
+ durationMs: report.metrics.durationMs,
151
+ totalDirectDeps: report.metrics.totalDirectDeps,
152
+ totalLockPackages: report.metrics.totalLockPackages,
153
+ packagesWithMultipleVersions: report.metrics.packagesWithMultipleVersions,
154
+ },
155
+ };
156
+ }
157
+ async function runDependencyHealthMonitor(options = {}) {
158
+ const startTime = Date.now();
159
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
160
+ const packageJsonPath = options.packageJsonPath ?? path.join(workspaceRoot, "package.json");
161
+ const lockfilePath = options.lockfilePath ?? path.join(workspaceRoot, "pnpm-lock.yaml");
162
+ const checkVersionSpecifiers = options.checkVersionSpecifiers ?? DEFAULTS.checkVersionSpecifiers;
163
+ const checkLockfileDupes = options.checkLockfileDupes ?? DEFAULTS.checkLockfileDupes;
164
+ const maxDistinctVersionsWarning = options.maxDistinctVersionsWarning ?? DEFAULTS.maxDistinctVersionsWarning;
165
+ const maxDistinctVersionsError = options.maxDistinctVersionsError ?? DEFAULTS.maxDistinctVersionsError;
166
+ const issues = [];
167
+ if (!fs.existsSync(packageJsonPath)) {
168
+ issues.push({
169
+ severity: "error",
170
+ message: `package.json not found at ${packageJsonPath}`,
171
+ });
172
+ const durationMs = Date.now() - startTime;
173
+ return toPreflightResult({
174
+ issues,
175
+ metrics: {
176
+ durationMs,
177
+ totalDirectDeps: 0,
178
+ totalLockPackages: 0,
179
+ packagesWithMultipleVersions: 0,
180
+ },
181
+ });
182
+ }
183
+ const pkg = readJsonFile(packageJsonPath);
184
+ const directDeps = {
185
+ ...(pkg.dependencies ?? {}),
186
+ ...(pkg.devDependencies ?? {}),
187
+ ...(pkg.optionalDependencies ?? {}),
188
+ };
189
+ if (checkVersionSpecifiers) {
190
+ for (const [depName, spec] of Object.entries(directDeps)) {
191
+ const trimmed = String(spec).trim();
192
+ // Common non-reproducible/risky specifiers
193
+ if (trimmed === "*" || trimmed.toLowerCase() === "latest") {
194
+ issues.push({
195
+ severity: "error",
196
+ dependencyName: depName,
197
+ message: `Non-reproducible version specifier: ${spec}`,
198
+ });
199
+ continue;
200
+ }
201
+ // Disallow git/file/link by default (these can break reproducibility)
202
+ if (/^git\+/.test(trimmed) ||
203
+ /^git:/.test(trimmed) ||
204
+ /^https?:\/\//.test(trimmed) ||
205
+ /^file:/.test(trimmed) ||
206
+ /^link:/.test(trimmed)) {
207
+ issues.push({
208
+ severity: "warning",
209
+ dependencyName: depName,
210
+ message: `Potentially non-reproducible dependency specifier: ${spec}`,
211
+ });
212
+ }
213
+ // workspace:* is typically intentional in monorepos
214
+ if (/^workspace:/.test(trimmed)) {
215
+ issues.push({
216
+ severity: "info",
217
+ dependencyName: depName,
218
+ message: `Workspace dependency: ${spec}`,
219
+ });
220
+ }
221
+ }
222
+ }
223
+ let totalLockPackages = 0;
224
+ let packagesWithMultipleVersions = 0;
225
+ if (checkLockfileDupes) {
226
+ if (!fs.existsSync(lockfilePath)) {
227
+ issues.push({
228
+ severity: "warning",
229
+ message: `pnpm lockfile not found at ${lockfilePath} (skipping lock health checks)`,
230
+ });
231
+ }
232
+ else {
233
+ const lockText = fs.readFileSync(lockfilePath, "utf-8");
234
+ const keys = extractPnpmLockPackageKeys(lockText);
235
+ totalLockPackages = keys.length;
236
+ const versionsByName = new Map();
237
+ for (const key of keys) {
238
+ const parsed = splitNameAndVersion(key);
239
+ if (!parsed)
240
+ continue;
241
+ const set = versionsByName.get(parsed.name) ?? new Set();
242
+ set.add(parsed.version);
243
+ versionsByName.set(parsed.name, set);
244
+ }
245
+ for (const [name, versions] of versionsByName.entries()) {
246
+ if (versions.size <= 1)
247
+ continue;
248
+ packagesWithMultipleVersions += 1;
249
+ const sortedVersions = Array.from(versions).sort();
250
+ const versionList = sortedVersions.slice(0, 5).join(", ");
251
+ const extra = sortedVersions.length > 5 ? ` (+${sortedVersions.length - 5} more)` : "";
252
+ if (versions.size >= maxDistinctVersionsError) {
253
+ issues.push({
254
+ severity: "error",
255
+ dependencyName: name,
256
+ message: `Resolved to ${versions.size} distinct versions in lockfile: ${versionList}${extra}`,
257
+ });
258
+ }
259
+ else if (versions.size >= maxDistinctVersionsWarning) {
260
+ issues.push({
261
+ severity: "warning",
262
+ dependencyName: name,
263
+ message: `Resolved to ${versions.size} distinct versions in lockfile: ${versionList}${extra}`,
264
+ });
265
+ }
266
+ }
267
+ }
268
+ }
269
+ const durationMs = Date.now() - startTime;
270
+ const report = {
271
+ issues,
272
+ metrics: {
273
+ durationMs,
274
+ totalDirectDeps: Object.keys(directDeps).length,
275
+ totalLockPackages,
276
+ packagesWithMultipleVersions,
277
+ },
278
+ };
279
+ return toPreflightResult(report);
280
+ }
281
+ // Export run function for framework compatibility
282
+ async function run() {
283
+ const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(path.basename(__filename, ".ts"));
284
+ const result = await runDependencyHealthMonitor();
285
+ console.log("\n🧩 DEPENDENCY HEALTH MONITOR\n");
286
+ if (result.errors.length > 0) {
287
+ console.log(`${console_chars_1.emoji.error} ERRORS`);
288
+ for (const error of result.errors)
289
+ console.log(`- ${error}`);
290
+ console.log();
291
+ }
292
+ if (result.warnings.length > 0) {
293
+ console.log(`${console_chars_1.emoji.warning} WARNINGS`);
294
+ for (const warning of result.warnings)
295
+ console.log(`- ${warning}`);
296
+ console.log();
297
+ }
298
+ if (result.info && result.info.length > 0) {
299
+ console.log(`${console_chars_1.emoji.info} INFO`);
300
+ for (const message of result.info)
301
+ console.log(`- ${message}`);
302
+ console.log();
303
+ }
304
+ if (result.metrics) {
305
+ console.log((0, console_chars_1.createDivider)(60, "light"));
306
+ console.log(`Duration: ${result.metrics.durationMs}ms`);
307
+ console.log(`Direct deps: ${result.metrics.totalDirectDeps}`);
308
+ console.log(`Lock packages: ${result.metrics.totalLockPackages}`);
309
+ console.log(`Multi-version packages: ${result.metrics.packagesWithMultipleVersions}`);
310
+ console.log((0, console_chars_1.createDivider)(60, "light"));
311
+ }
312
+ return result;
313
+ }
314
+ // Allow direct execution
315
+ if (require.main === module) {
316
+ run()
317
+ .then((result) => process.exit(result.passed ? 0 : 1))
318
+ .catch((err) => {
319
+ console.error("Error:", err);
320
+ process.exit(1);
321
+ });
322
+ }
323
+ //# sourceMappingURL=dependency-health-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-health-monitor.js","sourceRoot":"","sources":["../../../src/checks/dependencies/dependency-health-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * File Hygiene Validation Preflight (BLOCKING)
4
+ *
5
+ * Catches file naming anti-patterns that indicate technical debt:
6
+ * 1. Version suffixes (-v2, -v3, etc.) - indicates unfinished migration
7
+ * 2. Temporary suffixes (-old, -backup, -new, -legacy, -deprecated)
8
+ * 3. Problematic route segments (/new/, /old/, /temp/) in app router
9
+ * 4. Duplicate/shadow files that should be consolidated
10
+ * 5. Case collisions (UserCard.tsx vs usercard.tsx)
11
+ * 6. Component/export name mismatches
12
+ * 7. Directory naming violations
13
+ *
14
+ * BLOCKING: Fails build if violations found (unless allowlisted).
15
+ *
16
+ * Usage:
17
+ * pnpm preflight:file-hygiene - BLOCKING mode
18
+ * pnpm preflight:file-hygiene --warning - Warning mode
19
+ * pnpm preflight:file-hygiene --fix-preview - Show migration suggestions
20
+ * pnpm preflight:file-hygiene --add-allowlist <file> - Add to allowlist
21
+ * pnpm preflight:file-hygiene --check-duplicates - Check for duplicate filenames
22
+ * pnpm preflight:file-hygiene --check-exports - Check component/export name match
23
+ */
24
+ export declare const id = "misc/file-hygiene-validation";
25
+ export declare const name = "File Hygiene Validation";
26
+ export declare const category = "misc";
27
+ export declare const blocking = true;
28
+ export declare const description = "File Hygiene Validation Preflight (BLOCKING)";
29
+ export declare const tags: string[];
30
+ export declare function run(): Promise<void>;
31
+ //# sourceMappingURL=file-hygiene-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hygiene-validation.d.ts","sourceRoot":"","sources":["../../src/checks/file-hygiene-validation.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAaH,eAAO,MAAM,EAAE,iCAAiC,CAAC;AACjD,eAAO,MAAM,IAAI,4BAA4B,CAAC;AAC9C,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAC1E,eAAO,MAAM,IAAI,UAAwB,CAAC;AAo9B1C,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBzC"}