@aiready/core 0.23.2 → 0.23.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.
Files changed (79) hide show
  1. package/dist/__tests__/parser-factory.test.d.ts +1 -1
  2. package/dist/__tests__/parser-factory.test.js +62 -50
  3. package/dist/__tests__/python-parser.test.d.ts +1 -1
  4. package/dist/__tests__/python-parser.test.js +111 -109
  5. package/dist/__tests__/scoring.test.d.ts +1 -1
  6. package/dist/__tests__/scoring.test.js +193 -176
  7. package/dist/chunk-3YI4IS3D.mjs +191 -173
  8. package/dist/chunk-5HIXDC3X.mjs +273 -251
  9. package/dist/chunk-5V3L53AE.mjs +805 -0
  10. package/dist/chunk-CKVKHN3G.mjs +228 -211
  11. package/dist/chunk-COHIBX3Q.mjs +213 -195
  12. package/dist/chunk-CWRCDSKZ.mjs +91 -82
  13. package/dist/chunk-D3D3NCRR.mjs +147 -129
  14. package/dist/chunk-HCFYP7UD.mjs +805 -0
  15. package/dist/chunk-HFLFBA6F.mjs +79 -72
  16. package/dist/chunk-HKSARRCD.mjs +66 -58
  17. package/dist/chunk-JJ5JL5FX.mjs +91 -82
  18. package/dist/chunk-KDSTXVLQ.mjs +724 -0
  19. package/dist/chunk-KI7XORTN.mjs +91 -82
  20. package/dist/chunk-LTMHFNFK.mjs +690 -0
  21. package/dist/chunk-LTNXTXRI.mjs +228 -211
  22. package/dist/chunk-M22BXHBR.mjs +805 -0
  23. package/dist/chunk-MH3A3LX6.mjs +200 -182
  24. package/dist/chunk-NGHT7JOG.mjs +697 -0
  25. package/dist/chunk-OQ6IGDXG.mjs +147 -129
  26. package/dist/chunk-QAFB3HXQ.mjs +181 -165
  27. package/dist/chunk-QQBKXHLU.mjs +678 -0
  28. package/dist/chunk-RDHYGES7.mjs +678 -0
  29. package/dist/chunk-SWTDBVYJ.mjs +228 -213
  30. package/dist/chunk-UIWL5JQB.mjs +79 -72
  31. package/dist/chunk-UQGI67WR.mjs +79 -72
  32. package/dist/chunk-UTZOO4XO.mjs +147 -131
  33. package/dist/chunk-X4F46I5L.mjs +213 -195
  34. package/dist/chunk-XKK7YHPX.mjs +204 -186
  35. package/dist/chunk-YCA4FTEK.mjs +190 -172
  36. package/dist/chunk-ZSZRRTJM.mjs +719 -0
  37. package/dist/client-BgmiMoil.d.mts +1344 -0
  38. package/dist/client-BgmiMoil.d.ts +1344 -0
  39. package/dist/client-BxGrPuuN.d.mts +1191 -0
  40. package/dist/client-BxGrPuuN.d.ts +1191 -0
  41. package/dist/client-D-cn9ydj.d.mts +1136 -0
  42. package/dist/client-D-cn9ydj.d.ts +1136 -0
  43. package/dist/client-D9seCH4K.d.mts +1334 -0
  44. package/dist/client-D9seCH4K.d.ts +1334 -0
  45. package/dist/client-DIXIh7rw.d.mts +1193 -0
  46. package/dist/client-DIXIh7rw.d.ts +1193 -0
  47. package/dist/client-DVHXWOHw.d.mts +1245 -0
  48. package/dist/client-DVHXWOHw.d.ts +1245 -0
  49. package/dist/client.d.mts +2 -1098
  50. package/dist/client.d.ts +2 -1098
  51. package/dist/client.js +23 -43
  52. package/dist/client.mjs +3 -25
  53. package/dist/index.d.mts +325 -103
  54. package/dist/index.d.ts +325 -103
  55. package/dist/index.js +307 -324
  56. package/dist/index.mjs +283 -306
  57. package/dist/parsers/parser-factory.d.ts +45 -45
  58. package/dist/parsers/parser-factory.js +86 -84
  59. package/dist/parsers/python-parser.d.ts +33 -28
  60. package/dist/parsers/python-parser.js +224 -222
  61. package/dist/parsers/typescript-parser.d.ts +15 -10
  62. package/dist/parsers/typescript-parser.js +223 -197
  63. package/dist/scoring.d.ts +59 -49
  64. package/dist/scoring.js +129 -127
  65. package/dist/types/language.d.ts +104 -93
  66. package/dist/types/language.js +23 -23
  67. package/dist/types.d.ts +105 -87
  68. package/dist/types.js +1 -1
  69. package/dist/utils/ast-parser.d.ts +42 -33
  70. package/dist/utils/ast-parser.js +159 -162
  71. package/dist/utils/cli-helpers.d.ts +27 -10
  72. package/dist/utils/cli-helpers.js +45 -43
  73. package/dist/utils/config.d.ts +8 -3
  74. package/dist/utils/config.js +67 -69
  75. package/dist/utils/file-scanner.d.ts +1 -1
  76. package/dist/utils/file-scanner.js +80 -76
  77. package/dist/utils/metrics.d.ts +1 -1
  78. package/dist/utils/metrics.js +2 -2
  79. package/package.json +1 -1
@@ -1,47 +1,47 @@
1
1
  // src/types/schema.ts
2
- import { z } from "zod";
2
+ import { z } from 'zod';
3
3
  var Severity = /* @__PURE__ */ ((Severity2) => {
4
- Severity2["Critical"] = "critical";
5
- Severity2["Major"] = "major";
6
- Severity2["Minor"] = "minor";
7
- Severity2["Info"] = "info";
4
+ Severity2['Critical'] = 'critical';
5
+ Severity2['Major'] = 'major';
6
+ Severity2['Minor'] = 'minor';
7
+ Severity2['Info'] = 'info';
8
8
  return Severity2;
9
9
  })(Severity || {});
10
10
  var SeveritySchema = z.nativeEnum(Severity);
11
11
  var IssueType = /* @__PURE__ */ ((IssueType2) => {
12
- IssueType2["DuplicatePattern"] = "duplicate-pattern";
13
- IssueType2["PatternInconsistency"] = "pattern-inconsistency";
14
- IssueType2["ContextFragmentation"] = "context-fragmentation";
15
- IssueType2["DependencyHealth"] = "dependency-health";
16
- IssueType2["CircularDependency"] = "circular-dependency";
17
- IssueType2["DocDrift"] = "doc-drift";
18
- IssueType2["NamingInconsistency"] = "naming-inconsistency";
19
- IssueType2["NamingQuality"] = "naming-quality";
20
- IssueType2["ArchitectureInconsistency"] = "architecture-inconsistency";
21
- IssueType2["DeadCode"] = "dead-code";
22
- IssueType2["MissingTypes"] = "missing-types";
23
- IssueType2["MagicLiteral"] = "magic-literal";
24
- IssueType2["BooleanTrap"] = "boolean-trap";
25
- IssueType2["AiSignalClarity"] = "ai-signal-clarity";
26
- IssueType2["LowTestability"] = "low-testability";
27
- IssueType2["AgentNavigationFailure"] = "agent-navigation-failure";
28
- IssueType2["AmbiguousApi"] = "ambiguous-api";
29
- IssueType2["ChangeAmplification"] = "change-amplification";
12
+ IssueType2['DuplicatePattern'] = 'duplicate-pattern';
13
+ IssueType2['PatternInconsistency'] = 'pattern-inconsistency';
14
+ IssueType2['ContextFragmentation'] = 'context-fragmentation';
15
+ IssueType2['DependencyHealth'] = 'dependency-health';
16
+ IssueType2['CircularDependency'] = 'circular-dependency';
17
+ IssueType2['DocDrift'] = 'doc-drift';
18
+ IssueType2['NamingInconsistency'] = 'naming-inconsistency';
19
+ IssueType2['NamingQuality'] = 'naming-quality';
20
+ IssueType2['ArchitectureInconsistency'] = 'architecture-inconsistency';
21
+ IssueType2['DeadCode'] = 'dead-code';
22
+ IssueType2['MissingTypes'] = 'missing-types';
23
+ IssueType2['MagicLiteral'] = 'magic-literal';
24
+ IssueType2['BooleanTrap'] = 'boolean-trap';
25
+ IssueType2['AiSignalClarity'] = 'ai-signal-clarity';
26
+ IssueType2['LowTestability'] = 'low-testability';
27
+ IssueType2['AgentNavigationFailure'] = 'agent-navigation-failure';
28
+ IssueType2['AmbiguousApi'] = 'ambiguous-api';
29
+ IssueType2['ChangeAmplification'] = 'change-amplification';
30
30
  return IssueType2;
31
31
  })(IssueType || {});
32
32
  var IssueTypeSchema = z.nativeEnum(IssueType);
33
33
  var AnalysisStatus = /* @__PURE__ */ ((AnalysisStatus2) => {
34
- AnalysisStatus2["Processing"] = "processing";
35
- AnalysisStatus2["Completed"] = "completed";
36
- AnalysisStatus2["Failed"] = "failed";
34
+ AnalysisStatus2['Processing'] = 'processing';
35
+ AnalysisStatus2['Completed'] = 'completed';
36
+ AnalysisStatus2['Failed'] = 'failed';
37
37
  return AnalysisStatus2;
38
38
  })(AnalysisStatus || {});
39
39
  var AnalysisStatusSchema = z.nativeEnum(AnalysisStatus);
40
40
  var ModelTier = /* @__PURE__ */ ((ModelTier2) => {
41
- ModelTier2["Compact"] = "compact";
42
- ModelTier2["Standard"] = "standard";
43
- ModelTier2["Extended"] = "extended";
44
- ModelTier2["Frontier"] = "frontier";
41
+ ModelTier2['Compact'] = 'compact';
42
+ ModelTier2['Standard'] = 'standard';
43
+ ModelTier2['Extended'] = 'extended';
44
+ ModelTier2['Frontier'] = 'frontier';
45
45
  return ModelTier2;
46
46
  })(ModelTier || {});
47
47
  var ModelTierSchema = z.nativeEnum(ModelTier);
@@ -50,14 +50,14 @@ var LocationSchema = z.object({
50
50
  line: z.number(),
51
51
  column: z.number().optional(),
52
52
  endLine: z.number().optional(),
53
- endColumn: z.number().optional()
53
+ endColumn: z.number().optional(),
54
54
  });
55
55
  var IssueSchema = z.object({
56
56
  type: IssueTypeSchema,
57
57
  severity: SeveritySchema,
58
58
  message: z.string(),
59
59
  location: LocationSchema,
60
- suggestion: z.string().optional()
60
+ suggestion: z.string().optional(),
61
61
  });
62
62
  var MetricsSchema = z.object({
63
63
  tokenCost: z.number().optional(),
@@ -74,104 +74,113 @@ var MetricsSchema = z.object({
74
74
  // Business value metrics
75
75
  estimatedMonthlyCost: z.number().optional(),
76
76
  estimatedDeveloperHours: z.number().optional(),
77
- comprehensionDifficultyIndex: z.number().optional()
77
+ comprehensionDifficultyIndex: z.number().optional(),
78
78
  });
79
79
  var AnalysisResultSchema = z.object({
80
80
  fileName: z.string(),
81
81
  issues: z.array(IssueSchema),
82
- metrics: MetricsSchema
82
+ metrics: MetricsSchema,
83
83
  });
84
84
  var SpokeOutputSchema = z.object({
85
85
  results: z.array(AnalysisResultSchema),
86
86
  summary: z.any(),
87
- metadata: z.object({
88
- toolName: z.string(),
89
- version: z.string(),
90
- timestamp: z.string()
91
- }).catchall(z.any()).optional()
87
+ metadata: z
88
+ .object({
89
+ toolName: z.string(),
90
+ version: z.string(),
91
+ timestamp: z.string(),
92
+ })
93
+ .catchall(z.any())
94
+ .optional(),
92
95
  });
93
- var UnifiedReportSchema = z.object({
94
- summary: z.object({
95
- totalFiles: z.number(),
96
- totalIssues: z.number(),
97
- criticalIssues: z.number(),
98
- majorIssues: z.number()
99
- }),
100
- results: z.array(AnalysisResultSchema),
101
- scoring: z.object({
102
- overall: z.number(),
103
- rating: z.string(),
104
- timestamp: z.string(),
105
- breakdown: z.array(
106
- z.object({
107
- toolName: z.string(),
108
- score: z.number()
109
- }).catchall(z.any())
110
- )
111
- }).optional()
112
- }).catchall(z.any());
96
+ var UnifiedReportSchema = z
97
+ .object({
98
+ summary: z.object({
99
+ totalFiles: z.number(),
100
+ totalIssues: z.number(),
101
+ criticalIssues: z.number(),
102
+ majorIssues: z.number(),
103
+ }),
104
+ results: z.array(AnalysisResultSchema),
105
+ scoring: z
106
+ .object({
107
+ overall: z.number(),
108
+ rating: z.string(),
109
+ timestamp: z.string(),
110
+ breakdown: z.array(
111
+ z
112
+ .object({
113
+ toolName: z.string(),
114
+ score: z.number(),
115
+ })
116
+ .catchall(z.any())
117
+ ),
118
+ })
119
+ .optional(),
120
+ })
121
+ .catchall(z.any());
113
122
 
114
123
  // src/types/language.ts
115
124
  var Language = /* @__PURE__ */ ((Language2) => {
116
- Language2["TypeScript"] = "typescript";
117
- Language2["JavaScript"] = "javascript";
118
- Language2["Python"] = "python";
119
- Language2["Java"] = "java";
120
- Language2["Go"] = "go";
121
- Language2["Rust"] = "rust";
122
- Language2["CSharp"] = "csharp";
125
+ Language2['TypeScript'] = 'typescript';
126
+ Language2['JavaScript'] = 'javascript';
127
+ Language2['Python'] = 'python';
128
+ Language2['Java'] = 'java';
129
+ Language2['Go'] = 'go';
130
+ Language2['Rust'] = 'rust';
131
+ Language2['CSharp'] = 'csharp';
123
132
  return Language2;
124
133
  })(Language || {});
125
134
  var LANGUAGE_EXTENSIONS = {
126
- ".ts": "typescript" /* TypeScript */,
127
- ".tsx": "typescript" /* TypeScript */,
128
- ".js": "javascript" /* JavaScript */,
129
- ".jsx": "javascript" /* JavaScript */,
130
- ".py": "python" /* Python */,
131
- ".java": "java" /* Java */,
132
- ".go": "go" /* Go */,
133
- ".rs": "rust" /* Rust */,
134
- ".cs": "csharp" /* CSharp */
135
+ '.ts': 'typescript' /* TypeScript */,
136
+ '.tsx': 'typescript' /* TypeScript */,
137
+ '.js': 'javascript' /* JavaScript */,
138
+ '.jsx': 'javascript' /* JavaScript */,
139
+ '.py': 'python' /* Python */,
140
+ '.java': 'java' /* Java */,
141
+ '.go': 'go' /* Go */,
142
+ '.rs': 'rust' /* Rust */,
143
+ '.cs': 'csharp' /* CSharp */,
135
144
  };
136
145
  var ParseError = class extends Error {
137
146
  constructor(message, filePath, loc) {
138
147
  super(message);
139
148
  this.filePath = filePath;
140
149
  this.loc = loc;
141
- this.name = "ParseError";
150
+ this.name = 'ParseError';
142
151
  }
143
152
  };
144
153
 
145
154
  // src/scoring.ts
146
155
  var DEFAULT_TOOL_WEIGHTS = {
147
- "pattern-detect": 22,
148
- "context-analyzer": 19,
156
+ 'pattern-detect': 22,
157
+ 'context-analyzer': 19,
149
158
  consistency: 14,
150
- "ai-signal-clarity": 11,
151
- "agent-grounding": 10,
159
+ 'ai-signal-clarity': 11,
160
+ 'agent-grounding': 10,
152
161
  testability: 10,
153
- "doc-drift": 8,
154
- deps: 6
162
+ 'doc-drift': 8,
163
+ deps: 6,
155
164
  };
156
165
  var TOOL_NAME_MAP = {
157
- patterns: "pattern-detect",
158
- context: "context-analyzer",
159
- consistency: "consistency",
160
- "AI signal clarity": "ai-signal-clarity",
161
- "ai-signal-clarity": "ai-signal-clarity",
162
- grounding: "agent-grounding",
163
- "agent-grounding": "agent-grounding",
164
- testability: "testability",
165
- tests: "testability",
166
- "doc-drift": "doc-drift",
167
- docs: "doc-drift",
168
- deps: "deps"
166
+ patterns: 'pattern-detect',
167
+ context: 'context-analyzer',
168
+ consistency: 'consistency',
169
+ 'AI signal clarity': 'ai-signal-clarity',
170
+ 'ai-signal-clarity': 'ai-signal-clarity',
171
+ grounding: 'agent-grounding',
172
+ 'agent-grounding': 'agent-grounding',
173
+ testability: 'testability',
174
+ tests: 'testability',
175
+ 'doc-drift': 'doc-drift',
176
+ docs: 'doc-drift',
177
+ deps: 'deps',
169
178
  };
170
179
  var CONTEXT_TIER_THRESHOLDS = {
171
180
  compact: { idealTokens: 3e3, criticalTokens: 1e4, idealDepth: 4 },
172
181
  standard: { idealTokens: 5e3, criticalTokens: 15e3, idealDepth: 5 },
173
182
  extended: { idealTokens: 15e3, criticalTokens: 5e4, idealDepth: 7 },
174
- frontier: { idealTokens: 5e4, criticalTokens: 15e4, idealDepth: 10 }
183
+ frontier: { idealTokens: 5e4, criticalTokens: 15e4, idealDepth: 10 },
175
184
  };
176
185
  var SIZE_ADJUSTED_THRESHOLDS = {
177
186
  xs: 80,
@@ -182,20 +191,21 @@ var SIZE_ADJUSTED_THRESHOLDS = {
182
191
  // 200-500 files
183
192
  large: 65,
184
193
  // 500-2000 files
185
- enterprise: 58
194
+ enterprise: 58,
186
195
  // 2000+ files
187
196
  };
188
197
  function getProjectSizeTier(fileCount) {
189
- if (fileCount < 50) return "xs";
190
- if (fileCount < 200) return "small";
191
- if (fileCount < 500) return "medium";
192
- if (fileCount < 2e3) return "large";
193
- return "enterprise";
198
+ if (fileCount < 50) return 'xs';
199
+ if (fileCount < 200) return 'small';
200
+ if (fileCount < 500) return 'medium';
201
+ if (fileCount < 2e3) return 'large';
202
+ return 'enterprise';
194
203
  }
195
- function getRecommendedThreshold(fileCount, modelTier = "standard") {
204
+ function getRecommendedThreshold(fileCount, modelTier = 'standard') {
196
205
  const sizeTier = getProjectSizeTier(fileCount);
197
206
  const base = SIZE_ADJUSTED_THRESHOLDS[sizeTier];
198
- const modelBonus = modelTier === "frontier" ? -3 : modelTier === "extended" ? -2 : 0;
207
+ const modelBonus =
208
+ modelTier === 'frontier' ? -3 : modelTier === 'extended' ? -2 : 0;
199
209
  return base + modelBonus;
200
210
  }
201
211
  function normalizeToolName(shortName) {
@@ -215,9 +225,9 @@ function parseWeightString(weightStr) {
215
225
  if (!weightStr) {
216
226
  return weights;
217
227
  }
218
- const pairs = weightStr.split(",");
228
+ const pairs = weightStr.split(',');
219
229
  for (const pair of pairs) {
220
- const [toolShortName, weightStr2] = pair.split(":");
230
+ const [toolShortName, weightStr2] = pair.split(':');
221
231
  if (toolShortName && weightStr2) {
222
232
  const toolName = normalizeToolName(toolShortName.trim());
223
233
  const weight = parseInt(weightStr2.trim(), 10);
@@ -230,13 +240,14 @@ function parseWeightString(weightStr) {
230
240
  }
231
241
  function calculateOverallScore(toolOutputs, config, cliWeights) {
232
242
  if (toolOutputs.size === 0) {
233
- throw new Error("No tool outputs provided for scoring");
243
+ throw new Error('No tool outputs provided for scoring');
234
244
  }
235
245
  const weights = /* @__PURE__ */ new Map();
236
246
  for (const [toolName] of toolOutputs.entries()) {
237
247
  const cliWeight = cliWeights?.get(toolName);
238
248
  const configWeight = config?.tools?.[toolName]?.scoreWeight;
239
- const weight = cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 5;
249
+ const weight =
250
+ cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 5;
240
251
  weights.set(toolName, weight);
241
252
  }
242
253
  let weightedSum = 0;
@@ -261,44 +272,44 @@ function calculateOverallScore(toolOutputs, config, cliWeights) {
261
272
  return `(${output.score} \xD7 ${w})`;
262
273
  }
263
274
  );
264
- const formulaStr = `[${formulaParts.join(" + ")}] / ${totalWeight} = ${overall}`;
275
+ const formulaStr = `[${formulaParts.join(' + ')}] / ${totalWeight} = ${overall}`;
265
276
  return {
266
277
  overall,
267
278
  rating,
268
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
279
+ timestamp: /* @__PURE__ */ new Date().toISOString(),
269
280
  toolsUsed,
270
281
  breakdown,
271
282
  calculation: {
272
283
  formula: formulaStr,
273
284
  weights: calculationWeights,
274
- normalized: formulaStr
275
- }
285
+ normalized: formulaStr,
286
+ },
276
287
  };
277
288
  }
278
289
  function getRating(score) {
279
- if (score >= 90) return "Excellent";
280
- if (score >= 75) return "Good";
281
- if (score >= 60) return "Fair";
282
- if (score >= 40) return "Needs Work";
283
- return "Critical";
290
+ if (score >= 90) return 'Excellent';
291
+ if (score >= 75) return 'Good';
292
+ if (score >= 60) return 'Fair';
293
+ if (score >= 40) return 'Needs Work';
294
+ return 'Critical';
284
295
  }
285
- function getRatingWithContext(score, fileCount, modelTier = "standard") {
296
+ function getRatingWithContext(score, fileCount, modelTier = 'standard') {
286
297
  const threshold = getRecommendedThreshold(fileCount, modelTier);
287
298
  const normalized = score - threshold + 70;
288
299
  return getRating(normalized);
289
300
  }
290
301
  function getRatingDisplay(rating) {
291
302
  switch (rating) {
292
- case "Excellent":
293
- return { emoji: "\u2705", color: "green" };
294
- case "Good":
295
- return { emoji: "\u{1F44D}", color: "blue" };
296
- case "Fair":
297
- return { emoji: "\u26A0\uFE0F", color: "yellow" };
298
- case "Needs Work":
299
- return { emoji: "\u{1F528}", color: "orange" };
300
- case "Critical":
301
- return { emoji: "\u274C", color: "red" };
303
+ case 'Excellent':
304
+ return { emoji: '\u2705', color: 'green' };
305
+ case 'Good':
306
+ return { emoji: '\u{1F44D}', color: 'blue' };
307
+ case 'Fair':
308
+ return { emoji: '\u26A0\uFE0F', color: 'yellow' };
309
+ case 'Needs Work':
310
+ return { emoji: '\u{1F528}', color: 'orange' };
311
+ case 'Critical':
312
+ return { emoji: '\u274C', color: 'red' };
302
313
  }
303
314
  }
304
315
  function formatScore(result) {
@@ -313,17 +324,22 @@ function formatToolScore(output) {
313
324
  result += ` Factors:
314
325
  `;
315
326
  output.factors.forEach((factor) => {
316
- const impactSign = factor.impact > 0 ? "+" : "";
327
+ const impactSign = factor.impact > 0 ? '+' : '';
317
328
  result += ` \u2022 ${factor.name}: ${impactSign}${factor.impact} - ${factor.description}
318
329
  `;
319
330
  });
320
- result += "\n";
331
+ result += '\n';
321
332
  }
322
333
  if (output.recommendations && output.recommendations.length > 0) {
323
334
  result += ` Recommendations:
324
335
  `;
325
336
  output.recommendations.forEach((rec, i) => {
326
- const priorityIcon = rec.priority === "high" ? "\u{1F534}" : rec.priority === "medium" ? "\u{1F7E1}" : "\u{1F535}";
337
+ const priorityIcon =
338
+ rec.priority === 'high'
339
+ ? '\u{1F534}'
340
+ : rec.priority === 'medium'
341
+ ? '\u{1F7E1}'
342
+ : '\u{1F535}';
327
343
  result += ` ${i + 1}. ${priorityIcon} ${rec.action}
328
344
  `;
329
345
  result += ` Impact: +${rec.estimatedImpact} points
@@ -533,5 +549,5 @@ export {
533
549
  getRatingDisplay,
534
550
  formatScore,
535
551
  formatToolScore,
536
- generateHTML
552
+ generateHTML,
537
553
  };