agentleFS
thisrohanguptathisrohangupta/harness-skills/skills/create-template/SKILL.md

create-template

Skill2 starsChanged 7 months agoApache-2.0Archived repositoryView on GitHub

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.

We split this skill into the rules it gives an agent

2 rules. 0 are common, 2 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 8 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Verify the versionLabel is unique for each template update.

    line 242
  2. Distinctive:

    Test template references in a pipeline before distributing to other teams.

    line 243

“Common” is measured: kept by at least 6 in 10 of the 8 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Create Template

Generate Harness v0 Template YAML for reusable components and push via MCP.

Instructions

  1. Determine template type - Step, Stage, Pipeline, or StepGroup
  2. Identify reusable parameters - Mark configurable fields with <+input> for runtime inputs
  3. Generate YAML using the structure below with a unique versionLabel
  4. Create via MCP using harness_create with resource_type template
  5. Verify creation using harness_list with resource_type template

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 versionLabel
  • INVALID_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

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.