hermes-agent/.github/workflows
Teknium d8703e27f5
feat(skills-hub): health checks, freshness badge, and a watchdog cron (#32345)
Layered safety so the Skills Hub at /docs/skills stays in sync without
silent rot. Three pieces:

1. build_skills_index.py — refuses to ship a degenerate index.
   EXPECTED_FLOORS per source (skills.sh ≥100, lobehub ≥100, clawhub ≥50,
   official ≥50, github ≥30, browse-sh ≥50) and MIN_TOTAL=1500. Any source
   collapsing to zero (the silent OpenAI breakage that hid for weeks) now
   fails the workflow loud — broken index never reaches the live site.

2. extract-skills.py + the React page — visible freshness signal.
   Sidecar website/src/data/skills-meta.json carries the index's
   generated_at timestamp, plus per-source counts. Skills Hub renders a
   'Catalog refreshed N hours ago · auto-rebuilt twice daily' line under
   the hero copy. If the cron stalls, users see the staleness immediately.

3. .github/workflows/skills-index-freshness.yml — watchdog cron.
   Every 4 hours, fetches the live /docs/api/skills-index.json, validates
   shape, checks age (>26h is stale), checks the same per-source floors,
   and opens (or appends to) a GitHub issue when anything is off. The
   issue is title-prefixed [skills-index-watchdog] so subsequent failures
   append a comment instead of spamming new issues.

Net effect:
- A silent regression like 'OpenAI tap moved its skills' now fails the
  build instead of shipping a quietly broken catalog.
- A stuck cron (like the landingpage breakage that ran red for weeks) now
  files an issue within 4 hours.
- Users see how fresh the catalog is on the page itself.

Test plan:
- Local: built skills-meta.json from the live index → 'Catalog refreshed
  N minutes ago' rendered correctly in the static HTML.
- Probe logic dry-run against the live index: total=2456, all 6 sources
  above floor, age 0.1h — issues=NONE.
- Triggered skills-index.yml manually; both jobs green, deploy-site.yml
  dispatch fired.
2026-05-25 23:10:45 -07:00
..
contributor-check.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
deploy-site.yml fix(skills-hub): show every catalog source on /docs/skills (skills.sh, ClawHub, browse.sh, OpenAI, …) (#32336) 2026-05-25 18:34:54 -07:00
docker-lint.yml ci(docker): add hadolint + shellcheck for container build inputs 2026-05-24 18:05:14 -07:00
docker-publish.yml ci(docker): run tests/docker/ in build-amd64 against the freshly-built image 2026-05-25 12:40:57 +10:00
docs-site-checks.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
history-check.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
lint.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
nix-lockfile-fix.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
nix.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
osv-scanner.yml chore(actions)(deps): bump the actions-minor-patch group across 1 directory with 2 updates 2026-05-19 03:27:09 -07:00
skills-index-freshness.yml feat(skills-hub): health checks, freshness badge, and a watchdog cron (#32345) 2026-05-25 23:10:45 -07:00
skills-index.yml fix(skills-hub): show every catalog source on /docs/skills (skills.sh, ClawHub, browse.sh, OpenAI, …) (#32336) 2026-05-25 18:34:54 -07:00
supply-chain-audit.yml ci(supply-chain): anchor install-hook regex at repo root (#31744) 2026-05-24 17:46:08 -07:00
tests.yml feat(ci): use 6-way slicing based on benchmark results 2026-05-22 19:46:18 -07:00
upload_to_pypi.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00
uv-lockfile-check.yml chore(actions)(deps): bump actions/checkout from 4.3.1 to 6.0.2 2026-05-19 03:27:54 -07:00