Commit Graph
20 Commits
Author SHA1 Message Date
tiennm99 a44bcbd6b0 feat(site): rank every series on chart hover
Hovering a date now lists all plotted repos ordered by stars at that
point, with exact counts, so the chart answers "who was ahead when"
instead of only showing one value at a time. The series under the cursor
is bold in the list, stays solid and thickens, and every other line goes
thin and dashed — readable with forty lines on screen.

Chart.js paints its tooltip on the canvas and cannot weight one row
differently, so the readout is an HTML card positioned beside the caret
(flipped and clamped to stay inside the chart) and the built-in tooltip
is off. Forty rows fit as three columns; names truncate on a shared grid
so the counts align. Hidden series are excluded, so the ranking always
matches what is drawn.
2026-09-11 16:07:07 +07:00
tiennm99 ff33c20ab6 fix(site): plot every repo in the star history by default
The chart hid every series past rank 12 while the legend still listed
all of them, so the card claimed to show everything and drew a third of
it. Plot all series on load; the legend stays the way to hide the ones
you do not want, and hidden state still survives re-renders.
2026-09-11 15:46:29 +07:00
tiennm99 eb12bcc2cb feat: replace category with a multi-facet tag vocabulary
A single category could not describe tools that ship as a CLI, an editor
plugin and a desktop app at once, and 7 of the 40 entries were filed
under a surface they only partly match — cline is "an SDK, IDE extension
or CLI assistant" in one `extension` slot, Reasonix ships CLI, desktop
and VS Code under `cli`, warp is a terminal filed as `ide`.

Tags cover five facets: surface (at least one), model access, workflow,
integration, and origin (at most one). tagVocabulary in validate.go is
the single source of truth — the validator, its error messages, and the
dashboard's filter chips all derive from it, the last via a new facets
field in site/data.json.

The dashboard now filters on tags with multi-select chips grouped by
facet: OR within a facet, AND across facets, plus a clear-filters
control, and search matches tags as well as name and description. Only
tags some row actually carries get a chip, so chips and rows cannot
disagree. Tag pills are tinted per facet, replacing the category badge.

All 40 entries are tagged from each repo's own README, topics and docs;
CONTRIBUTING documents every tag and the evidence rule for applying one.
A leftover `category:` key now fails validation with a message naming
its replacement, rather than being silently ignored.

README.md and data/history.jsonl are the regenerated updater output.
2026-09-11 15:40:18 +07:00
tiennm99 ce81c85645 feat: flag repos that stopped receiving pushes
The maintenance criterion was unfalsifiable, so entries went years
without a push before anyone noticed by hand. The updater already
fetches pushedAt; warn when it is older than 90 days, alongside the
existing rename and archival annotations. Archived repos keep their own
warning rather than getting two.

Quantify the criterion in the README and CONTRIBUTING: dropped after 6
months idle, flagged past 3, with removal still a human decision.

Also correct two CONTRIBUTING claims the code contradicts — duplicates
are rejected by CI rather than ignored at run time, and renames do carry
history over once canonicalKeyMigrations has the old key.
2026-09-11 14:37:26 +07:00
tiennm99 fde3ae7efd refactor: share one atomic write path for generated files
README.md and site/data.json were written with os.Create/os.WriteFile,
so a write that failed midway left the repo front page truncated, while
history.jsonl already used a temp-file-plus-rename. Extract that pattern
into atomicWriteFile and route all three writers through it.

Also sort snapshots by date when reading history.jsonl: delta windows
pick the newest snapshot inside the window by scan order, which silently
produces wrong deltas if a hand edit or a merge of two concurrent runs
interleaves lines.

Cover the README renderer, which had no test beyond sanitizeCell, and
name the generated paths as constants instead of repeating literals.
Coverage 65.1% -> 75.7%.
2026-09-11 14:29:49 +07:00
tiennm99 94e9852cfd feat(agents): track 14 active agents, drop 3 abandoned ones
Adds deepseek-harness (top of the list by stars), grok-build,
openinterpreter, Codewhale, DeepSeek-Reasonix, openclaude, oh-my-pi,
open-code-review, prime-agent, jcode, DeepCode, freebuff, kimi-cli and
claurst, all meeting the inclusion criteria.

Drops bolt.new, plandex and trae-agent: no upstream push in 21, 11 and 7
months respectively.

Also points avante.nvim at its current canonical slug and maps the old
history key so its star history stays attached.
2026-09-11 14:21:11 +07:00
tiennm99 c53838f165 docs(reports): research list refresh candidates and stale entries
Live GitHub audit of all 29 tracked repos plus ~380 candidate slugs:
14 repos meeting the inclusion criteria are untracked (deepseek-harness
at 219.6k stars would rank first), 7 tracked repos have no push in over
three months, and data/agents.yml still carries the pre-rename
yetone/avante.nvim slug.
2026-09-11 14:19:40 +07:00
tiennm99 e4753ba33c chore: annotate archived repos, publish inclusion criteria (#10)
- notes for gpt-engineer, void, Roo-Code (archived upstream) — shown
  as badges + italics on the dashboard; kept for historical value
- README Contributing now states inclusion criteria: must BE a coding
  agent (not tooling for agents), ~10k+ stars, open source + maintained
- resolves ambiguity for community PRs proposing sub-bar repos
2026-08-09 03:36:44 +07:00
tiennm99 0d5e4b3266 feat: momentum metrics, agents.yml validation, drift detection, hardening (#9)
Review fixes:
- applyMigrations resolves chained renames deterministically (cycle guard)
- GraphQL errors name the failing owner/repo, not the alias
- sanitizeCell escapes backslash + angle brackets (README md/HTML injection)
- timeNow/graphqlURL seams; new httptest fetch tests, site + delta tests
  (coverage 30% -> 65.6%)

Features:
- delta30d computed from history; dashboard gains sortable D30d column
- README shows Top 7-day mover line
- 'go run . -check' validates agents.yml offline (dupes, categories,
  name patterns); wired into CI for contributor PRs
- isArchived + rename drift warnings in daily run; archived badge on
  dashboard (E2E found 3 archived repos: gpt-engineer, void, Roo-Code)
2026-08-09 03:26:01 +07:00
tiennm99 5d66d4757c chore: project hardening — dep swap, CI gates, dependabot, action bumps (#8)
* chore: project hardening — dep swap, CI gates, dependabot, action bumps

- swap gopkg.in/yaml.v3 (upstream archived Apr 2025) for maintained
  github.com/goccy/go-yaml; same Unmarshal API, tags unchanged
- add CI workflow: go vet/test/build + golangci-lint + govulncheck
  on PRs and main pushes
- add dependabot for gomod + github-actions (weekly)
- bump actions to latest majors in update.yml (clears Node 20
  deprecation annotations); workflow logic untouched
- README/history refreshed by E2E verification run (29 agents)

* fix: check Close/Remove error returns (errcheck)

Write paths (writeSnapshots, renderReadme) now propagate close errors —
a failed close there can hide lost data. Read/cleanup paths ignore
explicitly with _ =.
2026-08-09 02:48:03 +07:00
tiennm99 6658de1fa9 feat(site): apply ui-ux-pro-max design system to dashboard (#7)
Design system: Data-Dense Dashboard — blue primary (#2563EB/#3B82F6),
amber accent, slate neutrals, Fira Code (headings/data) + Fira Sans
(body) via Google Fonts.

- KPI stat cards: tracked repos, total stars, top 7d gainer, last updated
- card surfaces w/ subtle shadow for table + chart; row hover highlight
- per-category tinted badges (text carries meaning, not color alone)
- search box w/ inline SVG icon; GitHub header button w/ SVG mark
- footer w/ Actions + contributing links
- all PR #6 logic/a11y preserved (sort, search, chips, legend state,
  degraded mode, aria, focus-visible, reduced-motion, 44px targets)
- workflow: add site/** to push paths so dashboard edits auto-deploy

Verified: dark + light schemes, 375px mobile (no h-scroll), 29 rows,
KPI values correct, zero console errors.
2026-08-09 01:17:24 +07:00
tiennm99 e0c965442a feat(site): UI/UX improvements for Pages dashboard (#6)
* feat(site): UI/UX improvements for Pages dashboard

Phase 1+2 of plans/260808-2317 + ui-ux-pro-max quality pass:
- fix invisible single-snapshot chart series (show points when <2)
- persist legend hidden-state across chart re-renders
- Chart.js CDN failure fallback message
- meta description, OG tags, SVG favicon, theme-color, noscript
- log/linear y-axis toggle; debounced text search (table + chart)
- stale-repo muting + text badge (>6 months since push)
- delta7d sort puts no-baseline rows last
- a11y: aria-sort, aria-pressed, canvas role/label, focus-visible,
  keyboard-sortable headers, 44px coarse-pointer targets,
  contrast >=4.5:1 both schemes, reduced-motion guard, empty state

* fix(site): guard renderChart in Chart.js CDN-failure degraded mode

Review finding (major): filter/search handlers call hoisted renderChart()
after the early CDN-failure return, hitting TDZ consts and throwing on
every interaction. Guard with window.Chart check; verified with a
broken-CDN copy: table filtering works error-free, fallback msg shows.
2026-08-09 00:44:28 +07:00
tiennm99 5051274e52 feat: add 10 agents, fix renamed slugs, add GitHub Pages dashboard (#5)
- Add pi, OpenHands, warp, gpt-pilot, qwen-code, kilocode, onlook,
  dyad, trae-agent, copilot-cli (19 -> 29 tracked repos)
- Update renamed slugs to canonical owners (anomalyco/opencode,
  aaif-goose/goose, AntonOsika/gpt-engineer) with history key
  migrations so star deltas survive the rename
- Generate site/data.json each run and deploy site/ (interactive
  table + star-history chart) to GitHub Pages from the daily
  workflow, since GITHUB_TOKEN bot pushes cannot trigger a separate
  Pages workflow
2026-08-08 23:27:53 +07:00
tiennm99 110afce2a6 style: gofmt history_test.go 2026-05-14 15:49:05 +07:00
tiennm99 4ccee1420a docs: add LOCAL_DEV and CONTRIBUTING guides, explain Delta7d
Two new short docs unblock new contributors who currently have to read
the Go source to figure out the GITHUB_TOKEN requirement and the
agents.yml schema:

- docs/LOCAL_DEV.md walks through the PAT setup, the local run command,
  what files the run modifies, and how to revert before opening a PR.
- docs/CONTRIBUTING.md documents the agents.yml fields, enumerates the
  six valid category values, and explains the rename and deprecation
  policy now that history is keyed canonically.

Also add a one-sentence caption under the table in readme.tmpl so the
Delta7d column has a definition in the rendered README.
2026-05-14 15:49:05 +07:00
tiennm99 f0e10d6d26 fix(ci): narrow conflict resolution to bot-generated files only
The blanket git pull --rebase -X theirs in the push-retry loop silently
discarded conflicting changes in any file, so a maintainer push to
data/agents.yml racing with the daily run could be dropped without
warning. Replace it with a selective resolver: plain rebase first, then
inspect git diff --name-only --diff-filter=U; if every conflicting path
is data/history.jsonl or README.md (both bot-generated), resolve those
with --theirs and continue; otherwise abort the rebase and fail the run
loudly so the human edit is preserved and visible.

Also leave a comment at the permissions block warning future maintainers
not to swap GITHUB_TOKEN for a PAT, since the no-recursion invariant is
what currently prevents the auto-commit from triggering its own workflow.
2026-05-14 15:49:05 +07:00
tiennm99 62cbdd7a4a fix: harden GitHub fetcher and history I/O, add canonical keying
GitHub fetcher (github.go):
- add 30s HTTP client timeout (was http.DefaultClient with no bound)
- chunk GraphQL alias requests at 50 repos to stay clear of abuse detection
- abort the run on any partial GraphQL error or missing repo rather than
  silently shrinking the README and poisoning the next delta
- retry transient failures (network, 5xx, 429) with 2s/4s/8s backoff

History layer (history.go):
- key snapshots by canonical owner/repo from agents.yml instead of the
  rename-resolved NameWithOwner returned by the API; carry a lazy
  migration map so existing aaif-goose/goose entries fold into block/goose
  on next read with no manual data edit
- tighten the 7d delta window to (cutoff-3d, cutoff] so a missed cron week
  no longer mislabels a 90d-old comparison as Delta7d
- replace the snapshots[:0] aliased filter loop with slices.DeleteFunc
- log malformed JSONL lines to stderr with line numbers instead of
  silently skipping them
- write history.jsonl atomically via tmp file + rename so a crash
  mid-write can no longer truncate accumulated history

Plus collapse a few redundant fmt.Errorf wraps, drop a named Config type
that was used once, inline the single-call sortByStars helper with a
deterministic tiebreaker on canonical key, and use filepath.Base instead
of hand-rolling a basename.

Includes unit tests covering the 7d window edges, canonical-key
migration, atomic write path, malformed-line tolerance, YAML validation,
and markdown cell escaping.
2026-05-14 15:49:05 +07:00
tiennm99 e445ab91a2 fix(workflow): use -X theirs to resolve history.jsonl rebase conflicts 2026-05-13 14:47:49 +07:00
tiennm99 515315de78 fix(workflow): rebase-retry on push to handle concurrent run races 2026-05-13 14:45:59 +07:00
tiennm99 03704df0a5 feat: initial scaffold of awesome-coding-agents tracker
Go updater that fetches AI agent coding tool repo stats via GitHub GraphQL
(batched, one query), sorts by star count, appends a daily snapshot to
data/history.jsonl, and regenerates README.md from templates/readme.tmpl.
Daily workflow at .github/workflows/update.yml refreshes rankings and
commits changes. Seed list in data/agents.yml covers 19 tracked repos.
2026-05-13 14:43:35 +07:00