plugins/claude-code-templating-plugin/skills/universal-templating/SKILL.md
Master all templating formats - Handlebars, Cookiecutter, Copier, Maven, and Harness - with format selection matrix, generation workflows, and best practices
npx skillsauth add markus41/claude universal-templatingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Comprehensive guide to template format selection, design patterns, generation workflows, and best practices across Handlebars, Cookiecutter, Copier, Maven, and Harness templates.
Use Cases:
Syntax:
Hello {{name}},
{{#if premium}}Welcome to premium!{{/if}}
{{#each items}}- {{this}}{{/each}}
Strengths:
Weaknesses:
Best For: Configuration file templating, simple document generation
Use Cases:
Syntax:
{
"project_name": "{{ cookiecutter.project_name }}",
"author": "{{ cookiecutter.author_name }}"
}
Strengths:
Weaknesses:
Best For: Python projects, quick prototypes, community templates
Use Cases:
Syntax:
_templates_suffix: .jinja
_copy_without_render:
- "*.png"
- "*.jpg"
project_name:
type: str
help: What is your project name?
default: my_project
Strengths:
Weaknesses:
Best For: Enterprise templates, versioned scaffolding, complex projects
Use Cases:
Syntax:
<archetype>
<groupId>org.apache.maven.archetypes</groupId>
<artifactId>maven-archetype-quickstart</artifactId>
</archetype>
Strengths:
Weaknesses:
Best For: Java/JVM projects, Maven-based builds
Use Cases:
Syntax:
template:
name: Deploy Service
type: StepGroup
spec:
steps:
- step:
name: Deploy K8s
identifier: deploy_k8s
type: K8sDeploy
spec:
service: <+input>
Strengths:
Weaknesses:
Best For: Harness pipelines, deployment templates
START: Need to generate what?
│
├─ Configuration files
│ ├─ Simple substitution → Handlebars
│ └─ Complex validation → Copier
│
├─ Project scaffold
│ ├─ Python project → Cookiecutter
│ ├─ Enterprise/versioned → Copier
│ └─ Java/JVM → Maven
│
├─ CI/CD pipeline
│ ├─ Harness platform → Harness Templates
│ └─ Other CI → Handlebars + custom
│
├─ Document/email
│ └─ Handlebars
│
└─ Reusable components
├─ Code snippets → Handlebars
└─ Full modules → Copier
Inputs:
Deliverables:
Questions to Answer:
Essential Variables:
project_name - Primary identifier
author_name - Creator/maintainer
organization - Company/org name
description - Brief description
license - License type (MIT, Apache, etc.)
target_framework - Framework/language version
Optional Variables (by use case):
// Python projects
python_version - Target Python version
package_name - PyPI package name
django_version - Django version (if applicable)
// Java projects
java_version - JDK version
groupId - Maven group ID
artifactId - Maven artifact ID
// Cloud projects
aws_region - AWS region
kubernetes_cluster - K8s cluster name
docker_registry - Container registry
Naming Rules:
Format: snake_case (all formats support this)
Prefixes:
generated_* - Files/content created by templateinput_* - User input requiredcomputed_* - Derived from other variablesoptional_* - Optional user inputExamples:
✓ project_name
✓ author_email
✓ generated_version
✓ target_framework
✗ ProjectName (avoid PascalCase)
✗ PROJECT_NAME (avoid SCREAMING_SNAKE_CASE)
Standard Project Structure:
{project_name}/
├── README.md # Template instructions
├── {project_name}/ # Main package/app
│ ├── __init__.py # (if applicable)
│ ├── main.py
│ └── config.py
├── tests/ # Test directory
│ ├── __init__.py
│ └── test_main.py
├── docs/ # Documentation
│ └── API.md
├── .gitignore
├── LICENSE
├── requirements.txt # (Python)
├── setup.py # (Python)
├── package.json # (Node.js)
└── {{cookiecutter.var}}/ # Template variables
When to Use:
Handlebars Example:
{{#if include_docker}}
FROM python:3.11
COPY . /app
{{/if}}
Cookiecutter/Copier Example:
{%- if use_docker %}
# Docker configuration
{%- endif %}
Input Validation:
Copier Example:
project_name:
type: str
help: Project name (lowercase, alphanumeric + underscore)
regex: "^[a-z_][a-z0-9_]*$"
python_version:
type: str
default: "3.11"
help: Python version (3.9, 3.10, 3.11, 3.12)
choices:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
Cookiecutter/Copier Hooks:
# hooks/post_gen_project.py
import os
from pathlib import Path
# Initialize git repository
os.system("git init")
# Create virtual environment
os.system("python -m venv venv")
# Install dependencies
os.system("pip install -r requirements.txt")
# Generate API docs
os.system("python generate_docs.py")
Required Documentation:
Good Defaults:
# Clear, sensible defaults
author_name: "Your Name"
license: "MIT"
python_version: "3.11" # Latest stable
include_docker: false # Opt-in for complexity
include_tests: true # Always good to start with tests
Bad Defaults:
# Unclear or empty
author_name: ""
unknown_var: "???"
version: "1.0.0" # Should be context-aware
Template Variables Once:
Define: project_name = "my_project"
Use in:
- Directory name
- README title
- Setup.py name
- Docker image name
Group Related Files:
template/
├── [project_name]/ # Project source (stays as-is)
├── [project_name]_docs/ # Docs structure
├── [project_name]_config/ # Config templates
└── tests/ # Test templates
Use Clear Comments:
{# This file is generated from {{template_name}} #}
{# Last updated: {{generated_date}} #}
{# For questions, see: {{docs_url}} #}
Template Versioning:
# In template metadata
version: "1.0.0"
harness_compatibility: "1.4+"
minimum_python: "3.9"
Clear Error Messages:
# Instead of: ValueError
# Use:
if not re.match(r"^[a-z_][a-z0-9_]*$", project_name):
raise ValueError(
f"Project name '{project_name}' is invalid.\n"
f"Must start with lowercase letter or underscore,\n"
f"followed by lowercase letters, numbers, or underscores."
)
1. USER SELECTION
├─ Choose template
├─ Select format (if flexible)
└─ Provide variables
2. VALIDATION
├─ Validate all inputs
├─ Check constraints
└─ Generate variable report
3. PRE-PROCESSING
├─ Compute derived variables
├─ Expand conditionals
└─ Build file tree
4. GENERATION
├─ Render templates
├─ Copy static files
├─ Create directory structure
└─ Handle special files
5. POST-PROCESSING
├─ Run hooks
├─ Initialize git/vcs
├─ Install dependencies
└─ Generate documentation
6. VALIDATION
├─ Check generated files
├─ Verify structure
├─ Test basic functionality
└─ Generate report
7. OUTPUT
├─ Display summary
├─ Provide next steps
└─ Save manifest
Harness Expressions:
├─ <+input.VARIABLE_NAME> # Inputs
├─ <+pipeline.PROPERTY> # Pipeline-level
├─ <+stage.PROPERTY> # Stage-level
├─ <+steps.STEP_ID.PROPERTY> # Step outputs
├─ <+env.PROPERTY> # Environment variables
├─ <+secrets.getValue("NAME")> # Secret references
└─ <+execution.PROPERTY> # Execution context
template:
name: Deploy Service
type: Step
spec:
service:
name: <+input.service_name>
environment:
name: <+input.environment>
variables:
version: <+input.artifact_version>
deploy_timeout: <+input.timeout_minutes>
approval_required: <+input.requires_approval>
development
Enhanced plan-authoring skill with Pre-Writing context gathering, task metadata, non-TDD templates, Red Flags, telemetry, and an automated plan linter. Use when you have a spec or requirements for a multi-step task, before touching code.
tools
Documentation intelligence engine with graph-based API docs, algorithm library, and drift detection
tools
Ultraplan cloud planning — kick off a plan in the cloud from your terminal, review and revise in the browser, then execute remotely or send back to CLI
tools
--- name: mcp description: Configure MCP servers for Claude Code — stdio vs HTTP, authentication, Tools/Resources/Prompts distinction, channels (CI webhook, mobile relay, Discord bridge, fakechat), and cost of always-loaded tools. Use this skill whenever adding an MCP server, debugging connection issues, choosing between MCP Tools vs Prompts vs Resources, installing channel servers, or managing .mcp.json. Triggers on: "MCP server", "mcp config", "add Obsidian MCP", "install context7", "channels"