Scripts
Catalog, installer, consumer guidance, and evaluation scripts.
./Scripts/generate-skill-catalog.py --check
./Scripts/validate-skill-evaluations.py
./Scripts/verify-skills.sh
./Scripts/test-install-skills.sh
./Scripts/test-consumer-guidance.sh
./Scripts/install-skills.sh --dry-run
./Scripts/install-skills.sh --tier all
./Scripts/install-skills.sh --status --tier all
./Scripts/install-skills.sh --uninstall # safe: only matching installer symlinks in the target
The installer records only its own symlinks in
.expo-development-foundation-links, preserves conflicts, and supports
uninstall without touching unrelated files. The default remains
${CODEX_HOME:-$HOME/.codex}/skills with --tier all.
Installation strategies
Choose one strategy and use the same target and tier for installation and status checks.
A. Reproducible offline snapshot
Install every foundation-owned skill and each vendored Expo snapshot:
./Scripts/install-skills.sh --tier all
./Scripts/install-skills.sh --status --tier all
B. Foundation router with canonical upstream Expo skills
Install Expo’s skills from their canonical upstream source, then install only the foundation-owned routing and workflow layer:
npx skills@latest add expo/skills --skill '*'
./Scripts/install-skills.sh --tier foundation
./Scripts/install-skills.sh --status --tier foundation
This avoids installing the repository’s local vendored official snapshots and keeps upstream Expo skills canonical.
Use an explicit skills-directory target for another flat installation root:
./Scripts/install-skills.sh --target-dir "$HOME/.agents/skills" --tier all
./Scripts/install-skills.sh --target-dir "$HOME/.agents/skills" --status --tier all
Installing into a directory does not prove that an agent host discovers it. Host discovery requires separate documentation and testing.
Status mode
./Scripts/install-skills.sh --status --tier <foundation|all> performs a
read-only comparison of the selected installable skill symlinks against
.agents/skills/manifest.json. It prints the source, resolved target, and tier,
then classifies each selected skill as:
| Classification | Meaning |
|---|---|
ok: |
Symlink target matches the manifest |
missing: |
No symlink exists at the expected path |
dangling: |
Symlink points to a path that no longer exists |
wrong-target: |
Symlink points elsewhere, or the path exists but is not a symlink |
stale: |
Recorded in the state file but absent from the complete current manifest |
It exits zero when every installable skill link is synced and one on any
link-topology divergence. It does not inspect Git or verify skill contents
against repository HEAD; use normal Git verification separately when checkout
integrity matters.
Malformed skill names or paths in the manifest are rejected and reported rather
than trusted (fail closed). Intended role: in an unattended session, run
--status before trusting installed copies of this foundation’s skills for
routing, and re-sync with the same target and tier before acting when it reports
link divergence.