schools

A school is a Git repository of skills, conventions, and configuration for AI coding tools. Teams share the source and choose the skills each project needs.

use a school

$ ace setup ace-rs/school # clone & configure
$ ace skills # see what resolved, then narrow in ace.toml
$ ace # skills are symlinked, backend launches

propose changes

The best place to improve a skill is the session that surfaced the problem. When a skill turns out too loose or wrong for your stack, tell the backend to fix it and propose the change back to the school without leaving your project.

ACE makes that a single request. It tells the backend where the linked school lives and points it at the ace-school skill, which prepares the change and opens a PR against the school. The agent can then carry out “tighten the rust-coding skill and propose it upstream” end to end.

Illustrative workflow: code samples are abbreviated excerpts, and the error-handling rule shown is this school's policy rather than a universal Rust rule.

you@acme · api-svc

Prefer to drive it by hand? Work in your own clone of the school repository, not the linked clone ACE manages. These commands show where things stand:

$ ace diff # uncommitted changes in the linked school clone
$ ace paths school # where the linked school clone lives
$ ace paths worktrees # where school proposal worktrees live

$ ace pull # teammates pull the merged change
This is the feedback loop a school is for: sharpen a skill once, in the session where the work happens, and projects that select it can pull the sharper version.

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, default backend, session prompt, env vars, [[mcp]] servers, [backends.<name>] custom-backend tables, [[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.

ACE skips skill folders with unsupported names and prints a warning. It does not rename the folder, so give the folder a supported name before trying again.

imports

Schools can import skills from other repositories. Each [[imports]] entry in school.toml names a source repository and the skills to take from it, so ace school pull (alias ace school update) knows how to refresh them.

# exact import — a single named skill
[[imports]]
source = "anthropics/skills"
skills = ["skill-creator"]

# wildcard import — all matching skills, re-discovered on every update
[[imports]]
source = "company/school"
skills = ["frontend-*"]

# import everything curated from the source, minus one skill
[[imports]]
source = "company/school"
skills = ["*"]
exclude_skills = ["legacy-review"]

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. Skills marked internal stay out of wildcard matches unless the entry sets include_internal = true; naming one explicitly imports it.

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 skills = ["*"] 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