mirror of
https://github.com/tiennm99/awesome-ai-dev-tools.git
synced 2026-10-15 00:17:01 +00:00
feat: split data update from site build; publish via Cloudflare Pages
The updater fetched GitHub metadata and rendered the dashboard payload in a single step, so anything that published the site needed a GITHUB_TOKEN. Cloudflare Pages builds from a Git webhook and has no business holding one. Split the tool into three modes. The default update step still fetches GitHub and now records every API-sourced field in data/metadata.json, which is committed alongside README.md and data/history.jsonl. The new -build mode joins that snapshot with data/agents.yml and data/history.jsonl to render dist/ with no network access and no token; -check is unchanged. Supporting changes: - computeDeltaAt anchors the delta windows to when the data was fetched rather than the wall clock, so a redeploy days later reproduces the same Δ7d instead of sliding the window past its slack allowance. - writeSiteData takes updatedAt explicitly for the same reason: the timestamp labels data freshness, not build time. - sortStats is extracted from fetchStats so the build step re-ranks identically from committed metadata. - An agents.yml entry with no metadata yet is omitted with a warning instead of failing the build, which would otherwise block every deploy between merging a new entry and the next nightly run. - update.yml drops the GitHub Pages deploy steps and commits data/metadata.json; ci.yml runs `go run . -build` so a build that would break on deploy breaks in CI first. - site/_headers stops the edge serving a stale data.json after a refresh. - docs/DEPLOY.md covers the Cloudflare setup, including the one-time bootstrap of data/metadata.json that the build depends on. Also carries the in-progress curation work already in the tree: the module rename to awesome-ai-dev-tools, retagged entries, and removal of the archived Roo-Code, void, continue and suna entries.
This commit is contained in:
1 parent
3310ed36d4
commit
00c90c5be9
22 files changed
+728
-116
No files matched your search
@@ -156,16 +156,21 @@ func fetchStats(token string, agents []Agent) ([]Stat, error) {
|
||||
})
|
||||
}
|
||||
|
||||
// Sort by stars descending. Ties are ordered by CanonicalKey for determinism
|
||||
// regardless of map-iteration or agents.yml order.
|
||||
sortStats(stats)
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
// sortStats orders the ranking by stars descending. Ties break on CanonicalKey
|
||||
// for determinism regardless of map-iteration or agents.yml order. Shared with
|
||||
// the build step, which re-ranks from committed metadata.
|
||||
func sortStats(stats []Stat) {
|
||||
sort.Slice(stats, func(i, j int) bool {
|
||||
if stats[i].Stars != stats[j].Stars {
|
||||
return stats[i].Stars > stats[j].Stars
|
||||
}
|
||||
return stats[i].CanonicalKey < stats[j].CanonicalKey
|
||||
})
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
// fetchChunk sends one GraphQL request for a slice of agents. aliasOffset
|
||||
@@ -251,7 +256,7 @@ func doWithRetry(token string, body []byte) ([]byte, int, error) {
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+token)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Set("User-Agent", "ai-dev-tools-updater")
|
||||
req.Header.Set("User-Agent", "awesome-ai-dev-tools-updater")
|
||||
|
||||
resp, err := httpClient.Do(req)
|
||||
if err != nil {
|
||||
|
||||
Reference in new issue
Block a user