Guidance for AI Agents working with this repository.
A sophisticated collection of infrastructure templates (boilerplates) with a Python CLI for management. Supports Terraform, Docker, Ansible, Kubernetes, etc. Built with Typer (CLI) and Jinja2 (templating).
# Run the CLI application
python3 -m cli
# Debugging and Testing commands
python3 -m cli --log-level DEBUG compose list
Should always happen before pushing anything to the repository.
yamllint for YAML files and ruff for Python code.The project is stored in a public GitHub Repository, use issues, and branches for features/bugfixes and open PRs for merging.
Naming Conventions and Best-Practices:
feature/2314-add-feature, problem/1249-fix-bugtype(scope): subject (e.g., fix(compose): correct variable parsing).cli/ - Python CLI application source code
cli/core/ - Core Components of the CLI applicationcli/modules/ - Modules implementing variable specs and technology-specific functionscli/__main__.py - CLI entry point, auto-discovers modules and registers commandslibrary/ - Template collections organized by module
library/ansible/ - Ansible playbooks and configurationslibrary/compose/ - Docker Compose configurationslibrary/docker/ - Docker templateslibrary/kubernetes/ - Kubernetes deploymentslibrary/packer/ - Packer templateslibrary/terraform/ - OpenTofu/Terraform templates and examplescli/core/collection.py - Dataclass for VariableCollection (stores variable sections and variables)cli/core/config.py - Configuration management (loading, saving, validation)cli/core/display.py - Centralized CLI output rendering (Always use this to display output - never print directly)cli/core/exceptions.py - Custom exceptions for error handling (Always use this for raising errors)cli/core/library.py - LibraryManager for template discovery from git-synced libraries and static file pathscli/core/module.py - Abstract base class for modules (defines standard commands)cli/core/prompt.py - Interactive CLI prompts using rich librarycli/core/registry.py - Central registry for module classes (auto-discovers modules)cli/core/repo.py - Repository management for syncing git-based template librariescli/core/section.py - Dataclass for VariableSection (stores section metadata and variables)cli/core/template.py - Template Class for parsing, managing and rendering templatescli/core/variable.py - Dataclass for Variable (stores variable metadata and values)cli/core/validators.py - Semantic validators for template content (Docker Compose, YAML, etc.)cli/core/version.py - Version comparison utilities for semantic versioningCreating Modules:
Module from cli/core/module.pyname and description class attributesspec for default variables (common across all templates)registry.register(YourModule) at module bottomModule Spec: Optional class attribute for module-wide variable defaults. Example:
spec = VariableCollection.from_dict({
"general": {"vars": {"common_var": {"type": "str", "default": "value"}}},
"networking": {"title": "Network", "toggle": "net_enabled", "vars": {...}}
})
Existing Modules:
cli/modules/compose.py - Docker Compose (defines extensive module spec with traefik, database, email, authentik sections)(Work in Progress): terraform, docker, ansible, kubernetes, packer modules
~/.config/boilerplates/libraries/{name}/Library Types:
git: Requires url, branch, directory fieldsstatic: Requires path field (absolute or relative to config)Duplicate Handling:
DuplicateTemplateErroralloy.default, alloy.local)compose show alloy loads from first librarycompose show alloy.localConfig Example:
libraries:
- name: default # Highest priority (checked first)
type: git
url: https://github.com/user/templates.git
branch: main
directory: library
- name: local # Lower priority
type: static
path: ~/my-templates
url: '' # Backward compatibility fields
branch: main
directory: .
Note: Static libraries include dummy url/branch/directory fields for backward compatibility with older CLI versions.
~/.config/boilerplates/config.yamlExternal code should NEVER directly call IconManager or console.print, instead always use DisplayManager methods.
DisplayManager provides a centralized interface for ALL CLI output rendering (Use display_*** methods from DisplayManager for ALL output)IconManager provides Nerd Font icons internally for DisplayManager, don't use Emojis or direct console accessTemplates are directory-based. Each template is a directory containing all the necessary files and subdirectories for the boilerplate.
Requires template.yaml or template.yml with metadata and variables:
---
kind: compose
schema: "1.0" # Optional: Defaults to 1.0 if not specified
metadata:
name: My Nginx Template
description: >
A template for a simple Nginx service.
Project: https://...
Source: https://
Documentation: https://
version: 0.1.0
author: Christian Lempa
date: '2024-10-01'
spec:
general:
vars:
nginx_version:
type: string
description: The Nginx version to use.
default: latest
Templates and modules use schema versioning to ensure compatibility. Each module defines a supported schema version, and templates declare which schema version they use.
---
kind: compose
schema: "1.0" # Defaults to 1.0 if not specified
metadata:
name: My Template
version: 1.0.0
# ... other metadata fields
spec:
# ... variable specifications
How It Works:
cli/modules/*.py) defines schema_version (e.g., "1.0")schema at the top level (defaults to "1.0")IncompatibleSchemaVersionErrorBehavior:
schema field default to "1.0" (backward compatible)When to Use:
schema: "1.1"Module Example:
class ComposeModule(Module):
name = "compose"
description = "Manage Docker Compose configurations"
schema_version = "1.0" # Current schema version supported
Version Management:
cli/__init__.py as __version____version__ for releases.j2): Rendered by Jinja2, .j2 extension removed in output. Support {% include %} and {% import %}..j2 files copied as-is.Precedence (lowest to highest):
spec (defaults for all templates of that kind)spec (overrides module defaults)config.yaml (overrides template and module defaults)--var (highest priority)Variable Types:
str (default), int, float, boolemail - Email validation with regexurl - URL validation (requires scheme and host)hostname - Hostname/domain validationenum - Choice from options listVariable Properties:
sensitive: true - Masked in prompts/display (e.g., passwords)autogenerated: true - Auto-generates value if empty (shows *auto placeholder)default - Default valuedescription - Variable descriptionprompt - Custom prompt text (overrides description)extra - Additional help textoptions - List of valid values (for enum type)Section Features:
required: true (general is implicit). Users must provide all values.toggle: "bool_var_name". If false, section is skipped.needs: "section_name" or needs: ["sec1", "sec2"]. Dependent sections only shown when dependencies are enabled. Auto-validated (detects circular/missing/self dependencies). Topologically sorted.Example Section with Dependencies:
spec:
traefik:
title: Traefik
required: false
toggle: traefik_enabled
vars:
traefik_enabled:
type: bool
default: false
traefik_host:
type: hostname
traefik_tls:
title: Traefik TLS/SSL
needs: traefik
toggle: traefik_tls_enabled
vars:
traefik_tls_enabled:
type: bool
default: true
traefik_tls_certresolver:
type: str
sensitive: false
default: myresolver
Jinja2 Validation:
Semantic Validation:
cli/core/validators.pyContentValidator abstract base classDockerComposeValidator, YAMLValidatorcompose validate command with --semantic flag (enabled by default)Uses rich library for interactive prompts. Supports:
sensitive: true variables)*auto placeholder, generate on render)To skip the prompt use the --no-interactive flag, which will use defaults or empty values.
Standard Module Commands (auto-registered for all modules):
list - List all templatessearch <query> - Search templates by IDshow <id> - Show template detailsgenerate <id> [directory] - Generate from template (supports --dry-run, --var, --no-interactive)validate [id] - Validate templates (Jinja2 + semantic)defaults - Manage config defaults (get, set, rm, clear, list)Core Commands:
repo sync - Sync git-based librariesrepo list - List configured libraries