@aiready/core 0.19.0 → 0.19.3

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.js CHANGED
@@ -30,20 +30,34 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ AnalysisResultSchema: () => AnalysisResultSchema,
34
+ AnalysisStatus: () => AnalysisStatus,
35
+ AnalysisStatusSchema: () => AnalysisStatusSchema,
33
36
  CONTEXT_TIER_THRESHOLDS: () => CONTEXT_TIER_THRESHOLDS,
34
37
  DEFAULT_COST_CONFIG: () => DEFAULT_COST_CONFIG,
35
38
  DEFAULT_EXCLUDE: () => DEFAULT_EXCLUDE,
36
39
  DEFAULT_TOOL_WEIGHTS: () => DEFAULT_TOOL_WEIGHTS,
40
+ IssueSchema: () => IssueSchema,
41
+ IssueType: () => IssueType,
42
+ IssueTypeSchema: () => IssueTypeSchema,
37
43
  LANGUAGE_EXTENSIONS: () => LANGUAGE_EXTENSIONS,
38
44
  Language: () => Language,
45
+ LocationSchema: () => LocationSchema,
39
46
  MODEL_PRICING_PRESETS: () => MODEL_PRICING_PRESETS,
47
+ MetricsSchema: () => MetricsSchema,
48
+ ModelTier: () => ModelTier,
49
+ ModelTierSchema: () => ModelTierSchema,
40
50
  ParseError: () => ParseError,
41
51
  ParserFactory: () => ParserFactory,
42
52
  PythonParser: () => PythonParser,
43
53
  SEVERITY_TIME_ESTIMATES: () => SEVERITY_TIME_ESTIMATES,
44
54
  SIZE_ADJUSTED_THRESHOLDS: () => SIZE_ADJUSTED_THRESHOLDS,
55
+ Severity: () => Severity,
56
+ SeveritySchema: () => SeveritySchema,
57
+ SpokeOutputSchema: () => SpokeOutputSchema,
45
58
  TOOL_NAME_MAP: () => TOOL_NAME_MAP,
46
59
  TypeScriptParser: () => TypeScriptParser,
60
+ UnifiedReportSchema: () => UnifiedReportSchema,
47
61
  VAGUE_FILE_NAMES: () => VAGUE_FILE_NAMES,
48
62
  calculateAgentGrounding: () => calculateAgentGrounding,
49
63
  calculateAiSignalClarity: () => calculateAiSignalClarity,
@@ -116,10 +130,125 @@ __export(index_exports, {
116
130
  saveScoreEntry: () => saveScoreEntry,
117
131
  scanEntries: () => scanEntries,
118
132
  scanFiles: () => scanFiles,
119
- validateSpokeOutput: () => validateSpokeOutput
133
+ validateSpokeOutput: () => validateSpokeOutput,
134
+ validateWithSchema: () => validateWithSchema
120
135
  });
121
136
  module.exports = __toCommonJS(index_exports);
122
137
 
138
+ // src/types/schema.ts
139
+ var import_zod = require("zod");
140
+ var Severity = /* @__PURE__ */ ((Severity2) => {
141
+ Severity2["Critical"] = "critical";
142
+ Severity2["Major"] = "major";
143
+ Severity2["Minor"] = "minor";
144
+ Severity2["Info"] = "info";
145
+ return Severity2;
146
+ })(Severity || {});
147
+ var SeveritySchema = import_zod.z.nativeEnum(Severity);
148
+ var IssueType = /* @__PURE__ */ ((IssueType2) => {
149
+ IssueType2["DuplicatePattern"] = "duplicate-pattern";
150
+ IssueType2["PatternInconsistency"] = "pattern-inconsistency";
151
+ IssueType2["ContextFragmentation"] = "context-fragmentation";
152
+ IssueType2["DependencyHealth"] = "dependency-health";
153
+ IssueType2["CircularDependency"] = "circular-dependency";
154
+ IssueType2["DocDrift"] = "doc-drift";
155
+ IssueType2["NamingInconsistency"] = "naming-inconsistency";
156
+ IssueType2["NamingQuality"] = "naming-quality";
157
+ IssueType2["ArchitectureInconsistency"] = "architecture-inconsistency";
158
+ IssueType2["DeadCode"] = "dead-code";
159
+ IssueType2["MissingTypes"] = "missing-types";
160
+ IssueType2["MagicLiteral"] = "magic-literal";
161
+ IssueType2["BooleanTrap"] = "boolean-trap";
162
+ IssueType2["AiSignalClarity"] = "ai-signal-clarity";
163
+ IssueType2["LowTestability"] = "low-testability";
164
+ IssueType2["AgentNavigationFailure"] = "agent-navigation-failure";
165
+ IssueType2["AmbiguousApi"] = "ambiguous-api";
166
+ IssueType2["ChangeAmplification"] = "change-amplification";
167
+ return IssueType2;
168
+ })(IssueType || {});
169
+ var IssueTypeSchema = import_zod.z.nativeEnum(IssueType);
170
+ var AnalysisStatus = /* @__PURE__ */ ((AnalysisStatus2) => {
171
+ AnalysisStatus2["Processing"] = "processing";
172
+ AnalysisStatus2["Completed"] = "completed";
173
+ AnalysisStatus2["Failed"] = "failed";
174
+ return AnalysisStatus2;
175
+ })(AnalysisStatus || {});
176
+ var AnalysisStatusSchema = import_zod.z.nativeEnum(AnalysisStatus);
177
+ var ModelTier = /* @__PURE__ */ ((ModelTier2) => {
178
+ ModelTier2["Compact"] = "compact";
179
+ ModelTier2["Standard"] = "standard";
180
+ ModelTier2["Extended"] = "extended";
181
+ ModelTier2["Frontier"] = "frontier";
182
+ return ModelTier2;
183
+ })(ModelTier || {});
184
+ var ModelTierSchema = import_zod.z.nativeEnum(ModelTier);
185
+ var LocationSchema = import_zod.z.object({
186
+ file: import_zod.z.string(),
187
+ line: import_zod.z.number(),
188
+ column: import_zod.z.number().optional(),
189
+ endLine: import_zod.z.number().optional(),
190
+ endColumn: import_zod.z.number().optional()
191
+ });
192
+ var IssueSchema = import_zod.z.object({
193
+ type: IssueTypeSchema,
194
+ severity: SeveritySchema,
195
+ message: import_zod.z.string(),
196
+ location: LocationSchema,
197
+ suggestion: import_zod.z.string().optional()
198
+ });
199
+ var MetricsSchema = import_zod.z.object({
200
+ tokenCost: import_zod.z.number().optional(),
201
+ complexityScore: import_zod.z.number().optional(),
202
+ consistencyScore: import_zod.z.number().optional(),
203
+ docFreshnessScore: import_zod.z.number().optional(),
204
+ // AI agent readiness metrics (v0.12+)
205
+ aiSignalClarityScore: import_zod.z.number().optional(),
206
+ agentGroundingScore: import_zod.z.number().optional(),
207
+ testabilityScore: import_zod.z.number().optional(),
208
+ docDriftScore: import_zod.z.number().optional(),
209
+ dependencyHealthScore: import_zod.z.number().optional(),
210
+ modelContextTier: ModelTierSchema.optional(),
211
+ // Business value metrics
212
+ estimatedMonthlyCost: import_zod.z.number().optional(),
213
+ estimatedDeveloperHours: import_zod.z.number().optional(),
214
+ comprehensionDifficultyIndex: import_zod.z.number().optional(),
215
+ // Extended metrics for specific spokes
216
+ totalSymbols: import_zod.z.number().optional(),
217
+ totalExports: import_zod.z.number().optional()
218
+ });
219
+ var AnalysisResultSchema = import_zod.z.object({
220
+ fileName: import_zod.z.string(),
221
+ issues: import_zod.z.array(IssueSchema),
222
+ metrics: MetricsSchema
223
+ });
224
+ var SpokeOutputSchema = import_zod.z.object({
225
+ results: import_zod.z.array(AnalysisResultSchema),
226
+ summary: import_zod.z.any(),
227
+ metadata: import_zod.z.object({
228
+ toolName: import_zod.z.string(),
229
+ version: import_zod.z.string(),
230
+ timestamp: import_zod.z.string()
231
+ }).catchall(import_zod.z.any()).optional()
232
+ });
233
+ var UnifiedReportSchema = import_zod.z.object({
234
+ summary: import_zod.z.object({
235
+ totalFiles: import_zod.z.number(),
236
+ totalIssues: import_zod.z.number(),
237
+ criticalIssues: import_zod.z.number(),
238
+ majorIssues: import_zod.z.number()
239
+ }),
240
+ results: import_zod.z.array(AnalysisResultSchema),
241
+ scoring: import_zod.z.object({
242
+ overall: import_zod.z.number(),
243
+ rating: import_zod.z.string(),
244
+ timestamp: import_zod.z.string(),
245
+ breakdown: import_zod.z.array(import_zod.z.object({
246
+ toolName: import_zod.z.string(),
247
+ score: import_zod.z.number()
248
+ }).catchall(import_zod.z.any()))
249
+ }).optional()
250
+ }).catchall(import_zod.z.any());
251
+
123
252
  // src/types/language.ts
124
253
  var Language = /* @__PURE__ */ ((Language2) => {
125
254
  Language2["TypeScript"] = "typescript";
@@ -198,6 +327,16 @@ function validateSpokeOutput(toolName, output) {
198
327
  errors
199
328
  };
200
329
  }
330
+ function validateWithSchema(schema, data) {
331
+ const result = schema.safeParse(data);
332
+ if (result.success) {
333
+ return { valid: true, data: result.data };
334
+ }
335
+ return {
336
+ valid: false,
337
+ errors: result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`)
338
+ };
339
+ }
201
340
 
202
341
  // src/utils/file-scanner.ts
203
342
  var import_glob = require("glob");
@@ -1218,43 +1357,47 @@ function estimateCostFromBudget(budget, model, config = {}) {
1218
1357
 
1219
1358
  // src/business/productivity-metrics.ts
1220
1359
  var SEVERITY_TIME_ESTIMATES = {
1221
- critical: 4,
1222
- major: 2,
1223
- minor: 0.5,
1224
- info: 0.25
1360
+ ["critical" /* Critical */]: 4,
1361
+ ["major" /* Major */]: 2,
1362
+ ["minor" /* Minor */]: 0.5,
1363
+ ["info" /* Info */]: 0.25
1225
1364
  };
1226
1365
  var DEFAULT_HOURLY_RATE = 75;
1227
1366
  function calculateProductivityImpact(issues, hourlyRate = DEFAULT_HOURLY_RATE) {
1228
1367
  const counts = {
1229
- critical: issues.filter((i) => i.severity === "critical").length,
1230
- major: issues.filter((i) => i.severity === "major").length,
1231
- minor: issues.filter((i) => i.severity === "minor").length,
1232
- info: issues.filter((i) => i.severity === "info").length
1368
+ ["critical" /* Critical */]: issues.filter((i) => i.severity === "critical" /* Critical */).length,
1369
+ ["major" /* Major */]: issues.filter((i) => i.severity === "major" /* Major */).length,
1370
+ ["minor" /* Minor */]: issues.filter((i) => i.severity === "minor" /* Minor */).length,
1371
+ ["info" /* Info */]: issues.filter((i) => i.severity === "info" /* Info */).length
1233
1372
  };
1234
1373
  const hours = {
1235
- critical: counts.critical * SEVERITY_TIME_ESTIMATES.critical,
1236
- major: counts.major * SEVERITY_TIME_ESTIMATES.major,
1237
- minor: counts.minor * SEVERITY_TIME_ESTIMATES.minor,
1238
- info: counts.info * SEVERITY_TIME_ESTIMATES.info
1374
+ ["critical" /* Critical */]: counts["critical" /* Critical */] * SEVERITY_TIME_ESTIMATES["critical" /* Critical */],
1375
+ ["major" /* Major */]: counts["major" /* Major */] * SEVERITY_TIME_ESTIMATES["major" /* Major */],
1376
+ ["minor" /* Minor */]: counts["minor" /* Minor */] * SEVERITY_TIME_ESTIMATES["minor" /* Minor */],
1377
+ ["info" /* Info */]: counts["info" /* Info */] * SEVERITY_TIME_ESTIMATES["info" /* Info */]
1239
1378
  };
1240
- const totalHours = hours.critical + hours.major + hours.minor + hours.info;
1379
+ const totalHours = hours["critical" /* Critical */] + hours["major" /* Major */] + hours["minor" /* Minor */] + hours["info" /* Info */];
1241
1380
  const totalCost = totalHours * hourlyRate;
1242
1381
  return {
1243
1382
  totalHours: Math.round(totalHours * 10) / 10,
1244
1383
  hourlyRate,
1245
1384
  totalCost: Math.round(totalCost),
1246
1385
  bySeverity: {
1247
- critical: {
1248
- hours: Math.round(hours.critical * 10) / 10,
1249
- cost: Math.round(hours.critical * hourlyRate)
1386
+ ["critical" /* Critical */]: {
1387
+ hours: Math.round(hours["critical" /* Critical */] * 10) / 10,
1388
+ cost: Math.round(hours["critical" /* Critical */] * hourlyRate)
1389
+ },
1390
+ ["major" /* Major */]: {
1391
+ hours: Math.round(hours["major" /* Major */] * 10) / 10,
1392
+ cost: Math.round(hours["major" /* Major */] * hourlyRate)
1250
1393
  },
1251
- major: {
1252
- hours: Math.round(hours.major * 10) / 10,
1253
- cost: Math.round(hours.major * hourlyRate)
1394
+ ["minor" /* Minor */]: {
1395
+ hours: Math.round(hours["minor" /* Minor */] * 10) / 10,
1396
+ cost: Math.round(hours["minor" /* Minor */] * hourlyRate)
1254
1397
  },
1255
- minor: {
1256
- hours: Math.round(hours.minor * 10) / 10,
1257
- cost: Math.round(hours.minor * hourlyRate)
1398
+ ["info" /* Info */]: {
1399
+ hours: Math.round(hours["info" /* Info */] * 10) / 10,
1400
+ cost: Math.round(hours["info" /* Info */] * hourlyRate)
1258
1401
  }
1259
1402
  }
1260
1403
  };
@@ -2985,20 +3128,34 @@ function getRepoMetadata(directory) {
2985
3128
  }
2986
3129
  // Annotate the CommonJS export names for ESM import in node:
2987
3130
  0 && (module.exports = {
3131
+ AnalysisResultSchema,
3132
+ AnalysisStatus,
3133
+ AnalysisStatusSchema,
2988
3134
  CONTEXT_TIER_THRESHOLDS,
2989
3135
  DEFAULT_COST_CONFIG,
2990
3136
  DEFAULT_EXCLUDE,
2991
3137
  DEFAULT_TOOL_WEIGHTS,
3138
+ IssueSchema,
3139
+ IssueType,
3140
+ IssueTypeSchema,
2992
3141
  LANGUAGE_EXTENSIONS,
2993
3142
  Language,
3143
+ LocationSchema,
2994
3144
  MODEL_PRICING_PRESETS,
3145
+ MetricsSchema,
3146
+ ModelTier,
3147
+ ModelTierSchema,
2995
3148
  ParseError,
2996
3149
  ParserFactory,
2997
3150
  PythonParser,
2998
3151
  SEVERITY_TIME_ESTIMATES,
2999
3152
  SIZE_ADJUSTED_THRESHOLDS,
3153
+ Severity,
3154
+ SeveritySchema,
3155
+ SpokeOutputSchema,
3000
3156
  TOOL_NAME_MAP,
3001
3157
  TypeScriptParser,
3158
+ UnifiedReportSchema,
3002
3159
  VAGUE_FILE_NAMES,
3003
3160
  calculateAgentGrounding,
3004
3161
  calculateAiSignalClarity,
@@ -3071,5 +3228,6 @@ function getRepoMetadata(directory) {
3071
3228
  saveScoreEntry,
3072
3229
  scanEntries,
3073
3230
  scanFiles,
3074
- validateSpokeOutput
3231
+ validateSpokeOutput,
3232
+ validateWithSchema
3075
3233
  });
package/dist/index.mjs CHANGED
@@ -1,11 +1,25 @@
1
1
  import {
2
+ AnalysisResultSchema,
3
+ AnalysisStatus,
4
+ AnalysisStatusSchema,
2
5
  CONTEXT_TIER_THRESHOLDS,
3
6
  DEFAULT_TOOL_WEIGHTS,
7
+ IssueSchema,
8
+ IssueType,
9
+ IssueTypeSchema,
4
10
  LANGUAGE_EXTENSIONS,
5
11
  Language,
12
+ LocationSchema,
13
+ MetricsSchema,
14
+ ModelTier,
15
+ ModelTierSchema,
6
16
  ParseError,
7
17
  SIZE_ADJUSTED_THRESHOLDS,
18
+ Severity,
19
+ SeveritySchema,
20
+ SpokeOutputSchema,
8
21
  TOOL_NAME_MAP,
22
+ UnifiedReportSchema,
9
23
  calculateOverallScore,
10
24
  formatScore,
11
25
  formatToolScore,
@@ -18,7 +32,7 @@ import {
18
32
  getToolWeight,
19
33
  normalizeToolName,
20
34
  parseWeightString
21
- } from "./chunk-UQGI67WR.mjs";
35
+ } from "./chunk-D3D3NCRR.mjs";
22
36
 
23
37
  // src/types/contract.ts
24
38
  function validateSpokeOutput(toolName, output) {
@@ -67,6 +81,16 @@ function validateSpokeOutput(toolName, output) {
67
81
  errors
68
82
  };
69
83
  }
84
+ function validateWithSchema(schema, data) {
85
+ const result = schema.safeParse(data);
86
+ if (result.success) {
87
+ return { valid: true, data: result.data };
88
+ }
89
+ return {
90
+ valid: false,
91
+ errors: result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`)
92
+ };
93
+ }
70
94
 
71
95
  // src/utils/file-scanner.ts
72
96
  import { glob } from "glob";
@@ -729,43 +753,47 @@ function estimateCostFromBudget(budget, model, config = {}) {
729
753
 
730
754
  // src/business/productivity-metrics.ts
731
755
  var SEVERITY_TIME_ESTIMATES = {
732
- critical: 4,
733
- major: 2,
734
- minor: 0.5,
735
- info: 0.25
756
+ ["critical" /* Critical */]: 4,
757
+ ["major" /* Major */]: 2,
758
+ ["minor" /* Minor */]: 0.5,
759
+ ["info" /* Info */]: 0.25
736
760
  };
737
761
  var DEFAULT_HOURLY_RATE = 75;
738
762
  function calculateProductivityImpact(issues, hourlyRate = DEFAULT_HOURLY_RATE) {
739
763
  const counts = {
740
- critical: issues.filter((i) => i.severity === "critical").length,
741
- major: issues.filter((i) => i.severity === "major").length,
742
- minor: issues.filter((i) => i.severity === "minor").length,
743
- info: issues.filter((i) => i.severity === "info").length
764
+ ["critical" /* Critical */]: issues.filter((i) => i.severity === "critical" /* Critical */).length,
765
+ ["major" /* Major */]: issues.filter((i) => i.severity === "major" /* Major */).length,
766
+ ["minor" /* Minor */]: issues.filter((i) => i.severity === "minor" /* Minor */).length,
767
+ ["info" /* Info */]: issues.filter((i) => i.severity === "info" /* Info */).length
744
768
  };
745
769
  const hours = {
746
- critical: counts.critical * SEVERITY_TIME_ESTIMATES.critical,
747
- major: counts.major * SEVERITY_TIME_ESTIMATES.major,
748
- minor: counts.minor * SEVERITY_TIME_ESTIMATES.minor,
749
- info: counts.info * SEVERITY_TIME_ESTIMATES.info
770
+ ["critical" /* Critical */]: counts["critical" /* Critical */] * SEVERITY_TIME_ESTIMATES["critical" /* Critical */],
771
+ ["major" /* Major */]: counts["major" /* Major */] * SEVERITY_TIME_ESTIMATES["major" /* Major */],
772
+ ["minor" /* Minor */]: counts["minor" /* Minor */] * SEVERITY_TIME_ESTIMATES["minor" /* Minor */],
773
+ ["info" /* Info */]: counts["info" /* Info */] * SEVERITY_TIME_ESTIMATES["info" /* Info */]
750
774
  };
751
- const totalHours = hours.critical + hours.major + hours.minor + hours.info;
775
+ const totalHours = hours["critical" /* Critical */] + hours["major" /* Major */] + hours["minor" /* Minor */] + hours["info" /* Info */];
752
776
  const totalCost = totalHours * hourlyRate;
753
777
  return {
754
778
  totalHours: Math.round(totalHours * 10) / 10,
755
779
  hourlyRate,
756
780
  totalCost: Math.round(totalCost),
757
781
  bySeverity: {
758
- critical: {
759
- hours: Math.round(hours.critical * 10) / 10,
760
- cost: Math.round(hours.critical * hourlyRate)
782
+ ["critical" /* Critical */]: {
783
+ hours: Math.round(hours["critical" /* Critical */] * 10) / 10,
784
+ cost: Math.round(hours["critical" /* Critical */] * hourlyRate)
785
+ },
786
+ ["major" /* Major */]: {
787
+ hours: Math.round(hours["major" /* Major */] * 10) / 10,
788
+ cost: Math.round(hours["major" /* Major */] * hourlyRate)
761
789
  },
762
- major: {
763
- hours: Math.round(hours.major * 10) / 10,
764
- cost: Math.round(hours.major * hourlyRate)
790
+ ["minor" /* Minor */]: {
791
+ hours: Math.round(hours["minor" /* Minor */] * 10) / 10,
792
+ cost: Math.round(hours["minor" /* Minor */] * hourlyRate)
765
793
  },
766
- minor: {
767
- hours: Math.round(hours.minor * 10) / 10,
768
- cost: Math.round(hours.minor * hourlyRate)
794
+ ["info" /* Info */]: {
795
+ hours: Math.round(hours["info" /* Info */] * 10) / 10,
796
+ cost: Math.round(hours["info" /* Info */] * hourlyRate)
769
797
  }
770
798
  }
771
799
  };
@@ -2495,20 +2523,34 @@ function getRepoMetadata(directory) {
2495
2523
  return metadata;
2496
2524
  }
2497
2525
  export {
2526
+ AnalysisResultSchema,
2527
+ AnalysisStatus,
2528
+ AnalysisStatusSchema,
2498
2529
  CONTEXT_TIER_THRESHOLDS,
2499
2530
  DEFAULT_COST_CONFIG,
2500
2531
  DEFAULT_EXCLUDE,
2501
2532
  DEFAULT_TOOL_WEIGHTS,
2533
+ IssueSchema,
2534
+ IssueType,
2535
+ IssueTypeSchema,
2502
2536
  LANGUAGE_EXTENSIONS,
2503
2537
  Language,
2538
+ LocationSchema,
2504
2539
  MODEL_PRICING_PRESETS,
2540
+ MetricsSchema,
2541
+ ModelTier,
2542
+ ModelTierSchema,
2505
2543
  ParseError,
2506
2544
  ParserFactory,
2507
2545
  PythonParser,
2508
2546
  SEVERITY_TIME_ESTIMATES,
2509
2547
  SIZE_ADJUSTED_THRESHOLDS,
2548
+ Severity,
2549
+ SeveritySchema,
2550
+ SpokeOutputSchema,
2510
2551
  TOOL_NAME_MAP,
2511
2552
  TypeScriptParser,
2553
+ UnifiedReportSchema,
2512
2554
  VAGUE_FILE_NAMES,
2513
2555
  calculateAgentGrounding,
2514
2556
  calculateAiSignalClarity,
@@ -2581,5 +2623,6 @@ export {
2581
2623
  saveScoreEntry,
2582
2624
  scanEntries,
2583
2625
  scanFiles,
2584
- validateSpokeOutput
2626
+ validateSpokeOutput,
2627
+ validateWithSchema
2585
2628
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/core",
3
- "version": "0.19.0",
3
+ "version": "0.19.3",
4
4
  "description": "Shared utilities for AIReady analysis tools",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -48,7 +48,8 @@
48
48
  "chalk": "^5.4.1",
49
49
  "glob": "^13.0.0",
50
50
  "ignore": "^7.0.0",
51
- "typescript": "^5.9.3"
51
+ "typescript": "^5.9.3",
52
+ "zod": "^4.3.6"
52
53
  },
53
54
  "scripts": {
54
55
  "build": "tsup src/index.ts src/client.ts --format cjs,esm --dts",