原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 10391,
"has_wiki": true,
"homepage": "https://claude-top.a2d2.dev",
"languages": {
"Go": 292475,
"JavaScript": 3105,
"TypeScript": 97040
},
"pushed_at": "2026-07-13T02:02:43Z",
"created_at": "2026-04-07T08:41:10Z",
"owner_type": "Organization",
"updated_at": "2026-07-13T01:42:40Z",
"description": "Terminal UI for monitoring Claude Code token and cost usage",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go",
"TypeScript"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "a2d2-dev",
"company": null,
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/245786816?v=4",
"created_at": "2025-11-24T03:17:11Z",
"is_verified": null,
"public_repos": 18,
"account_age_days": 240
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2026-07-13T02:02:43Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-06-15T02:35:57Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-06-08T02:45:01Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-04-29T02:19:32Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2026-04-12T14:17:59Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-04-11T18:56:17Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-04-11T06:57:29Z"
},
{
"tag": "v0.2.9",
"kind": "patch",
"published_at": "2026-04-10T14:41:43Z"
},
{
"tag": "v0.2.8",
"kind": "patch",
"published_at": "2026-04-10T14:05:14Z"
},
{
"tag": "v0.2.7",
"kind": "patch",
"published_at": "2026-04-10T13:58:36Z"
},
{
"tag": "v0.2.6",
"kind": "patch",
"published_at": "2026-04-10T13:33:35Z"
},
{
"tag": "v0.2.5",
"kind": "patch",
"published_at": "2026-04-10T13:14:50Z"
},
{
"tag": "v0.2.4",
"kind": "patch",
"published_at": "2026-04-10T12:55:06Z"
},
{
"tag": "v0.2.3",
"kind": "patch",
"published_at": "2026-04-10T12:14:40Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2026-04-10T12:03:12Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-04-10T11:43:41Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-04-10T03:38:57Z"
},
{
"tag": "v0.1.5",
"kind": "patch",
"published_at": "2026-04-08T16:02:30Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2026-04-07T14:34:50Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2026-04-07T14:18:19Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-04-07T12:01:47Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-04-07T11:58:34Z"
}
],
"recent_commits": [
{
"oid": "09a3d1a7f48fc9a2606d9d698fc1ee1583abf1ba",
"body": "Fix session metadata, sessions tab caching, and leaderboard script escaping",
"is_bot": false,
"headline": "Merge pull request #14 from a2d2-dev/codex/-github",
"author_name": "LiuFeng",
"author_login": "imneov",
"committed_at": "2026-07-13T01:42:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "351d61d5916736fe2985aaf934916cfe861bb88f",
"body": null,
"is_bot": false,
"headline": "Fix issue metadata, session scroll perf, and script escaping",
"author_name": "LiuFeng",
"author_login": "imneov",
"committed_at": "2026-07-13T01:42:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe87673d8c9ad5c6c614cb72da8e3690c9236192",
"body": null,
"is_bot": false,
"headline": "chore: ignore worktree directories",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-06-14T12:35:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b63a95e0d07f083880865eab6bc050e24b06d583",
"body": "Add comprehensive BMad (Brownfield Method) development framework:\n- Analysis workflows (product brief, research, UX design)\n- Planning workflows (PRD, architecture, test architecture)\n- Implementation workflows (stories, sprint planning, code review)\n- Documentation and diagram generation tools\n- Enterprise development patterns and templates",
"is_bot": false,
"headline": "feat: add BMad framework integration and development tools",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-06-14T12:32:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71aa45b93bcfd33df0f8bd0bea29a754f0efdbe3",
"body": "fix(ui): move Chat tab before Sessions in tab order",
"is_bot": false,
"headline": "Merge pull request #9 from a2d2-dev/fix/chat-tab-order",
"author_name": "LiuFeng",
"author_login": "imneov",
"committed_at": "2026-06-07T16:17:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bc9db607533137a9c8ef7f1880986729c65cff93",
"body": "fix(sessions): default detail message sort to chronological order",
"is_bot": false,
"headline": "Merge pull request #7 from a2d2-dev/fix/detail-sort-default",
"author_name": "LiuFeng",
"author_login": "imneov",
"committed_at": "2026-06-07T16:17:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38fe5b5093fd5cb2b0696d5a375b9ae0df444e85",
"body": "Reorder tabs to Overview → Chat → Sessions → Daily → Monthly.\nChat is accessed more frequently for message browsing, so placing\nit right after Overview makes it more accessible.\n\nUpdate number key bindings: 2=Chat, 3=Sessions, 4=Daily, 5=Monthly.\n\nCloses #8",
"is_bot": false,
"headline": "fix(ui): move Chat tab before Sessions in tab order",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-06-07T16:12:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd146c22cec3be18ce456403185ebcd046fa81bb",
"body": "Change the default sort in session detail view from cost (highest first)\nto time (chronological). This makes it easier to follow conversation\nflow when opening a session.\n\nCloses #6",
"is_bot": false,
"headline": "fix(sessions): default detail message sort to chronological order",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-06-07T16:05:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c07a98045f8347d81c0d0fbccd1ec89fb13ea6d2",
"body": "feat(chat): add Chat tab with search for browsing messages",
"is_bot": false,
"headline": "Merge pull request #5 from a2d2-dev/feat/chat-tab",
"author_name": "LiuFeng",
"author_login": "imneov",
"committed_at": "2026-06-07T14:44:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc9bb783670554a90879b1c0ecbc3bb036574c8a",
"body": "Add a new Chat tab (key: 5) that shows all messages in a flat\nchronological list with real-time search filtering. Users can search\nby keyword (including CJK characters) to find specific conversations,\nview full message details (user input, assistant response, tool calls),\nand jump to the Sessions ta\n[…]\n view reusing existing renderMsgDetailContent\n- Jump-to-session (s key) locates the session and message in Sessions tab\n- Search input captures all keys to prevent global shortcut conflicts\n\nCloses #4",
"is_bot": false,
"headline": "feat(chat): add Chat tab with search for browsing individual messages",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-06-07T13:57:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "657bfb7f17711c4e1f0900af1212de4d0923f81b",
"body": "…-path\n\n- Add Monthly tab and self-update to features\n- Document 4th tab key (4 = Monthly)\n- Fix Usage block: --data-path → --claude-path, document update/version subcommands, drop removed --plan flag (now in TUI settings)\n- Add changelog entries for v0.3.0 / v0.3.2 / v0.4.0\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): refresh for v0.4.0 — Monthly tab, self-update, --claude…",
"author_name": "Neov",
"author_login": null,
"committed_at": "2026-05-26T04:58:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "718e0041d400b12c9b45e751ad74343be660609d",
"body": "Add a Monthly tab (key 4) for budgeting and trend tracking:\n- MonthlyStats model with DayCount for active days per month\n- BuildMonthlyStats aggregation following the Daily pattern\n- Scrollable table with Month, Days, Msgs, Tokens, Cost, Avg/Day\n- Cost summary header (total, avg/month, peak, min)\n- Navigation: up/down/g/G, Tab/Shift+Tab cycling\n\nCloses #2",
"is_bot": false,
"headline": "feat(monthly): add Monthly usage tab with per-month aggregation",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-29T02:18:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e2090fcc0f79ae93713d4b5482ae6d9b036d47b4",
"body": "claude-top update – fetch latest release from GitHub and replace binary,\n showing a live [████░░] progress bar during download.\nclaude-top version – print current version (embedded via ldflags at build).\n\nnpm installs are detected and redirected to npm install -g @a2d2/claude-top.",
"is_bot": false,
"headline": "feat(update): add self-update command with download progress bar",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-12T14:16:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "055e309dd082fe967e754c0b552429f9dd91fa41",
"body": "Each project now gets its own rows in the Sessions list instead of\nbeing merged into the same time-window block. Entries from simultaneous\nprojects no longer absorb each other through dominant-CWD selection.\n\n- BuildSessionBlocks now partitions entries by (CWD, source) first\n- Each group builds its own independent 5-hour block sequence\n- All groups are merged and sorted by StartTime for display\n- Block IDs include CWD to prevent collisions for same-hour blocks",
"is_bot": false,
"headline": "fix(sessions): group sessions by project (CWD+source) independently",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T18:54:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b1648d889ba43fd7a5b9ef6ca0d093a94450fffd",
"body": "Previously sessionRows() filtered out IsActive blocks, so any session\nwithin its 5-hour window was invisible in the Sessions tab. With multiple\nprojects running simultaneously, hours of work would disappear from the list.\n\nNow all non-gap blocks are shown. Active blocks are marked with ● in the\nleftmost prefix column so the user can distinguish in-progress sessions\nfrom completed ones at a glance.",
"is_bot": false,
"headline": "fix(sessions): show active (in-progress) blocks in Sessions list",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T14:11:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "457137f368663bb897bd155673ee0711db5d1ba1",
"body": "… directly\n\nThe buffer pattern (overwrite pendingEntry on each token_count, flush on\nuser_message/turn_context/EOF) was the root cause of the 7x undercount:\nTypeScript SDK sessions don't emit user_message events, so only the last\nturn per file was ever flushed.\n\nThe buffer was also unnecessary: last\n[…]\nfrom codexParseState, remove all flush logic, and\nrename updatePendingEntry → buildUsageEntry (returns UsageEntry directly).\nUpdate the streaming-dedup test to reflect the correct multi-turn behavior.",
"is_bot": false,
"headline": "refactor(codex): remove pending-entry buffer, emit token_count events…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T11:41:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cf80fb049ec7a927404c9be2d3957082c9953c96",
"body": "TypeScript SDK (codex_sdk_ts) interactive sessions may not emit\nuser_message events between AI turns. Previously, only user_message\nand EOF were flush boundaries, so only the last turn per session was\nemitted — causing ~7x undercount for heavy users.\n\nNow turn_context also flushes any pending entry \n[…]\nesent.\n\nAlso add correct pricing for gpt-5.2, gpt-5.3-codex, gpt-5.4, and\ngpt-5.4-mini (sourced from splitrail models.rs), and add\ntotal_token_usage differential fallback when last_token_usage is nil.",
"is_bot": false,
"headline": "fix(codex): flush pending entry on turn_context to capture all turns",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T10:02:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f5e8c545d7630f6355139ae83e0a92de374e474c",
"body": "…e, benchmark fix\n\n- Add Codex exec-mode session gap detection and warning in Overview tab\n (exec sessions have no local billing data; warns users to check OpenAI dashboard)\n- Add plan selection to Settings modal (Claude Code Plan section with Pro/Max 5×/Max 20×)\n- Persist plan to ~/.claude-top/con\n[…]\ncodex-path\n- Fix BenchmarkLoadEntries_10k to use same 4-worker parallel pool as production LoadEntries()\n- Update CONTRIBUTING.md benchmark baselines to reflect parallel parsing reality (~11s vs 3.8s)",
"is_bot": false,
"headline": "feat: Codex exec-mode warning, plan TUI settings, --claude-path renam…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T06:55:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c003d6824d2a777c673f276b9044bca8a1763603",
"body": "- wrangler.toml: add [observability] block (logs enabled=false with\n invocation_logs, traces disabled) from Cloudflare dashboard sync\n- Layout.tsx: inject Cloudflare Web Analytics beacon script in <head>\n (token: 19c63d74703a4d69aa5642a289748139)",
"is_bot": false,
"headline": "feat(backend): add Cloudflare observability config and Web Analytics",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T02:55:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5224eaaf638d0ae0e04bdbc79331e644fa8dd1b3",
"body": "…cess\n\n- release.yml: add 'test' job that runs go test ./... before any build.\n build job now has needs:test so a test failure blocks the entire release.\n- CONTRIBUTING.md: new developer handbook covering:\n - release checklist (unit tests → benchmark → tag)\n - benchmark baseline table with concern thresholds per metric\n - explanation of cold-parse vs warm-cache scenarios\n - context on why benchmarks run locally (not in CI)",
"is_bot": false,
"headline": "chore: add test gate to release CI and document release+benchmark pro…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T01:46:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dedf63ba6e09c1919f466289231cb5d6a607756e",
"body": "Benchmark results (Apple M1, synthetic dataset):\n Cold parse 10k sessions: ~3.8s (expected, I/O-bound)\n Warm cache 10k sessions: 206ms → 83ms (2.5×)\n gob decode 200k entries: 62ms → 3µs (18,000×)\n\nFixes:\n- Cap worker pool at min(NumCPU, 4) in both reader.go and codex_reader.go.\n Previously \n[…]\nfinal snapshot), not one per distinct token count value.\n- Add bench_test.go with benchmarks across 100/1k/5k/10k session scales for\n cold parse, warm cache, gob save/load, merge, and directory walk.",
"is_bot": false,
"headline": "perf: add benchmark suite and fix CPU saturation on large session sets",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-11T00:19:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7a06ed5de93c6bf87d340487665f139e0a04aa60",
"body": "…ex CLI\n\nReplaces the implicit [C]/[X] badge with an explicit filter bar above\nthe sessions table. Press 'c' to toggle Claude Code, 'x' to toggle\nCodex CLI. At least one source must remain active. Extensible for\nfuture AI tool sources.",
"is_bot": false,
"headline": "feat(sessions): add source filter toggles — [✓] Claude Code / [✓] Cod…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T14:39:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2a32d942328435e550a15440e3673bc5d66dddf",
"body": "For spans > 18 months: yearly ticks labeled '2025', '2026', etc.\nFor shorter spans: monthly ticks labeled 'MM/DD', with January\nshowing 'Jan YYYY' to make year boundaries obvious.",
"is_bot": false,
"headline": "feat(overview): add intermediate time axis ticks (monthly/yearly)",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T14:03:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c04e8fce10cb2cbb190e0c220ec7ad5e92cd32d4",
"body": "Previously each data point got equal width, causing sparse old sessions\n(e.g. Oct 29 + Apr 09) to each occupy 1/3 of the chart.\n\nNow each column represents a fixed time slice of the total span — a single\nday's bar is 1 char wide when the history spans months, leaving empty space\nbetween isolated sessions.",
"is_bot": false,
"headline": "fix(overview): use time-proportional X-axis for cost chart",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T13:57:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ee6627fa17483d4e551c928483c99f7004dd6c4",
"body": "… last 30 data points\n\nOld data (e.g. Codex sessions from 5 months ago) would stretch the X-axis\nacross months while appearing as equal-width bars alongside recent sessions.",
"is_bot": false,
"headline": "fix(overview): filter RECENT COST chart to last 30 calendar days, not…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T13:32:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "869a43e5e19b0f80be44910caac60980c226ed33",
"body": null,
"is_bot": false,
"headline": "fix(cache): bump cacheVersion to 6 for Codex streaming dedup fix",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T13:13:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf1ca866777d8e648383bad34098e1dee00a911d",
"body": "…ntermediates\n\nStreaming generates many token_count events per AI turn with incrementally\ngrowing values. Previously all changed snapshots were emitted as separate\nmessages, causing massive overcounting (e.g. 64 messages for one session).\n\nNew approach: buffer the latest snapshot in state.pendingEnt\n[…]\nrwriting\neach intermediate). Flush on the next user_message or end-of-file — only\nthe final snapshot per turn is recorded.\n\nAlso bumps cacheVersion to 6 to force re-parse of all cached Codex sessions.",
"is_bot": false,
"headline": "fix(codex): only emit final token_count per turn, discard streaming i…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T13:11:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e9d063e67229c2f9fd889e827b876d69776eb3c3",
"body": "…ter double-billing fix\n\nv0.2.2 fixed Codex InputTokens calculation but did not bump cacheVersion,\nso old session files were still served from cache with the wrong values.\nBumping to 5 forces a full re-parse of all Codex sessions on next run.",
"is_bot": false,
"headline": "fix(cache): bump cacheVersion to 5 to invalidate stale Codex cache af…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T12:53:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e41184e64c81d6566b00aff64cce8f500ae50258",
"body": "…dirs to avoid binary collision",
"is_bot": false,
"headline": "fix(ci): fix release asset naming — download artifacts into separate …",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T12:13:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89ddbc103347495cd5e0f2515c6eb1a8445314c3",
"body": null,
"is_bot": false,
"headline": "docs: add changelog section to README for v0.2.2",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T12:02:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a93f122b1a40d4197d63ccb0486361ce28d56965",
"body": "OpenAI's input_tokens includes cached tokens, unlike Anthropic where\ninput_tokens excludes cache_read. This caused cached tokens to be\ncharged at both the full input rate and the cache-read rate, inflating\nCodex costs by ~3-4x for users with high cache hit rates (>90%).",
"is_bot": false,
"headline": "fix(codex): subtract cached tokens from input to avoid double billing",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T11:57:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f20bbba78647ed2adafdac7be96dbf1eb92eac19",
"body": "…ilure\n\nrequire.resolve can fail in some npm/npx environments (Windows in\nparticular) even when the optional dependency is installed. Add a second\nlookup strategy that calculates the platform package path directly as a\nsibling under the same @a2d2 scope directory, and improve the error\nmessage to show both searched paths and direct download instructions.\n\nFixes #1",
"is_bot": false,
"headline": "fix(npm): add sibling-path fallback in launcher to fix Windows npx fa…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T11:42:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e82088ab2ac7becd18e23dcfbb6f7f6c82c20fb9",
"body": "… single-level tabs\n\nRemove nested Leaderboard > (Claude Code / Codex CLI / All) two-layer tabs.\nReplace with flat three-tab navigation: Claude Code | Codex CLI | About.\nClicking a leaderboard tab triggers a full page reload with ?source= param\nso the server renders the correct dataset.",
"is_bot": false,
"headline": "feat(web): flatten tab structure — Claude Code / Codex CLI / About as…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T04:01:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f601ad3fd97f05f7ad6a102be16f940f9bb8eb42",
"body": "Required for npm provenance validation — package.json repository.url\nmust match the GitHub repo from which CI publishes.",
"is_bot": false,
"headline": "fix(npm): update repository URL to claude-top in all platform packages",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T03:37:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "35d280ece7021f1fb2a7142ab3b8d44d6deffa92",
"body": "…ction",
"is_bot": false,
"headline": "docs: update README for v0.2.0 — add Codex CLI, flags, leaderboard se…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T03:34:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f4c52e6dd46e98b299d4fa6aad5827e705b57d6b",
"body": "后端:\n- 新增 /api/v2/upload 明确版本化路由,与 /api/upload 共用同一 handler\n- /api/upload(v1)保留不变,兼容所有旧版客户端\n- 两个版本的 response 都加入 source 字段,告知调用方排名属于哪个榜单\n\n客户端:\n- UploadResponse 增加 Source 字段\n- 新版 TUI 使用 /api/v2/upload\n- 收集每个 source 各自的排名结果,不再只取最后一次的\n\nTUI 上传成功界面:\n- source=all 时分别显示 \"Claude Code 排名:#x/y\" 和 \"Codex CLI 排名:#x/y\"\n- 单一 source 也正确显示对应标签",
"is_bot": false,
"headline": "feat(upload): API版本化 + 上传成功分source显示排名",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T03:23:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1470964dda746585051003b12389720b0cb74d2c",
"body": "DB修复:\n- 重建 uploads 表,unique constraint 从 (device_id,period)\n 改为 (device_id,period,source),修复 ON CONFLICT 语句500错误\n- 旧版客户端不携带 source 字段时默认为 'claude',保持兼容\n\n确认框改进:\n- source=all 时按 Claude Code / Codex CLI 分别显示费用、Token、Session\n- 单一数据源保持原有显示方式不变",
"is_bot": false,
"headline": "fix(upload): 修复上传500错误,优化确认框显示数据来源",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T03:00:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa1b2405381ed7d773af175e33c0b902d8023cb6",
"body": "…er-column\n\nApplying lipgloss Background() to each column individually caused\naccumulated ANSI escape codes to push the row past terminal width,\nmaking the Directory column wrap to a new line on the cursor row.\n\nFix: render all columns with plain muted style, then apply Bold +\nForeground + Background to the entire row string as one Render call.",
"is_bot": false,
"headline": "fix(ui): fix cursor row wrapping — apply background to full row not p…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T01:04:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "554fad6ee655ee4dee5c62c1b273f0015def1cca",
"body": "…ex sessions)",
"is_bot": false,
"headline": "fix(ui): show cached UserPrompt even when full detail load fails (Cod…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T00:24:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b8edb43cb41613c61df5914724d3e92da8fb957",
"body": "… add UserPrompt fallback",
"is_bot": false,
"headline": "fix(ui): message detail missing prompt — dangling pointer in byUUID +…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T00:22:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "641b6cd2b60f2bcf189a248943d11afd6762fa18",
"body": "…session detail\n\n- New data.ReadMessageDetail() reads the source JSONL on demand (no cache changes)\n- data.FindClaudeSessionFile() locates the file via sessionID glob\n- Shows: User Message, Tool Results (prev turn), Assistant Response, Tool Calls\n- Extended thinking blocks displayed when present\n- Loading spinner while async read is in flight\n- Graceful error message for Codex sessions (not yet supported)\n- No changes to UsageEntry, fileCache, or cache version",
"is_bot": false,
"headline": "feat(ui): on-demand message detail — show full content when Enter in …",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T00:15:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a55ce6e270caf37d803588c76fd5569264c17109",
"body": "…in detail view",
"is_bot": false,
"headline": "fix(ui): viewMsgDetail not rendered — session list shown after Enter …",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-10T00:00:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d11345510a9eb0dae3f685371c174cc26d727d68",
"body": "- Replace two-label X-axis with 3-6 evenly-spaced ticks (based on chart width)\n- When session spans midnight, format all labels as \"MM-DD HH:MM\" to\n eliminate ambiguity between e.g. \"23:00\" (day 1) and \"02:00\" (day 2)\n- Same-day sessions keep the compact \"HH:MM\" format",
"is_bot": false,
"headline": "fix(chart): add intermediate X-axis ticks and cross-midnight date labels",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T23:46:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3f3a5f75173a95c2bcf5dfbcf34b6f17979f996c",
"body": null,
"is_bot": false,
"headline": "feat(ui): add o as alias for settings (alongside ,)",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T23:45:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dfc489a243ab095847f893af9fa668cb769d0e4c",
"body": "- s/S now exclusively controls sort order in Sessions tab\n- , opens the settings modal (vim/tmux convention)\n- Updated all footer hints to reflect new keybinding",
"is_bot": false,
"headline": "fix(ui): move Settings key from s to , to avoid sort conflict",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T23:37:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb819e898ea99a89c90fce2d368fc7634b36a827",
"body": "Bumped cacheVersion 3→4 to invalidate stale caches that stored the wrong\nCWD (sessions storage path instead of project directory).\n\nAdded TestLoadCodexEntries_CWDSurvivedCacheRoundTrip to catch future\nregressions where a parsing change doesn't bump the cache version — the\ntest verifies that CWD is correct on both the initial parse AND the\nsubsequent cache-served load.",
"is_bot": false,
"headline": "fix(cache): bump version to 4, add cache round-trip CWD test",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T23:34:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84c38d02714c5a76f29745f112c5408598de2ee8",
"body": "CWD fix:\n- Read CWD from session_meta.payload.cwd (the actual project directory)\n- Fall back to filepath.Dir(filePath) only when session_meta has no CWD\n- Previously always showed ~/.codex/sessions/YYYY/MM/DD\n\nSource-split fix:\n- needsNewBlock now forces a new block when source changes (claude→codex\n[…]\nerifies session_meta.cwd is used\n- CWDFallbackToFilePath: verifies fallback when cwd absent\n- SourceSplit: claude+codex in same hour → separate blocks\n- SourceTag: codex-only block gets Source=\"codex\"",
"is_bot": false,
"headline": "fix(codex): correct CWD and source-split for Codex sessions",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T23:30:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "64f92cb2e13e051512d89255c9a407544ab402ac",
"body": "New tests for the Codex JSONL parser:\n- NullInfo: token_count with info=null is silently skipped\n- AllZeroTokens: all-zero snapshots are skipped (aborted turns)\n- NoTokenEvents: file with no token events returns empty, no error\n- TimestampParsed: ISO 8601 top-level timestamp is stored correctly\n- Se\n[…]\n skipped, valid lines parsed\n- RealWorldFormat: full real-world event (rate_limits, total_token_usage)\n\nNew pricing tests:\n- ActualCodexModelNames: gpt-5-codex and gpt-5.1-codex-mini hit correct tiers",
"is_bot": false,
"headline": "test(codex): add comprehensive parser and pricing test coverage",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T22:43:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3636d5c25d677338766d278e9a1fb93b4f3810cb",
"body": "The spec described a different format than what Codex CLI actually writes:\n- Top-level field is \"type\" not \"event_msg\"\n- \"event_msg\" is itself an event type with inner payload.type dispatch\n- user_message text is in payload.message not payload.text\n- token_count data is at payload.info.last_token_usage not payload.last_token_usage\n- Timestamps are ISO 8601 strings at top level, not Unix ms in payload\n\nUpdated test fixtures to match the real format. 648 Codex entries now load.",
"is_bot": false,
"headline": "fix(codex): fix JSONL parser for actual Codex CLI format",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T22:39:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b050775fe8e41e1dcbf5727f954f4a9ed4332e65",
"body": "…port\n\nEpic 6 complete — Codex CLI dual leaderboard and multi-source upload:\n\nStory 6-1 (backend-source-field):\n- backend/schema.sql: add `source` column to uploads, unique constraint on (device_id,period,source)\n- backend/src/routes/leaderboard.ts: source-aware queries, KV key isolation per source\n\n[…]\nge.tsx: split into per-source sections, total cost banner\n- backend/src/routes/web.tsx: fetch claude+codex stats in parallel for /u/:login\n\nAlso: cmd/preview/main.go updated for new NewModel signature",
"is_bot": false,
"headline": "feat(epic-6): add multi-source leaderboard, upload, and user page sup…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T18:15:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b2d043196f01546da022809498c5e0e6043a3a00",
"body": null,
"is_bot": false,
"headline": "chore(5-2,5-3,5-4): mark stories as done",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:55:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cfed25a1bf974fd6729fc8152c5f980618717e1",
"body": "…stats, settings panel\n\nStory 5-2: Sessions Tab multi-source\n- Add --source and --codex-path flags to main.go\n- Model gains source/codexPath/settings fields\n- loadData/loadCached use LoadAllEntries for source-aware loading\n- Sessions header and historyDataRow show [C]/[X] source prefix in mixed mode\n[…]\ng/config.go: persistent config at ~/.claude-top/config.json\n- internal/ui/settings.go: Settings modal with source selection and codex path editor\n- main.go loads config as fallback for unset CLI flags",
"is_bot": false,
"headline": "feat(5-2,5-3,5-4): add multi-source TUI display, per-source overview …",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:55:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9b70de106ec7cebdb7772c26e84952b4d6bb92f3",
"body": null,
"is_bot": false,
"headline": "chore(5-1-codex-data-parsing-cache): mark story as done",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:43:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1aef1b8308f50dd2d1ab315b212bc1876cce56b8",
"body": "…che support\n\n- Add Source field to UsageEntry and SessionBlock models\n- Bump cacheVersion 2→3 to invalidate stale caches\n- Add codexCachePath() for Codex-specific cache file\n- Add OpenAI/Codex pricing (codex-mini, codex) to pricing.go\n- Implement codex_reader.go with parseCodexFile, LoadCodexEntrie\n[…]\nn all Claude entries in LoadEntries/LoadCached\n- Update finalizeBlock() to set block.Source via dominantSource()\n- Add tests: missing dir, streaming dedup, OpenAI pricing, LoadAllEntries source filter",
"is_bot": false,
"headline": "feat(5-1-codex-data-parsing-cache): add Codex CLI data parsing and ca…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:43:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9f392c32f764d3cf6b1f957d85bfaff93e5d72e1",
"body": "- Comprehensive story file with full dev context\n- Token field mapping, streaming dedup, pricing, cache patterns\n- Status set to ready-for-dev",
"is_bot": false,
"headline": "chore(5-1): create story 5.1 - Codex CLI data parsing & cache",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:29:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b246a4f5661c0e60ab35041ed7d2db8a0256550c",
"body": "- Fix epic-1 status inconsistency (all stories done → mark done)\n- Add Epic 5 stories (5-1 to 5-4) as backlog\n- Add Epic 6 stories (6-1 to 6-4) as backlog\n- Set epic-5 in-progress (active development phase)",
"is_bot": false,
"headline": "chore: update sprint-status for Epic 5-6 (Codex CLI)",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:26:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd7ca567a908cf8d5a8dc784f81ba8004868a119",
"body": "- PRD: expand product scope to multi-source AI monitoring, add Epic 3\n (Codex CLI integration, dual leaderboards, Settings panel)\n- epics.md: add Epic 5 (TUI multi-source data view) and Epic 6\n (dual leaderboards + multi-source upload) with full stories",
"is_bot": false,
"headline": "docs: add Codex CLI support to PRD and epics",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T17:25:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0869a3043f81b1457bde2399730791b7cc909ec6",
"body": null,
"is_bot": false,
"headline": "fix: bilingual footer text, show English by default",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T06:13:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4fd595a55392e27cbc966a30621fe7298147a4fb",
"body": null,
"is_bot": false,
"headline": "feat: default to About tab, add /leaderboard route for direct URL access",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T06:11:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52abd867c11529c8a853c9353b8c61698ed7872d",
"body": null,
"is_bot": false,
"headline": "fix: default to leaderboard tab, remove sessionStorage persistence",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T06:05:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb06665b740742e483ab33bbe24a2eacf09cccac",
"body": null,
"is_bot": false,
"headline": "docs: remove broken remote screenshot URL",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T05:32:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cee11a34ee1bc079360415a4c2f29ba2292a5022",
"body": null,
"is_bot": false,
"headline": "docs: add screenshots to repo and update all references to claude-top",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T05:19:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00145dcfad5e515c92b5a70e08eb5e5ce9232e6d",
"body": null,
"is_bot": false,
"headline": "docs: add screenshots section and update repo URLs to claude-top",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T02:06:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bc01f031771799e32edec8700cf9331940c2b56",
"body": "…een colors, cost summary + daily table",
"is_bot": false,
"headline": "fix: redesign Daily screen to match real TUI — horizontal heatmap, gr…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T01:08:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8029fec43ab99e300d909843679664251ff73594",
"body": "… detail hint",
"is_bot": false,
"headline": "feat: auto-cycling TUI terminal, copy-command install button, session…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T01:03:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85b41d8465d5554fd9fb6ea6660412803b151600",
"body": "…urate TUI terminal mockup",
"is_bot": false,
"headline": "feat: bilingual support (EN default), tab layout for leaderboard, acc…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T00:55:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "764beb2897a8d313ed3e197e89158f42fa57b9b4",
"body": "- 将 web.ts (HTML 字符串拼接) 重构为 web.tsx (Hono JSX)\n- 新增 src/pages/Layout.tsx:共享导航/footer/CSS 变量\n- 新增 src/pages/LeaderboardPage.tsx:落地页组件(Hero/功能介绍/使用步骤/CTA/排行榜)\n- 新增 src/pages/UserPage.tsx:用户统计页组件\n- Hono JSX 运行时自动转义插值,消除手动 escapeHtml 安全隐患\n- 启用 tsconfig jsx/jsxImportSource 支持 .tsx 文件\n- 设计风格移植自 a2d2.lovable.app(深色海军蓝 + 青色渐变主题)",
"is_bot": false,
"headline": "refactor: migrate web routes to Hono JSX components",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-09T00:34:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87fcc34a118da8845643bf32e63e494bed6511f8",
"body": "…oopback issue",
"is_bot": false,
"headline": "fix: replace self-fetch with direct DB queries in web routes to fix l…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T22:32:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db0d8e108da7f257cd2e118b6a72634221bad66a",
"body": "…a raw string template",
"is_bot": false,
"headline": "fix: escape user data to prevent XSS, fix table row HTML injection vi…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T16:39:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae4d170b6c52640f980d2bfe72b7675740c06ca3",
"body": null,
"is_bot": false,
"headline": "fix: add missing clipboard.go to resolve build errors",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T15:59:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b55a23c1beee6222edab0893838cbe7b375fa10",
"body": null,
"is_bot": false,
"headline": "refactor: rename package from @a2d2/claude-monitor to @a2d2/claude-top",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T15:49:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "479f079c758b5cc03597fa0ef4615ab445cc1f41",
"body": null,
"is_bot": false,
"headline": "fix: update D1 database_name to a2d2-claude-top",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T09:16:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e45593b75deb5e69130c99388643dca450d5bd8a",
"body": null,
"is_bot": false,
"headline": "fix: use vars.* for non-sensitive Cloudflare IDs, not secrets.*",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T01:04:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bc636576701fa9158a4420b7dbb83f7ac5656388",
"body": "- wrangler.toml: replace D1/KV IDs with \\${VAR} placeholders\n- deploy-backend.yml: envsubst generates wrangler.generated.toml from secrets\n Secrets required: CLOUDFLARE_D1_DATABASE_ID, CLOUDFLARE_KV_NAMESPACE_ID,\n CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID\n- release.yml: inject CLAUDE_TOP_GITHUB_CLIENT_ID into Go binary via ldflags\n- .gitignore: add wrangler.generated.toml",
"is_bot": false,
"headline": "security: move resource IDs out of wrangler.toml, inject via CI",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-08T00:48:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca6fe32a5d565bee32cba60047c5d21a7bdfbc07",
"body": null,
"is_bot": false,
"headline": "chore: add backend/node_modules to .gitignore and untrack",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T17:34:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7eaf4b96dd9b04f0e5bf42a2b803b7966afb6b9a",
"body": "Epic 3 — Backend (TypeScript, Hono, D1, KV):\n- schema.sql: devices + uploads tables with UNIQUE constraints and indexes\n- JWT HS256 impl using Web Crypto API (no external deps)\n- POST /auth/verify: GitHub token → JWT (never store GitHub token)\n- POST /api/upload: upsert per-device stats, rank calc, \n[…]\n page with dark terminal theme\n- GET /u/:login: user stats page with OG meta tags\n- GET /og/:login: SVG-based OG image (1200×630, no external deps)\n\nAll TypeScript compiles clean (tsc --noEmit passes)",
"is_bot": false,
"headline": "feat(epic-3+4): Cloudflare Worker backend + web frontend",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T17:33:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74194c8ea0df304e0c37f8ac9497d3d0107c203b",
"body": "- Add internal/upload package: AggregateCurrentMonth, Upload HTTP client\n- Add upload overlay states (confirm/in-progress/success/error)\n- u key (authenticated): shows confirm dialog with cost/tokens/sessions\n- u key (unauthenticated): triggers GitHub Device Flow then auto-opens confirm\n- Upload payload excludes prompts/file paths; only aggregated stats\n- Add aggregator_test.go: tests month filter, gap/active exclusion, nil guard",
"is_bot": false,
"headline": "feat(story-2.1+2.2): upload confirmation UI + monthly data aggregation",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T17:27:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aea7ee79da60a44b588273614ec056440bb92af6",
"body": "- Add internal/auth package: Device Flow API, JWT storage, device UUID\n- Add auth overlay UI states (authIdle/Requesting/ShowingCode/Verifying/Success/Error)\n- u key triggers auth flow globally; shows device code panel in TUI\n- JWT persisted to ~/.claude-top/auth.json; device UUID to device.json\n- Auth overlay replaces content area during flow, dismissed with ESC/Enter\n- Add BMAD sprint planning artifacts (epics.md, sprint-status.yaml, stories/)",
"is_bot": false,
"headline": "feat(story-1.1): GitHub Device Flow OAuth authentication in TUI",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T17:18:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f76c4dfc80c021eb8f0fd1592f18c2cfd60a681",
"body": "…lict",
"is_bot": false,
"headline": "fix: remove bin entries from platform packages to avoid bin name conf…",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T14:33:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b487dbfa7708974c850d18932dd3c804187aeddf",
"body": null,
"is_bot": false,
"headline": "fix: correctly replace all 0.0.0 versions in main package",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T14:17:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34a5cf34fc57497f6709d9326629b88c4be1c5d8",
"body": null,
"is_bot": false,
"headline": "docs: remove homebrew section",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T14:06:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4958f2f923c5339faceeaee7def4dffd59204a45",
"body": null,
"is_bot": false,
"headline": "docs: add README with installation and usage",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T14:03:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bdf3c351e85f1d627c0b024fbba3dc94e28e63c2",
"body": null,
"is_bot": false,
"headline": "fix: use ./ prefix for npm publish paths",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T11:57:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9519425edefa8507d2a585d28375b2a61e25f138",
"body": null,
"is_bot": false,
"headline": "initial commit: claude-usage-monitor TUI",
"author_name": "imneov",
"author_login": "imneov",
"committed_at": "2026-04-07T08:41:03Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 22,
"commits_last_year": 84,
"latest_release_at": "2026-07-13T02:02:43Z",
"latest_release_tag": "v0.6.1",
"releases_from_tags": false,
"days_since_last_push": 9,
"active_weeks_last_year": 7,
"days_since_latest_release": 9,
"mean_days_between_releases": 10.4
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": true,
"has_contributing": true,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/a2d2-dev/claude-usage-monitor",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": false,
"registry_url": "https://pkg.go.dev/github.com/a2d2-dev/claude-usage-monitor",
"is_deprecated": false,
"latest_version": "v0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-usage-monitor",
"versions_count": 23,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-13T01:42:35Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top",
"exists": true,
"license": "MIT",
"keywords": [
"claude",
"anthropic",
"token",
"usage",
"monitor",
"tui"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 401,
"first_published_at": "2026-04-08T16:02:54.111000Z",
"latest_published_at": "2026-07-13T02:04:35.381000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top-linux-x64",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top-linux-x64",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 416,
"first_published_at": "2026-04-08T16:02:45.382000Z",
"latest_published_at": "2026-07-13T02:04:27.760000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top-darwin-x64",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top-darwin-x64",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 414,
"first_published_at": "2026-04-08T16:02:35.971000Z",
"latest_published_at": "2026-07-13T02:04:19.905000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top-linux-arm64",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top-linux-arm64",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 382,
"first_published_at": "2026-04-08T16:02:40.108000Z",
"latest_published_at": "2026-07-13T02:04:23.809000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top-windows-x64",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top-windows-x64",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 404,
"first_published_at": "2026-04-08T16:02:50.448000Z",
"latest_published_at": "2026-07-13T02:04:32.117000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
},
{
"name": "@a2d2/claude-top-darwin-arm64",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@a2d2/claude-top-darwin-arm64",
"is_deprecated": false,
"latest_version": "0.6.1",
"repository_url": "https://github.com/a2d2-dev/claude-top",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 415,
"first_published_at": "2026-04-08T16:02:31.319000Z",
"latest_published_at": "2026-07-13T02:04:15.956000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 9
}
]
},
"popularity": {
"forks": 0,
"stars": 21,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [
{
"date": "2026-04-09",
"count": 5
},
{
"date": "2026-04-10",
"count": 1
},
{
"date": "2026-04-11",
"count": 6
},
{
"date": "2026-04-12",
"count": 2
},
{
"date": "2026-04-13",
"count": 1
},
{
"date": "2026-05-21",
"count": 1
},
{
"date": "2026-05-26",
"count": 3
},
{
"date": "2026-05-27",
"count": 1
},
{
"date": "2026-06-14",
"count": 1
}
],
"complete": true,
"collected": 21,
"total_stars": 21
},
"open_issues_and_prs": 3
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"backend/tsconfig.json"
],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 50774,
"source_files_sampled": 54,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"backend/package.json",
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go",
"npm"
],
"dependencies": [
{
"name": "hono",
"manifest": "backend/package.json",
"ecosystem": "npm",
"version_constraint": "^4.6.0"
},
{
"name": "github.com/charmbracelet/bubbles",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.0"
},
{
"name": "github.com/charmbracelet/bubbletea",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.3.10"
},
{
"name": "github.com/charmbracelet/lipgloss",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 4,
"open_issues": 3,
"closed_ratio": 0.625,
"closed_issues": 5,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "imneov",
"commits": 83,
"avatar_url": "https://avatars.githubusercontent.com/u/31612033?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"deploy-backend.yml",
"release.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"pnpm-lock.yaml"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 8,
"reason": "binaries present in source code",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 0,
"reason": "0 out of 4 merged PRs checked by a CI test -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/26 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "33 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "09a3d1a7f48fc9a2606d9d698fc1ee1583abf1ba",
"ran_at": "2026-07-22T06:16:13Z",
"aggregate_score": 2.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-13T02:04:38Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-13T01:42:35Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 3,
"created_at": "2026-04-28T16:11:42Z",
"last_comment_at": "2026-04-28T16:22:38Z",
"last_comment_author": "imneov"
},
{
"number": 12,
"created_at": "2026-07-12T14:56:36Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 13,
"created_at": "2026-07-12T15:08:44Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/a2d2-dev/claude-top",
"host": "github.com",
"name": "claude-top",
"owner": "a2d2-dev"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"security": 27,
"vitality": 73,
"community": 38,
"governance": 50,
"engineering": 55
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 73,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"commits_last_year": 84,
"human_commit_share": 1,
"days_since_last_push": 9,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 9 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 9
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "84 commits in the last year",
"points": 17.3,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 84
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 22,
"latest_release_tag": "v0.6.1",
"releases_from_tags": false,
"days_since_latest_release": 9,
"mean_days_between_releases": 10.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "22 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 22
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 9 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 9
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~10.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 10.4
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 38,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 21,
"inputs": {
"forks": 0,
"stars": 21,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "below_threshold"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "21 stars",
"points": 21.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 21
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 45,
"inputs": {
"has_readme": true,
"has_license": false,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"packages": [
"@a2d2/claude-top",
"@a2d2/claude-top-linux-x64",
"@a2d2/claude-top-darwin-x64",
"@a2d2/claude-top-linux-arm64",
"@a2d2/claude-top-windows-x64",
"@a2d2/claude-top-darwin-arm64"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 2432
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,432 downloads/month across npm",
"points": 45.1,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2432,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 50,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 67,
"inputs": {
"merged_prs": 4,
"open_issues": 3,
"closed_issues": 5,
"issue_closed_ratio": 0.625,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "62% of issues closed",
"points": 29.2,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 62
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "4/4 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 4,
"decided": 4
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/26 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "a2d2-dev",
"public_repos": 18,
"account_age_days": 240
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of a2d2-dev",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "a2d2-dev"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "18 public repos, account ~0 yr old",
"points": 10.6,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 18
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@a2d2/claude-top",
"@a2d2/claude-top-linux-x64",
"@a2d2/claude-top-darwin-x64",
"@a2d2/claude-top-linux-arm64",
"@a2d2/claude-top-windows-x64",
"@a2d2/claude-top-darwin-arm64"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 9
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "6 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 6,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 9 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 9
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "17 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 17
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 55,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 48,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "0 out of 4 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "https://claude-top.a2d2.dev",
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://claude-top.a2d2.dev",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 27,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": null,
"notes": [],
"value": 27,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 2.7
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "binaries present in source code",
"points": 6,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "0 out of 4 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/26 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "33 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 1
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 59,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.976,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "82 of 84 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 82,
"sampled": 84
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum",
"pnpm-lock.yaml"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"backend/tsconfig.json"
],
"agent_commit_share": 0.012,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "backend/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "backend/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "1 of the last 84 commits agent-authored or agent-credited",
"points": 2.4,
"status": "partial",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 1,
"sampled": 84
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 50774,
"source_files_sampled": 54,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/54 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 54,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"go package 'github.com/a2d2-dev/claude-usage-monitor' points at a different repository (https://github.com/a2d2-dev/claude-usage-monitor); excluded from ecosystem scoring",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@a2d2/claude-top@0.6.1; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-22T06:16:23.176837Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/a2d2-dev/claude-top.svg",
"full_name": "a2d2-dev/claude-top",
"license_state": "absent",
"license_spdx": null
}