Manage AI agent configurations through symlinks. Keep all your configs in one git-tracked location.
Consolidates config files for AI coding agents (Claude Code, Goose) into a single source of truth via symlinks:
- Git-tracked configs synced across machines
- Edit once, apply everywhere
- Declarative plugin management (Claude Code)
- Exclude specific files (e.g., company-managed)
- Per-agent customizations
Supported: Claude Code (settings, agents, commands, plugins), Goose (hints, config), Shared (AGENTS.md)
Requirements: Python 3.10+, uv
One-command setup from PyPI:
uvx --from ai-agent-rules ai-rules setupThis will:
- Install AI agent configuration symlinks
- Make
ai-rulesavailable system-wide - Auto-install optional tools (claude-code-statusline)
After setup, you can run ai-rules from any directory.
Install from GitHub to get the latest development code:
uvx --from ai-agent-rules ai-rules setup --githubThis installs from the main branch and auto-detects the GitHub source for future updates.
For contributing or local development:
git clone https://github.com/wpfleger96/ai-rules.git
cd ai-rules
uv run ai-rules installUse uv run ai-rules <command> to test local changes. The global ai-rules command continues to run your installed version (PyPI/GitHub).
Check for and install updates:
ai-rules upgrade # Check and install updates
ai-rules upgrade --check # Only check for updatesAuto-update checks run weekly by default. Configure in ~/.ai-rules/update_config.yaml:
enabled: true
frequency: weekly # daily, weekly, never
notify_only: falseai-rules setup # One-time setup: install symlinks + make available system-wide
ai-rules setup --github # Install from GitHub (pre-release)
ai-rules setup --profile work # Setup with a specific profile
ai-rules upgrade # Upgrade to latest version
ai-rules upgrade --check # Check for updates without installing
ai-rules install # Install all agent configs + optional tools
ai-rules install --agents claude # Install specific agents
ai-rules install --dry-run # Preview changes
ai-rules install --force # Skip confirmations
ai-rules install --rebuild-cache # Rebuild merged settings cache
ai-rules status # Check symlink status + optional tools + active profile (✓✗⚠○)
ai-rules diff # Show config differences
ai-rules validate # Verify source files exist
ai-rules install # Re-sync after adding files
ai-rules uninstall # Remove all symlinks
ai-rules list-agents # Show available agents# Interactive wizard for first-time setup
ai-rules config init # Start configuration wizard
# View configuration
ai-rules config show # Show raw config files
ai-rules config show --merged # Show merged settings with overrides
ai-rules config show --agent claude # Show config for specific agent
ai-rules config edit # Edit user config in $EDITOR
# Manage exclusions
ai-rules exclude add "~/.claude/*.json" # Add exclusion pattern (supports globs)
ai-rules exclude remove "~/.claude/*.json" # Remove exclusion pattern
ai-rules exclude list # List all exclusions
# Manage settings overrides (for machine-specific settings)
ai-rules override set claude.model "claude-sonnet-4-5-20250929" # Set simple override
ai-rules override set claude.hooks.SubagentStop[0].hooks[0].command "script.py" # Array notation
ai-rules override unset claude.model # Remove override
ai-rules override list # List all overridesRun the interactive configuration wizard for guided setup:
ai-rules config initThis will walk you through:
- Selecting common exclusions
- Adding custom exclusion patterns (with glob support)
- Setting up machine-specific settings overrides
Create ~/.ai-rules-config.yaml for user-level settings:
version: 1
# Global exclusions (apply to all contexts)
# Supports glob patterns: *.json, **/*.yaml, etc.
exclude_symlinks:
- "~/.config/goose/config.yaml"
- "~/.claude/*.log" # Glob: exclude all log files
- "~/.claude/agents/debug-*.md" # Glob: exclude debug agents
# Machine-specific settings overrides
# Keeps repo settings.json synced via git, but allows local overrides
settings_overrides:
claude:
model: "claude-sonnet-4-5-20250929" # Override model on personal laptop
# Other settings inherited from base config/claude/settings.json
goose:
provider: "anthropic"Config File Location:
~/.ai-rules-config.yaml- User-specific config (exclusions and overrides)~/.ai-rules/state.yaml- Active profile and last install timestamp (auto-managed)~/.ai-rules/cache/- Merged settings cache (auto-generated)~/.ai-rules/update_config.yaml- Update check configuration
Problem: You want to sync your settings.json via git, but need different settings on different machines (e.g., different model access on work vs personal laptop).
Solution: Use settings_overrides in your user config:
# ~/.ai-rules-config.yaml on personal laptop
settings_overrides:
claude:
model: "claude-sonnet-4-5-20250929" # No Opus access
# ~/.ai-rules-config.yaml on work laptop
settings_overrides:
claude:
model: "claude-opus-4-20250514" # Has Opus accessBoth machines sync the same config/claude/settings.json via git, but each has different local overrides. The system merges them at install time:
- Base settings from
config/claude/settings.json(git-tracked) - Merged with overrides from
~/.ai-rules-config.yaml(local only) - Cached in
~/.ai-rules/cache/claude/settings.json - Symlinked to
~/.claude/settings.json
After changing overrides, run:
ai-rules install --rebuild-cacheOverride commands support array index notation for complex nested structures:
# Override nested array elements (e.g., hooks)
ai-rules override set claude.hooks.SubagentStop[0].hooks[0].command "uv run ~/my-hook.py"
# Override environment variables
ai-rules override set claude.env.MY_VAR "value"
# The system validates paths and provides helpful suggestions
ai-rules override set claude.modle "sonnet"
# Error: Key 'modle' not found at 'modle'
# Available options: model, env, hooks, statusLine, ...Path validation ensures you only set valid overrides that exist in the base settings, preventing typos and configuration errors.
Profiles let you group configuration overrides into named presets. Instead of manually maintaining different ~/.ai-rules-config.yaml files across machines, define profiles once and select them at install time.
# List available profiles
ai-rules profile list
# View profile details
ai-rules profile show work
ai-rules profile show work --resolved # Show with inheritance
# Check which profile is active
ai-rules profile current
# Switch to a different profile
ai-rules profile switch work
# Install with a specific profile
ai-rules install --profile workProfiles are stored in src/ai_rules/config/profiles/ and support inheritance:
# profiles/work.yaml
name: work
description: Work laptop with extended context model
extends: null
settings_overrides:
claude:
env:
ANTHROPIC_DEFAULT_SONNET_MODEL: "claude-sonnet-4-5-20250929[1m]"
model: opusplanConfiguration layers (lowest to highest priority):
- Profile overrides
- Local
~/.ai-rules-config.yamloverrides
Your local config always wins, so you can use a profile as a base and tweak specific settings per-machine. Profiles are git-tracked and can be shared across your team.
The active profile is tracked in ~/.ai-rules/state.yaml and persists across sessions. Use profile current to see which profile is active, or profile switch to quickly change profiles without re-running the full install.
Specify Claude Code plugins in your profile or user config, and ai-rules automatically installs them via claude plugin install:
# profiles/work.yaml or ~/.ai-rules-config.yaml
plugins:
- name: feature-dev
marketplace: claude-plugins-official
- name: python-expert
marketplace: cc-marketplace
marketplaces:
- name: cc-marketplace
source: ananddtyagi/cc-marketplaceWhen you run ai-rules install:
- Adds missing marketplaces via
claude plugin marketplace add - Installs missing plugins via
claude plugin install <name>@<marketplace> - Warns about extra plugins (doesn't auto-uninstall)
Check plugin status:
ai-rules status # Shows Plugins section with installed/pending/extraPlugins are tracked in ~/.claude/plugins/installed_plugins.json and synced across machines via your git-tracked profile configuration.
config/
├── AGENTS.md # User-level rules → ~/AGENTS.md, ~/.CLAUDE.md, ~/.config/goose/.goosehints
├── claude/
│ ├── settings.json # → ~/.claude/settings.json
│ ├── agents/*.md # → ~/.claude/agents/*.md (dynamic)
│ ├── commands/*.md # → ~/.claude/commands/*.md (dynamic)
│ ├── hooks/*.py # → ~/.claude/hooks/*.py (dynamic)
│ └── skills/*/SKILL.md # → ~/.claude/skills/*/SKILL.md (dynamic)
└── goose/
└── config.yaml # → ~/.config/goose/config.yaml
AI Rules automatically installs optional tools that enhance functionality:
- claude-code-statusline - Custom status line for Claude Code showing token usage, git info, time, and workspace details
These tools are installed automatically during setup and install commands. Check installation status:
ai-rules status # Shows Optional Tools sectionIf a tool fails to install, ai-rules continues normally (fail-open behavior).
Add Claude agent/command:
- Create
config/claude/agents/my-agent.mdorconfig/claude/commands/my-cmd.md - Run
ai-rules install
Add Claude skill with auto-activation:
- Create
config/claude/skills/my-skill/SKILL.mdwith frontmatter:
---
name: my-skill
description: "Brief description"
metadata:
trigger-keywords: "keyword1, keyword2"
trigger-patterns: "pattern1, pattern2"
---- Run
ai-rules install - Skill auto-suggests when user prompt matches keywords/patterns
Add Claude hook:
- Create
config/claude/hooks/my-hook.py - Run
ai-rules install - Configure in settings or overrides (e.g., UserPromptSubmit, SubagentStop)
Add new AI tool:
- Add configs to
config/<tool>/ - Implement
ai_rules/agents/<tool>.py - Register in
ai_rules/cli.py::get_agents()
- First-run warnings
- Timestamped backups (
*.ai-rules-backup.YYYYMMDD-HHMMSS) - Interactive prompts and dry-run mode
- Only manages symlinks (never deletes real files)
- Contextual error messages with tips
This project uses just for task automation.
Install just:
# macOS
brew install just
# Linux
cargo install just
# or: sudo apt install just (Ubuntu 23.04+)
# Windows
choco install justCommon commands:
just # Run quick quality checks (sync, type-check, lint-check, format-check)
just --list # List all available recipes
# Setup
just setup # First-time setup: sync deps + install git hooks
just sync # Sync dependencies only
# Code Quality
just check # Quick quality checks (no tests)
just check-all # All checks including tests
just lint # Fix linting issues
just format # Auto-format code
just type-check # Run mypy type checking
# Testing
just test # Run all tests (default config)
just test-unit # Unit tests only
just test-integration # Integration tests only
just test-cov # Tests with coverage report
# Benchmarking
just benchmark-save # Run and save baseline
just benchmark-compare # Compare against baseline
just benchmark-record # Compare and save
just benchmark-list # List saved benchmarks
just benchmark-clean # Remove all benchmarks
# Build
just build # Build package
just rebuild # Clean and buildThe test suite includes both unit tests and integration tests.
Using just (recommended):
just test # Run all tests with default config
just test-unit # Only unit tests
just test-integration # Only integration tests
just test-cov # Tests with coverage reportUsing uv directly:
uv run pytest [--cov=src --cov-report=term-missing] # All tests
uv run pytest -m unit # Unit tests only
uv run pytest -m integration # Integration tests onlyWrong target: ai-rules status then ai-rules install --force
Restore backup:
ls -la ~/.CLAUDE.md.ai-rules-backup.*
mv ~/.CLAUDE.md.ai-rules-backup.20250104-143022 ~/.CLAUDE.mdDisable symlink: Use the exclude command or add to config manually:
ai-rules exclude add "~/.claude/settings.json"
# Or edit manually: ai-rules config editOverride not applying: Rebuild the merged settings cache:
ai-rules install --rebuild-cacheView merged settings: Check what's actually being applied:
ai-rules config show --merged
ai-rules config show --merged --agent claudeMIT