The Pain: Configuring coding rules, skills, and agent personas across Claude, Cursor, and Copilot means scattered files and constant drift.
The Solution: dotai is a single source of truth. Edit once, run one script, and every AI tool picks up the changes via symlinks — instantly.
The Result: Your AI pair programmer behaves consistently everywhere, with zero manual syncing.
| Type | Path | Purpose |
|---|---|---|
| 📏 Rules | rules/coding.md |
Coding standards — style, error handling, typing, dependencies |
| 🌐 Global instructions | global/ |
Agent workflow rules (MRs/PRs), compiled by APM into every tool's global AGENTS.md |
| 🔧 Skills | skills/<category>/<name>/SKILL.md |
Skills authored here |
| 📦 Dependencies | apm.yml |
Upstream skills and public MCP servers, pinned in apm.lock.yaml |
| 🤖 Agents | agents/<name>.md |
Named sub-agent personas (architect, reviewer) |
| 🪝 Hooks | hooks/ |
Lifecycle hooks: session_start, task_complete |
| 🔍 Review plugin | skills/code/review-workflow/ |
Routine and deep reviews, local reports, and GitLab MR and GitHub PR comments |
The dotai-review guide covers the portable
review-workflow skill and the Claude Code plugin. The plugin uses the same source
directory and is registered in .claude-plugin/marketplace.json.
git clone https://github.com/yourusername/dotai
cd dotai
apm install # fetch pinned upstream skills + MCP servers
bash scripts/install.sh # update private skills and publish everything to your toolsThat's it. All rules and skills are symlinked into every supported tool's config directory.
The installer initializes and updates skills/internal to the commit pinned by
dotai before publishing skills. If the private repository is unavailable or local
changes prevent the update, it warns and continues with the available skills.
install.sh --list only lists skills and does not update the submodule.
Requires APM. If your network blocks SSH to
GitHub, run apm config set allow-protocol-fallback true once so clones fall
back to HTTPS.
apm.yml registers GitHub's HTTP MCP. apm install writes it into .mcp.json
and the project Codex config.
cua-driver is not
registered as an MCP server: agents drive it through its CLI
(cua-driver call <tool> '<json>'), taught by the cua-driver skill. The
binary, macOS app and skill links come from
dotnix (just switch there).
Private MCP definitions live in skills/internal/apm.yml in the private
dotai-internal submodule. After initializing the pinned submodule with
bash scripts/install.sh, preview and apply them from the dotai root:
bash scripts/install.sh --sync-mcp --dry-run
bash scripts/install.sh --sync-mcp
# Optionally select a tool:
bash scripts/install.sh --sync-mcp --target claudeThis mode delegates to the private sync script and requires Ruby and APM. It updates user-level APM and tool configuration without publishing rules or skills. The dry run does not initialize or update the submodule. Existing managed tool targets are retained; selecting a tool adds or updates that target. Servers using remote HTTP skip Codex. Native connection conflicts are reported and preserved.
Change private definitions through a PR in dotai-internal, then update the
submodule pointer here to the approved commit. Ordinary install.sh runs only
publish rules and skills; private MCP sync is explicit. Project apm install
continues to manage the public MCPs. Keep private server names, URLs, headers,
and tokens out of this repository's apm.yml, .mcp.json, and lockfile.
Agents read logins without prompting you (see "Credentials" in global/). Set up
one or both stores once per machine. The keys go in ~/.zshrc-local, which is
untracked:
# 1Password: a read-only service account on a dedicated "agent" vault
op vault create agent
token=$(op service-account create agent-reader --vault agent:read_items --raw)
echo "export OP_SERVICE_ACCOUNT_TOKEN=$token" >> ~/.zshrc-local
# Bitwarden: a session key for the whole vault (asks for the master password)
bw login
echo "export BW_SESSION=$(bw unlock --raw)" >> ~/.zshrc-local
echo '{"name":"agent"}' | bw encode | bw create folder
chmod 600 ~/.zshrc-localPut a login in the agent vault or folder, and give it the URL of the login
page, for agents to use. Agents use only the login whose URL hostname matches
the page they are on.
- The 1Password service account reads only the
agentvault. BW_SESSIONopens your whole Bitwarden vault; the folder only picks the login.
To revoke access, delete the service account in 1Password and run bw lock, then
remove the lines from ~/.zshrc-local.
| Tool | Rules | Skills |
|---|---|---|
| Claude Code | ~/.claude/rules/coding.md |
~/.claude/skills/ |
| Cursor | ~/.cursor/rules/coding.mdc |
~/.cursor/skills/ |
| GitHub Copilot | ~/.config/github-copilot/intellij/global-copilot-instructions.md |
~/.copilot/skills/ |
| Generic agents | — | ~/.agents/skills/ |
All paths are symlinks — edit rules/coding.md or a skill once and every tool sees the change immediately.
Skills come from three places, all published the same way — as {category}.{name}
symlinks in every tool directory:
| Source | Lives in | Managed by |
|---|---|---|
| Authored here | skills/<category>/<name>/ |
you, directly |
| Upstream repos | apm_modules/ (gitignored) |
apm.yml + apm.lock.yaml |
| Another local repo | symlinked into skills/<category>/ |
external-skills.conf |
apm install pbakaus/impeccable#<sha> --skill impeccableThen give it a category in vendored-skills.conf and run bash scripts/install.sh.
APM pins the resolved commit and every file hash in apm.lock.yaml; the category
file decides where the skill lands. Skills are matched by the name: in their
SKILL.md frontmatter, so a repo whose directory name differs still resolves.
Give the category as - to publish a skill under its bare name instead of
{category}.{name} — for skills whose own CLI or docs refer to them by an exact
name.
Repos without a skill manifest (no plugin.json) reject --skill — install the
whole repo and let vendored-skills.conf select what gets published.
apm outdated # what has drifted from upstream
apm update # refresh refs and rewrite the lockfile
apm install # install what the lockfile pins
apm audit # detect tampering with fetched files
bash scripts/install.sh --list # every skill and the source it resolves to
bash scripts/verify-skills-layout.shCreate skills/<category>/<name>/SKILL.md and run bash scripts/install.sh.
No registration step — the directory layout is the declaration.
- Edit
rules/coding.md(coding standards) orglobal/.apm/instructions/(agent workflow rules). - Run
bash scripts/install.shto propagate.
No other steps needed; symlinks keep all tools in sync automatically.
rules/ Authoritative rule text — edit here
skills/ Skills authored here, by category (code/, docs/, creative/, utils/)
apm.yml Upstream skill and MCP server dependencies
apm.lock.yaml Resolved commits and file hashes — commit this
apm_modules/ Fetched upstream repos (gitignored, rebuilt by apm install)
vendored-skills.conf Which category each apm_modules/ skill is published under
external-skills.conf Machine-local: skill directories owned by another repo
agents/ Named sub-agent persona definitions
hooks/ Lifecycle hook registry and handlers
scripts/
install.sh Publishes rules and skills to all tool directories
sync.sh git pull + apm install + install.sh
verify-skills-layout.sh Checks the published layout matches what install.sh resolves
Some skills in this repo were copied from external projects. Attribution:
| Skill | Source |
|---|---|
code.clean-code-principles |
AsyrafHussin/agent-skills |
code.impeccable |
pbakaus/impeccable |
creative.baoyu-translate |
JimLiu/baoyu-skills |
creative.hyperframes |
heygen-com/hyperframes |
creative.logo-generator |
op7418/logo-generator-skill |
creative.project-logo-author |
tsilva/claudeskillz |
docs.project-readme-author |
tsilva/claudeskillz |
ego-browser |
citrolabs/ego-lite |
mattpocock.diagnosing-bugs |
mattpocock/skills |
mattpocock.grill-with-docs |
mattpocock/skills |
mattpocock.improve-codebase-architecture |
mattpocock/skills |
mattpocock.prototype |
mattpocock/skills |
mattpocock.setup-matt-pocock-skills |
mattpocock/skills |
mattpocock.tdd |
mattpocock/skills |
mattpocock.to-spec |
mattpocock/skills |
mattpocock.to-tickets |
mattpocock/skills |
mattpocock.triage |
mattpocock/skills |
utils.skill-creator |
anthropics/skills |
These skills are fetched from their upstream repos by apm install and are not copied into this repo. If you recognise your work here and attribution is missing or wrong, please open an issue.
If dotai saves you time, give it a star — it helps others find it!
