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.
This commit is contained in:
tiennm99 committed 2026-09-11 15:40:18 +07:00
1 parent e49c487700
commit eb12bcc2cb
16 files changed
+462 -205

No files matched your search

+2 -2
View File
@@ -18,7 +18,7 @@ type Stat struct {
CanonicalKey string
Owner string
Repo string
Category string
Tags []string
Notes string
Description string
Stars int
@@ -137,7 +137,7 @@ func fetchStats(token string, agents []Agent) ([]Stat, error) {
CanonicalKey: canonicalKey,
Owner: a.Owner,
Repo: a.Repo,
Category: a.Category,
Tags: a.Tags,
Notes: a.Notes,
Description: node.Description,
Stars: node.StargazerCount,