scribeclock 0.1.4 → 0.1.5

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.
@@ -919,7 +919,7 @@ export const analyticsCommand = cmd({
919
919
  REPO_FLAG,
920
920
  { name: "days", alias: "d", type: "number", description: "Window in days (default 30, max 180)." },
921
921
  { name: "environment", alias: "e", type: "string", description: "Only this environment." },
922
- { name: "report", type: "string", choices: ["overview", "daily", "retention", "screens", "clicks", "events", "breakdowns", "releases", "issues", "hourly"], description: "One section only." },
922
+ { name: "report", type: "string", choices: ["overview", "daily", "retention", "screens", "clicks", "events", "breakdowns", "releases", "issues", "hourly", "weekday"], description: "One section only." },
923
923
  { name: "csv", type: "boolean", description: "Print the daily series as CSV." },
924
924
  ],
925
925
  examples: ["scribeclock analytics", "scribeclock analytics --days 7 --report releases", "scribeclock analytics --days 90 --csv > usage.csv", "scribeclock analytics --json | jq .totals"],
@@ -945,11 +945,11 @@ export const analyticsCommand = cmd({
945
945
  out.log("");
946
946
  out.log(out.bold("Overview") + out.dim(" (vs previous window)"));
947
947
  out.kv([
948
- ["active users", `${String(t.users ?? 0)} (${delta(t.users, prev.users)}) · ${String(t.new_users ?? 0)} new · stickiness ${pct(t.stickiness_pct)} · MAU ${String(t.mau ?? 0)}`],
948
+ ["active users", `${String(t.users ?? 0)} (${delta(t.users, prev.users)}) · ${String(t.new_users ?? 0)} new · ${String(t.returning_users ?? 0)} returning · stickiness ${pct(t.stickiness_pct)} · MAU ${String(t.mau ?? 0)}`],
949
949
  ["sessions", `${String(t.sessions ?? 0)} (${delta(t.sessions, prev.sessions)}) · ${String(t.avg_session_minutes ?? 0)} min avg · ${String(t.avg_screens_per_session ?? 0)} screens/session`],
950
950
  ["crash-free", `${pct(t.crash_free_sessions_pct)} sessions · ${pct(t.crash_free_users_pct)} users`],
951
951
  ["page views / clicks", `${String(t.pageviews ?? 0)} / ${String(t.clicks ?? 0)} · ${String(t.events ?? 0)} events (${delta(t.events, prev.events)})`],
952
- ["errors / crashes", `${String(t.errors ?? 0)} (${delta(t.errors, prev.errors)}) / ${String(t.crashes ?? 0)} (${delta(t.crashes, prev.crashes)}) · ${String(t.users_affected ?? 0)} users affected`],
952
+ ["errors / crashes", `${String(t.errors ?? 0)} (${delta(t.errors, prev.errors)}) / ${String(t.crashes ?? 0)} (${delta(t.crashes, prev.crashes)}) · ${String(t.users_affected ?? 0)} users affected · ${String(t.errors_per_1k_sessions ?? "–")} per 1K sessions`],
953
953
  ["bug reports", `${String(t.bug_reports ?? 0)} (${delta(t.bug_reports, prev.bug_reports)})`],
954
954
  ["issues", `${String(t.issues_opened ?? 0)} opened · ${String(t.issues_resolved ?? 0)} resolved · ${String(t.issues_regressed ?? 0)} regressed · ${String(t.open_issues ?? 0)} open · MTTR ${String(t.mttr_hours ?? 0)} h`],
955
955
  ["emails", `${String(t.emails_immediate ?? 0)} immediate · ${String(t.emails_digest ?? 0)} digests`],
@@ -1022,6 +1022,13 @@ export const analyticsCommand = cmd({
1022
1022
  out.log(` ${hourly.map((h) => String(h.hour).padStart(2, "0")).join(" ")}`);
1023
1023
  out.log(` ${hourly.map((h) => { const n = Number(h.events); const lvl = n === 0 ? " " : n < max / 4 ? "▁" : n < max / 2 ? "▃" : n < (3 * max) / 4 ? "▅" : "█"; return ` ${lvl}`; }).join(" ")}`);
1024
1024
  }
1025
+ const weekday = (data.weekday ?? []);
1026
+ if (show("weekday") && weekday.some((w) => Number(w.sessions) || Number(w.events) || Number(w.errors))) {
1027
+ out.log("");
1028
+ out.log(out.bold("Day of week (UTC)"));
1029
+ const names = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
1030
+ out.table(["day", "sessions", "events", "errors"], weekday.map((w) => [names[Number(w.weekday)] ?? String(w.weekday), w.sessions, w.events, w.errors]), { indent: 2 });
1031
+ }
1025
1032
  if (data.hint && !Number(t.events) && !Number(t.sessions))
1026
1033
  out.info(out.dim(String(data.hint)));
1027
1034
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scribeclock",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "ScribeClock from the terminal: tasks, time clock, projects, PRDs, meetings, files, vault and Cloudflare — a thin client over the ScribeClock MCP server.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Haydar Al-Karar LLC, dba Karar Tech",