sigrank 0.0.224 → 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.223",
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.224",
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",
@@ -1040,7 +1040,7 @@ function renderDashboard(data, status = "", scrollOffset = 0) {
1040
1040
  emit();
1041
1041
  emit(` ${hr()}`);
1042
1042
  emit(
1043
- ` ${bold("Four Degrees")} ${dim("AA baseline · Human Center of Mass · Power users · Top Evals — signalaf.com/wiki")}`,
1043
+ ` ${bold("Four Degrees")} ${dim("AA · HCM · Power · Top Evals — signalaf.com/wiki")}`,
1044
1044
  );
1045
1045
  const tdHead = [
1046
1046
  padEnd(hdr("Metric"), 10),
@@ -1309,7 +1309,10 @@ function renderCompare(data) {
1309
1309
  const platform = data?.platform ?? "claude";
1310
1310
  const WINS = ["7d", "30d", "90d", "all"];
1311
1311
  const w = W();
1312
- const budget = H() - 4;
1312
+ // Compare tab needs more vertical space — 4 sources × 4 pillars = 16 rows
1313
+ // + headers + cascade metrics. Use full terminal height (not H()-4) and
1314
+ // fall back to a generous fixed minimum when rows is undefined (--render mode).
1315
+ const budget = Math.max(H() - 2, 40);
1313
1316
  let used = 0;
1314
1317
  const emit = (s = "") => {
1315
1318
  if (used < budget) {
@@ -2952,7 +2955,27 @@ export async function runTui({
2952
2955
  if (switched && activeTab === 2 && !compareData) {
2953
2956
  submitMsg = "";
2954
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);
2955
2977
  const result = await loadCompareData(platform).catch(() => null);
2978
+ clearInterval(spinTimer);
2956
2979
  if (activeTab === 2) {
2957
2980
  // still on Compare? render the result
2958
2981
  compareData = result;
@@ -3009,8 +3032,25 @@ export async function runTui({
3009
3032
  compareData = null;
3010
3033
  status = `loading ${platform}…`;
3011
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);
3012
3051
  // ASYNC FIX: guard — only render if still on Compare (user may have switched away)
3013
3052
  const result = await loadCompareData(platform).catch(() => null);
3053
+ clearInterval(spinTimer);
3014
3054
  if (activeTab === 2) {
3015
3055
  compareData = result;
3016
3056
  status = `last refreshed ${new Date().toLocaleTimeString("en-US", { hour12: false })}`;