standout 0.5.22 → 0.5.23

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/dist/cli.js CHANGED
@@ -148,7 +148,7 @@ async function runAgent(jobId) {
148
148
  },
149
149
  });
150
150
  await confirmPrivacy();
151
- const stopInitialLoading = startLoadingLine("Generating your Standout wrapped");
151
+ const stopInitialLoading = startLoadingLine("Putting together your AI highlights");
152
152
  const usagePromise = gatherUsageStats();
153
153
  const basicsPromise = gatherProfileBasics();
154
154
  let usageStats;
@@ -182,7 +182,7 @@ async function runAgent(jobId) {
182
182
  });
183
183
  // Generate EVERYTHING up front (gather + all the server LLM cards) under one
184
184
  // spinner, then page the whole deck at once — no two-pass preview/finale split.
185
- const stopWrappedLoading = startLoadingLine("Generating your Standout wrapped");
185
+ const stopWrappedLoading = startLoadingLine("Putting together your AI highlights");
186
186
  let wrapped;
187
187
  let prefetched;
188
188
  try {
@@ -466,6 +466,9 @@ export function aggregateView(args) {
466
466
  active_days_percentile: rankSummary.active_days_percentile ?? null,
467
467
  tokens_percentile: rankSummary.tokens_percentile ?? null,
468
468
  commit_days_percentile: rankSummary.commit_days_percentile ?? null,
469
+ total_tokens_percentile: rankSummary.total_tokens_percentile ?? null,
470
+ avg_agents_percentile: rankSummary.avg_agents_percentile ?? null,
471
+ weekend_pct_percentile: rankSummary.weekend_pct_percentile ?? null,
469
472
  },
470
473
  proficiency: parseProficiency(computedObj.proficiency),
471
474
  tokens,
@@ -73,6 +73,9 @@ function fixture(s) {
73
73
  active_days_percentile: s.consistency,
74
74
  tokens_percentile: s.intensity,
75
75
  commit_days_percentile: s.intensity,
76
+ total_tokens_percentile: s.intensity,
77
+ avg_agents_percentile: s.intensity,
78
+ weekend_pct_percentile: s.consistency,
76
79
  },
77
80
  proficiency: {
78
81
  score: s.score,
@@ -200,10 +200,12 @@ 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
204
  const lines = [
204
205
  chalk.dim("YOU MANAGED"),
205
206
  "",
206
207
  bigNumber(` ${hours} session-hours`),
208
+ ...(badge ? ["", badge] : []),
207
209
  "",
208
210
  chalk.white(` ${verdict}`),
209
211
  chalk.dim(" across parallel agent sessions, last 30 days"),
@@ -259,6 +261,7 @@ function cardRhythm(view) {
259
261
  : "no clear peak";
260
262
  const weekendPct = Math.round(view.weekend_ratio * 100);
261
263
  const weekdayPct = 100 - weekendPct;
264
+ const weekendBadge = benchmarkBadge(view, view.rank_summary.weekend_pct_percentile, "of devs by weekend coding");
262
265
  const isNightOwl = critter?.key === "night_owl";
263
266
  const subhead = isNightOwl
264
267
  ? "while the 9-5ers sleep, you ship."
@@ -278,6 +281,7 @@ function cardRhythm(view) {
278
281
  "",
279
282
  ` ${chalk.white("weekdays".padEnd(9))} ${bar(weekdayPct, 100, 20)} ${chalk.dim(weekdayPct + "%")}`,
280
283
  ` ${chalk.white("weekends".padEnd(9))} ${bar(weekendPct, 100, 20)} ${chalk.dim(weekendPct + "%")}`,
284
+ ...(weekendBadge ? ["", weekendBadge] : []),
281
285
  "",
282
286
  ];
283
287
  if (view.rhythm_comment) {
@@ -395,6 +399,17 @@ function topPercent(percentile) {
395
399
  const top = topPercentNumber(percentile);
396
400
  return top === null ? null : `top ${top}%`;
397
401
  }
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) {
406
+ if (view.early_adopter)
407
+ return null;
408
+ const top = topPercentNumber(percentile);
409
+ if (top === null)
410
+ return null;
411
+ return ` ${chalk.hex("#ff8a00")(`top ${top}%`)} ${chalk.dim(dimension)}`;
412
+ }
398
413
  function cardRankSummary(view) {
399
414
  if (!usageReady(view) || view.total_sessions <= 0)
400
415
  return "";
@@ -503,6 +518,7 @@ function cardTokens(view) {
503
518
  chalk.dim("YOU BURNED THIS MANY TOKENS"),
504
519
  "",
505
520
  ` ${totalLine}`,
521
+ benchmarkBadge(view, view.rank_summary.total_tokens_percentile, "of devs by tokens") ?? "",
506
522
  "",
507
523
  cachedNote,
508
524
  generatedLine,
@@ -738,10 +754,12 @@ function cardConcurrency(view) {
738
754
  const longest = days >= 1.5
739
755
  ? `${days.toFixed(0)} days`
740
756
  : `${Math.round(c.longest_session_hours)}h`;
757
+ const badge = benchmarkBadge(view, view.rank_summary.avg_agents_percentile, "of devs by agents juggled");
741
758
  const lines = [
742
759
  chalk.dim("HOW MANY AGENTS YOU JUGGLE"),
743
760
  "",
744
761
  ` ${bigNumber(`~${c.open_tab_avg}`)} ${chalk.white("agents open at once")}`,
762
+ ...(badge ? ["", badge] : []),
745
763
  "",
746
764
  ` ${chalk.white("peak".padEnd(14))} ${chalk.dim(`${c.open_tab_peak} at once`)}`,
747
765
  ` ${chalk.white("longest tab".padEnd(14))} ${chalk.dim(`${longest} open`)}`,
@@ -937,7 +955,7 @@ export async function renderWrappedPreview(view) {
937
955
  // CLI runs that separately. Returns whether the user quit early.
938
956
  export async function renderWrappedAll(view) {
939
957
  process.stdout.write("\n");
940
- process.stdout.write(" " + TITLE_GRADIENT.multiline("░▒▓ STANDOUT WRAPPED ▓▒░") + "\n");
958
+ process.stdout.write(" " + TITLE_GRADIENT.multiline("░▒▓ YOUR AI WRAPPED ▓▒░") + "\n");
941
959
  process.stdout.write(chalk.dim(` ${view.name.toLowerCase()} · last 30 days\n\n`));
942
960
  const cards = buildRenderableCards(view, "final");
943
961
  if (cards.length === 0) {
@@ -958,7 +976,7 @@ export async function renderWrappedAll(view) {
958
976
  async function renderWrappedCards(view, mode) {
959
977
  // Title banner
960
978
  process.stdout.write("\n");
961
- process.stdout.write(" " + TITLE_GRADIENT.multiline("░▒▓ STANDOUT WRAPPED ▓▒░") + "\n");
979
+ process.stdout.write(" " + TITLE_GRADIENT.multiline("░▒▓ YOUR AI WRAPPED ▓▒░") + "\n");
962
980
  process.stdout.write(chalk.dim(` ${view.name.toLowerCase()} · last 30 days\n\n`));
963
981
  // Render each card; cards that return empty string get skipped (e.g. tool
964
982
  // relationship when there's not enough data, models when no model captured).
@@ -94,6 +94,9 @@ export interface WrappedAggregateView {
94
94
  active_days_percentile: number | null;
95
95
  tokens_percentile: number | null;
96
96
  commit_days_percentile: number | null;
97
+ total_tokens_percentile: number | null;
98
+ avg_agents_percentile: number | null;
99
+ weekend_pct_percentile: number | null;
97
100
  };
98
101
  proficiency: ProficiencyView | null;
99
102
  tokens: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "standout",
3
- "version": "0.5.22",
3
+ "version": "0.5.23",
4
4
  "description": "Build your developer profile with AI. One command, zero friction.",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",