feat: widen scope to AI developer tools; enforce hard 1,000-star floor

The list was already drifting past "coding agents" — ADEs were admitted in
the previous commit. Rather than keep widening criterion 1 one category at a
time, it now describes the actual subject: developer tools built around AI.
The dividing line becomes tools you use vs. building blocks you import, which
keeps libraries, SDKs, model weights and skill collections out.

The star floor drops from a soft "roughly 10,000+" to a hard 1,000:

- enforceStarFloor drops any below-floor entry from the ranking and emits an
  ::error:: annotation, so the published list can never violate the rule.
  Dropping rather than failing keeps one bad entry from blocking the refresh
  of every other repo.
- -check cannot catch this (star counts need the API, -check runs offline);
  docs/CONTRIBUTING.md says so explicitly.

Side effect: Orkas (1,998 stars) now clears the floor it previously missed.

go run . -check: 43 agents valid. go test ./...: ok.
This commit is contained in:
tiennm99 committed 2026-09-16 21:21:12 +07:00
1 parent 21ad0d47a5
commit c5d8561d8f
6 files changed
+81 -17

No files matched your search

+23
View File
@@ -74,6 +74,13 @@ var graphqlURL = "https://api.github.com/graphql"
// annotates the run.
const staleWarnAfter = 90 * 24 * time.Hour
// minStars is the hard inclusion floor from the README's criteria. Unlike the
// staleness window, this is not a judgement call: an entry below the floor is
// dropped from the published ranking, so the list can never show a repo that
// does not meet it. It lives here rather than in -check because star counts
// need the API and -check runs offline.
const minStars = 1000
// chunkSize is the max aliases per GraphQL request (GitHub node-limit safety margin).
const chunkSize = 50
@@ -272,3 +279,19 @@ func doWithRetry(token string, body []byte) ([]byte, int, error) {
}
return nil, 0, fmt.Errorf("all %d attempts failed; last error: %w", maxRetries, lastErr)
}
// enforceStarFloor drops entries below minStars and annotates each one as a run
// error. Dropping rather than failing the run keeps one below-floor entry from
// blocking the refresh of every other repo, while the ::error:: annotation
// makes the removal impossible to miss in the Actions log.
func enforceStarFloor(stats []Stat) []Stat {
kept := make([]Stat, 0, len(stats))
for _, s := range stats {
if s.Stars < minStars {
fmt.Printf("::error::repo %s has %d stars, below the %d minimum — dropped from the ranking; remove its entry from data/agents.yml\n", s.CanonicalKey, s.Stars, minStars)
continue
}
kept = append(kept, s)
}
return kept
}