free-coding-models 0.5.22 → 0.5.24

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,9 @@
1
+ # Changelog v0.5.23 - 2026-06-10
2
+
3
+ ### Fixed
4
+ - **Critical SyntaxError crash on startup** in `src/tui/render-table.js`: `speedCell` and `moodCell` were declared twice in the same scope (lines 855–856 vs 866–867), causing the published 0.5.22 CLI to fail with `SyntaxError: Identifier 'speedCell' has already been declared` before the TUI could render. Removed the dead first declarations; the badge-aware declarations are now the only ones in scope.
5
+ - **Missing `NEW_MODELS` import** in `src/tui/render-table.js`: the NEW (🆕) badge check added in 0.5.22 was reading from `NEW_MODELS` without importing it. Exported the set from `src/core/utils.js` and imported it correctly in the renderer.
6
+ - **Stale renderTable unit test** regex that assumed the old `🟩 Perfect` verdict format. Updated to match the new `🟩✨ Perfect` (sparkle emoji) format introduced in 0.5.22.
7
+
8
+ ### Changed
9
+ - Bumped package version to `0.5.23`.
@@ -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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.5.22",
3
+ "version": "0.5.24",
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/core/utils.js CHANGED
@@ -115,7 +115,7 @@ export const getAvg = (r) => {
115
115
  //
116
116
  // 📖 The "wasUpBefore" check is key — it distinguishes between a model that's
117
117
  // temporarily flaky vs one that was never reachable in the first place.
118
- const NEW_MODELS = new Set([
118
+ export const NEW_MODELS = new Set([
119
119
  'nvidia/nemotron-3-ultra-550b-a55b',
120
120
  '@cf/meta/llama-3.2-90b-instruct',
121
121
  '@cf/mistralai/mistral-7b-instruct-v0.2',
@@ -49,7 +49,7 @@ import {
49
49
  } from '../core/constants.js'
50
50
  import { themeColors, currentPalette, getProviderRgb, getTierRgb, getReadableTextRgb, getTheme, THEME_BG_RGB } from './theme.js'
51
51
  import { TIER_COLOR } from './tier-colors.js'
52
- import { getAvg, getVerdict, getUptime, getStabilityScore, getVersionStatusInfo } from '../core/utils.js'
52
+ import { getAvg, getVerdict, getUptime, getStabilityScore, getVersionStatusInfo, NEW_MODELS } from '../core/utils.js'
53
53
  import { usagePlaceholderForProvider } from '../core/ping.js'
54
54
  import { formatBenchmarkLatency, formatBenchmarkTps } from '../core/benchmark.js'
55
55
  import { calculateViewport, sortResultsWithPinnedFavorites, padEndDisplay, displayWidth, stripAnsi, fadedRow } from './render-helpers.js'
@@ -800,71 +800,64 @@ export function renderTable({
800
800
  // 📖 Verdict colors follow the same green→red gradient as TIER_COLOR / SWE%
801
801
  switch (verdict) {
802
802
  case 'Perfect':
803
- verdictIcon = '🟩✨'
803
+ verdictIcon = '🟩'
804
804
  verdictText = `${verdictIcon} Perfect`
805
805
  verdictColor = themeColors.successBold
806
806
  break
807
807
  case 'Normal':
808
- verdictIcon = '🟢✨'
808
+ verdictIcon = '🟢'
809
809
  verdictText = `${verdictIcon} Normal`
810
810
  verdictColor = themeColors.metricGood
811
811
  break
812
812
  case 'Spiky':
813
- verdictIcon = '🟡✨'
813
+ verdictIcon = '🟡'
814
814
  verdictText = `${verdictIcon} Spiky`
815
815
  verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A+'))(text)
816
816
  break
817
817
  case 'Slow':
818
- verdictIcon = '🟠✨'
818
+ verdictIcon = '🟠'
819
819
  verdictText = `${verdictIcon} Slow`
820
820
  verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A-'))(text)
821
821
  break
822
822
  case 'Very Slow':
823
- verdictIcon = '🔴✨'
823
+ verdictIcon = '🔴'
824
824
  verdictText = `${verdictIcon} Very Slow`
825
825
  verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B+'))(text)
826
826
  break
827
827
  case 'Overloaded':
828
- verdictIcon = '🔥✨'
828
+ verdictIcon = '🔥'
829
829
  verdictText = `${verdictIcon} Overloaded`
830
830
  verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B'))(text)
831
831
  break
832
832
  case 'Unstable':
833
833
  // 📖 Avoid ⚠️ here: its variation selector has inconsistent terminal width and shifts the tiny ❔ column.
834
- verdictIcon = '🟥✨'
834
+ verdictIcon = '🟥'
835
835
  verdictText = `${verdictIcon} Unstable`
836
836
  verdictColor = themeColors.errorBold
837
837
  break
838
838
  case 'Not Active':
839
- verdictIcon = '⚫✨'
839
+ verdictIcon = ''
840
840
  verdictText = `${verdictIcon} Not Active`
841
841
  verdictColor = themeColors.dim
842
842
  break
843
843
  case 'Pending':
844
- verdictIcon = '⏳✨'
844
+ verdictIcon = ''
845
845
  verdictText = `${verdictIcon} Pending`
846
846
  verdictColor = themeColors.dim
847
847
  break
848
848
  default:
849
- verdictIcon = '💀✨'
849
+ verdictIcon = '💀'
850
850
  verdictText = `${verdictIcon} Unusable`
851
851
  verdictColor = (text) => chalk.bold.rgb(...getTierRgb('C'))(text)
852
852
  break
853
853
  }
854
- // 📖 Use padEndDisplay to account for emoji display width (2 cols each) so all rows align
855
- const speedCell = verdictColor(padEndDisplay(verdictText, W_VERDICT))
856
- const moodCell = padEndDisplay(verdictIcon, W_MOOD)
857
-
858
854
  // 📖 Add NEW badge for recently added models
855
+ // 📖 Use padEndDisplay to account for emoji display width (2 cols each) so all rows align
859
856
  const isNewModel = NEW_MODELS.has(r.modelId) || NEW_MODELS.has(`${r.providerKey}/${r.modelId}`)
860
857
  const newBadge = isNewModel ? '🆕' : ''
861
858
  const verdictTextWithBadge = newBadge ? `${newBadge} ${verdictText}` : verdictText
862
- const speedCellWithBadge = verdictColor(padEndDisplay(verdictTextWithBadge, W_VERDICT))
863
- const moodCellWithBadge = padEndDisplay(verdictIcon, W_MOOD)
864
-
865
- // 📖 Use the version with badge for display
866
- const speedCell = speedCellWithBadge
867
- const moodCell = moodCellWithBadge
859
+ const speedCell = verdictColor(padEndDisplay(verdictTextWithBadge, W_VERDICT))
860
+ const moodCell = padEndDisplay(verdictIcon, W_MOOD)
868
861
 
869
862
  // 📖 Stability column - composite score (0–100) from p95 + jitter + spikes + uptime
870
863
  // 📖 Left-aligned to sit flush under the column header