sigrank 0.0.225 → 0.0.226

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/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/anthropics/mcpb/main/schemas/mcpb-manifest-v0.4.schema.json",
3
3
  "manifest_version": "0.4",
4
4
  "name": "sigrank",
5
- "version": "0.0.224",
5
+ "version": "0.0.225",
6
6
  "description": "Ranks AI coding operators by token cascade efficiency (Yield = cache_read \u00d7 output / input\u00b2). 23 tools for yield calculation, local token usage pulls, signed submission, and tokscale-powered analytics (market share, developer profiles, model trends, cost analysis, device profiles, MCP usage, competitive intelligence). Privacy-first: runs locally, only four token counts leave the machine.",
7
7
  "author": {
8
8
  "name": "SunrisesIllNeverSee",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sigrank",
3
- "version": "0.0.225",
3
+ "version": "0.0.226",
4
4
  "author": "SunrisesIllNeverSee (https://github.com/SunrisesIllNeverSee)",
5
5
  "description": "SigRank MCP server — AI operator evaluation and token cascade efficiency tools. The yield cascade + live leaderboard as MCP tools any agent can call.",
6
6
  "mcpName": "io.github.SunrisesIllNeverSee/sigrank-mcp",
@@ -2955,7 +2955,27 @@ export async function runTui({
2955
2955
  if (switched && activeTab === 2 && !compareData) {
2956
2956
  submitMsg = "";
2957
2957
  await redraw(); // show the spinner line before the (slow) fresh pull
2958
+ // Animated spinner with elapsed timer — the fresh verifier pull takes
2959
+ // 5-20s (ccusage CLI scans 1,700+ JSONL files). Without animation the
2960
+ // user sees a frozen "pulling fresh sources…" line and thinks it hung.
2961
+ const SPIN_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
2962
+ const BEAR_FRAMES = ["ʕ•ᴥ•ʔ", "ʕ•ᴥ•ʔノ", "ʕ•ᴥ•ʔ", "ʕ•ᴥ•ʔノ"];
2963
+ const pullStart = Date.now();
2964
+ let spinIdx = 0;
2965
+ const spinTimer = setInterval(() => {
2966
+ if (activeTab !== 2) return; // user switched away — don't repaint
2967
+ const elapsed = ((Date.now() - pullStart) / 1000).toFixed(1);
2968
+ const spin = SPIN_FRAMES[spinIdx % SPIN_FRAMES.length];
2969
+ const bear = BEAR_FRAMES[spinIdx % BEAR_FRAMES.length];
2970
+ spinIdx++;
2971
+ // Repaint just the spinner line in-place (line 4 of the frame)
2972
+ process.stdout.write(
2973
+ GOTO(4, 1) + ERLINE +
2974
+ ` ${gold(spin)} ${dim(`pulling fresh sources…`)} ${bold(`${elapsed}s`)} ${dim(`·`)} ${gold(bear)}`,
2975
+ );
2976
+ }, 200);
2958
2977
  const result = await loadCompareData(platform).catch(() => null);
2978
+ clearInterval(spinTimer);
2959
2979
  if (activeTab === 2) {
2960
2980
  // still on Compare? render the result
2961
2981
  compareData = result;
@@ -3012,8 +3032,25 @@ export async function runTui({
3012
3032
  compareData = null;
3013
3033
  status = `loading ${platform}…`;
3014
3034
  await redraw();
3035
+ // Animated spinner (same as the initial Compare load — see above)
3036
+ const SPIN_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
3037
+ const BEAR_FRAMES = ["ʕ•ᴥ•ʔ", "ʕ•ᴥ•ʔノ", "ʕ•ᴥ•ʔ", "ʕ•ᴥ•ʔノ"];
3038
+ const pullStart = Date.now();
3039
+ let spinIdx = 0;
3040
+ const spinTimer = setInterval(() => {
3041
+ if (activeTab !== 2) return;
3042
+ const elapsed = ((Date.now() - pullStart) / 1000).toFixed(1);
3043
+ const spin = SPIN_FRAMES[spinIdx % SPIN_FRAMES.length];
3044
+ const bear = BEAR_FRAMES[spinIdx % BEAR_FRAMES.length];
3045
+ spinIdx++;
3046
+ process.stdout.write(
3047
+ GOTO(4, 1) + ERLINE +
3048
+ ` ${gold(spin)} ${dim(`pulling ${platform}…`)} ${bold(`${elapsed}s`)} ${dim(`·`)} ${gold(bear)}`,
3049
+ );
3050
+ }, 200);
3015
3051
  // ASYNC FIX: guard — only render if still on Compare (user may have switched away)
3016
3052
  const result = await loadCompareData(platform).catch(() => null);
3053
+ clearInterval(spinTimer);
3017
3054
  if (activeTab === 2) {
3018
3055
  compareData = result;
3019
3056
  status = `last refreshed ${new Date().toLocaleTimeString("en-US", { hour12: false })}`;