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 pylint for Python code.2 spaces for YAML and Python indentation.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/sections.py - Dataclass for VariableSection (stores section metadata and variables)cli/core/template.py - Template Class for parsing, managing and rendering templatescli/core/variables.py - Dataclass for Variable (stores variable metadata and values)cli/modules/compose.py - Docker Compose-specific functionality
(Work in Progress)cli/modules/terraform.py - Terraform-specific functionalitycli/modules/docker.py - Docker-specific functionalitycli/modules/ansible.py - Ansible-specific functionalitycli/modules/kubernetes.py - Kubernetes-specific functionalitycli/modules/packer.py - Packer-specific functionality~/.config/boilerplates/libraries/{name}/~/.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
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
.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)Key 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
Uses rich library for interactive prompts. Supports:
To skip the prompt use the --no-interactive flag, which will use defaults or empty values.