Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 06:16 UTC

a2d2-dev / claude-top

Terminal UI for monitoring Claude Code token and cost usage

Go · TypeScriptNo license detected★ 21 stars⑂ 0 forkssince Apr 2026View on GitHub ↗

a2d2-dev/claude-top holds a health index of 50 out of 100, placing it in the Moderate band. It scores highest on Vitality (73/100) and lowest on Security (27/100). It was last updated 9 days ago. A single contributor accounts for most of its recent work.

50
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

50
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

a2d2-devOrganization
1 follower18 public repossince Nov 2025

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
Gogithub.com/a2d2-dev/claude-usage-monitorpoints to another repo — not scoredv0.6.1-239 days ago
npm@a2d2/claude-top0.6.1401179 days agoclaudeanthropictokenusagemonitortui
npm@a2d2/claude-top-linux-x640.6.1416179 days ago
npm@a2d2/claude-top-darwin-x640.6.1414179 days ago
npm@a2d2/claude-top-linux-arm640.6.1382179 days ago
npm@a2d2/claude-top-windows-x640.6.1404179 days ago
npm@a2d2/claude-top-darwin-arm640.6.1415179 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

73Good · 22% of overall
How it's scored
28.8/36Push recency — last push 9 days ago
4.8/36Commit cadence — 7/52 weeks with commits
17.3/18Commit volume — 84 commits in the last year
10/10OpenSSF Scorecard: Maintained — 12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year84
human_commit_share1
days_since_last_push9
active_weeks_last_year7
How it's scored
27/27Ships releases — 22 releases published
36/36Release recency — latest release 9 days ago
27/27Release cadence — a release every ~10.4 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count22
latest_release_tagv0.6.1
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases10.4

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

38At risk · 18% of overall
How it's scored
21.1/60Stars — 21 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars21
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
0/22.5License — no license file detected
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
45.1/80Monthly downloads — 2,432 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
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
ecosystemsnpm
total_downloads
monthly_downloads2,432
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

50Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
29.2/46.8Issue resolution — 62% of issues closed
38.2/38.3PR acceptance — 4/4 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/26 approved changesets -- score normalized to 0
Inputs used
merged_prs4
open_issues3
closed_issues5
issue_closed_ratio0.625
closed_unmerged_prs0
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
2.2/25Owner reach — 1 followers of a2d2-dev
10.6/25Track record — 18 public repos, account ~0 yr old
Inputs used
followers1
owner_typeOrganization
is_verified
owner_logina2d2-dev
public_repos18
account_age_days240
How it's scored
25/25Published & resolvable — 6 package(s) on npm
35/35Publish recency — latest publish 9 days ago
20/20Version history — 17 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
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
ecosystemsnpm
any_deprecatedno
min_days_since_publish9

Engineering Quality

Are baseline engineering and documentation practices in place?

55Moderate · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 4 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

65Moderate
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — https://claude-top.a2d2.dev
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepagehttps://claude-top.a2d2.dev
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

27Critical · 16% of overall
How it's scored
6/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 4 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/26 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5License — license file not detected
7.5/7.5Maintained — 12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2.7

AI Readiness

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.

59Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 82 of 84 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.976
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — go.mod (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — backend/tsconfig.json
10/10Reproducible environment — lockfile
2.4/10Demonstrated agent practice — 1 of the last 84 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum, pnpm-lock.yaml
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsbackend/tsconfig.json
agent_commit_share0.012
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
55/55Manageable file sizes — 0/54 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes50,774
source_files_sampled54
oversized_source_files0

Key facts

21GitHub stars
1contributors
84commits, last 12 months
9days since last push
22releases
1bus factor
3open issues
Go, npmpackage ecosystems

Data collection 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

More detail

Star and fork history 21 ★ / 0 ⇿
21Stars
15Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

48121620242162026-042026-052026-06
Major 0Minor 4Patch 11
OpenSSF Scorecard 2.7 / 10
2.7aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 06:16 UTC

8Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 4 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/26 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities33 existing vulnerabilities detected
Direct dependencies 4
RegistryPackageVersion constraintManifest
npmhono^4.6.0backend/package.json
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo, npm.