@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,64 +1,64 @@
1
1
  // src/types/language.ts
2
2
  var Language = /* @__PURE__ */ ((Language2) => {
3
- Language2["TypeScript"] = "typescript";
4
- Language2["JavaScript"] = "javascript";
5
- Language2["Python"] = "python";
6
- Language2["Java"] = "java";
7
- Language2["Go"] = "go";
8
- Language2["Rust"] = "rust";
9
- Language2["CSharp"] = "csharp";
3
+ Language2['TypeScript'] = 'typescript';
4
+ Language2['JavaScript'] = 'javascript';
5
+ Language2['Python'] = 'python';
6
+ Language2['Java'] = 'java';
7
+ Language2['Go'] = 'go';
8
+ Language2['Rust'] = 'rust';
9
+ Language2['CSharp'] = 'csharp';
10
10
  return Language2;
11
11
  })(Language || {});
12
12
  var LANGUAGE_EXTENSIONS = {
13
- ".ts": "typescript" /* TypeScript */,
14
- ".tsx": "typescript" /* TypeScript */,
15
- ".js": "javascript" /* JavaScript */,
16
- ".jsx": "javascript" /* JavaScript */,
17
- ".py": "python" /* Python */,
18
- ".java": "java" /* Java */,
19
- ".go": "go" /* Go */,
20
- ".rs": "rust" /* Rust */,
21
- ".cs": "csharp" /* CSharp */
13
+ '.ts': 'typescript' /* TypeScript */,
14
+ '.tsx': 'typescript' /* TypeScript */,
15
+ '.js': 'javascript' /* JavaScript */,
16
+ '.jsx': 'javascript' /* JavaScript */,
17
+ '.py': 'python' /* Python */,
18
+ '.java': 'java' /* Java */,
19
+ '.go': 'go' /* Go */,
20
+ '.rs': 'rust' /* Rust */,
21
+ '.cs': 'csharp' /* CSharp */,
22
22
  };
23
23
  var ParseError = class extends Error {
24
24
  constructor(message, filePath, loc) {
25
25
  super(message);
26
26
  this.filePath = filePath;
27
27
  this.loc = loc;
28
- this.name = "ParseError";
28
+ this.name = 'ParseError';
29
29
  }
30
30
  };
31
31
 
32
32
  // src/scoring.ts
33
33
  var DEFAULT_TOOL_WEIGHTS = {
34
- "pattern-detect": 22,
35
- "context-analyzer": 19,
34
+ 'pattern-detect': 22,
35
+ 'context-analyzer': 19,
36
36
  consistency: 14,
37
- "ai-signal-clarity": 11,
38
- "agent-grounding": 10,
37
+ 'ai-signal-clarity': 11,
38
+ 'agent-grounding': 10,
39
39
  testability: 10,
40
- "doc-drift": 8,
41
- deps: 6
40
+ 'doc-drift': 8,
41
+ deps: 6,
42
42
  };
43
43
  var TOOL_NAME_MAP = {
44
- patterns: "pattern-detect",
45
- context: "context-analyzer",
46
- consistency: "consistency",
47
- "AI signal clarity": "ai-signal-clarity",
48
- "ai-signal-clarity": "ai-signal-clarity",
49
- grounding: "agent-grounding",
50
- "agent-grounding": "agent-grounding",
51
- testability: "testability",
52
- tests: "testability",
53
- "doc-drift": "doc-drift",
54
- docs: "doc-drift",
55
- deps: "deps"
44
+ patterns: 'pattern-detect',
45
+ context: 'context-analyzer',
46
+ consistency: 'consistency',
47
+ 'AI signal clarity': 'ai-signal-clarity',
48
+ 'ai-signal-clarity': 'ai-signal-clarity',
49
+ grounding: 'agent-grounding',
50
+ 'agent-grounding': 'agent-grounding',
51
+ testability: 'testability',
52
+ tests: 'testability',
53
+ 'doc-drift': 'doc-drift',
54
+ docs: 'doc-drift',
55
+ deps: 'deps',
56
56
  };
57
57
  var CONTEXT_TIER_THRESHOLDS = {
58
58
  compact: { idealTokens: 3e3, criticalTokens: 1e4, idealDepth: 4 },
59
59
  standard: { idealTokens: 5e3, criticalTokens: 15e3, idealDepth: 5 },
60
60
  extended: { idealTokens: 15e3, criticalTokens: 5e4, idealDepth: 7 },
61
- frontier: { idealTokens: 5e4, criticalTokens: 15e4, idealDepth: 10 }
61
+ frontier: { idealTokens: 5e4, criticalTokens: 15e4, idealDepth: 10 },
62
62
  };
63
63
  var SIZE_ADJUSTED_THRESHOLDS = {
64
64
  xs: 80,
@@ -69,20 +69,21 @@ var SIZE_ADJUSTED_THRESHOLDS = {
69
69
  // 200-500 files
70
70
  large: 65,
71
71
  // 500-2000 files
72
- enterprise: 58
72
+ enterprise: 58,
73
73
  // 2000+ files
74
74
  };
75
75
  function getProjectSizeTier(fileCount) {
76
- if (fileCount < 50) return "xs";
77
- if (fileCount < 200) return "small";
78
- if (fileCount < 500) return "medium";
79
- if (fileCount < 2e3) return "large";
80
- return "enterprise";
76
+ if (fileCount < 50) return 'xs';
77
+ if (fileCount < 200) return 'small';
78
+ if (fileCount < 500) return 'medium';
79
+ if (fileCount < 2e3) return 'large';
80
+ return 'enterprise';
81
81
  }
82
- function getRecommendedThreshold(fileCount, modelTier = "standard") {
82
+ function getRecommendedThreshold(fileCount, modelTier = 'standard') {
83
83
  const sizeTier = getProjectSizeTier(fileCount);
84
84
  const base = SIZE_ADJUSTED_THRESHOLDS[sizeTier];
85
- const modelBonus = modelTier === "frontier" ? -3 : modelTier === "extended" ? -2 : 0;
85
+ const modelBonus =
86
+ modelTier === 'frontier' ? -3 : modelTier === 'extended' ? -2 : 0;
86
87
  return base + modelBonus;
87
88
  }
88
89
  function normalizeToolName(shortName) {
@@ -102,9 +103,9 @@ function parseWeightString(weightStr) {
102
103
  if (!weightStr) {
103
104
  return weights;
104
105
  }
105
- const pairs = weightStr.split(",");
106
+ const pairs = weightStr.split(',');
106
107
  for (const pair of pairs) {
107
- const [toolShortName, weightStr2] = pair.split(":");
108
+ const [toolShortName, weightStr2] = pair.split(':');
108
109
  if (toolShortName && weightStr2) {
109
110
  const toolName = normalizeToolName(toolShortName.trim());
110
111
  const weight = parseInt(weightStr2.trim(), 10);
@@ -117,13 +118,14 @@ function parseWeightString(weightStr) {
117
118
  }
118
119
  function calculateOverallScore(toolOutputs, config, cliWeights) {
119
120
  if (toolOutputs.size === 0) {
120
- throw new Error("No tool outputs provided for scoring");
121
+ throw new Error('No tool outputs provided for scoring');
121
122
  }
122
123
  const weights = /* @__PURE__ */ new Map();
123
124
  for (const [toolName] of toolOutputs.entries()) {
124
125
  const cliWeight = cliWeights?.get(toolName);
125
126
  const configWeight = config?.tools?.[toolName]?.scoreWeight;
126
- const weight = cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 10;
127
+ const weight =
128
+ cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 10;
127
129
  weights.set(toolName, weight);
128
130
  }
129
131
  let weightedSum = 0;
@@ -148,44 +150,44 @@ function calculateOverallScore(toolOutputs, config, cliWeights) {
148
150
  return `(${output.score} \xD7 ${w})`;
149
151
  }
150
152
  );
151
- const formulaStr = `[${formulaParts.join(" + ")}] / ${totalWeight} = ${overall}`;
153
+ const formulaStr = `[${formulaParts.join(' + ')}] / ${totalWeight} = ${overall}`;
152
154
  return {
153
155
  overall,
154
156
  rating,
155
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
157
+ timestamp: /* @__PURE__ */ new Date().toISOString(),
156
158
  toolsUsed,
157
159
  breakdown,
158
160
  calculation: {
159
161
  formula: formulaStr,
160
162
  weights: calculationWeights,
161
- normalized: formulaStr
162
- }
163
+ normalized: formulaStr,
164
+ },
163
165
  };
164
166
  }
165
167
  function getRating(score) {
166
- if (score >= 90) return "Excellent";
167
- if (score >= 75) return "Good";
168
- if (score >= 60) return "Fair";
169
- if (score >= 40) return "Needs Work";
170
- return "Critical";
168
+ if (score >= 90) return 'Excellent';
169
+ if (score >= 75) return 'Good';
170
+ if (score >= 60) return 'Fair';
171
+ if (score >= 40) return 'Needs Work';
172
+ return 'Critical';
171
173
  }
172
- function getRatingWithContext(score, fileCount, modelTier = "standard") {
174
+ function getRatingWithContext(score, fileCount, modelTier = 'standard') {
173
175
  const threshold = getRecommendedThreshold(fileCount, modelTier);
174
176
  const normalized = score - threshold + 70;
175
177
  return getRating(normalized);
176
178
  }
177
179
  function getRatingDisplay(rating) {
178
180
  switch (rating) {
179
- case "Excellent":
180
- return { emoji: "\u2705", color: "green" };
181
- case "Good":
182
- return { emoji: "\u{1F44D}", color: "blue" };
183
- case "Fair":
184
- return { emoji: "\u26A0\uFE0F", color: "yellow" };
185
- case "Needs Work":
186
- return { emoji: "\u{1F528}", color: "orange" };
187
- case "Critical":
188
- return { emoji: "\u274C", color: "red" };
181
+ case 'Excellent':
182
+ return { emoji: '\u2705', color: 'green' };
183
+ case 'Good':
184
+ return { emoji: '\u{1F44D}', color: 'blue' };
185
+ case 'Fair':
186
+ return { emoji: '\u26A0\uFE0F', color: 'yellow' };
187
+ case 'Needs Work':
188
+ return { emoji: '\u{1F528}', color: 'orange' };
189
+ case 'Critical':
190
+ return { emoji: '\u274C', color: 'red' };
189
191
  }
190
192
  }
191
193
  function formatScore(result) {
@@ -200,17 +202,22 @@ function formatToolScore(output) {
200
202
  result += ` Factors:
201
203
  `;
202
204
  output.factors.forEach((factor) => {
203
- const impactSign = factor.impact > 0 ? "+" : "";
205
+ const impactSign = factor.impact > 0 ? '+' : '';
204
206
  result += ` \u2022 ${factor.name}: ${impactSign}${factor.impact} - ${factor.description}
205
207
  `;
206
208
  });
207
- result += "\n";
209
+ result += '\n';
208
210
  }
209
211
  if (output.recommendations && output.recommendations.length > 0) {
210
212
  result += ` Recommendations:
211
213
  `;
212
214
  output.recommendations.forEach((rec, i) => {
213
- const priorityIcon = rec.priority === "high" ? "\u{1F534}" : rec.priority === "medium" ? "\u{1F7E1}" : "\u{1F535}";
215
+ const priorityIcon =
216
+ rec.priority === 'high'
217
+ ? '\u{1F534}'
218
+ : rec.priority === 'medium'
219
+ ? '\u{1F7E1}'
220
+ : '\u{1F535}';
214
221
  result += ` ${i + 1}. ${priorityIcon} ${rec.action}
215
222
  `;
216
223
  result += ` Impact: +${rec.estimatedImpact} points
@@ -406,5 +413,5 @@ export {
406
413
  getRatingDisplay,
407
414
  formatScore,
408
415
  formatToolScore,
409
- generateHTML
416
+ generateHTML,
410
417
  };
@@ -1,48 +1,48 @@
1
1
  // src/types/language.ts
2
2
  var Language = /* @__PURE__ */ ((Language2) => {
3
- Language2["TypeScript"] = "typescript";
4
- Language2["JavaScript"] = "javascript";
5
- Language2["Python"] = "python";
6
- Language2["Java"] = "java";
7
- Language2["Go"] = "go";
8
- Language2["Rust"] = "rust";
9
- Language2["CSharp"] = "csharp";
3
+ Language2['TypeScript'] = 'typescript';
4
+ Language2['JavaScript'] = 'javascript';
5
+ Language2['Python'] = 'python';
6
+ Language2['Java'] = 'java';
7
+ Language2['Go'] = 'go';
8
+ Language2['Rust'] = 'rust';
9
+ Language2['CSharp'] = 'csharp';
10
10
  return Language2;
11
11
  })(Language || {});
12
12
  var LANGUAGE_EXTENSIONS = {
13
- ".ts": "typescript" /* TypeScript */,
14
- ".tsx": "typescript" /* TypeScript */,
15
- ".js": "javascript" /* JavaScript */,
16
- ".jsx": "javascript" /* JavaScript */,
17
- ".py": "python" /* Python */,
18
- ".java": "java" /* Java */,
19
- ".go": "go" /* Go */,
20
- ".rs": "rust" /* Rust */,
21
- ".cs": "csharp" /* CSharp */
13
+ '.ts': 'typescript' /* TypeScript */,
14
+ '.tsx': 'typescript' /* TypeScript */,
15
+ '.js': 'javascript' /* JavaScript */,
16
+ '.jsx': 'javascript' /* JavaScript */,
17
+ '.py': 'python' /* Python */,
18
+ '.java': 'java' /* Java */,
19
+ '.go': 'go' /* Go */,
20
+ '.rs': 'rust' /* Rust */,
21
+ '.cs': 'csharp' /* CSharp */,
22
22
  };
23
23
  var ParseError = class extends Error {
24
24
  constructor(message, filePath, loc) {
25
25
  super(message);
26
26
  this.filePath = filePath;
27
27
  this.loc = loc;
28
- this.name = "ParseError";
28
+ this.name = 'ParseError';
29
29
  }
30
30
  };
31
31
 
32
32
  // src/scoring.ts
33
33
  var DEFAULT_TOOL_WEIGHTS = {
34
- "pattern-detect": 40,
35
- "context-analyzer": 35,
36
- "consistency": 25,
37
- "doc-drift": 20,
38
- "deps": 15
34
+ 'pattern-detect': 40,
35
+ 'context-analyzer': 35,
36
+ consistency: 25,
37
+ 'doc-drift': 20,
38
+ deps: 15,
39
39
  };
40
40
  var TOOL_NAME_MAP = {
41
- "patterns": "pattern-detect",
42
- "context": "context-analyzer",
43
- "consistency": "consistency",
44
- "doc-drift": "doc-drift",
45
- "deps": "deps"
41
+ patterns: 'pattern-detect',
42
+ context: 'context-analyzer',
43
+ consistency: 'consistency',
44
+ 'doc-drift': 'doc-drift',
45
+ deps: 'deps',
46
46
  };
47
47
  function normalizeToolName(shortName) {
48
48
  return TOOL_NAME_MAP[shortName] || shortName;
@@ -61,9 +61,9 @@ function parseWeightString(weightStr) {
61
61
  if (!weightStr) {
62
62
  return weights;
63
63
  }
64
- const pairs = weightStr.split(",");
64
+ const pairs = weightStr.split(',');
65
65
  for (const pair of pairs) {
66
- const [toolShortName, weightStr2] = pair.split(":");
66
+ const [toolShortName, weightStr2] = pair.split(':');
67
67
  if (toolShortName && weightStr2) {
68
68
  const toolName = normalizeToolName(toolShortName.trim());
69
69
  const weight = parseInt(weightStr2.trim(), 10);
@@ -76,13 +76,14 @@ function parseWeightString(weightStr) {
76
76
  }
77
77
  function calculateOverallScore(toolOutputs, config, cliWeights) {
78
78
  if (toolOutputs.size === 0) {
79
- throw new Error("No tool outputs provided for scoring");
79
+ throw new Error('No tool outputs provided for scoring');
80
80
  }
81
81
  const weights = /* @__PURE__ */ new Map();
82
82
  for (const [toolName] of toolOutputs.entries()) {
83
83
  const cliWeight = cliWeights?.get(toolName);
84
84
  const configWeight = config?.tools?.[toolName]?.scoreWeight;
85
- const weight = cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 10;
85
+ const weight =
86
+ cliWeight ?? configWeight ?? DEFAULT_TOOL_WEIGHTS[toolName] ?? 10;
86
87
  weights.set(toolName, weight);
87
88
  }
88
89
  let weightedSum = 0;
@@ -101,43 +102,45 @@ function calculateOverallScore(toolOutputs, config, cliWeights) {
101
102
  }
102
103
  const overall = Math.round(weightedSum / totalWeight);
103
104
  const rating = getRating(overall);
104
- const formulaParts = Array.from(toolOutputs.entries()).map(([name, output]) => {
105
- const w = weights.get(name) || 10;
106
- return `(${output.score} \xD7 ${w})`;
107
- });
108
- const formulaStr = `[${formulaParts.join(" + ")}] / ${totalWeight} = ${overall}`;
105
+ const formulaParts = Array.from(toolOutputs.entries()).map(
106
+ ([name, output]) => {
107
+ const w = weights.get(name) || 10;
108
+ return `(${output.score} \xD7 ${w})`;
109
+ }
110
+ );
111
+ const formulaStr = `[${formulaParts.join(' + ')}] / ${totalWeight} = ${overall}`;
109
112
  return {
110
113
  overall,
111
114
  rating,
112
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
115
+ timestamp: /* @__PURE__ */ new Date().toISOString(),
113
116
  toolsUsed,
114
117
  breakdown,
115
118
  calculation: {
116
119
  formula: formulaStr,
117
120
  weights: calculationWeights,
118
- normalized: formulaStr
119
- }
121
+ normalized: formulaStr,
122
+ },
120
123
  };
121
124
  }
122
125
  function getRating(score) {
123
- if (score >= 90) return "Excellent";
124
- if (score >= 75) return "Good";
125
- if (score >= 60) return "Fair";
126
- if (score >= 40) return "Needs Work";
127
- return "Critical";
126
+ if (score >= 90) return 'Excellent';
127
+ if (score >= 75) return 'Good';
128
+ if (score >= 60) return 'Fair';
129
+ if (score >= 40) return 'Needs Work';
130
+ return 'Critical';
128
131
  }
129
132
  function getRatingDisplay(rating) {
130
133
  switch (rating) {
131
- case "Excellent":
132
- return { emoji: "\u2705", color: "green" };
133
- case "Good":
134
- return { emoji: "\u{1F44D}", color: "blue" };
135
- case "Fair":
136
- return { emoji: "\u26A0\uFE0F", color: "yellow" };
137
- case "Needs Work":
138
- return { emoji: "\u{1F528}", color: "orange" };
139
- case "Critical":
140
- return { emoji: "\u274C", color: "red" };
134
+ case 'Excellent':
135
+ return { emoji: '\u2705', color: 'green' };
136
+ case 'Good':
137
+ return { emoji: '\u{1F44D}', color: 'blue' };
138
+ case 'Fair':
139
+ return { emoji: '\u26A0\uFE0F', color: 'yellow' };
140
+ case 'Needs Work':
141
+ return { emoji: '\u{1F528}', color: 'orange' };
142
+ case 'Critical':
143
+ return { emoji: '\u274C', color: 'red' };
141
144
  }
142
145
  }
143
146
  function formatScore(result) {
@@ -152,17 +155,22 @@ function formatToolScore(output) {
152
155
  result += ` Factors:
153
156
  `;
154
157
  output.factors.forEach((factor) => {
155
- const impactSign = factor.impact > 0 ? "+" : "";
158
+ const impactSign = factor.impact > 0 ? '+' : '';
156
159
  result += ` \u2022 ${factor.name}: ${impactSign}${factor.impact} - ${factor.description}
157
160
  `;
158
161
  });
159
- result += "\n";
162
+ result += '\n';
160
163
  }
161
164
  if (output.recommendations && output.recommendations.length > 0) {
162
165
  result += ` Recommendations:
163
166
  `;
164
167
  output.recommendations.forEach((rec, i) => {
165
- const priorityIcon = rec.priority === "high" ? "\u{1F534}" : rec.priority === "medium" ? "\u{1F7E1}" : "\u{1F535}";
168
+ const priorityIcon =
169
+ rec.priority === 'high'
170
+ ? '\u{1F534}'
171
+ : rec.priority === 'medium'
172
+ ? '\u{1F7E1}'
173
+ : '\u{1F535}';
166
174
  result += ` ${i + 1}. ${priorityIcon} ${rec.action}
167
175
  `;
168
176
  result += ` Impact: +${rec.estimatedImpact} points
@@ -353,5 +361,5 @@ export {
353
361
  getRatingDisplay,
354
362
  formatScore,
355
363
  formatToolScore,
356
- generateHTML
364
+ generateHTML,
357
365
  };