free-coding-models 0.5.23 → 0.5.25
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.
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Changelog v0.5.24 - 2026-06-10
|
|
2
|
+
|
|
3
|
+
### Fixed
|
|
4
|
+
- Removed erroneous ✨ sparkles from ALL verdict icons (🟩🟢🟡🟠🔴🔥🟥⚫⏳💀). The ✨ were added by mistake to every model row instead of being reserved for new models only.
|
|
5
|
+
- The 🆕 NEW badge now correctly appears **only** on recently added models (from the `NEW_MODELS` set), keeping the table clean and readable for all other models.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Changelog v0.5.25 - 2026-06-10
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
- 🆕 badge moved from verdict column to **left of model name** — same slot as ⭐ favorite and 🎯 recommended
|
|
5
|
+
- Priority: ⭐ favorite > 🎯 recommended > 🆕 new — favorite replaces 🆕 when both apply
|
|
6
|
+
- No line shifting: prefix width is subtracted from model name width so columns stay aligned
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "free-coding-models",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.25",
|
|
4
4
|
"description": "Find the fastest coding LLM models in seconds — ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nvidia",
|
package/src/tui/render-table.js
CHANGED
|
@@ -651,12 +651,15 @@ export function renderTable({
|
|
|
651
651
|
? providerName.slice(0, 4) + '…'
|
|
652
652
|
: providerName
|
|
653
653
|
const source = themeColors.provider(r.providerKey, providerDisplay.padEnd(wSource))
|
|
654
|
-
// 📖
|
|
654
|
+
// 📖 Prefix: ⭐ favorite > 🎯 recommended > 🆕 new — only one emoji, never shifts the line
|
|
655
|
+
const isNewModel = NEW_MODELS.has(r.modelId) || NEW_MODELS.has(`${r.providerKey}/${r.modelId}`)
|
|
655
656
|
let favoritePrefix = ''
|
|
656
657
|
if (r.isRecommended) {
|
|
657
658
|
favoritePrefix = '🎯 '
|
|
658
659
|
} else if (r.isFavorite) {
|
|
659
660
|
favoritePrefix = '⭐ '
|
|
661
|
+
} else if (isNewModel) {
|
|
662
|
+
favoritePrefix = '🆕 '
|
|
660
663
|
}
|
|
661
664
|
const prefixDisplayWidth = displayWidth(favoritePrefix)
|
|
662
665
|
const nameWidth = Math.max(0, W_MODEL - prefixDisplayWidth)
|
|
@@ -800,63 +803,58 @@ export function renderTable({
|
|
|
800
803
|
// 📖 Verdict colors follow the same green→red gradient as TIER_COLOR / SWE%
|
|
801
804
|
switch (verdict) {
|
|
802
805
|
case 'Perfect':
|
|
803
|
-
verdictIcon = '
|
|
806
|
+
verdictIcon = '🟩'
|
|
804
807
|
verdictText = `${verdictIcon} Perfect`
|
|
805
808
|
verdictColor = themeColors.successBold
|
|
806
809
|
break
|
|
807
810
|
case 'Normal':
|
|
808
|
-
verdictIcon = '
|
|
811
|
+
verdictIcon = '🟢'
|
|
809
812
|
verdictText = `${verdictIcon} Normal`
|
|
810
813
|
verdictColor = themeColors.metricGood
|
|
811
814
|
break
|
|
812
815
|
case 'Spiky':
|
|
813
|
-
verdictIcon = '
|
|
816
|
+
verdictIcon = '🟡'
|
|
814
817
|
verdictText = `${verdictIcon} Spiky`
|
|
815
818
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A+'))(text)
|
|
816
819
|
break
|
|
817
820
|
case 'Slow':
|
|
818
|
-
verdictIcon = '
|
|
821
|
+
verdictIcon = '🟠'
|
|
819
822
|
verdictText = `${verdictIcon} Slow`
|
|
820
823
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A-'))(text)
|
|
821
824
|
break
|
|
822
825
|
case 'Very Slow':
|
|
823
|
-
verdictIcon = '
|
|
826
|
+
verdictIcon = '🔴'
|
|
824
827
|
verdictText = `${verdictIcon} Very Slow`
|
|
825
828
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B+'))(text)
|
|
826
829
|
break
|
|
827
830
|
case 'Overloaded':
|
|
828
|
-
verdictIcon = '
|
|
831
|
+
verdictIcon = '🔥'
|
|
829
832
|
verdictText = `${verdictIcon} Overloaded`
|
|
830
833
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B'))(text)
|
|
831
834
|
break
|
|
832
835
|
case 'Unstable':
|
|
833
836
|
// 📖 Avoid ⚠️ here: its variation selector has inconsistent terminal width and shifts the tiny ❔ column.
|
|
834
|
-
verdictIcon = '
|
|
837
|
+
verdictIcon = '🟥'
|
|
835
838
|
verdictText = `${verdictIcon} Unstable`
|
|
836
839
|
verdictColor = themeColors.errorBold
|
|
837
840
|
break
|
|
838
841
|
case 'Not Active':
|
|
839
|
-
verdictIcon = '
|
|
842
|
+
verdictIcon = '⚫'
|
|
840
843
|
verdictText = `${verdictIcon} Not Active`
|
|
841
844
|
verdictColor = themeColors.dim
|
|
842
845
|
break
|
|
843
846
|
case 'Pending':
|
|
844
|
-
verdictIcon = '
|
|
847
|
+
verdictIcon = '⏳'
|
|
845
848
|
verdictText = `${verdictIcon} Pending`
|
|
846
849
|
verdictColor = themeColors.dim
|
|
847
850
|
break
|
|
848
851
|
default:
|
|
849
|
-
verdictIcon = '
|
|
852
|
+
verdictIcon = '💀'
|
|
850
853
|
verdictText = `${verdictIcon} Unusable`
|
|
851
854
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('C'))(text)
|
|
852
855
|
break
|
|
853
856
|
}
|
|
854
|
-
|
|
855
|
-
// 📖 Use padEndDisplay to account for emoji display width (2 cols each) so all rows align
|
|
856
|
-
const isNewModel = NEW_MODELS.has(r.modelId) || NEW_MODELS.has(`${r.providerKey}/${r.modelId}`)
|
|
857
|
-
const newBadge = isNewModel ? '🆕' : ''
|
|
858
|
-
const verdictTextWithBadge = newBadge ? `${newBadge} ${verdictText}` : verdictText
|
|
859
|
-
const speedCell = verdictColor(padEndDisplay(verdictTextWithBadge, W_VERDICT))
|
|
857
|
+
const speedCell = verdictColor(padEndDisplay(verdictText, W_VERDICT))
|
|
860
858
|
const moodCell = padEndDisplay(verdictIcon, W_MOOD)
|
|
861
859
|
|
|
862
860
|
// 📖 Stability column - composite score (0–100) from p95 + jitter + spikes + uptime
|