Help us improve
Share bugs, ideas, or general feedback.
From ai-toolkit
Reviews Terraform PRs with 8-category checklist on structure, state safety, security, naming, modules, variables, providers, and CI/CD. Outputs Approved/Needs Changes/Blocked verdict for PR reviews, pre-merge checks, and audits.
npx claudepluginhub c0x12c/ai-toolkit --plugin ai-toolkitHow this skill is triggered — by the user, by Claude, or both
Slash command
/ai-toolkit:terraform-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Runs an 8-category review checklist on Terraform changes. Produces an Approved / Needs Changes / Blocked verdict.
Analyzes Terraform and similar IaC (OpenTofu, Pulumi) stacks for module structure, state backends, environments, providers, naming/tagging conventions, security patterns, CI/CD, and testing. Activates on *.tf files during discovery.
Provides quick reference for Terraform best practices including file organization, naming conventions, modules, state management, security, and anti-patterns. Useful when writing or reviewing Terraform code.
Validates, lints, audits, and plans Terraform HCL files using tflint, checkov, terraform validate/fmt/init; enforces security checklists and best practices.
Share bugs, ideas, or general feedback.
Runs an 8-category review checklist on Terraform changes. Produces an Approved / Needs Changes / Blocked verdict.
live/, modules/, envs/terraform.tf has backend + provider configvariables.tf, outputs.tf, locals.tf are separate files.terraform/ or *.tfstate* in the PR# CORRECT structure
terraform/
live/terraform.tf # backend + provider
live/variables.tf # inputs
live/locals.tf # computed values
live/outputs.tf # exports
modules/{service}/ # one resource per file
envs/{env}/ # per-environment config
# WRONG — everything in one file
terraform/main.tf # 500 lines of mixed resources
terraform state commands in automationprevent_destroy on critical resources (RDS, S3 with data)terraform state rm plan documentedcreate_before_destroy on security groups and launch configsterraform import CLI)# CORRECT — protect critical resources
resource "aws_db_instance" "main" {
lifecycle {
prevent_destroy = true
}
}
# CORRECT — zero-downtime SG updates
resource "aws_security_group" "app" {
name_prefix = "${local.name_prefix}-app-"
lifecycle {
create_before_destroy = true
}
}
.tf or .tfvars committed to gitsensitive = true0.0.0.0/0 ingress on non-ALB)* actions on * resources# WRONG — overly permissive
resource "aws_security_group_rule" "bad" {
cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 65535
}
# CORRECT — scoped to specific source
resource "aws_security_group_rule" "good" {
source_security_group_id = var.alb_security_group_id
from_port = 8080
to_port = 8080
}
local.name_prefix (pattern: {project}-{service}-{env})# CORRECT
locals {
name_prefix = "${var.project}-${var.service}-${var.env}"
}
# WRONG
resource "aws_s3_bucket" "assets" {
bucket = "my-bucket-prod" # hardcoded
}
?ref=vX.Y.Z)versions.tf with required provider versions# CORRECT — pinned version
module "rds" {
source = "git::https://github.com/{project}/terraform-modules.git//rds?ref=v1.2.0"
}
# WRONG — no version pin
module "rds" {
source = "git::https://github.com/{project}/terraform-modules.git//rds"
}
description and typesensitive = true# CORRECT
variable "instance_class" {
description = "RDS instance class"
type = string
default = "db.t3.micro"
validation {
condition = can(regex("^db\\.", var.instance_class))
error_message = "Must be a valid RDS instance class."
}
}
# WRONG — no description, no type
variable "instance_class" {}
~> (pessimistic constraint)required_version for Terraform itselflive/terraform.tf, never in modulesterraform fmt -check runs in CIterraform validate runs in CI.tf files in the PR0.0.0.0/0 ingress, missing encryptionProduces a structured review:
## Terraform Review: {PR title}
### Verdict: Approved | Needs Changes | Blocked
### Findings
#### Blocked (if any)
- [ ] **[Security]** Secrets found in terraform.tfvars — file:line
#### Needs Changes (if any)
- [ ] **[Naming]** Hardcoded bucket name in s3.tf:12
- [ ] **[Modules]** Missing version pin on RDS module
#### Suggestions (if any)
- **[Variables]** Consider adding validation on `instance_class`
### Checklist Summary
| Category | Status |
|-----------|--------|
| Structure | Pass |
| State | Pass |
| Security | Fail |
| Naming | Warn |
| Modules | Warn |
| Variables | Pass |
| Providers | Pass |
| CI/CD | Pass |