Skip to content

Overview

dotai maps the configuration surfaces of six AI coding tools — Claude Code, Cursor, Codex, OpenCode, Copilot, and Antigravity — into 8 entity types. Once you author config in .ai/, the sync command translates it into each tool’s native format. You never touch tool-specific files directly.

EntityWhat it governsConfig location
DirectivePersistent textual instructions.ai/directives/*.md
SkillReusable knowledge packages.ai/skills/<name>/SKILL.md
AgentSpecialized sub-agents.ai/agents/*.md
ToolServerMCP tool/data providers.ai/config.yaml servers
HookEvent-driven lifecycle handlers.ai/config.yaml hooks
PermissionAccess control rules.ai/config.yaml permissions
SettingKey-value configuration.ai/config.yaml settings
IgnorePatternFile exclusion rules.ai/config.yaml ignore

Each entity is loaded from your .ai/ directory, validated against its domain type, and then emitted to each tool’s config format during ai sync.

Every entity carries a scope that controls where it applies and how it is trusted. Scopes form a hierarchy from broadest to narrowest:

enterprise > project > user > local
ScopeMeaningLocationVCS
enterpriseOrganization-wide policyDefined by organization toolingCommitted
projectRepository-specific config.ai/ at the repo rootCommitted
userPersonal preferences~/.ai/ in the home directoryNot committed
localMachine-local overrides.ai.local/ at the repo rootGitignored

Scope represents a trust hierarchy, not just layering. A directive scoped to enterprise expresses organization policy that downstream scopes cannot override. A user-scoped directive applies only to one developer’s environment and is never committed to the repository.

When the same key appears at multiple scopes, the narrower scope wins for settings and permissions. For directives and skills, all scopes contribute — a project-scoped directive and a user-scoped directive are both active simultaneously.