aiolos · keeper of the winds
One command to make Claude Code fit your repo.
aiolos reads your stack, turns on the agents that match it, wires your MCP servers without ever touching your secrets, and lays down a deny-list so Claude can't cat ~/.ssh/id_rsa on a bad day. About 30 seconds per repo.
uv tool install aiolos
aiolos wizard
The first time you opened a repo with Claude Code…
You pasted an API key into .mcp.json to test a server, then committed it by accident. You watched the assistant run a gh command on your main branch. Your teammate's .claude/ looked nothing like yours and neither of you remembered why. You tried to harden settings.json, realised the deny patterns are harder than they look, and shipped without them.
aiolos does the 30-minute chore of wiring a new Claude Code project so you don't.
What runs when you type aiolos wizard
The repo is scanned, matched to one or more presets, and .claude/ is wired in four ways. The tool ships plumbing. The content — prompts, agent bodies, skill markdown — comes from Anthropic's built-ins and authors you explicitly trust.
What it writes into your repo
A Next.js repo with Postgres, after aiolos wizard:
# .mcp.json — committed, only ${VAR} placeholders
{
"mcpServers": {
"github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}" } },
"postgres": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-postgres",
"${DATABASE_URL}"] }
}
}
# .env.claude.example — committed, documents what the team needs
GITHUB_PERSONAL_ACCESS_TOKEN=
DATABASE_URL=
# .gitignore — we add this line, so real values never slip in
.env.claude
# .claude/settings.json — deny-rules you'd otherwise write by hand
{ "permissions": { "deny": [
"Read(~/.ssh/**)", "Read(~/.aws/**)", "Read(.env)", "Read(.env.*)",
"Bash(cat ~/.ssh/**)", "Bash(security find-generic-password*)",
"Bash(git push --force *)", "Bash(terraform destroy *)"
]}}
Re-run any time; the managed blocks merge cleanly and your own rules survive.
The small set of commands
- wizard
- Interactive grand tour. Five gated steps (init → browse → harden → mcp → tools); each prints a plan and asks [Y/n] before writing anything. Start here.
- init
- Scans the repo, picks the matching preset(s), activates the built-in Anthropic agents those presets reference (
typescript-pro,nextjs-developer,python-pro, …). Monorepo-aware: if Python and Next.js both match, both activate. - browse
- Interactive picker over trusted community sources —
anthropics/skills,obra/skills,vercel-labs/skills,skills.sh, or a customowner/repo. Lists their skills, confirms the ones you want, fetches into your library, installs into the repo. - mcp
- Writes
.mcp.jsonwith${VAR}references, a committed.env.claude.example, and a.gitignoreentry for the local.env.claude. Secrets never enter git. - harden
- Baseline
permissions.denyrules in.claude/settings.json— SSH, AWS, GCP, GPG, kubeconfig,.env*, macOS Keychain — plus a sidecaraiolos.lock.jsonso re-runs merge cleanly and never stomp your hand-written rules. Optional hooks: refuse edits to.env*, pause on--production, ding when a turn finishes. - tools
- Scans
PATHfor authenticated CLIs (gh,flyctl,neonctl,wrangler…) and scaffolds a wrapperSKILL.mdyou can fill in. Defaults to repo-relevant CLIs — if the repo has aDockerfileyou seedocker, not your whole global toolbox. Pass--allfor the full scan. - new-skill
- Scaffolds a
SKILL.mdwith the things people forget: single-line description, Prettier guard, the right frontmatter keys. The body is yours. - lint · audit · doctor
- Sanity checks for your personal skill library. Use when something stops working.
Not to be confused with
- Claude Code's built-in
/init - Writes a
CLAUDE.md. We wire agents, MCP, secrets, and deny-rules. Use both; they don't overlap. - rulesync
- Syncs rule files across Cursor, Codex, Copilot, Claude. We're Claude-Code-only and configure runtime, not just rules. If you use multiple assistants, use rulesync too.
- obra/superpowers, skill marketplaces
- Ship opinionated skill content. We ship zero. Point us at any marketplace via
trust.tomland we'll fetch from it.
What aiolos deliberately doesn't do
This is plumbing. The pipes are ours; the water is yours and the community's.
-
It doesn't write your skills for you.
new-skillgives you a scaffold with the right shape and gets out of the way. The body is yours because only you know your codebase. -
It doesn't re-implement Anthropic's built-in agents.
If Claude Code already ships
typescript-pro, we reference it by name. One source of truth, upgraded when Anthropic upgrades it. -
It doesn't touch your secrets.
.mcp.jsononly holds${VAR}references. Real values live in.env.claude, gitignored before you can commit by accident. You get.env.claude.exampleto share with the team. -
It isn't a security audit.
The deny-list stops the obvious footguns — SSH keys, cloud creds, keychain,
.env*. If you're shipping to users, that's table stakes, not a substitute for a real review.