standout 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.
@@ -469,6 +469,7 @@ export function aggregateView(args) {
469
469
  total_tokens_percentile: rankSummary.total_tokens_percentile ?? null,
470
470
  avg_agents_percentile: rankSummary.avg_agents_percentile ?? null,
471
471
  weekend_pct_percentile: rankSummary.weekend_pct_percentile ?? null,
472
+ ai_assisted_pct_percentile: rankSummary.ai_assisted_pct_percentile ?? null,
472
473
  },
473
474
  proficiency: parseProficiency(computedObj.proficiency),
474
475
  tokens,
@@ -76,6 +76,7 @@ function fixture(s) {
76
76
  total_tokens_percentile: s.intensity,
77
77
  avg_agents_percentile: s.intensity,
78
78
  weekend_pct_percentile: s.consistency,
79
+ ai_assisted_pct_percentile: s.intensity,
79
80
  },
80
81
  proficiency: {
81
82
  score: s.score,
@@ -200,12 +200,11 @@ function card1Open(view) {
200
200
  : perDay >= 1
201
201
  ? "a daily habit at this point."
202
202
  : "just getting warmed up.";
203
- const badge = benchmarkBadge(view, view.rank_summary.hours_percentile, "of devs by session-hours");
203
+ const bench = benchmarkInline(view, view.rank_summary.hours_percentile);
204
204
  const lines = [
205
205
  chalk.dim("YOU MANAGED"),
206
206
  "",
207
- bigNumber(` ${hours} session-hours`),
208
- ...(badge ? ["", badge] : []),
207
+ bigNumber(` ${hours} session-hours`) + (bench ? ` ${bench}` : ""),
209
208
  "",
210
209
  chalk.white(` ${verdict}`),
211
210
  chalk.dim(" across parallel agent sessions, last 30 days"),
@@ -261,7 +260,7 @@ function cardRhythm(view) {
261
260
  : "no clear peak";
262
261
  const weekendPct = Math.round(view.weekend_ratio * 100);
263
262
  const weekdayPct = 100 - weekendPct;
264
- const weekendBadge = benchmarkBadge(view, view.rank_summary.weekend_pct_percentile, "of devs by weekend coding");
263
+ const weekendBench = benchmarkInline(view, view.rank_summary.weekend_pct_percentile);
265
264
  const isNightOwl = critter?.key === "night_owl";
266
265
  const subhead = isNightOwl
267
266
  ? "while the 9-5ers sleep, you ship."
@@ -281,7 +280,7 @@ function cardRhythm(view) {
281
280
  "",
282
281
  ` ${chalk.white("weekdays".padEnd(9))} ${bar(weekdayPct, 100, 20)} ${chalk.dim(weekdayPct + "%")}`,
283
282
  ` ${chalk.white("weekends".padEnd(9))} ${bar(weekendPct, 100, 20)} ${chalk.dim(weekendPct + "%")}`,
284
- ...(weekendBadge ? ["", weekendBadge] : []),
283
+ ...(weekendBench ? ["", ` ${weekendBench}`] : []),
285
284
  "",
286
285
  ];
287
286
  if (view.rhythm_comment) {
@@ -350,13 +349,20 @@ function card7AINative(view) {
350
349
  : pct > 0
351
350
  ? "Claude's in your commit history. no going back."
352
351
  : "no AI-co-authored commits yet.";
352
+ const bench = benchmarkInline(view, view.rank_summary.ai_assisted_pct_percentile);
353
+ const streak = view.streak_days;
353
354
  const lines = [
354
355
  chalk.dim("YOU'RE AI-NATIVE"),
355
356
  "",
356
357
  ` commits since 2024: ${chalk.white(view.total_commits.toLocaleString())}`,
357
358
  ` AI co-authored: ${chalk.white(view.ai_assisted_commits.toLocaleString())}`,
358
359
  "",
359
- ` ${bar(pct, 100, 26)} ${chalk.white(pct + "%")}`,
360
+ ` ${bar(pct, 100, 22)} ${chalk.white(pct + "%")}${bench ? ` ${bench}` : ""}`,
361
+ ...(streak >= 2
362
+ ? [
363
+ ` ${chalk.white(`${streak}-day streak`)}${chalk.dim(", coding without missing a day.")}`,
364
+ ]
365
+ : []),
360
366
  "",
361
367
  chalk.dim(subhead),
362
368
  ].join("\n");
@@ -399,16 +405,20 @@ function topPercent(percentile) {
399
405
  const top = topPercentNumber(percentile);
400
406
  return top === null ? null : `top ${top}%`;
401
407
  }
402
- // Inline "top X%" benchmark for a single metric card, gated on the same 100-user
403
- // cohort that unlocks the rest of the rankings. Returns null (line omitted) for
404
- // early adopters or until the metric has a percentile.
405
- function benchmarkBadge(view, percentile, dimension) {
408
+ // Inline "(top X% of users)" cohort benchmark appended to a metric. Faint, except
409
+ // when the user lands in the top <10% the percentile renders in the rainbow
410
+ // gradient (the rest stays faint). Returns "" (omitted) for early adopters or
411
+ // until the metric has a percentile, so callers can append conditionally.
412
+ function benchmarkInline(view, percentile) {
406
413
  if (view.early_adopter)
407
- return null;
414
+ return "";
408
415
  const top = topPercentNumber(percentile);
409
416
  if (top === null)
410
- return null;
411
- return ` ${chalk.hex("#ff8a00")(`top ${top}%`)} ${chalk.dim(dimension)}`;
417
+ return "";
418
+ const pct = `${top}%`;
419
+ return top < 10
420
+ ? chalk.dim("(top ") + TITLE_GRADIENT(pct) + chalk.dim(" of users)")
421
+ : chalk.dim(`(top ${pct} of users)`);
412
422
  }
413
423
  function cardRankSummary(view) {
414
424
  if (!usageReady(view) || view.total_sessions <= 0)
@@ -485,6 +495,7 @@ function cardTokens(view) {
485
495
  if (!usageReady(view) || (t.work_tokens <= 0 && t.cache_tokens <= 0))
486
496
  return "";
487
497
  const totalLine = bigNumber(formatTokens(t.total_30d) + " tokens");
498
+ const tokensBench = benchmarkInline(view, view.rank_summary.total_tokens_percentile);
488
499
  const max = Math.max(...t.by_tool.map((x) => x.tokens), 1);
489
500
  const toolRows = t.by_tool.length > 0
490
501
  ? t.by_tool
@@ -517,8 +528,7 @@ function cardTokens(view) {
517
528
  const lines = [
518
529
  chalk.dim("YOU BURNED THIS MANY TOKENS"),
519
530
  "",
520
- ` ${totalLine}`,
521
- benchmarkBadge(view, view.rank_summary.total_tokens_percentile, "of devs by tokens") ?? "",
531
+ ` ${totalLine}${tokensBench ? ` ${tokensBench}` : ""}`,
522
532
  "",
523
533
  cachedNote,
524
534
  generatedLine,
@@ -754,12 +764,11 @@ function cardConcurrency(view) {
754
764
  const longest = days >= 1.5
755
765
  ? `${days.toFixed(0)} days`
756
766
  : `${Math.round(c.longest_session_hours)}h`;
757
- const badge = benchmarkBadge(view, view.rank_summary.avg_agents_percentile, "of devs by agents juggled");
767
+ const bench = benchmarkInline(view, view.rank_summary.avg_agents_percentile);
758
768
  const lines = [
759
769
  chalk.dim("HOW MANY AGENTS YOU JUGGLE"),
760
770
  "",
761
- ` ${bigNumber(`~${c.open_tab_avg}`)} ${chalk.white("agents open at once")}`,
762
- ...(badge ? ["", badge] : []),
771
+ ` ${bigNumber(`~${c.open_tab_avg}`)} ${chalk.white("agents open at once")}${bench ? ` ${bench}` : ""}`,
763
772
  "",
764
773
  ` ${chalk.white("peak".padEnd(14))} ${chalk.dim(`${c.open_tab_peak} at once`)}`,
765
774
  ` ${chalk.white("longest tab".padEnd(14))} ${chalk.dim(`${longest} open`)}`,
@@ -97,6 +97,7 @@ export interface WrappedAggregateView {
97
97
  total_tokens_percentile: number | null;
98
98
  avg_agents_percentile: number | null;
99
99
  weekend_pct_percentile: number | null;
100
+ ai_assisted_pct_percentile: number | null;
100
101
  };
101
102
  proficiency: ProficiencyView | null;
102
103
  tokens: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "standout",
3
- "version": "0.5.23",
3
+ "version": "0.5.25",
4
4
  "description": "Build your developer profile with AI. One command, zero friction.",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",