@aiready/core 0.23.1 → 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.
- package/dist/__tests__/parser-factory.test.d.ts +1 -1
- package/dist/__tests__/parser-factory.test.js +62 -50
- package/dist/__tests__/python-parser.test.d.ts +1 -1
- package/dist/__tests__/python-parser.test.js +111 -109
- package/dist/__tests__/scoring.test.d.ts +1 -1
- package/dist/__tests__/scoring.test.js +193 -176
- package/dist/chunk-3YI4IS3D.mjs +191 -173
- package/dist/chunk-5HIXDC3X.mjs +273 -251
- package/dist/chunk-5V3L53AE.mjs +805 -0
- package/dist/chunk-CKVKHN3G.mjs +228 -211
- package/dist/chunk-COHIBX3Q.mjs +213 -195
- package/dist/chunk-CWRCDSKZ.mjs +91 -82
- package/dist/chunk-D3D3NCRR.mjs +147 -129
- package/dist/chunk-HCFYP7UD.mjs +805 -0
- package/dist/chunk-HFLFBA6F.mjs +79 -72
- package/dist/chunk-HKSARRCD.mjs +66 -58
- package/dist/chunk-JJ5JL5FX.mjs +91 -82
- package/dist/chunk-KDSTXVLQ.mjs +724 -0
- package/dist/chunk-KI7XORTN.mjs +91 -82
- package/dist/chunk-LTMHFNFK.mjs +690 -0
- package/dist/chunk-LTNXTXRI.mjs +228 -211
- package/dist/chunk-M22BXHBR.mjs +805 -0
- package/dist/chunk-MH3A3LX6.mjs +200 -182
- package/dist/chunk-NGHT7JOG.mjs +697 -0
- package/dist/chunk-OQ6IGDXG.mjs +147 -129
- package/dist/chunk-QAFB3HXQ.mjs +181 -165
- package/dist/chunk-QQBKXHLU.mjs +678 -0
- package/dist/chunk-RDHYGES7.mjs +678 -0
- package/dist/chunk-SWTDBVYJ.mjs +228 -213
- package/dist/chunk-UIWL5JQB.mjs +79 -72
- package/dist/chunk-UQGI67WR.mjs +79 -72
- package/dist/chunk-UTZOO4XO.mjs +147 -131
- package/dist/chunk-X4F46I5L.mjs +213 -195
- package/dist/chunk-XKK7YHPX.mjs +204 -186
- package/dist/chunk-YCA4FTEK.mjs +190 -172
- package/dist/chunk-ZSZRRTJM.mjs +719 -0
- package/dist/client-BgmiMoil.d.mts +1344 -0
- package/dist/client-BgmiMoil.d.ts +1344 -0
- package/dist/client-BxGrPuuN.d.mts +1191 -0
- package/dist/client-BxGrPuuN.d.ts +1191 -0
- package/dist/client-D-cn9ydj.d.mts +1136 -0
- package/dist/client-D-cn9ydj.d.ts +1136 -0
- package/dist/client-D9seCH4K.d.mts +1334 -0
- package/dist/client-D9seCH4K.d.ts +1334 -0
- package/dist/client-DIXIh7rw.d.mts +1193 -0
- package/dist/client-DIXIh7rw.d.ts +1193 -0
- package/dist/client-DVHXWOHw.d.mts +1245 -0
- package/dist/client-DVHXWOHw.d.ts +1245 -0
- package/dist/client.d.mts +2 -1094
- package/dist/client.d.ts +2 -1094
- package/dist/client.js +23 -43
- package/dist/client.mjs +3 -25
- package/dist/index.d.mts +380 -108
- package/dist/index.d.ts +380 -108
- package/dist/index.js +609 -445
- package/dist/index.mjs +587 -429
- package/dist/parsers/parser-factory.d.ts +45 -45
- package/dist/parsers/parser-factory.js +86 -84
- package/dist/parsers/python-parser.d.ts +33 -28
- package/dist/parsers/python-parser.js +224 -222
- package/dist/parsers/typescript-parser.d.ts +15 -10
- package/dist/parsers/typescript-parser.js +223 -197
- package/dist/scoring.d.ts +59 -49
- package/dist/scoring.js +129 -127
- package/dist/types/language.d.ts +104 -93
- package/dist/types/language.js +23 -23
- package/dist/types.d.ts +105 -87
- package/dist/types.js +1 -1
- package/dist/utils/ast-parser.d.ts +42 -33
- package/dist/utils/ast-parser.js +159 -162
- package/dist/utils/cli-helpers.d.ts +27 -10
- package/dist/utils/cli-helpers.js +45 -43
- package/dist/utils/config.d.ts +8 -3
- package/dist/utils/config.js +67 -69
- package/dist/utils/file-scanner.d.ts +1 -1
- package/dist/utils/file-scanner.js +80 -76
- package/dist/utils/metrics.d.ts +1 -1
- package/dist/utils/metrics.js +2 -2
- package/package.json +2 -2
package/dist/chunk-UTZOO4XO.mjs
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
// src/types/schema.ts
|
|
2
|
-
import { z } from
|
|
2
|
+
import { z } from 'zod';
|
|
3
3
|
var Severity = /* @__PURE__ */ ((Severity2) => {
|
|
4
|
-
Severity2[
|
|
5
|
-
Severity2[
|
|
6
|
-
Severity2[
|
|
7
|
-
Severity2[
|
|
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[
|
|
13
|
-
IssueType2[
|
|
14
|
-
IssueType2[
|
|
15
|
-
IssueType2[
|
|
16
|
-
IssueType2[
|
|
17
|
-
IssueType2[
|
|
18
|
-
IssueType2[
|
|
19
|
-
IssueType2[
|
|
20
|
-
IssueType2[
|
|
21
|
-
IssueType2[
|
|
22
|
-
IssueType2[
|
|
23
|
-
IssueType2[
|
|
24
|
-
IssueType2[
|
|
25
|
-
IssueType2[
|
|
26
|
-
IssueType2[
|
|
27
|
-
IssueType2[
|
|
28
|
-
IssueType2[
|
|
29
|
-
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';
|
|
30
30
|
return IssueType2;
|
|
31
31
|
})(IssueType || {});
|
|
32
32
|
var IssueTypeSchema = z.nativeEnum(IssueType);
|
|
33
33
|
var AnalysisStatus = /* @__PURE__ */ ((AnalysisStatus2) => {
|
|
34
|
-
AnalysisStatus2[
|
|
35
|
-
AnalysisStatus2[
|
|
36
|
-
AnalysisStatus2[
|
|
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[
|
|
42
|
-
ModelTier2[
|
|
43
|
-
ModelTier2[
|
|
44
|
-
ModelTier2[
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
})
|
|
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[
|
|
117
|
-
Language2[
|
|
118
|
-
Language2[
|
|
119
|
-
Language2[
|
|
120
|
-
Language2[
|
|
121
|
-
Language2[
|
|
122
|
-
Language2[
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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 =
|
|
150
|
+
this.name = 'ParseError';
|
|
142
151
|
}
|
|
143
152
|
};
|
|
144
153
|
|
|
145
154
|
// src/scoring.ts
|
|
146
155
|
var DEFAULT_TOOL_WEIGHTS = {
|
|
147
|
-
|
|
148
|
-
|
|
156
|
+
'pattern-detect': 22,
|
|
157
|
+
'context-analyzer': 19,
|
|
149
158
|
consistency: 14,
|
|
150
|
-
|
|
151
|
-
|
|
159
|
+
'ai-signal-clarity': 11,
|
|
160
|
+
'agent-grounding': 10,
|
|
152
161
|
testability: 10,
|
|
153
|
-
|
|
154
|
-
deps: 6
|
|
162
|
+
'doc-drift': 8,
|
|
163
|
+
deps: 6,
|
|
155
164
|
};
|
|
156
165
|
var TOOL_NAME_MAP = {
|
|
157
|
-
patterns:
|
|
158
|
-
context:
|
|
159
|
-
consistency:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
grounding:
|
|
163
|
-
|
|
164
|
-
testability:
|
|
165
|
-
tests:
|
|
166
|
-
|
|
167
|
-
docs:
|
|
168
|
-
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
|
|
190
|
-
if (fileCount < 200) return
|
|
191
|
-
if (fileCount < 500) return
|
|
192
|
-
if (fileCount < 2e3) return
|
|
193
|
-
return
|
|
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 =
|
|
204
|
+
function getRecommendedThreshold(fileCount, modelTier = 'standard') {
|
|
196
205
|
const sizeTier = getProjectSizeTier(fileCount);
|
|
197
206
|
const base = SIZE_ADJUSTED_THRESHOLDS[sizeTier];
|
|
198
|
-
const modelBonus =
|
|
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(
|
|
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 =
|
|
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(
|
|
275
|
+
const formulaStr = `[${formulaParts.join(' + ')}] / ${totalWeight} = ${overall}`;
|
|
265
276
|
return {
|
|
266
277
|
overall,
|
|
267
278
|
rating,
|
|
268
|
-
timestamp:
|
|
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
|
|
280
|
-
if (score >= 75) return
|
|
281
|
-
if (score >= 60) return
|
|
282
|
-
if (score >= 40) return
|
|
283
|
-
return
|
|
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 =
|
|
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
|
|
293
|
-
return { emoji:
|
|
294
|
-
case
|
|
295
|
-
return { emoji:
|
|
296
|
-
case
|
|
297
|
-
return { emoji:
|
|
298
|
-
case
|
|
299
|
-
return { emoji:
|
|
300
|
-
case
|
|
301
|
-
return { emoji:
|
|
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 +=
|
|
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 =
|
|
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
|
};
|