Create template
A collection of structured AI agent skills that enable Claude Code, Cursor, GitHub Copilot, and other AI coding assistants to create, operate, debug, and govern Harness CI/CD workflows through natural language.
npx -y skills add harness/harness-skills --skill create-templateAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Generate Harness v0 Template YAML for reusable pipeline components (Step, Stage, Pipeline, StepGroup) and create them via MCP. Use when asked to create a template, build a step template, stage template, pipeline template, or reusable step. Do NOT use for checking template usage or references (use template-usage instead). Trigger phrases: create template, step template, stage template, pipeline template, reusable step, template YAML.
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.2 KB, as published. Nobody here has run it
Create Template
Generate Harness v0 Template YAML for reusable components and push via MCP.
Instructions
- Determine template type - Step, Stage, Pipeline, or StepGroup
- Identify reusable parameters - Mark configurable fields with
<+input>for runtime inputs - Generate YAML using the structure below with a unique
versionLabel - Create via MCP using
harness_createwith resource_typetemplate - Verify creation using
harness_listwith resource_typetemplate
Template Types
- Step - Reusable step definitions
- Stage - Reusable stage definitions
- Pipeline - Complete reusable pipelines
- StepGroup - Groups of related steps
Template Structure
template:
name: My Template
identifier: my_template
versionLabel: "1.0.0"
type: Step # Step, Stage, Pipeline, StepGroup
orgIdentifier: default
projectIdentifier: my_project
tags: {}
spec: ... # Content depends on type
Step Template
template:
name: Docker Build Push
identifier: docker_build_push
versionLabel: "1.0.0"
type: Step
spec:
type: BuildAndPushDockerRegistry
spec:
connectorRef: <+input>
repo: <+input>
tags: <+input>
dockerfile: Dockerfile
context: .
timeout: 15m
Stage Template
template:
name: K8s Deploy Stage
identifier: k8s_deploy_stage
versionLabel: "1.0.0"
type: Stage
spec:
type: Deployment
spec:
deploymentType: Kubernetes
service:
serviceRef: <+input>
environment:
environmentRef: <+input>
infrastructureDefinitions:
- identifier: <+input>
execution:
steps:
- step:
identifier: rollout
name: Rollout
type: K8sRollingDeploy
spec:
skipDryRun: false
timeout: 10m
rollbackSteps:
- step:
identifier: rollback
name: Rollback
type: K8sRollingRollback
spec: {}
timeout: 10m
failureStrategies:
- onFailure:
errors: [AllErrors]
action:
type: StageRollback
Pipeline Template
template:
name: Standard CI/CD
identifier: standard_cicd
versionLabel: "1.0.0"
type: Pipeline
spec:
stages:
- stage:
identifier: build
name: Build
type: CI
spec:
cloneCodebase: true
platform:
os: Linux
arch: Amd64
runtime:
type: Cloud
spec: {}
execution:
steps:
- step:
identifier: build
name: Build
type: Run
spec:
shell: Bash
command: <+input>
StepGroup Template
template:
name: Test Suite
identifier: test_suite
versionLabel: "1.0.0"
type: StepGroup
spec:
steps:
- step:
identifier: unit_tests
name: Unit Tests
type: Run
spec:
shell: Bash
command: <+input>
- step:
identifier: integration_tests
name: Integration Tests
type: Run
spec:
shell: Bash
command: <+input>
Using Runtime Inputs
Mark configurable fields with <+input> so users provide values when using the template:
spec:
connectorRef: <+input> # User selects connector
repo: <+input> # User provides repo name
tags:
- <+input> # User provides tag
- <+pipeline.sequenceId> # Fixed value
Creating via MCP
Call MCP tool: harness_create
Parameters:
resource_type: "template"
org_id: "<organization>"
project_id: "<project>"
body: <the template YAML>
To update a template version:
Call MCP tool: harness_update
Parameters:
resource_type: "template"
resource_id: "<template_identifier>"
org_id: "<organization>"
project_id: "<project>"
body: <updated template YAML with new versionLabel>
To list existing templates:
Call MCP tool: harness_list
Parameters:
resource_type: "template"
org_id: "<organization>"
project_id: "<project>"
Referencing Templates in Pipelines
- stage:
identifier: deploy
name: Deploy
template:
templateRef: k8s_deploy_stage
versionLabel: "1.0.0"
templateInputs:
type: Deployment
spec:
service:
serviceRef: my_service
environment:
environmentRef: prod
Examples
- "Create a Docker build and push step template" - Generate Step template with BuildAndPushDockerRegistry
- "Create a reusable K8s deployment stage" - Generate Stage template with Deployment type
- "Make a standard CI/CD pipeline template" - Generate Pipeline template with CI + CD stages
Performance Notes
- Mark all configurable fields with
<+input>to maximize template reusability. - Verify the versionLabel is unique for each template update.
- Test template references in a pipeline before distributing to other teams.
Troubleshooting
Template Creation Errors
DUPLICATE_IDENTIFIER- Template exists; update with new versionLabelINVALID_VERSION- versionLabel must be unique per template- Identifiers must match
^[a-zA-Z_][0-9a-zA-Z_]{0,127}$
Template Usage Errors
TEMPLATE_NOT_FOUND- Check templateRef and scope (account/org/project)VERSION_NOT_FOUND- Verify versionLabel exists- Missing templateInputs - Provide all
<+input>values