Manages ~ on macOS via chezmoi. Covers shell, editor, AI tooling, calendar automation, and a library of AI agent skills.
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply athal7You'll be prompted for a few required values (name, email, code directory, GitHub token, calendar names). Optional integrations — Slack, Figma, Elasticsearch, Linear, ICS feeds, etc. — can be added by editing ~/.config/chezmoi/chezmoi.toml after init. See the commented sections in .chezmoi.toml.tmpl for the full list.
- Shell — zsh (
dot_zshrc.tmpl,dot_zshenv.tmpl,dot_zprofile.tmpl) - Editor — Neovim (
dot_config/nvim/) - Git — config, aliases, hooks (
dot_config/git/) - Terminal — Ghostty (
dot_config/ghostty/) - AI tooling — OpenCode config, MCPs, plugins, agent instructions (
dot_config/opencode/) - Packages — brew, cask, mise, GitHub releases (
.chezmoidata/packages.yaml) - Calendar automation — sync, lunch guard, family scheduler (
dot_local/bin/,Library/LaunchAgents/) - Homebridge — Google Nest via HomeKit (
dot_homebridge/) - macOS services — LaunchAgents for background processes (
Library/LaunchAgents/) - Agent skills — 26 skills for OpenCode and compatible agents (
dot_agents/skills/)
chezmoi uses filename prefixes to encode behavior. Key ones used here:
| Source name | Deploys to |
|---|---|
dot_foo |
~/.foo |
dot_config/ |
~/.config/ |
dot_agents/ |
~/.agents/ |
dot_local/ |
~/.local/ |
foo.tmpl |
foo (processed as a Go template) |
private_foo |
foo (deployed with chmod 600) |
run_once_*.sh |
Script run once on first apply |
run_onchange_*.sh |
Script run when its contents change |
See the chezmoi source state reference for the full list.
26 Agent Skills-compatible skills deployed to ~/.agents/skills/. Works with OpenCode and any compatible agent. See dot_agents/skills/README.md for the full list and install instructions.
Skills use a capability-based composition system — workflow skills declare what they requires, and a capabilities.yaml manifest binds capabilities to providers (a skill, cli://<binary>, or mcp://<server>). This lets workflow skills stay tool-agnostic: swap Linear for Jira by changing one line.
Spec proposal: This composition model is proposed as an extension to the agentskills format at agentskills/agentskills#311.
Install individual skills via chezmoi external by adding entries to your .chezmoiexternal.toml:
[".agents/skills/commit"]
type = "archive"
url = "https://github.com/athal7/dotfiles/archive/refs/heads/main.tar.gz"
stripComponents = 3
include = ["*/dot_agents/skills/commit/**"]
targetPath = ".agents/skills/commit"
refreshPeriod = "168h"stripComponents = 3 strips the athal7-dotfiles-<sha>/dot_agents/skills/ prefix so the skill lands directly at the targetPath.
To use workflow skills that have requires, create ~/.agents/capabilities.yaml mapping each capability to a provider:
# Skill — loads SKILL.md instructions
logs: elasticsearch
# CLI — agent calls the binary directly via Bash
calendar: cli://ical
# MCP tool — activates tool calls on demand
pull-requests: mcp://githubYour agent also needs to know how to resolve capabilities. Add this to your global agent instructions (e.g. ~/.config/opencode/AGENTS.md):
## Skill Capabilities
When you load a skill that has `requires` in its metadata, read `~/.agents/capabilities.yaml`
to resolve each capability. If the value is a skill name, load that skill. If it starts with
`cli://`, call that binary via Bash and read its `--help` on demand. If it starts with `mcp://`,
activate that tool. If a capability has no mapping, ask the user which provider to use.If you want to install many skills from the same repo without repeating the archive entry for each, you can drive the external config from chezmoi data. Add this to your .chezmoiexternal.toml.tmpl:
{{ range $url, $data := .agentSkills }}
{{ range $skill := $data.skills }}
[".agents/skills/{{ $skill }}"]
type = "{{ with index $data "type" }}{{ $data.type }}{{ else }}archive{{ end }}"
url = "{{ $url }}"
stripComponents = {{ with index $data "stripComponents" }}{{ $data.stripComponents }}{{ else }}3{{ end }}
include = ["*/dot_agents/skills/{{ $skill }}/**"]
targetPath = ".agents/skills/{{ $skill }}"
refreshPeriod = "{{ with index $data "refreshPeriod" }}{{ $data.refreshPeriod }}{{ else }}168h{{ end }}"
{{ end }}
{{ end }}Then declare the skills you want in your .chezmoidata/skills.yaml (or any chezmoidata file). The full list of available skills is in dot_agents/skills/:
agentSkills:
"https://github.com/athal7/dotfiles/archive/refs/heads/main.tar.gz":
type: archive
stripComponents: 3
skills:
- attention
- commit
- context-log
- gh
- git-spice
- google-docs
- learn
- plan
- review
- slack
- tdd
- thinking-tools
- writing