schools
Schools are curated repositories of skills, conventions, and configuration for AI coding tools. Everyone on the same school shares the same skill set.
propose changes
The best place to improve a skill is the session that surfaced the problem. You're deep in a project, a skill turns out too loose or wrong for your stack — so you tell the backend to fix it and propose the change back to the school, without leaving your work.
ACE makes that a single request. It injects a session prompt telling the backend that skills are symlinked from the school cache and how to branch, commit, and open a PR against it — so “tighten the rust-coding skill and propose it upstream” is something the agent carries out end to end.
Prefer to drive it by hand? The same edits are plain git in the school cache:
$ ace diff # review your changes to the school cache $ ace paths # print resolved paths — locate the school cache # in the cache: git switch -c, commit, push, open a PR $ ace school pull # teammates pull the merged change
structure
my-school/ ├── school.toml # school metadata & config ├── skills/ # skill directories │ ├── commit/ │ │ └── SKILL.md │ ├── review/ │ │ └── SKILL.md │ ├── .curated/ # same tier as top-level (explicit) │ ├── .experimental/# opt-in via --include-experimental │ └── .system/ # opt-in via --include-system ├── rules/ # optional coding conventions ├── commands/ # optional slash commands └── agents/ # optional agent configs
school.toml defines the school name, env vars, [[mcp]] servers, [[backends]] custom-backend entries, [[imports]], and the [[projects]] catalog. Every section is optional — a school can be skills-only or ship a full configuration surface.
Skills under skills/<name> and skills/.curated/<name> are the curated tier — picked up by wildcard imports by default. .experimental/ and .system/ are hidden from wildcards unless the importer opts in. On name collisions, .curated/ wins, then top-level, then .experimental/, then .system/.
create a school
$ mkdir my-school && cd my-school $ git init $ ace school init # generates school.toml, starter files, a backend-aware # instructions file (CLAUDE.md for claude, AGENTS.md for # codex/opencode), and an ace.toml with school = "." so # the school dogfoods itself.
Add skills as folders under skills/ with a SKILL.md file. Add conventions, commands, or agent configs in the optional sibling folders. Push to a git remote.
use a school
$ ace setup ace-rs/school # clone & configure (offers ace learn if >10 skills) $ ace learn # or run it explicitly: narrow skills to project $ ace # skills are symlinked, backend launches
imports
Schools can import skills from other repositories. Each [[imports]] entry in school.toml records where a skill came from so ace school pull (alias ace school update) knows how to refresh it.
# exact import — a single named skill [[imports]] skill = "skill-creator" source = "anthropics/skills" # wildcard import — all matching skills, re-discovered on every update [[imports]] skill = "frontend-*" source = "company/school" # import everything curated from the source [[imports]] skill = "*" source = "company/school"
Glob patterns support * anywhere in the name (*, frontend-*, *-coding). No ?, **, or character classes. Wildcard matches default to the curated tier only — set include_experimental = true or include_system = true on the entry to widen the search.
parent school pattern
To inherit every skill from a company-wide school, import with --all:
$ ace import company/school --all $ ace school pull # fetches every curated skill
This records skill = "*" in [[imports]]. New skills added to the parent are picked up automatically on subsequent ace school pull runs — no re-import needed.
The source doesn't need to be an ACE school. Any repository with a skills/ folder works — including anthropics/skills and community skills.sh-style collections. No school.toml required on the source.
$ ace import anthropics/skills --all # treat a plain skills repo as a parent $ ace school pull