This skill should be used when the user asks to "create Terraform config", "write a .tf file", "add a Terraform module", "review Terraform code", "generate tfvars", "set up infrastructure", "create cloud resources with Terraform", or when editing any .tf or .tfvars file. Provides opinionated best practices for Terraform development including version pinning, tagging, pre-commit validation, Terratest generation, state isolation, module composition, variable validation, and naming conventions.
From terraformnpx claudepluginhub app-vitals/marketplace --plugin terraformThis skill uses the workspace's default tool permissions.
references/lint-rules.mdreferences/terratest-patterns.mdOpinionated Terraform skill distilled from 20+ years of real-world infrastructure experience. Applies automatically when working with Terraform configurations.
.tf or .tfvars filesEight practices organized by enforcement mode:
| # | Practice | Mode | Summary |
|---|---|---|---|
| 1 | Exact version pinning | lint | Pin external modules to exact versions, no ranges |
| 2 | Conservative tags | lint | Minimal tags only — never add owner |
| 3 | Pre-commit workflow | auto | Run fmt, validate, init, plan before commits |
| 4 | Terratest generation | generate | Auto-generate unit + integration tests |
| 5 | State isolation | lint | Separate state files per environment |
| 6 | Module composition | lint | Small, focused modules — one responsibility each |
| 7 | Variable validation | lint | Validation blocks on all input variables |
| 8 | Naming conventions | lint | Flag inconsistent naming within the codebase |
For detailed rules with pass/fail examples, consult references/lint-rules.md.
Apply these checks when creating or reviewing Terraform code:
Pin every external module or provider to an exact version. No ranges (~>, >=), no missing versions. Local modules (source = "./modules/foo") are exempt.
If no version is pinned on an external source, look up the latest version from the Terraform registry and suggest pinning to it. Version staleness is handled by Renovate Bot — do not flag outdated pins.
Keep tags minimal. Only include tags that serve a clear operational, compliance, or cost-allocation purpose. Never add an owner tag under any circumstances. When in doubt, leave the tag out.
Dev, staging, and prod environments must use completely separate state files. Flag any backend configuration that could result in shared state across environments. Expect the pattern:
environments/
dev/backend.tf
staging/backend.tf
prod/backend.tf
Prefer small, focused modules over large monolithic ones. Flag when a module:
Encourage splitting into composable, single-purpose modules.
All input variables should include explicit validation blocks so bad inputs fail fast at plan time. Flag variables that accept values where invalid inputs are possible but no validation block is present.
Flag obvious violations of consistent naming:
var1, res, thing)vpc_id vs vpcId)Consistency within the codebase is the goal — do not enforce a strict external schema.
Before any Terraform code is committed, run these four commands automatically and silently in sequence:
terraform fmt
terraform validate
terraform init
terraform plan
Behavior:
Whenever a Terraform module or resource is created or modified, automatically generate corresponding Terratest tests alongside the Terraform code.
Tests live adjacent to the module they test:
modules/
vpc/
main.tf
variables.tf
outputs.tf
test/
vpc_unit_test.go
vpc_integration_test.go
For Terratest patterns, examples, and boilerplate, consult references/terratest-patterns.md.
references/lint-rules.md — Detailed pass/fail examples for all lint practices (version pinning, tags, state isolation, module composition, variable validation, naming)references/terratest-patterns.md — Terratest boilerplate, unit test patterns, integration test patterns, and file placement conventions