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.23",
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",
@@ -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
- // 📖 Favorites marked with a single no ranking numbers
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
- // 📖 Add NEW badge for recently added models
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