Update every repo from one catalog

Add one instruction to Codex or Claude Code. The agent fetches AI Stack Registry once and reuses that catalog across your repos. It shows you a plan before it edits anything.


One instruction for both agents

Add this to AGENTS.md for Codex or to CLAUDE.md for Claude Code.

## Model updates

Fetch https://aistackregistry.com/catalog.json once before checking my repos. Reuse that catalog for every repo in this update. Compare each repo's model IDs, limits, and provider settings. Tell me what should change before editing. After I approve, make the changes and run each repo's existing checks. If the catalog is missing a fact you need, tell me instead of guessing.

Then tell the agent which model you want and which repositories to check.

Install the shared model-update skill

Codex and Claude Code use the same SKILL.md. The skill fetches the catalog once and reuses the same bytes for every repo. Before editing, it reads repository instructions and model configuration, then makes the changes the catalog supports. It skips unknown or blocked repos and reports what changed or was skipped.

Install for Codex

skill_dir="${CODEX_HOME:-$HOME/.codex}/skills/update-ai-models"
mkdir -p "$skill_dir"
curl --fail --silent --show-error \
  https://aistackregistry.com/skill/SKILL.md \
  --output "$skill_dir/SKILL.md"

Install in a Claude Code project

mkdir -p .claude/skills/update-ai-models
curl --fail --silent --show-error \
  https://aistackregistry.com/skill/SKILL.md \
  --output .claude/skills/update-ai-models/SKILL.md

Restart the agent, then ask it to use the update-ai-models skill for the repositories you name.

Check pinned model facts in CI

CI can fetch the catalog once and compare a model ID, token limit, or provider setting your app pins.

Check that a configured model ID exists

This example assumes config/ai.json contains a model field. Change the file and field to match your repo. The only network call is the catalog fetch.

- name: Check configured AI model
  shell: bash
  env:
    MODEL_CONFIG: config/ai.json
  run: |
    set -euo pipefail
    catalog="$RUNNER_TEMP/aistackregistry-catalog.json"
    curl --fail --silent --show-error https://aistackregistry.com/catalog.json --output "$catalog"
    model_id="$(jq -r '.model' "$MODEL_CONFIG")"
    hit='def hit: .api_model_id == $id or ((.aliases // []) | index($id) != null);'
    if jq -e --arg id "$model_id" "$hit"' .models | any(hit)' "$catalog" >/dev/null
    then
      echo "$model_id is listed as current by its provider."
    elif jq -e --arg id "$model_id" "$hit"' .retired | any(hit)' "$catalog" >/dev/null
    then
      chain="$(jq -r --arg id "$model_id" "$hit"'
        (.retired | map({key: .api_model_id, value: .replaced_by}) | from_entries) as $next
        | [.retired[] | select(hit) | .replaced_by | while(. != null; $next[.])] | join(", ")' "$catalog")"
      echo "::error::$model_id left the catalog. Replacement chain: ${chain:-none}"
      exit 1
    else
      echo "::error::$model_id is not in AI Stack Registry."
      exit 1
    fi

A listed id is current under its provider's own listing, so a listed pin passes even when a newer sibling exists. The job fails when the id has left the catalog, and prints the replacements the provider named, following a retired replacement to the current id or none, or when the id is unknown. Add comparisons for the limits and provider settings each repo pins. Fetch the catalog before the repo loop.