Files
awesome-ai-dev-tools/agents.go
T
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

40 lines
883 B
Go

package main
import (
"fmt"
"os"
"github.com/goccy/go-yaml"
)
type Agent struct {
Owner string `yaml:"owner"`
Repo string `yaml:"repo"`
Tags []string `yaml:"tags"`
Notes string `yaml:"notes,omitempty"`
// Category is the retired single-select field that tags replaced. It is
// still parsed so a stale entry fails validation with a message naming
// the replacement, rather than being silently ignored.
Category string `yaml:"category,omitempty"`
}
func loadAgents(path string) ([]Agent, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var cfg struct {
Agents []Agent `yaml:"agents"`
}
if err := yaml.Unmarshal(data, &cfg); err != nil {
return nil, err
}
for i, a := range cfg.Agents {
if a.Owner == "" || a.Repo == "" {
return nil, fmt.Errorf("entry %d missing owner or repo", i)
}
}
return cfg.Agents, nil
}