diff --git a/README.md b/README.md index 568150f..5ad65a3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Awesome Coding Agents -> Curated ranking of AI agent coding tools, sorted by GitHub stars. +> Curated ranking of AI-powered developer tools, sorted by GitHub stars. > Updated daily by GitHub Actions. 📊 **[Interactive dashboard with star-history charts →](https://tiennm99.github.io/awesome-coding-agents/)** @@ -68,8 +68,8 @@ **Inclusion criteria** — a repo belongs on this list when it is: -1. **An AI coding agent, or an environment for running them** — either a tool that autonomously writes, edits, or reviews code, or an *agent development environment* (ADE) that runs and coordinates those agents as its primary purpose. Libraries, SDKs, prompt/skill collections, and observability-only layers remain out of scope. -2. **Notable**: roughly **10,000+ GitHub stars** (the current list floor). +1. **A developer tool built around AI** — something a developer uses to build software, where an LLM is central to what it does. That covers agents that write, edit, or review code; agent development environments that run and coordinate them; and AI-assisted editors, terminals, and review tools. Libraries, SDKs, model weights, and prompt or skill collections are out of scope — this list ranks tools you *use*, not building blocks you *import*. +2. **At least 1,000 GitHub stars** — a hard floor, enforced by the updater. An entry below it is dropped from the ranking automatically, so the threshold is never waived for an individual entry. 3. **Open source and actively maintained** — no push in **6 months** means the entry is dropped. The daily run flags anything past **3 months** for review, so the ranking reflects tools people can actually use today. Archived or abandoned repos are kept only when they are historically significant, and are marked as such in [`data/agents.yml`](data/agents.yml). diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 3529c9a..de079f8 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -26,20 +26,35 @@ Optional fields: `notes` (for clarifications or caveats) ## Scope -Two kinds of project belong here: +This list ranks **developer tools built around AI** — things a developer uses to +build software, where an LLM is central to what the tool does. In practice that +spans several shapes: -1. **Coding agents** — they write, edit, or review code themselves. -2. **Agent development environments (ADEs)** — their primary purpose is running and - coordinating those agents: parallel worktrees, session management, remote or mobile - control. Tag these `orchestration`. +- **Coding agents** — they write, edit, or review code themselves. +- **Agent development environments (ADEs)** — their primary purpose is running and + coordinating those agents: parallel worktrees, session management, remote or + mobile control. Tag these `orchestration`. +- **AI-assisted editors, terminals, and review tools** — the developer stays in the + driver's seat and the model accelerates the work. -An ADE earns a row because it is the surface a developer actually works in, the same way -a coding agent is. What stays out is anything that only *assists* agents without being a -place you run them: libraries and SDKs, prompt or skill collections, dashboards and -observability-only layers, and single-purpose wrappers around one agent's config. +The dividing line is **tools you use vs. building blocks you import**. Out of scope: +libraries and SDKs, agent frameworks meant to be built on, model weights, prompt or +skill collections, and dashboards that only observe a tool without being one. -The other two criteria in the [README](../README.md#contributing) — roughly 10,000+ stars -and active maintenance — apply to both kinds equally. +A tool also has to be *about* software development. General-purpose assistants and +chat UIs do not qualify just because a developer could use them. + +### The star floor is hard + +**1,000 stars minimum.** This is not a judgement call and is not waived for +individual entries, however good the tool is. The updater enforces it: any entry +below the floor is dropped from the ranking and reported as an `::error::` in the +Actions log (`enforceStarFloor` in `github.go`). Because star counts require the +API, `go run . -check` cannot catch this offline — a below-floor entry passes CI +and is then dropped by the next daily run, so check the count before opening a PR. + +Maintenance requirements apply to every entry equally: no push in 6 months means +removal, and the daily run warns past 3 months. ## Tag Vocabulary diff --git a/github.go b/github.go index 3a621d7..3e1919a 100644 --- a/github.go +++ b/github.go @@ -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 +} diff --git a/github_test.go b/github_test.go index 27d63bc..7287702 100644 --- a/github_test.go +++ b/github_test.go @@ -312,3 +312,24 @@ func TestFetchStats_StaleWarning(t *testing.T) { t.Errorf("missing archived warning %q in:\n%s", want, logs) } } + +func TestEnforceStarFloor(t *testing.T) { + in := []Stat{ + {CanonicalKey: "a/above", Stars: minStars + 1}, + {CanonicalKey: "b/exactly", Stars: minStars}, + {CanonicalKey: "c/below", Stars: minStars - 1}, + {CanonicalKey: "d/zero", Stars: 0}, + } + + got := enforceStarFloor(in) + + want := []string{"a/above", "b/exactly"} + if len(got) != len(want) { + t.Fatalf("kept %d entries, want %d: %+v", len(got), len(want), got) + } + for i, w := range want { + if got[i].CanonicalKey != w { + t.Errorf("kept[%d] = %s, want %s", i, got[i].CanonicalKey, w) + } + } +} diff --git a/main.go b/main.go index b756b24..6ab7151 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,11 @@ func run() error { return err } + stats = enforceStarFloor(stats) + if len(stats) == 0 { + return fmt.Errorf("no agents in %s meet the %d-star minimum", agentsPath, minStars) + } + snapshots, deltas7, deltas30, err := appendHistory(historyPath, stats) if err != nil { return err diff --git a/templates/readme.tmpl b/templates/readme.tmpl index 2b1f070..6e28e2b 100644 --- a/templates/readme.tmpl +++ b/templates/readme.tmpl @@ -1,6 +1,6 @@ # Awesome Coding Agents -> Curated ranking of AI agent coding tools, sorted by GitHub stars. +> Curated ranking of AI-powered developer tools, sorted by GitHub stars. > Updated daily by GitHub Actions. 📊 **[Interactive dashboard with star-history charts →](https://tiennm99.github.io/awesome-coding-agents/)** @@ -33,8 +33,8 @@ **Inclusion criteria** — a repo belongs on this list when it is: -1. **An AI coding agent, or an environment for running them** — either a tool that autonomously writes, edits, or reviews code, or an *agent development environment* (ADE) that runs and coordinates those agents as its primary purpose. Libraries, SDKs, prompt/skill collections, and observability-only layers remain out of scope. -2. **Notable**: roughly **10,000+ GitHub stars** (the current list floor). +1. **A developer tool built around AI** — something a developer uses to build software, where an LLM is central to what it does. That covers agents that write, edit, or review code; agent development environments that run and coordinate them; and AI-assisted editors, terminals, and review tools. Libraries, SDKs, model weights, and prompt or skill collections are out of scope — this list ranks tools you *use*, not building blocks you *import*. +2. **At least 1,000 GitHub stars** — a hard floor, enforced by the updater. An entry below it is dropped from the ranking automatically, so the threshold is never waived for an individual entry. 3. **Open source and actively maintained** — no push in **6 months** means the entry is dropped. The daily run flags anything past **3 months** for review, so the ranking reflects tools people can actually use today. Archived or abandoned repos are kept only when they are historically significant, and are marked as such in [`data/agents.yml`](data/agents.yml).