Includes System
Reuse configurations across multiple projects through inheritance and composition.
Overview
Includes work through configuration inheritance:
- Define common rules once in a shared configuration
- Share rules, context, and skills across projects
- Mix and match includes to create project-specific configurations
- Track changes through version control
How Includes Work
Includes allow one .ai-rulez/ configuration to inherit content from other configurations. Use for:
- Organization-wide coding standards
- Framework-specific guidelines (React, Go, Python)
- Consistent security policies
- Team-specific workflows
Basic Example
Creating a Shared Configuration
Create a .ai-rulez/ directory that others can include:
shared-rules/.ai-rulez/config.yaml:
version: "3.0"
name: "shared-rules"
description: "Organization-wide AI rules"
presets: []
profiles:
default: []
shared-rules/.ai-rulez/rules/security.md:
---
priority: critical
---
# Security Standards
- Always validate user input
- Use parameterized queries
- Never hardcode secrets
- Rotate credentials regularly
Including in Your Project
In your project's .ai-rulez/config.yaml, reference the shared rules:
version: "3.0"
name: "my-project"
# Include rules from another directory
includes:
- ../shared-rules/.ai-rulez
presets:
- claude
- cursor
profiles:
default: []
Now your project includes all content from the shared configuration.
Include Paths
Includes can be:
- Relative paths:
../shared-rules/.ai-rulez,./team-guidelines/.ai-rulez - Absolute paths:
/etc/ai-rulez-standards/.ai-rulez - Git URLs:
https://github.com/org/shared-rules.git,git@github.com:org/shared-rules.git
Examples
Sibling directory:
includes:
- name: shared-rules
source: ../shared-rules
include:
- rules
- context
merge_strategy: local-override
Subdirectory:
includes:
- name: team-config
source: ./config/shared
include:
- rules
- skills
merge_strategy: local-override
Git repository (HTTPS):
includes:
- name: org-standards
source: https://github.com/myorg/shared-rules.git
ref: main
include:
- rules
- context
- skills
- agents
merge_strategy: local-override
Git repository (SSH):
includes:
- name: company-policies
source: git@github.com:company/ai-rulez.git
ref: v1.2.3
include:
- rules
- context
merge_strategy: local-override
Multiple includes:
includes:
# Local relative path
- name: team-guidelines
source: ../team-guidelines
include:
- rules
- context
merge_strategy: local-override
# Git repository
- name: org-standards
source: git@gitlab.com:org/standards.git
ref: main
include:
- rules
- skills
merge_strategy: local-override
# Another local path
- name: security-policies
source: ./security-policies
include:
- rules
merge_strategy: local-override
Supported Git URL Formats
- HTTPS:
https://github.com/owner/repo.git - SSH:
git@github.com:owner/repo.git - SSH protocol:
ssh://git@github.com/owner/repo.git - GitLab:
https://gitlab.com/owner/repo.git,git@gitlab.com:owner/repo.git - Self-hosted GitLab:
git@git.example.com:owner/repo.git,https://git.example.com/owner/repo.git
SSH Cloning for Private Repositories
For private repositories that require SSH authentication, ai-rulez automatically uses git clone when it detects SSH URLs (git@... or ssh://...). This leverages your existing SSH key configuration.
Benefits of SSH cloning: - Works with private repositories without needing access tokens - Uses your configured SSH keys and agent - Supports self-hosted Git servers (GitLab, Gitea, Gogs, etc.) - Ideal for local development and multi-repo setups
Example with SSH:
includes:
- name: private-rules
source: git@git.example.com:company/ai-rulez.git
ref: main
include:
- rules
- context
merge_strategy: local-override
Requirements: - Git must be installed and available in your PATH - SSH keys must be configured for the git host - SSH agent should be running (for passphrase-protected keys)
Repository Structure Support
ai-rulez supports two repository structures for includes:
-
Standard structure (recommended): Repository contains a
.ai-rulez/subdirectory with the configuration -
Root-level structure: Repository root IS the ai-rulez structure (no nested
.ai-rulez/directory)
ai-rulez automatically detects which structure your repository uses and handles it accordingly.
Private Repository Authentication (HTTPS)
When working with private Git repositories in includes, you can authenticate using an access token.
Using Environment Variable (Recommended)
Set the AI_RULEZ_GIT_TOKEN environment variable with your access token:
This is the recommended approach for CI/CD environments and automation scripts.
Using CLI Flag
Pass the token directly via the --token flag:
Creating Access Tokens
GitHub: 1. Go to Settings → Developer settings → Personal access tokens 2. Click "Generate new token (classic)" 3. Select scopes: - repo - Required for accessing private repositories 4. Generate and copy the token
GitLab: 1. Go to User Settings → Access Tokens 2. Click "Add new token" 3. Select scopes: - read_repository - Required for reading private repositories 4. Create token and copy it
Other Git Hosts:
Most Git hosting platforms that support Bearer token authentication will work with ai-rulez. The token is sent as a Bearer token in the Authorization header when fetching repository archives.
Security Best Practices
- Never commit tokens to your repository or configuration files
- Use environment variables in CI/CD pipelines (GitHub Actions secrets, GitLab CI/CD variables, etc.)
- Store tokens securely using secret management systems (AWS Secrets Manager, HashiCorp Vault, etc.)
- Rotate tokens regularly to limit exposure from potential leaks
- Use minimal permissions - only grant the token access to what's needed (read-only repository access)
- Use organization-level tokens when possible to manage access centrally
Example: CI/CD Integration
GitHub Actions:
name: Generate AI Rules
on: [push]
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate
env:
AI_RULEZ_GIT_TOKEN: ${{ secrets.GIT_TOKEN }}
run: npx ai-rulez@latest generate
GitLab CI:
Include Options
name: Unique identifier for the includesource: Path or Git URL to the configurationref: (Git only) Branch, tag, or commit SHA (default:main)include: List of content types to fetch:rules,context,skills,agentsmerge_strategy: How to handle conflicts:local-override: Local content takes precedence (default)remote-override: Remote content takes precedence
Include Priority
When the same file exists in multiple includes and your configuration:
- Your configuration takes precedence (highest priority)
- Includes are merged in order
- Later includes override earlier ones
Example:
includes:
- ../base-rules/.ai-rulez # Loaded first
- ../team-rules/.ai-rulez # Overrides base-rules
# Your rules/ directory overrides both
If multiple includes define .ai-rulez/rules/security.md, the last one wins.
Common Patterns
Organization-Wide Standards
Create a central repository with baseline rules:
Repository structure:
org-standards/
└── .ai-rulez/
├── config.yaml
├── rules/
│ ├── security.md
│ ├── code-quality.md
│ └── git-workflow.md
└── context/
└── company-values.md
Each project includes it:
Framework-Specific Rules
Create separate includes for each framework:
frameworks/
├── go-backend/
│ └── .ai-rulez/
│ ├── config.yaml
│ └── rules/
│ ├── project-layout.md
│ ├── error-handling.md
│ └── testing.md
├── react-frontend/
│ └── .ai-rulez/
│ └── rules/
│ ├── component-guidelines.md
│ ├── hooks-patterns.md
│ └── styling.md
└── python-ml/
└── .ai-rulez/
└── rules/
├── numpy-conventions.md
└── ml-best-practices.md
Your project uses them:
includes:
- ../../frameworks/go-backend/.ai-rulez
- ../../frameworks/react-frontend/.ai-rulez
presets:
- claude
- cursor
profiles:
backend:
- backend
frontend:
- frontend
full:
- backend
- frontend
Monorepo with Shared and Team-Specific Rules
Repository structure:
monorepo/
├── shared-rules/.ai-rulez/ # Used by all teams
├── backend-team/
│ └── .ai-rulez/ # Includes shared + backend-specific
├── frontend-team/
│ └── .ai-rulez/ # Includes shared + frontend-specific
└── mobile-team/
└── .ai-rulez/ # Includes shared + mobile-specific
backend-team/.ai-rulez/config.yaml:
version: "3.0"
name: "backend-api"
includes:
- ../shared-rules/.ai-rulez
presets:
- claude
- cursor
profiles:
default: []
Multi-Level Hierarchy
Includes can themselves include other includes:
hierarchy:
org-base/
├── rules/
│ └── security.md
└── .ai-rulez/config.yaml
go-framework/
└── .ai-rulez/config.yaml
includes:
- ../org-base/.ai-rulez
my-project/
└── .ai-rulez/config.yaml
includes:
- ../go-framework/.ai-rulez
- ../team-standards/.ai-rulez
When you generate from my-project, it loads: 1. org-base rules (base layer) 2. go-framework rules (framework-specific) 3. team-standards rules (team-specific) 4. my-project rules (project-specific)
Collision Handling
When includes define the same file:
shared-rules/.ai-rulez/rules/testing.md
go-framework/.ai-rulez/rules/testing.md
my-project/.ai-rulez/rules/testing.md
Resolution order (last one wins): 1. shared-rules/rules/testing.md (loaded first) 2. go-framework/rules/testing.md (overrides shared) 3. my-project/rules/testing.md (overrides both)
A warning is logged:
⚠️ Content collision: rules/testing.md found in multiple includes
→ Using: my-project/.ai-rulez/rules/testing.md
Best Practices
Organize by Specificity
org-wide-rules/ Applies to everything
team-rules/ Team-specific
framework-rules/ Technology-specific
project-rules/ Project-specific
Use Clear Naming
Good: - org-standards/.ai-rulez - react-best-practices/.ai-rulez - backend-security/.ai-rulez
Bad: - rules/.ai-rulez (ambiguous) - base/.ai-rulez (unclear scope)
Document Includes
Add comments to your config explaining why includes are needed:
version: "3.0"
name: "my-backend"
includes:
# Organization-wide coding standards
- ../org-standards/.ai-rulez
# Go-specific conventions
- ../go-guidelines/.ai-rulez
# Backend team standards
- ../backend-team/.ai-rulez
presets:
- claude
- cursor
Keep Includes Focused
Each include should have a single purpose:
Good:
security-policies/ Rules for security
error-handling/ Rules for error handling
code-style/ Rules for code style
Bad:
everything/ Security, errors, style, testing, etc.
Version Your Includes
Tag releases and reference specific versions:
Troubleshooting
Include Path Not Found
ls -la ../shared-rules/.ai-rulez/config.yaml
# Try absolute path
includes:
- /path/to/shared-rules/.ai-rulez
Circular Includes
If a includes b, and b includes a:
# Error: Circular include detected
# a -> b -> a
# Solution: Restructure to avoid cycles
# Create a base layer that both include from
Conflicting Rules
Use project-level rules to override, or change include order:
includes:
- ../stricter-rules/.ai-rulez # Load strict rules first
- ../lenient-rules/.ai-rulez # Load lenient rules last (wins)
Your .ai-rulez/rules/security.md overrides both includes.
Content Not Merging
cat .ai-rulez/config.yaml | grep includes
ls -la ../shared-rules/.ai-rulez/
ai-rulez validate --verbose
Migration Path
If you're currently using separate configurations:
-
Extract common rules into a shared include:
-
Add include to your config:
-
Regenerate and test:
-
Commit the include:
Next Steps
- Configuration Reference: Advanced config options
- Domains & Profiles: Team organization
- Quick Start: Getting started