plugins/buildkite/skills/developing-pipelines/SKILL.md
Use when creating, modifying, or debugging Buildkite pipeline YAML files - ensures current syntax from official docs, validates configurations before proposing changes, and references Buildkite best practices instead of relying on training data
npx skillsauth add technicalpickles/pickled-claude-plugins developing-pipelinesInstall 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.
Reference official Buildkite documentation before making pipeline changes. Your training data may contain outdated syntax, deprecated patterns, or missing features.
Use this skill when:
Do NOT use for:
NEVER propose Buildkite YAML without consulting the reference docs.
Check for buildkite-builder usage before proceeding:
buildkite-builder is detected when BOTH conditions are true:
.buildkite/pipeline.yml references Docker image containing "buildkite-builder".buildkite/pipeline.rb OR .buildkite/pipelines/*/pipeline.rbWhen detected, announce:
"I see you're using buildkite-builder for dynamic pipeline generation. I'll work with your pipeline.rb files and reference the Ruby DSL."
Then load buildkite-builder reference documentation as needed.
When editing pipeline steps that use plugins:
plugins: entries in the stepbuildkite-plugins if no org specified{org}/{plugin}#version formatgithub.com/{org}/{plugin}-buildkite-pluginBuildkite directory (latest):
https://buildkite.com/resources/plugins/{org}/{plugin-name}-buildkite-plugin
GitHub README (version-specific):
https://github.com/{org}/{plugin-name}-buildkite-plugin/tree/{version}
"Is there a plugin for X?"
https://buildkite.com/resources/plugins/Internal plugins:
Search org's GitHub for repos matching *-buildkite-plugin
Check for buildkite-builder usage:
.buildkite/pipeline.yml contains "buildkite-builder".buildkite/pipeline.rb OR .buildkite/pipelines/*/pipeline.rb existsIf detected, announce and load buildkite-builder context.
For YAML pipelines:
Before writing or modifying pipeline YAML:
**I need to reference the Buildkite documentation for [specific feature].**
Let me read [references/[relevant-doc].md](references/).
For buildkite-builder pipelines:
Before writing or modifying pipeline.rb:
**I need to reference buildkite-builder documentation for [specific feature].**
Let me read [references/buildkite-builder/[relevant-doc].md](references/buildkite-builder/).
Available references:
step-types.md - Command, trigger, block, wait, input stepsdynamic-pipelines.md - Generating steps programmaticallydependencies.md - Using depends_on, parallel stepsenvironment-variables.md - Setting and using env varsconditionals.md - if/branches for conditional executionartifacts.md - Uploading and downloading build artifactsSee references/index.md for complete list.
Plugin references (see references/plugins/index.md for full list):
plugins/docker.md - Docker container executionplugins/docker-compose.md - Multi-container environmentsplugins/artifacts.md - Artifact upload/downloadplugins/ecr.md - AWS ECR authenticationplugins/cache.md - Dependency cachingbuildkite-builder references (when detected):
buildkite-builder/index.md - Overview and when to usebuildkite-builder/dsl-syntax.md - Core DSL step typesbuildkite-builder/step-attributes.md - Common attributesbuildkite-builder/templates.md - Reusable step templatesbuildkite-builder/extensions.md - Custom DSL and extensionsbuildkite-builder/conditionals.md - Conditional step generationbuildkite-builder/dependencies.md - Step dependenciesbuildkite-builder/artifacts.md - Artifact handlingbuildkite-builder/plugins.md - Plugin usage in DSLbuildkite-builder/environment.md - Environment variablesSee references/buildkite-builder/index.md for complete guide.
After proposing changes, ALWAYS mention validation:
# Validate locally before pushing
buildkite-agent pipeline upload --dry-run < pipeline.yml
# Or validate a generated pipeline
./generate-pipeline.sh | buildkite-agent pipeline upload --dry-run
For buildkite-builder pipelines:
After proposing pipeline.rb changes:
# Generate YAML locally
docker run --rm \
-v $(pwd)/.buildkite:/workspace/.buildkite \
-e BUILDKITE_BRANCH=main \
-e BUILDKITE_COMMIT=abc123def \
-e BUILDKITE_BUILD_NUMBER=1 \
gusto/buildkite-builder:4.13.0
# Validate generated YAML
docker run ... | buildkite-agent pipeline upload --dry-run
Note: List any custom ENV variables found in pipeline.rb and suggest setting real values if needed.
Before modifying any step with plugins:
plugins: blockSee references/plugins/index.md for lookup workflow and common plugins.
When user mentions errors, "not generating", "YAML looks wrong", or validation failures with buildkite-builder:
This mode switches from Ruby-first to YAML-aware debugging.
| Mistake | Fix | |---------|-----| | Writing YAML from memory | Read step-types.md first | | "This should work..." | Validate with --dry-run | | Custom script without checking plugins | Search buildkite.com/plugins | | Speculating about errors | Check references/troubleshooting.md | | Assuming syntax from training data | Verify against current docs |
When generating steps programmatically:
# Standard pattern from official docs
.buildkite/pipeline.sh | buildkite-agent pipeline upload
When pipeline fails with validation errors:
All of these mean: STOP. Read the docs first.
Without this skill:
With this skill:
tools
--- name: writing-for-scannability description: Use when structuring prose so readers can skim it - drafting or restructuring READMEs, docs, PR or issue bodies, design docs, RFCs, or any long-form text where a wall of prose hides the structure. Also use when explicitly asked to make something scannable or skimmable, convert prose to a list, surface a buried list, fix a wall of text, or decide whether bullets or prose fit. Strong signal: text with parallel sentence shapes, contrast markers ("that
development
Ignore actually-lsp nudges for an ecosystem in this project. Use when the user wants to silence, dismiss, or ignore the LSP setup nudges for a specific ecosystem (Rust, TypeScript, Ruby), or invokes `/actually-lsp-ignore` directly. Writes `dismissed=true` to `.claude/actually-lsp.json`. Persistent across sessions for this project only.
tools
Diagnose and fix LSP setup for the current project's detected ecosystems (Rust, TypeScript, Ruby). Use when the SessionStart hook nudged about a missing LSP plugin, when the env isn't ready (no `bundle install`, no `cargo build`, missing server binary), when LSP calls are failing, or when the user invokes `/actually-lsp-doctor` directly. Walks the per-ecosystem state machine, reports what's missing, then runs the fix.
tools
--- name: investigating-runs description: Use whenever the user mentions a GitHub Actions / GHA run, even casually — invoke this skill before reaching for raw `gh` commands, because the bundled `gha-snapshot` helper distills `gh run view --log-failed` (a firehose) into a readable block with per-job status, failed-step log tails, and annotations. Specific triggers (any one is enough): a `github.com/.../actions/runs/...` URL; the phrase "GitHub Actions" or "GHA"; the `gh run` CLI; a failing workfl