Skip to content

fix(cli): eliminate YAML install friction and guarantee command coverage #4

fix(cli): eliminate YAML install friction and guarantee command coverage

fix(cli): eliminate YAML install friction and guarantee command coverage #4

Workflow file for this run

name: Roster Health
# Runs nightly and on changes to roster/index.yaml to verify every
# Eidolon in the roster is EIIS-conformant and reachable.
on:
push:
paths:
- 'roster/**'
- 'cli/**'
- 'schemas/**'
- '.github/workflows/roster-health.yml'
pull_request:
paths:
- 'roster/**'
- 'cli/**'
- 'schemas/**'
schedule:
# Nightly at 03:00 UTC — catches upstream Eidolon repos going bad
- cron: '0 3 * * *'
workflow_dispatch:
jobs:
validate-roster:
name: Validate roster schema
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y jq
# mikefarah/yq
sudo wget -qO /usr/local/bin/yq \
https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
- name: Validate roster/index.yaml structure
run: |
set -euo pipefail
yq eval '.' roster/index.yaml > /tmp/roster.json
# Every entry must have required fields
for name in $(jq -r '.eidolons[].name' /tmp/roster.json); do
echo "Validating $name..."
jq -e --arg n "$name" '.eidolons[] | select(.name == $n) |
.methodology.name and .methodology.version and .methodology.cycle and
.source.repo and
.versions.latest and
.handoffs.upstream and .handoffs.downstream' \
/tmp/roster.json > /dev/null || { echo "::error::$name missing required fields"; exit 1; }
done
- name: Validate JSON schemas themselves
run: |
for schema in schemas/*.json; do
echo "Checking $schema is valid JSON..."
jq empty "$schema"
done
check-eidolon-repos:
name: Check every Eidolon repo is reachable and EIIS-conformant
runs-on: ubuntu-latest
needs: validate-roster
strategy:
fail-fast: false
matrix:
eidolon: [atlas, spectra, apivr, idg, forge]
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y jq
sudo wget -qO /usr/local/bin/yq \
https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
- name: Resolve repo for ${{ matrix.eidolon }}
id: resolve
run: |
REPO=$(yq -r ".eidolons[] | select(.name == \"${{ matrix.eidolon }}\") | .source.repo" roster/index.yaml)
STATUS=$(yq -r ".eidolons[] | select(.name == \"${{ matrix.eidolon }}\") | .status" roster/index.yaml)
echo "repo=$REPO" >> "$GITHUB_OUTPUT"
echo "status=$STATUS" >> "$GITHUB_OUTPUT"
- name: Skip in-construction Eidolons
if: steps.resolve.outputs.status == 'in_construction'
run: echo "::notice::${{ matrix.eidolon }} is in_construction — skipping conformance check"
- name: Clone ${{ matrix.eidolon }}
if: steps.resolve.outputs.status == 'shipped'
run: |
git clone --depth 1 "https://github.com/${{ steps.resolve.outputs.repo }}" /tmp/eidolon
- name: EIIS conformance check
if: steps.resolve.outputs.status == 'shipped'
run: |
set -euo pipefail
required=(AGENTS.md CLAUDE.md install.sh agent.md README.md)
missing=()
for f in "${required[@]}"; do
[[ -f "/tmp/eidolon/$f" ]] || missing+=("$f")
done
if (( ${#missing[@]} > 0 )); then
echo "::error::${{ matrix.eidolon }} missing EIIS-required files: ${missing[*]}"
exit 1
fi
echo "::notice::${{ matrix.eidolon }} passes basic EIIS-1.0 checks"
- name: Verify install.sh exits cleanly with --help
if: steps.resolve.outputs.status == 'shipped'
run: |
cd /tmp/eidolon
bash install.sh --help > /dev/null
# CLI smoke testing has moved to .github/workflows/ci.yml (install-e2e +
# cli-tests jobs, which cover every command across Ubuntu and macOS with
# bats). This workflow now focuses on its namesake: verifying the roster
# itself is valid and every upstream Eidolon repo is reachable + EIIS-
# conformant (runs on path-filtered pushes and nightly).