@aiready/core 0.23.19 → 0.23.21

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 (96) hide show
  1. package/dist/chunk-2N7ISIKE.mjs +158 -0
  2. package/dist/chunk-ARUIZO7M.mjs +297 -0
  3. package/dist/chunk-CYC5EGEI.mjs +297 -0
  4. package/dist/{chunk-ZB3EHHAG.mjs → chunk-DBOPSRBC.mjs} +88 -26
  5. package/dist/chunk-EZ7ECLAZ.mjs +299 -0
  6. package/dist/chunk-FNPULWG7.mjs +248 -0
  7. package/dist/chunk-FZTFKZUQ.mjs +250 -0
  8. package/dist/chunk-GTS642BQ.mjs +262 -0
  9. package/dist/chunk-IXPY5J4K.mjs +248 -0
  10. package/dist/chunk-JJQLYW6Z.mjs +111 -0
  11. package/dist/chunk-L6BKANJC.mjs +130 -0
  12. package/dist/chunk-LXEO5PG3.mjs +292 -0
  13. package/dist/chunk-LZHO636W.mjs +501 -0
  14. package/dist/chunk-MTK2IIDZ.mjs +262 -0
  15. package/dist/chunk-QDCQETSI.mjs +262 -0
  16. package/dist/chunk-QZNY7B2N.mjs +248 -0
  17. package/dist/chunk-RCZSMGCX.mjs +250 -0
  18. package/dist/chunk-SWZOT67M.mjs +250 -0
  19. package/dist/chunk-U3IY2CFC.mjs +36 -0
  20. package/dist/chunk-UBCM5Y6R.mjs +275 -0
  21. package/dist/chunk-UTCRW3N7.mjs +301 -0
  22. package/dist/{chunk-RMH2TPAT.mjs → chunk-UYLH35LA.mjs} +88 -26
  23. package/dist/{chunk-TJXR2CHZ.mjs → chunk-WVNVC2PP.mjs} +266 -213
  24. package/dist/chunk-WYOW6O3P.mjs +114 -0
  25. package/dist/{chunk-CGOS2J6T.mjs → chunk-YRSSR4KN.mjs} +260 -217
  26. package/dist/client-2xbeKnrg.d.mts +1291 -0
  27. package/dist/client-2xbeKnrg.d.ts +1291 -0
  28. package/dist/client-4HLAGzFg.d.mts +1291 -0
  29. package/dist/client-4HLAGzFg.d.ts +1291 -0
  30. package/dist/client-B4TQwNa7.d.mts +1290 -0
  31. package/dist/client-B4TQwNa7.d.ts +1290 -0
  32. package/dist/client-Bdi4ty0v.d.mts +1294 -0
  33. package/dist/client-Bdi4ty0v.d.ts +1294 -0
  34. package/dist/client-BsKpUH3H.d.mts +1339 -0
  35. package/dist/client-BsKpUH3H.d.ts +1339 -0
  36. package/dist/client-Bv1zOaWF.d.mts +1291 -0
  37. package/dist/client-Bv1zOaWF.d.ts +1291 -0
  38. package/dist/client-Bz9YJMIX.d.mts +1290 -0
  39. package/dist/client-Bz9YJMIX.d.ts +1290 -0
  40. package/dist/client-CBpzm34X.d.mts +1291 -0
  41. package/dist/client-CBpzm34X.d.ts +1291 -0
  42. package/dist/client-CNu_tCZZ.d.mts +1305 -0
  43. package/dist/client-CNu_tCZZ.d.ts +1305 -0
  44. package/dist/client-CmEvxxQu.d.mts +1339 -0
  45. package/dist/client-CmEvxxQu.d.ts +1339 -0
  46. package/dist/client-DGMAxkZc.d.mts +1339 -0
  47. package/dist/client-DGMAxkZc.d.ts +1339 -0
  48. package/dist/client-DZq-CqcD.d.mts +1292 -0
  49. package/dist/client-DZq-CqcD.d.ts +1292 -0
  50. package/dist/{client-WVCAIWdJ.d.mts → client-DcqGfDTt.d.mts} +318 -226
  51. package/dist/{client-WVCAIWdJ.d.ts → client-DcqGfDTt.d.ts} +318 -226
  52. package/dist/{client-DLvFR2qA.d.mts → client-O8RvSRm0.d.mts} +89 -25
  53. package/dist/{client-DLvFR2qA.d.ts → client-O8RvSRm0.d.ts} +89 -25
  54. package/dist/client.d.mts +1 -1
  55. package/dist/client.d.ts +1 -1
  56. package/dist/client.js +53 -27
  57. package/dist/client.mjs +6 -6
  58. package/dist/csharp-parser-4ZKCSX5B.mjs +9 -0
  59. package/dist/csharp-parser-5HKICCRR.mjs +9 -0
  60. package/dist/csharp-parser-JCKXIAJW.mjs +9 -0
  61. package/dist/go-parser-J4KIH4RG.mjs +9 -0
  62. package/dist/go-parser-TKXL3DVH.mjs +9 -0
  63. package/dist/go-parser-XOM232XZ.mjs +9 -0
  64. package/dist/index.d.mts +332 -54
  65. package/dist/index.d.ts +332 -54
  66. package/dist/index.js +3930 -3064
  67. package/dist/index.mjs +933 -2036
  68. package/dist/java-parser-3KHXOXRQ.mjs +9 -0
  69. package/dist/java-parser-MASGS4WB.mjs +9 -0
  70. package/dist/java-parser-T5LXD63J.mjs +9 -0
  71. package/dist/python-parser-FNFK2473.mjs +8 -0
  72. package/dist/typescript-parser-2GGNRNB5.mjs +7 -0
  73. package/dist/typescript-parser-3ENJ6C7H.mjs +7 -0
  74. package/dist/typescript-parser-4GI7DPSW.mjs +7 -0
  75. package/dist/typescript-parser-4H3HUBO4.mjs +7 -0
  76. package/dist/typescript-parser-K63IVZMF.mjs +7 -0
  77. package/dist/typescript-parser-ZJKROMQG.mjs +7 -0
  78. package/package.json +1 -1
  79. package/dist/chunk-5SHLHMH7.mjs +0 -760
  80. package/dist/chunk-Q55AMEFV.mjs +0 -760
  81. package/dist/client-BEoUYNLp.d.mts +0 -1191
  82. package/dist/client-BEoUYNLp.d.ts +0 -1191
  83. package/dist/client-BrIMPk89.d.mts +0 -1214
  84. package/dist/client-BrIMPk89.d.ts +0 -1214
  85. package/dist/client-C5BuGX4F.d.mts +0 -1205
  86. package/dist/client-C5BuGX4F.d.ts +0 -1205
  87. package/dist/client-CKcjnPXt.d.mts +0 -1214
  88. package/dist/client-CKcjnPXt.d.ts +0 -1214
  89. package/dist/client-CLulBnie.d.mts +0 -1182
  90. package/dist/client-CLulBnie.d.ts +0 -1182
  91. package/dist/client-CQwvp8ep.d.mts +0 -1182
  92. package/dist/client-CQwvp8ep.d.ts +0 -1182
  93. package/dist/client-PFPdeo-z.d.mts +0 -1186
  94. package/dist/client-PFPdeo-z.d.ts +0 -1186
  95. package/dist/client-wk2fgk1q.d.mts +0 -1184
  96. package/dist/client-wk2fgk1q.d.ts +0 -1184
@@ -0,0 +1,301 @@
1
+ import {
2
+ ParseError
3
+ } from "./chunk-U3IY2CFC.mjs";
4
+
5
+ // src/parsers/typescript-parser.ts
6
+ import { parse } from "@typescript-eslint/typescript-estree";
7
+ var TypeScriptParser = class {
8
+ constructor() {
9
+ this.language = "typescript" /* TypeScript */;
10
+ this.extensions = [".ts", ".tsx", ".js", ".jsx"];
11
+ }
12
+ async initialize() {
13
+ }
14
+ canHandle(filePath) {
15
+ return this.extensions.some((ext) => filePath.endsWith(ext));
16
+ }
17
+ async getAST(code, filePath) {
18
+ try {
19
+ return parse(code, {
20
+ filePath,
21
+ loc: true,
22
+ range: true,
23
+ tokens: true,
24
+ comment: true,
25
+ jsx: filePath.endsWith("x")
26
+ });
27
+ } catch (error) {
28
+ throw new ParseError(error.message, filePath, {
29
+ line: error.lineNumber || 1,
30
+ column: error.column || 0
31
+ });
32
+ }
33
+ }
34
+ parse(code, filePath) {
35
+ try {
36
+ const ast = parse(code, {
37
+ filePath,
38
+ loc: true,
39
+ range: true,
40
+ tokens: true,
41
+ comment: true,
42
+ jsx: filePath.endsWith("x")
43
+ });
44
+ const imports = this.extractImports(ast);
45
+ const exports = this.extractExports(ast, code, filePath);
46
+ return {
47
+ exports,
48
+ imports,
49
+ language: this.language
50
+ };
51
+ } catch (error) {
52
+ throw new ParseError(error.message, filePath, {
53
+ line: error.lineNumber || 1,
54
+ column: error.column || 0
55
+ });
56
+ }
57
+ }
58
+ getNamingConventions() {
59
+ return {
60
+ variablePattern: /^[a-z][a-zA-Z0-9]*$/,
61
+ functionPattern: /^[a-z][a-zA-Z0-9]*$/,
62
+ classPattern: /^[A-Z][a-zA-Z0-9]*$/,
63
+ constantPattern: /^[A-Z][A-Z0-9_]*$/,
64
+ typePattern: /^[A-Z][a-zA-Z0-9]*$/,
65
+ interfacePattern: /^I?[A-Z][a-zA-Z0-9]*$/
66
+ };
67
+ }
68
+ analyzeMetadata(node, code) {
69
+ if (!code) return {};
70
+ return {
71
+ isPure: this.isLikelyPure(node),
72
+ hasSideEffects: !this.isLikelyPure(node)
73
+ };
74
+ }
75
+ extractImports(ast) {
76
+ const imports = [];
77
+ for (const node of ast.body) {
78
+ if (node.type === "ImportDeclaration") {
79
+ const specifiers = [];
80
+ let isTypeOnly = false;
81
+ if (node.importKind === "type") {
82
+ isTypeOnly = true;
83
+ }
84
+ for (const spec of node.specifiers) {
85
+ if (spec.type === "ImportSpecifier") {
86
+ const imported = spec.imported;
87
+ const name = imported.type === "Identifier" ? imported.name : imported.value;
88
+ specifiers.push(name);
89
+ } else if (spec.type === "ImportDefaultSpecifier") {
90
+ specifiers.push("default");
91
+ } else if (spec.type === "ImportNamespaceSpecifier") {
92
+ specifiers.push("*");
93
+ }
94
+ }
95
+ imports.push({
96
+ source: node.source.value,
97
+ specifiers,
98
+ isTypeOnly,
99
+ loc: node.loc ? {
100
+ start: {
101
+ line: node.loc.start.line,
102
+ column: node.loc.start.column
103
+ },
104
+ end: { line: node.loc.end.line, column: node.loc.end.column }
105
+ } : void 0
106
+ });
107
+ }
108
+ }
109
+ return imports;
110
+ }
111
+ extractExports(ast, code, filePath) {
112
+ const exports = [];
113
+ for (const node of ast.body) {
114
+ if (node.type === "ExportNamedDeclaration") {
115
+ if (node.declaration) {
116
+ const declaration = node.declaration;
117
+ if ((declaration.type === "FunctionDeclaration" || declaration.type === "TSDeclareFunction") && declaration.id) {
118
+ exports.push(
119
+ this.createExport(
120
+ declaration.id.name,
121
+ "function",
122
+ node,
123
+ // Pass the outer ExportNamedDeclaration
124
+ code,
125
+ filePath
126
+ )
127
+ );
128
+ } else if (declaration.type === "ClassDeclaration" && declaration.id) {
129
+ exports.push(
130
+ this.createExport(
131
+ declaration.id.name,
132
+ "class",
133
+ node,
134
+ // Pass the outer ExportNamedDeclaration
135
+ code,
136
+ filePath
137
+ )
138
+ );
139
+ } else if (declaration.type === "TSTypeAliasDeclaration") {
140
+ exports.push(
141
+ this.createExport(
142
+ declaration.id.name,
143
+ "type",
144
+ node,
145
+ // Pass the outer ExportNamedDeclaration
146
+ code,
147
+ filePath
148
+ )
149
+ );
150
+ } else if (declaration.type === "TSInterfaceDeclaration") {
151
+ exports.push(
152
+ this.createExport(
153
+ declaration.id.name,
154
+ "interface",
155
+ node,
156
+ // Pass the outer ExportNamedDeclaration
157
+ code,
158
+ filePath
159
+ )
160
+ );
161
+ } else if (declaration.type === "VariableDeclaration") {
162
+ for (const decl of declaration.declarations) {
163
+ if (decl.id.type === "Identifier") {
164
+ exports.push(
165
+ this.createExport(
166
+ decl.id.name,
167
+ "const",
168
+ node,
169
+ // Pass the outer ExportNamedDeclaration
170
+ code,
171
+ filePath,
172
+ decl.init
173
+ )
174
+ );
175
+ }
176
+ }
177
+ }
178
+ }
179
+ } else if (node.type === "ExportDefaultDeclaration") {
180
+ exports.push(
181
+ this.createExport("default", "default", node, code, filePath)
182
+ );
183
+ }
184
+ }
185
+ return exports;
186
+ }
187
+ createExport(name, type, node, code, filePath, initializer) {
188
+ const documentation = this.extractDocumentation(node, code);
189
+ let methodCount;
190
+ let propertyCount;
191
+ let parameters;
192
+ let isPrimitive = false;
193
+ let isTyped = false;
194
+ if (initializer) {
195
+ if (initializer.type === "Literal" || initializer.type === "TemplateLiteral" && initializer.expressions.length === 0) {
196
+ isPrimitive = true;
197
+ }
198
+ }
199
+ const structNode = node.type === "ExportNamedDeclaration" ? node.declaration : node.type === "ExportDefaultDeclaration" ? node.declaration : node;
200
+ if (filePath.endsWith(".ts") || filePath.endsWith(".tsx")) {
201
+ if (structNode.type === "TSTypeAliasDeclaration" || structNode.type === "TSInterfaceDeclaration" || structNode.type === "TSEnumDeclaration") {
202
+ isTyped = true;
203
+ } else if (structNode.type === "FunctionDeclaration" || structNode.type === "TSDeclareFunction") {
204
+ const hasReturnType = !!structNode.returnType;
205
+ const allParamsTyped = structNode.params.length === 0 || structNode.params.every((p) => !!p.typeAnnotation);
206
+ isTyped = hasReturnType && allParamsTyped;
207
+ } else if (structNode.type === "VariableDeclaration") {
208
+ isTyped = structNode.declarations.every(
209
+ (d) => !!d.id.typeAnnotation || !!d.init
210
+ );
211
+ } else if (structNode.type === "ClassDeclaration") {
212
+ isTyped = true;
213
+ }
214
+ } else if (filePath.endsWith(".js") || filePath.endsWith(".jsx")) {
215
+ isTyped = false;
216
+ }
217
+ if (structNode.type === "ClassDeclaration" || structNode.type === "TSInterfaceDeclaration") {
218
+ const body = structNode.type === "ClassDeclaration" ? structNode.body.body : structNode.body.body;
219
+ methodCount = body.filter(
220
+ (m) => m.type === "MethodDefinition" || m.type === "TSMethodSignature"
221
+ ).length;
222
+ propertyCount = body.filter(
223
+ (m) => m.type === "PropertyDefinition" || m.type === "TSPropertySignature"
224
+ ).length;
225
+ if (structNode.type === "ClassDeclaration") {
226
+ const constructor = body.find(
227
+ (m) => m.type === "MethodDefinition" && m.kind === "constructor"
228
+ );
229
+ if (constructor && constructor.value && constructor.value.params) {
230
+ parameters = constructor.value.params.map((p) => {
231
+ if (p.type === "Identifier") return p.name;
232
+ if (p.type === "TSParameterProperty" && p.parameter.type === "Identifier") {
233
+ return p.parameter.name;
234
+ }
235
+ return void 0;
236
+ }).filter(Boolean);
237
+ }
238
+ }
239
+ }
240
+ if (!parameters && (structNode.type === "FunctionDeclaration" || structNode.type === "TSDeclareFunction" || structNode.type === "MethodDefinition")) {
241
+ const funcNode = structNode.type === "MethodDefinition" ? structNode.value : structNode;
242
+ if (funcNode && funcNode.params) {
243
+ parameters = funcNode.params.map((p) => {
244
+ if (p.type === "Identifier") return p.name;
245
+ return void 0;
246
+ }).filter(Boolean);
247
+ }
248
+ }
249
+ return {
250
+ name,
251
+ type,
252
+ isPrimitive,
253
+ loc: node.loc ? {
254
+ start: { line: node.loc.start.line, column: node.loc.start.column },
255
+ end: { line: node.loc.end.line, column: node.loc.end.column }
256
+ } : void 0,
257
+ documentation,
258
+ methodCount,
259
+ propertyCount,
260
+ parameters,
261
+ isPure: this.isLikelyPure(node),
262
+ hasSideEffects: !this.isLikelyPure(node),
263
+ isTyped
264
+ };
265
+ }
266
+ extractDocumentation(node, code) {
267
+ if (node.range) {
268
+ const start = node.range[0];
269
+ const precedingCode = code.substring(0, start);
270
+ const jsdocMatch = precedingCode.match(/\/\*\*([\s\S]*?)\*\/\s*$/);
271
+ if (jsdocMatch) {
272
+ return {
273
+ content: jsdocMatch[1].trim(),
274
+ type: "jsdoc"
275
+ };
276
+ }
277
+ }
278
+ return void 0;
279
+ }
280
+ isLikelyPure(node) {
281
+ const structNode = node.type === "ExportNamedDeclaration" ? node.declaration : node.type === "ExportDefaultDeclaration" ? node.declaration : node;
282
+ if (structNode.type === "VariableDeclaration" && structNode.kind === "const")
283
+ return true;
284
+ if (structNode.type === "FunctionDeclaration" || structNode.type === "TSDeclareFunction" || structNode.type === "MethodDefinition" && structNode.value) {
285
+ const body = structNode.type === "MethodDefinition" ? structNode.value.body : structNode.body;
286
+ if (body && body.type === "BlockStatement") {
287
+ const bodyContent = JSON.stringify(body);
288
+ if (bodyContent.includes('"name":"console"') || bodyContent.includes('"name":"process"') || bodyContent.includes('"type":"AssignmentExpression"')) {
289
+ return false;
290
+ }
291
+ return true;
292
+ }
293
+ return true;
294
+ }
295
+ return false;
296
+ }
297
+ };
298
+
299
+ export {
300
+ TypeScriptParser
301
+ };
@@ -335,13 +335,7 @@ var ParseError = class extends Error {
335
335
  }
336
336
  };
337
337
 
338
- // src/scoring.ts
339
- var RecommendationPriority = /* @__PURE__ */ ((RecommendationPriority2) => {
340
- RecommendationPriority2["High"] = "high";
341
- RecommendationPriority2["Medium"] = "medium";
342
- RecommendationPriority2["Low"] = "low";
343
- return RecommendationPriority2;
344
- })(RecommendationPriority || {});
338
+ // src/utils/rating-helpers.ts
345
339
  var ReadinessRating = /* @__PURE__ */ ((ReadinessRating2) => {
346
340
  ReadinessRating2["Excellent"] = "Excellent";
347
341
  ReadinessRating2["Good"] = "Good";
@@ -350,6 +344,83 @@ var ReadinessRating = /* @__PURE__ */ ((ReadinessRating2) => {
350
344
  ReadinessRating2["Critical"] = "Critical";
351
345
  return ReadinessRating2;
352
346
  })(ReadinessRating || {});
347
+ function getRatingMetadata(score) {
348
+ if (score >= 90) {
349
+ return {
350
+ label: "Excellent",
351
+ slug: "excellent",
352
+ emoji: "\u2705",
353
+ rating: "Excellent" /* Excellent */
354
+ };
355
+ }
356
+ if (score >= 75) {
357
+ return {
358
+ label: "Good",
359
+ slug: "good",
360
+ emoji: "\u{1F44D}",
361
+ rating: "Good" /* Good */
362
+ };
363
+ }
364
+ if (score >= 60) {
365
+ return {
366
+ label: "Fair",
367
+ slug: "fair",
368
+ emoji: "\u{1F44C}",
369
+ rating: "Fair" /* Fair */
370
+ };
371
+ }
372
+ if (score >= 40) {
373
+ return {
374
+ label: "Needs Work",
375
+ slug: "needs-work",
376
+ emoji: "\u{1F528}",
377
+ rating: "Needs Work" /* NeedsWork */
378
+ };
379
+ }
380
+ return {
381
+ label: "Critical",
382
+ slug: "critical",
383
+ emoji: "\u{1F6A8}",
384
+ rating: "Critical" /* Critical */
385
+ };
386
+ }
387
+ function getRatingLabel(score) {
388
+ return getRatingMetadata(score).label;
389
+ }
390
+ function getRatingSlug(score) {
391
+ return getRatingMetadata(score).slug;
392
+ }
393
+ function getRatingEmoji(score) {
394
+ return getRatingMetadata(score).emoji;
395
+ }
396
+ function getToolEmoji(score) {
397
+ return getRatingEmoji(score);
398
+ }
399
+ function getPriorityIcon(priority) {
400
+ switch (priority) {
401
+ case "critical":
402
+ return "\u{1F534}";
403
+ case "high":
404
+ return "\u{1F7E0}";
405
+ case "medium":
406
+ return "\u{1F7E1}";
407
+ case "low":
408
+ return "\u{1F535}";
409
+ default:
410
+ return "\u26AA";
411
+ }
412
+ }
413
+ function getRating(score) {
414
+ return getRatingMetadata(score).rating;
415
+ }
416
+
417
+ // src/scoring.ts
418
+ var RecommendationPriority = /* @__PURE__ */ ((RecommendationPriority2) => {
419
+ RecommendationPriority2["High"] = "high";
420
+ RecommendationPriority2["Medium"] = "medium";
421
+ RecommendationPriority2["Low"] = "low";
422
+ return RecommendationPriority2;
423
+ })(RecommendationPriority || {});
353
424
  var DEFAULT_TOOL_WEIGHTS = {
354
425
  ["pattern-detect" /* PatternDetect */]: 22,
355
426
  ["context-analyzer" /* ContextAnalyzer */]: 19,
@@ -510,8 +581,8 @@ function calculateOverallScore(toolOutputs, config, cliWeights) {
510
581
  const rating = getRating(overall);
511
582
  const formulaParts = Array.from(toolOutputs.entries()).map(
512
583
  ([name, output]) => {
513
- const w = weights.get(name) ?? 5;
514
- return `(${output.score} \xD7 ${w})`;
584
+ const weight = weights.get(name) ?? 5;
585
+ return `(${output.score} \xD7 ${weight})`;
515
586
  }
516
587
  );
517
588
  const formulaStr = `[${formulaParts.join(" + ")}] / ${totalWeight} = ${overall}`;
@@ -528,20 +599,6 @@ function calculateOverallScore(toolOutputs, config, cliWeights) {
528
599
  }
529
600
  };
530
601
  }
531
- function getRating(score) {
532
- if (score >= 90) return "Excellent" /* Excellent */;
533
- if (score >= 75) return "Good" /* Good */;
534
- if (score >= 60) return "Fair" /* Fair */;
535
- if (score >= 40) return "Needs Work" /* NeedsWork */;
536
- return "Critical" /* Critical */;
537
- }
538
- function getRatingSlug(score) {
539
- if (score >= 90) return "excellent";
540
- if (score >= 75) return "good";
541
- if (score >= 60) return "fair";
542
- if (score >= 40) return "needs-work";
543
- return "critical";
544
- }
545
602
  function getRatingWithContext(score, fileCount, modelTier = "standard") {
546
603
  const threshold = getRecommendedThreshold(fileCount, modelTier);
547
604
  const normalized = score - threshold + 70;
@@ -798,8 +855,15 @@ export {
798
855
  Language,
799
856
  LANGUAGE_EXTENSIONS,
800
857
  ParseError,
801
- RecommendationPriority,
802
858
  ReadinessRating,
859
+ getRatingMetadata,
860
+ getRatingLabel,
861
+ getRatingSlug,
862
+ getRatingEmoji,
863
+ getToolEmoji,
864
+ getPriorityIcon,
865
+ getRating,
866
+ RecommendationPriority,
803
867
  DEFAULT_TOOL_WEIGHTS,
804
868
  TOOL_NAME_MAP,
805
869
  ScoringProfile,
@@ -812,8 +876,6 @@ export {
812
876
  getToolWeight,
813
877
  parseWeightString,
814
878
  calculateOverallScore,
815
- getRating,
816
- getRatingSlug,
817
879
  getRatingWithContext,
818
880
  getRatingDisplay,
819
881
  formatScore,