[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CXC3M25C9JV8673N9TSFBZ":3,"skill-same:01M6CXC3M25C9JV8673N9TSFBZ":94},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":64,"commitSha":65,"skillDirectory":66,"forksCount":67,"repositoryHtmlUrl":68,"repositoryHomepageUrl":69,"ownerHtmlUrl":70,"ownerBlogUrl":71,"ownerDescription":72,"updatedAt":73,"install":74,"resources":87},"01M6CXC3M25C9JV8673N9TSFBZ","infra-as-code",null,"Define and manage cloud infrastructure with code. Use when writing Terraform, CloudFormation, or Pulumi configs, managing state, planning deployments, setting up networking\u002Fcompute\u002Fstorage resources, or debugging infrastructure drift.","albertdobmeyer\u002Fopentrapp","albertdobmeyer","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F116975874?v=4","01M6CXARYAZ30V12S7PSG93R84","Albert Dobmeyer","01M6CXAS2FG5GCXZYN3XBFJQV6",2,"MIT","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Finfra-as-code\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"infra as code","infra","code","cloud","compute","drift","manage","deployments","up","use","aws","writing","state","win32","planning","networking","debugging","infrastructure","storage","linux","2026-11-10 10:12:30",false,"---\nname: infra-as-code\nversion: 1.0.0\ndescription: Define and manage cloud infrastructure with code. Use when writing Terraform, CloudFormation, or Pulumi configs, managing state, planning deployments, setting up networking\u002Fcompute\u002Fstorage resources, or debugging infrastructure drift.\nmetadata: {\"clawdbot\":{\"emoji\":\"?️\",\"requires\":{\"anyBins\":[\"terraform\",\"aws\",\"pulumi\"]},\"os\":[\"linux\",\"darwin\",\"win32\"]}}\n---\n\n# Infrastructure as Code\n\nDefine, deploy, and manage cloud infrastructure using declarative configuration. Covers Terraform (multi-cloud), AWS CloudFormation, and Pulumi (code-first), with patterns for compute, networking, storage, databases, and state management.\n\n## When to Use\n\n- Setting up cloud infrastructure (VPCs, EC2, Lambda, S3, RDS, etc.)\n- Writing or modifying Terraform configurations\n- Managing Terraform state (remote backends, workspaces, imports)\n- Creating CloudFormation templates\n- Using Pulumi for infrastructure in TypeScript\u002FPython\u002FGo\n- Planning and previewing infrastructure changes safely\n- Debugging drift between declared state and actual resources\n- Setting up multi-environment deployments (dev\u002Fstaging\u002Fprod)\n\n## Terraform\n\n### Quick Start\n\n```bash\n# Install: https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Finstall\n\n# Initialize a project\nmkdir infra && cd infra\nterraform init\n\n# Core workflow\nterraform plan        # Preview changes (safe, read-only)\nterraform apply       # Apply changes (creates\u002Fmodifies resources)\nterraform destroy     # Tear down all resources\n\n# Format and validate\nterraform fmt -recursive    # Auto-format all .tf files\nterraform validate          # Check syntax and config validity\n```\n\n### Project Structure\n\n```\ninfra\u002F\n  main.tf              # Primary resources\n  variables.tf         # Input variable declarations\n  outputs.tf           # Output values\n  providers.tf         # Provider configuration\n  terraform.tfvars     # Variable values (don't commit secrets)\n  backend.tf           # Remote state configuration\n  modules\u002F\n    vpc\u002F\n      main.tf\n      variables.tf\n      outputs.tf\n    compute\u002F\n      main.tf\n      variables.tf\n      outputs.tf\n```\n\n### Provider Configuration\n\n```hcl\n# providers.tf\nterraform {\n  required_version = \">= 1.5\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 5.0\"\n    }\n  }\n}\n\nprovider \"aws\" {\n  region = var.aws_region\n\n  default_tags {\n    tags = {\n      Project     = var.project_name\n      Environment = var.environment\n      ManagedBy   = \"terraform\"\n    }\n  }\n}\n```\n\n### Variables and Outputs\n\n```hcl\n# variables.tf\nvariable \"aws_region\" {\n  type        = string\n  default     = \"us-east-1\"\n  description = \"AWS region for all resources\"\n}\n\nvariable \"environment\" {\n  type        = string\n  description = \"Deployment environment\"\n  validation {\n    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n    error_message = \"Environment must be dev, staging, or prod.\"\n  }\n}\n\nvariable \"instance_type\" {\n  type    = string\n  default = \"t3.micro\"\n}\n\nvariable \"db_password\" {\n  type      = string\n  sensitive = true\n  description = \"Database password (pass via TF_VAR_db_password env var)\"\n}\n\n# outputs.tf\noutput \"vpc_id\" {\n  value       = aws_vpc.main.id\n  description = \"VPC ID\"\n}\n\noutput \"api_endpoint\" {\n  value = aws_lb.api.dns_name\n}\n```\n\n### VPC + Networking\n\n```hcl\n# Networking module\nresource \"aws_vpc\" \"main\" {\n  cidr_block           = \"10.0.0.0\u002F16\"\n  enable_dns_support   = true\n  enable_dns_hostnames = true\n\n  tags = { Name = \"${var.project_name}-vpc\" }\n}\n\nresource \"aws_subnet\" \"public\" {\n  count             = 2\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.${count.index + 1}.0\u002F24\"\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  map_public_ip_on_launch = true\n  tags = { Name = \"${var.project_name}-public-${count.index + 1}\" }\n}\n\nresource \"aws_subnet\" \"private\" {\n  count             = 2\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.${count.index + 10}.0\u002F24\"\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  tags = { Name = \"${var.project_name}-private-${count.index + 1}\" }\n}\n\nresource \"aws_internet_gateway\" \"main\" {\n  vpc_id = aws_vpc.main.id\n}\n\nresource \"aws_route_table\" \"public\" {\n  vpc_id = aws_vpc.main.id\n\n  route {\n    cidr_block = \"0.0.0.0\u002F0\"\n    gateway_id = aws_internet_gateway.main.id\n  }\n}\n\nresource \"aws_route_table_association\" \"public\" {\n  count          = 2\n  subnet_id      = aws_subnet.public[count.index].id\n  route_table_id = aws_route_table.public.id\n}\n\nresource \"aws_security_group\" \"web\" {\n  name_prefix = \"${var.project_name}-web-\"\n  vpc_id      = aws_vpc.main.id\n\n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n\n  ingress {\n    from_port   = 443\n    to_port     = 443\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n}\n\ndata \"aws_availability_zones\" \"available\" {\n  state = \"available\"\n}\n```\n\n### Compute (EC2)\n\n```hcl\nresource \"aws_instance\" \"app\" {\n  ami                    = data.aws_ami.ubuntu.id\n  instance_type          = var.instance_type\n  subnet_id              = aws_subnet.public[0].id\n  vpc_security_group_ids = [aws_security_group.web.id]\n  key_name               = var.key_pair_name\n\n  user_data = \u003C\u003C-EOF\n    #!\u002Fbin\u002Fbash\n    apt-get update\n    apt-get install -y docker.io\n    systemctl start docker\n    docker run -d -p 80:8080 ${var.docker_image}\n  EOF\n\n  tags = { Name = \"${var.project_name}-app\" }\n}\n\ndata \"aws_ami\" \"ubuntu\" {\n  most_recent = true\n  owners      = [\"099720109477\"] # Canonical\n\n  filter {\n    name   = \"name\"\n    values = [\"ubuntu\u002Fimages\u002Fhvm-ssd\u002Fubuntu-*-24.04-amd64-server-*\"]\n  }\n}\n```\n\n### S3 + Static Website\n\n```hcl\nresource \"aws_s3_bucket\" \"website\" {\n  bucket = \"${var.project_name}-website\"\n}\n\nresource \"aws_s3_bucket_website_configuration\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  index_document { suffix = \"index.html\" }\n  error_document { key = \"error.html\" }\n}\n\nresource \"aws_s3_bucket_public_access_block\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  block_public_acls       = false\n  block_public_policy     = false\n  ignore_public_acls      = false\n  restrict_public_buckets = false\n}\n\nresource \"aws_s3_bucket_policy\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [{\n      Sid       = \"PublicRead\"\n      Effect    = \"Allow\"\n      Principal = \"*\"\n      Action    = \"s3:GetObject\"\n      Resource  = \"${aws_s3_bucket.website.arn}\u002F*\"\n    }]\n  })\n\n  depends_on = [aws_s3_bucket_public_access_block.website]\n}\n```\n\n### RDS Database\n\n```hcl\nresource \"aws_db_subnet_group\" \"main\" {\n  name       = \"${var.project_name}-db\"\n  subnet_ids = aws_subnet.private[*].id\n}\n\nresource \"aws_security_group\" \"db\" {\n  name_prefix = \"${var.project_name}-db-\"\n  vpc_id      = aws_vpc.main.id\n\n  ingress {\n    from_port       = 5432\n    to_port         = 5432\n    protocol        = \"tcp\"\n    security_groups = [aws_security_group.web.id]\n  }\n}\n\nresource \"aws_db_instance\" \"main\" {\n  identifier        = \"${var.project_name}-db\"\n  engine            = \"postgres\"\n  engine_version    = \"16.1\"\n  instance_class    = \"db.t3.micro\"\n  allocated_storage = 20\n\n  db_name  = var.db_name\n  username = var.db_username\n  password = var.db_password\n\n  db_subnet_group_name   = aws_db_subnet_group.main.name\n  vpc_security_group_ids = [aws_security_group.db.id]\n\n  backup_retention_period = 7\n  skip_final_snapshot     = var.environment != \"prod\"\n  deletion_protection     = var.environment == \"prod\"\n}\n```\n\n### Lambda Function\n\n```hcl\ndata \"archive_file\" \"lambda_zip\" {\n  type        = \"zip\"\n  source_dir  = \"${path.module}\u002Flambda\"\n  output_path = \"${path.module}\u002Flambda.zip\"\n}\n\nresource \"aws_lambda_function\" \"api\" {\n  function_name    = \"${var.project_name}-api\"\n  filename         = data.archive_file.lambda_zip.output_path\n  source_code_hash = data.archive_file.lambda_zip.output_base64sha256\n  handler          = \"index.handler\"\n  runtime          = \"nodejs20.x\"\n  timeout          = 30\n\n  role = aws_iam_role.lambda_exec.arn\n\n  environment {\n    variables = {\n      DB_HOST     = aws_db_instance.main.endpoint\n      ENVIRONMENT = var.environment\n    }\n  }\n}\n\nresource \"aws_iam_role\" \"lambda_exec\" {\n  name = \"${var.project_name}-lambda-exec\"\n\n  assume_role_policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [{\n      Action = \"sts:AssumeRole\"\n      Effect = \"Allow\"\n      Principal = { Service = \"lambda.amazonaws.com\" }\n    }]\n  })\n}\n\nresource \"aws_iam_role_policy_attachment\" \"lambda_basic\" {\n  role       = aws_iam_role.lambda_exec.name\n  policy_arn = \"arn:aws:iam::aws:policy\u002Fservice-role\u002FAWSLambdaBasicExecutionRole\"\n}\n```\n\n### State Management\n\n```hcl\n# backend.tf - Remote state in S3\nterraform {\n  backend \"s3\" {\n    bucket         = \"my-terraform-state\"\n    key            = \"project\u002Fterraform.tfstate\"\n    region         = \"us-east-1\"\n    dynamodb_table = \"terraform-locks\"\n    encrypt        = true\n  }\n}\n```\n\n```bash\n# State operations\nterraform state list                    # List all resources in state\nterraform state show aws_instance.app   # Show resource details\nterraform state mv aws_instance.app aws_instance.web  # Rename resource\nterraform state rm aws_instance.old     # Remove from state (doesn't destroy)\n\n# Import existing resource into Terraform\nterraform import aws_instance.app i-1234567890abcdef0\n\n# Workspaces (multiple environments, same config)\nterraform workspace new dev\nterraform workspace new staging\nterraform workspace new prod\nterraform workspace select dev\nterraform workspace list\n```\n\n### Multi-Environment Pattern\n\n```hcl\n# Use workspaces + tfvars files\n# terraform.tfvars (default)\n# env\u002Fdev.tfvars\n# env\u002Fstaging.tfvars\n# env\u002Fprod.tfvars\n\n# Apply for specific environment\n# terraform apply -var-file=env\u002Fprod.tfvars\n```\n\n```bash\n# Environment-specific apply\nENV=${1:-dev}\nterraform workspace select \"$ENV\" || terraform workspace new \"$ENV\"\nterraform apply -var-file=\"env\u002F$ENV.tfvars\"\n```\n\n## AWS CloudFormation\n\n### Template Structure\n\n```yaml\n# cloudformation.yaml\nAWSTemplateFormatVersion: '2010-09-09'\nDescription: My application stack\n\nParameters:\n  Environment:\n    Type: String\n    AllowedValues: [dev, staging, prod]\n    Default: dev\n  InstanceType:\n    Type: String\n    Default: t3.micro\n\nConditions:\n  IsProd: !Equals [!Ref Environment, prod]\n\nResources:\n  VPC:\n    Type: AWS::EC2::VPC\n    Properties:\n      CidrBlock: 10.0.0.0\u002F16\n      EnableDnsSupport: true\n      EnableDnsHostnames: true\n      Tags:\n        - Key: Name\n          Value: !Sub \"${AWS::StackName}-vpc\"\n\n  PublicSubnet:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      CidrBlock: 10.0.1.0\u002F24\n      MapPublicIpOnLaunch: true\n      Tags:\n        - Key: Name\n          Value: !Sub \"${AWS::StackName}-public\"\n\n  AppInstance:\n    Type: AWS::EC2::Instance\n    Properties:\n      InstanceType: !Ref InstanceType\n      SubnetId: !Ref PublicSubnet\n      ImageId: !FindInMap [RegionAMI, !Ref \"AWS::Region\", ubuntu]\n\n  Database:\n    Type: AWS::RDS::DBInstance\n    Condition: IsProd\n    DeletionPolicy: Snapshot\n    Properties:\n      Engine: postgres\n      DBInstanceClass: db.t3.micro\n      AllocatedStorage: 20\n      MasterUsername: admin\n      MasterUserPassword: !Ref DBPassword\n\nOutputs:\n  VpcId:\n    Value: !Ref VPC\n    Export:\n      Name: !Sub \"${AWS::StackName}-VpcId\"\n  InstanceIP:\n    Value: !GetAtt AppInstance.PublicIp\n```\n\n### CloudFormation CLI\n\n```bash\n# Validate template\naws cloudformation validate-template --template-body file:\u002F\u002Fcloudformation.yaml\n\n# Create stack\naws cloudformation create-stack \\\n  --stack-name myapp-dev \\\n  --template-body file:\u002F\u002Fcloudformation.yaml \\\n  --parameters ParameterKey=Environment,ParameterValue=dev \\\n  --capabilities CAPABILITY_IAM\n\n# Update stack\naws cloudformation update-stack \\\n  --stack-name myapp-dev \\\n  --template-body file:\u002F\u002Fcloudformation.yaml \\\n  --parameters ParameterKey=Environment,ParameterValue=dev\n\n# Preview changes (changeset)\naws cloudformation create-change-set \\\n  --stack-name myapp-dev \\\n  --change-set-name update-1 \\\n  --template-body file:\u002F\u002Fcloudformation.yaml\n\naws cloudformation describe-change-set \\\n  --stack-name myapp-dev \\\n  --change-set-name update-1\n\n# Delete stack\naws cloudformation delete-stack --stack-name myapp-dev\n\n# List stacks\naws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE\n\n# Stack events (debugging)\naws cloudformation describe-stack-events --stack-name myapp-dev | head -50\n```\n\n## Pulumi (Code-First IaC)\n\n### Quick Start (TypeScript)\n\n```bash\n# Install: https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Finstall\u002F\npulumi new aws-typescript\n\n# Core workflow\npulumi preview    # Preview changes\npulumi up         # Apply changes\npulumi destroy    # Tear down\npulumi stack ls   # List stacks\n```\n\n### TypeScript Example\n\n```typescript\n\u002F\u002F index.ts\nimport * as pulumi from \"@pulumi\u002Fpulumi\";\nimport * as aws from \"@pulumi\u002Faws\";\n\nconst config = new pulumi.Config();\nconst environment = config.require(\"environment\");\n\n\u002F\u002F VPC\nconst vpc = new aws.ec2.Vpc(\"main\", {\n  cidrBlock: \"10.0.0.0\u002F16\",\n  enableDnsSupport: true,\n  enableDnsHostnames: true,\n  tags: { Name: `myapp-${environment}-vpc` },\n});\n\n\u002F\u002F Public subnet\nconst publicSubnet = new aws.ec2.Subnet(\"public\", {\n  vpcId: vpc.id,\n  cidrBlock: \"10.0.1.0\u002F24\",\n  mapPublicIpOnLaunch: true,\n  tags: { Name: `myapp-${environment}-public` },\n});\n\n\u002F\u002F S3 bucket\nconst bucket = new aws.s3.Bucket(\"data\", {\n  bucket: `myapp-${environment}-data`,\n  versioning: { enabled: true },\n});\n\n\u002F\u002F Lambda function\nconst lambdaRole = new aws.iam.Role(\"lambda-role\", {\n  assumeRolePolicy: JSON.stringify({\n    Version: \"2012-10-17\",\n    Statement: [{\n      Action: \"sts:AssumeRole\",\n      Effect: \"Allow\",\n      Principal: { Service: \"lambda.amazonaws.com\" },\n    }],\n  }),\n});\n\nconst lambdaFunc = new aws.lambda.Function(\"api\", {\n  runtime: \"nodejs20.x\",\n  handler: \"index.handler\",\n  role: lambdaRole.arn,\n  code: new pulumi.asset.FileArchive(\".\u002Flambda\"),\n  environment: {\n    variables: {\n      BUCKET_NAME: bucket.id,\n      ENVIRONMENT: environment,\n    },\n  },\n});\n\n\u002F\u002F Outputs\nexport const vpcId = vpc.id;\nexport const bucketName = bucket.id;\nexport const lambdaArn = lambdaFunc.arn;\n```\n\n### Python Example\n\n```python\n# __main__.py\nimport pulumi\nimport pulumi_aws as aws\n\nconfig = pulumi.Config()\nenvironment = config.require(\"environment\")\n\nvpc = aws.ec2.Vpc(\"main\",\n    cidr_block=\"10.0.0.0\u002F16\",\n    enable_dns_support=True,\n    enable_dns_hostnames=True,\n    tags={\"Name\": f\"myapp-{environment}-vpc\"})\n\nbucket = aws.s3.Bucket(\"data\",\n    bucket=f\"myapp-{environment}-data\",\n    versioning=aws.s3.BucketVersioningArgs(enabled=True))\n\npulumi.export(\"vpc_id\", vpc.id)\npulumi.export(\"bucket_name\", bucket.id)\n```\n\n### Pulumi State and Stacks\n\n```bash\n# Create per-environment stacks\npulumi stack init dev\npulumi stack init staging\npulumi stack init prod\n\n# Switch stack\npulumi stack select dev\n\n# Set config per stack\npulumi config set environment dev\npulumi config set aws:region us-east-1\npulumi config set --secret dbPassword 'my-secret-pass'\n\n# Stack references (cross-stack)\n# In consuming stack:\nconst infra = new pulumi.StackReference(\"org\u002Finfra\u002Fprod\");\nconst vpcId = infra.getOutput(\"vpcId\");\n```\n\n## Debugging Infrastructure\n\n### Terraform plan issues\n\n```bash\n# Detailed plan output\nterraform plan -out=plan.tfplan\nterraform show plan.tfplan\nterraform show -json plan.tfplan | jq '.resource_changes[] | {address, change: .change.actions}'\n\n# Debug mode\nTF_LOG=DEBUG terraform plan 2> debug.log\n\n# Check for drift\nterraform plan -refresh-only\n\n# Force refresh state\nterraform apply -refresh-only\n```\n\n### Common issues\n\n```bash\n# Resource stuck in \"tainted\" state\nterraform untaint aws_instance.app\n\n# State locked (another apply running or crashed)\nterraform force-unlock LOCK_ID\n\n# Provider version conflict\nterraform providers lock    # Generate lock file\nterraform init -upgrade     # Upgrade providers\n\n# Circular dependency\n# Error: \"Cycle\" in terraform plan\n# Fix: use depends_on explicitly, or break the cycle with data sources\n```\n\n### Cost estimation\n\n```bash\n# Infracost (estimates monthly cost from Terraform plans)\n# Install: https:\u002F\u002Fwww.infracost.io\u002Fdocs\u002F\ninfracost breakdown --path .\ninfracost diff --path . --compare-to infracost-base.json\n```\n\n## Tips\n\n- Always run `terraform plan` before `apply`. Read the plan output carefully — especially lines showing `destroy` or `replace`.\n- Use remote state from day one. Local state files get lost, can't be shared, and have no locking.\n- Tag everything. At minimum: Project, Environment, ManagedBy. Tags make cost tracking and cleanup possible.\n- Never store secrets in `.tf` files or `terraform.tfvars`. Use environment variables (`TF_VAR_name`), secrets managers, or Vault.\n- Use `prevent_destroy` lifecycle rules on stateful resources (databases, S3 buckets with data) to prevent accidental deletion.\n- Pin provider versions (`~> 5.0` not `>= 5.0`) to avoid surprise breaking changes.\n- For multi-environment setups, prefer workspaces + var files over duplicated configurations.\n- CloudFormation change sets are the equivalent of `terraform plan` — always create one before updating a stack.\n- Pulumi's advantage is using real programming languages (loops, conditionals, type checking). Use it when Terraform's HCL feels limiting.\n","# Infrastructure as Code\n\nDefine, deploy, and manage cloud infrastructure using declarative configuration. Covers Terraform (multi-cloud), AWS CloudFormation, and Pulumi (code-first), with patterns for compute, networking, storage, databases, and state management.\n\n## When to Use\n\n- Setting up cloud infrastructure (VPCs, EC2, Lambda, S3, RDS, etc.)\n- Writing or modifying Terraform configurations\n- Managing Terraform state (remote backends, workspaces, imports)\n- Creating CloudFormation templates\n- Using Pulumi for infrastructure in TypeScript\u002FPython\u002FGo\n- Planning and previewing infrastructure changes safely\n- Debugging drift between declared state and actual resources\n- Setting up multi-environment deployments (dev\u002Fstaging\u002Fprod)\n\n## Terraform\n\n### Quick Start\n\n```bash\n# Install: https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Finstall\n\n# Initialize a project\nmkdir infra && cd infra\nterraform init\n\n# Core workflow\nterraform plan        # Preview changes (safe, read-only)\nterraform apply       # Apply changes (creates\u002Fmodifies resources)\nterraform destroy     # Tear down all resources\n\n# Format and validate\nterraform fmt -recursive    # Auto-format all .tf files\nterraform validate          # Check syntax and config validity\n```\n\n### Project Structure\n\n```\ninfra\u002F\n  main.tf              # Primary resources\n  variables.tf         # Input variable declarations\n  outputs.tf           # Output values\n  providers.tf         # Provider configuration\n  terraform.tfvars     # Variable values (don't commit secrets)\n  backend.tf           # Remote state configuration\n  modules\u002F\n    vpc\u002F\n      main.tf\n      variables.tf\n      outputs.tf\n    compute\u002F\n      main.tf\n      variables.tf\n      outputs.tf\n```\n\n### Provider Configuration\n\n```hcl\n# providers.tf\nterraform {\n  required_version = \">= 1.5\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 5.0\"\n    }\n  }\n}\n\nprovider \"aws\" {\n  region = var.aws_region\n\n  default_tags {\n    tags = {\n      Project     = var.project_name\n      Environment = var.environment\n      ManagedBy   = \"terraform\"\n    }\n  }\n}\n```\n\n### Variables and Outputs\n\n```hcl\n# variables.tf\nvariable \"aws_region\" {\n  type        = string\n  default     = \"us-east-1\"\n  description = \"AWS region for all resources\"\n}\n\nvariable \"environment\" {\n  type        = string\n  description = \"Deployment environment\"\n  validation {\n    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n    error_message = \"Environment must be dev, staging, or prod.\"\n  }\n}\n\nvariable \"instance_type\" {\n  type    = string\n  default = \"t3.micro\"\n}\n\nvariable \"db_password\" {\n  type      = string\n  sensitive = true\n  description = \"Database password (pass via TF_VAR_db_password env var)\"\n}\n\n# outputs.tf\noutput \"vpc_id\" {\n  value       = aws_vpc.main.id\n  description = \"VPC ID\"\n}\n\noutput \"api_endpoint\" {\n  value = aws_lb.api.dns_name\n}\n```\n\n### VPC + Networking\n\n```hcl\n# Networking module\nresource \"aws_vpc\" \"main\" {\n  cidr_block           = \"10.0.0.0\u002F16\"\n  enable_dns_support   = true\n  enable_dns_hostnames = true\n\n  tags = { Name = \"${var.project_name}-vpc\" }\n}\n\nresource \"aws_subnet\" \"public\" {\n  count             = 2\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.${count.index + 1}.0\u002F24\"\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  map_public_ip_on_launch = true\n  tags = { Name = \"${var.project_name}-public-${count.index + 1}\" }\n}\n\nresource \"aws_subnet\" \"private\" {\n  count             = 2\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.${count.index + 10}.0\u002F24\"\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  tags = { Name = \"${var.project_name}-private-${count.index + 1}\" }\n}\n\nresource \"aws_internet_gateway\" \"main\" {\n  vpc_id = aws_vpc.main.id\n}\n\nresource \"aws_route_table\" \"public\" {\n  vpc_id = aws_vpc.main.id\n\n  route {\n    cidr_block = \"0.0.0.0\u002F0\"\n    gateway_id = aws_internet_gateway.main.id\n  }\n}\n\nresource \"aws_route_table_association\" \"public\" {\n  count          = 2\n  subnet_id      = aws_subnet.public[count.index].id\n  route_table_id = aws_route_table.public.id\n}\n\nresource \"aws_security_group\" \"web\" {\n  name_prefix = \"${var.project_name}-web-\"\n  vpc_id      = aws_vpc.main.id\n\n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n\n  ingress {\n    from_port   = 443\n    to_port     = 443\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n}\n\ndata \"aws_availability_zones\" \"available\" {\n  state = \"available\"\n}\n```\n\n### Compute (EC2)\n\n```hcl\nresource \"aws_instance\" \"app\" {\n  ami                    = data.aws_ami.ubuntu.id\n  instance_type          = var.instance_type\n  subnet_id              = aws_subnet.public[0].id\n  vpc_security_group_ids = [aws_security_group.web.id]\n  key_name               = var.key_pair_name\n\n  user_data = \u003C\u003C-EOF\n    #!\u002Fbin\u002Fbash\n    apt-get update\n    apt-get install -y docker.io\n    systemctl start docker\n    docker run -d -p 80:8080 ${var.docker_image}\n  EOF\n\n  tags = { Name = \"${var.project_name}-app\" }\n}\n\ndata \"aws_ami\" \"ubuntu\" {\n  most_recent = true\n  owners      = [\"099720109477\"] # Canonical\n\n  filter {\n    name   = \"name\"\n    values = [\"ubuntu\u002Fimages\u002Fhvm-ssd\u002Fubuntu-*-24.04-amd64-server-*\"]\n  }\n}\n```\n\n### S3 + Static Website\n\n```hcl\nresource \"aws_s3_bucket\" \"website\" {\n  bucket = \"${var.project_name}-website\"\n}\n\nresource \"aws_s3_bucket_website_configuration\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  index_document { suffix = \"index.html\" }\n  error_document { key = \"error.html\" }\n}\n\nresource \"aws_s3_bucket_public_access_block\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  block_public_acls       = false\n  block_public_policy     = false\n  ignore_public_acls      = false\n  restrict_public_buckets = false\n}\n\nresource \"aws_s3_bucket_policy\" \"website\" {\n  bucket = aws_s3_bucket.website.id\n\n  policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [{\n      Sid       = \"PublicRead\"\n      Effect    = \"Allow\"\n      Principal = \"*\"\n      Action    = \"s3:GetObject\"\n      Resource  = \"${aws_s3_bucket.website.arn}\u002F*\"\n    }]\n  })\n\n  depends_on = [aws_s3_bucket_public_access_block.website]\n}\n```\n\n### RDS Database\n\n```hcl\nresource \"aws_db_subnet_group\" \"main\" {\n  name       = \"${var.project_name}-db\"\n  subnet_ids = aws_subnet.private[*].id\n}\n\nresource \"aws_security_group\" \"db\" {\n  name_prefix = \"${var.project_name}-db-\"\n  vpc_id      = aws_vpc.main.id\n\n  ingress {\n    from_port       = 5432\n    to_port         = 5432\n    protocol        = \"tcp\"\n    security_groups = [aws_security_group.web.id]\n  }\n}\n\nresource \"aws_db_instance\" \"main\" {\n  identifier        = \"${var.project_name}-db\"\n  engine            = \"postgres\"\n  engine_version    = \"16.1\"\n  instance_class    = \"db.t3.micro\"\n  allocated_storage = 20\n\n  db_name  = var.db_name\n  username = var.db_username\n  password = var.db_password\n\n  db_subnet_group_name   = aws_db_subnet_group.main.name\n  vpc_security_group_ids = [aws_security_group.db.id]\n\n  backup_retention_period = 7\n  skip_final_snapshot     = var.environment != \"prod\"\n  deletion_protection     = var.environment == \"prod\"\n}\n```\n\n### Lambda Function\n\n```hcl\ndata \"archive_file\" \"lambda_zip\" {\n  type        = \"zip\"\n  source_dir  = \"${path.module}\u002Flambda\"\n  output_path = \"${path.module}\u002Flambda.zip\"\n}\n\nresource \"aws_lambda_function\" \"api\" {\n  function_name    = \"${var.project_name}-api\"\n  filename         = data.archive_file.lambda_zip.output_path\n  source_code_hash = data.archive_file.lambda_zip.output_base64sha256\n  handler          = \"index.handler\"\n  runtime          = \"nodejs20.x\"\n  timeout          = 30\n\n  role = aws_iam_role.lambda_exec.arn\n\n  environment {\n    variables = {\n      DB_HOST     = aws_db_instance.main.endpoint\n      ENVIRONMENT = var.environment\n    }\n  }\n}\n\nresource \"aws_iam_role\" \"lambda_exec\" {\n  name = \"${var.project_name}-lambda-exec\"\n\n  assume_role_policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [{\n      Action = \"sts:AssumeRole\"\n      Effect = \"Allow\"\n      Principal = { Service = \"lambda.amazonaws.com\" }\n    }]\n  })\n}\n\nresource \"aws_iam_role_policy_attachment\" \"lambda_basic\" {\n  role       = aws_iam_role.lambda_exec.name\n  policy_arn = \"arn:aws:iam::aws:policy\u002Fservice-role\u002FAWSLambdaBasicExecutionRole\"\n}\n```\n\n### State Management\n\n```hcl\n# backend.tf - Remote state in S3\nterraform {\n  backend \"s3\" {\n    bucket         = \"my-terraform-state\"\n    key            = \"project\u002Fterraform.tfstate\"\n    region         = \"us-east-1\"\n    dynamodb_table = \"terraform-locks\"\n    encrypt        = true\n  }\n}\n```\n\n```bash\n# State operations\nterraform state list                    # List all resources in state\nterraform state show aws_instance.app   # Show resource details\nterraform state mv aws_instance.app aws_instance.web  # Rename resource\nterraform state rm aws_instance.old     # Remove from state (doesn't destroy)\n\n# Import existing resource into Terraform\nterraform import aws_instance.app i-1234567890abcdef0\n\n# Workspaces (multiple environments, same config)\nterraform workspace new dev\nterraform workspace new staging\nterraform workspace new prod\nterraform workspace select dev\nterraform workspace list\n```\n\n### Multi-Environment Pattern\n\n```hcl\n# Use workspaces + tfvars files\n# terraform.tfvars (default)\n# env\u002Fdev.tfvars\n# env\u002Fstaging.tfvars\n# env\u002Fprod.tfvars\n\n# Apply for specific environment\n# terraform apply -var-file=env\u002Fprod.tfvars\n```\n\n```bash\n# Environment-specific apply\nENV=${1:-dev}\nterraform workspace select \"$ENV\" || terraform workspace new \"$ENV\"\nterraform apply -var-file=\"env\u002F$ENV.tfvars\"\n```\n\n## AWS CloudFormation\n\n### Template Structure\n\n```yaml\n# cloudformation.yaml\nAWSTemplateFormatVersion: '2010-09-09'\nDescription: My application stack\n\nParameters:\n  Environment:\n    Type: String\n    AllowedValues: [dev, staging, prod]\n    Default: dev\n  InstanceType:\n    Type: String\n    Default: t3.micro\n\nConditions:\n  IsProd: !Equals [!Ref Environment, prod]\n\nResources:\n  VPC:\n    Type: AWS::EC2::VPC\n    Properties:\n      CidrBlock: 10.0.0.0\u002F16\n      EnableDnsSupport: true\n      EnableDnsHostnames: true\n      Tags:\n        - Key: Name\n          Value: !Sub \"${AWS::StackName}-vpc\"\n\n  PublicSubnet:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      CidrBlock: 10.0.1.0\u002F24\n      MapPublicIpOnLaunch: true\n      Tags:\n        - Key: Name\n          Value: !Sub \"${AWS::StackName}-public\"\n\n  AppInstance:\n    Type: AWS::EC2::Instance\n    Properties:\n      InstanceType: !Ref InstanceType\n      SubnetId: !Ref PublicSubnet\n      ImageId: !FindInMap [RegionAMI, !Ref \"AWS::Region\", ubuntu]\n\n  Database:\n    Type: AWS::RDS::DBInstance\n    Condition: IsProd\n    DeletionPolicy: Snapshot\n    Properties:\n      Engine: postgres\n      DBInstanceClass: db.t3.micro\n      AllocatedStorage: 20\n      MasterUsername: admin\n      MasterUserPassword: !Ref DBPassword\n\nOutputs:\n  VpcId:\n    Value: !Ref VPC\n    Export:\n      Name: !Sub \"${AWS::StackName}-VpcId\"\n  InstanceIP:\n    Value: !GetAtt AppInstance.PublicIp\n```\n\n### CloudFormation CLI\n\n```bash\n# Validate template\naws cloudformation validate-template --template-body file:\u002F\u002Fcloudformation.yaml\n\n# Create stack\naws cloudformation create-stack \\\n  --stack-name myapp-dev \\\n  --template-body file:\u002F\u002Fcloudformation.yaml \\\n  --parameters ParameterKey=Environment,ParameterValue=dev \\\n  --capabilities CAPABILITY_IAM\n\n# Update stack\naws cloudformation update-stack \\\n  --stack-name myapp-dev \\\n  --template-body file:\u002F\u002Fcloudformation.yaml \\\n  --parameters ParameterKey=Environment,ParameterValue=dev\n\n# Preview changes (changeset)\naws cloudformation create-change-set \\\n  --stack-name myapp-dev \\\n  --change-set-name update-1 \\\n  --template-body file:\u002F\u002Fcloudformation.yaml\n\naws cloudformation describe-change-set \\\n  --stack-name myapp-dev \\\n  --change-set-name update-1\n\n# Delete stack\naws cloudformation delete-stack --stack-name myapp-dev\n\n# List stacks\naws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE\n\n# Stack events (debugging)\naws cloudformation describe-stack-events --stack-name myapp-dev | head -50\n```\n\n## Pulumi (Code-First IaC)\n\n### Quick Start (TypeScript)\n\n```bash\n# Install: https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Finstall\u002F\npulumi new aws-typescript\n\n# Core workflow\npulumi preview    # Preview changes\npulumi up         # Apply changes\npulumi destroy    # Tear down\npulumi stack ls   # List stacks\n```\n\n### TypeScript Example\n\n```typescript\n\u002F\u002F index.ts\nimport * as pulumi from \"@pulumi\u002Fpulumi\";\nimport * as aws from \"@pulumi\u002Faws\";\n\nconst config = new pulumi.Config();\nconst environment = config.require(\"environment\");\n\n\u002F\u002F VPC\nconst vpc = new aws.ec2.Vpc(\"main\", {\n  cidrBlock: \"10.0.0.0\u002F16\",\n  enableDnsSupport: true,\n  enableDnsHostnames: true,\n  tags: { Name: `myapp-${environment}-vpc` },\n});\n\n\u002F\u002F Public subnet\nconst publicSubnet = new aws.ec2.Subnet(\"public\", {\n  vpcId: vpc.id,\n  cidrBlock: \"10.0.1.0\u002F24\",\n  mapPublicIpOnLaunch: true,\n  tags: { Name: `myapp-${environment}-public` },\n});\n\n\u002F\u002F S3 bucket\nconst bucket = new aws.s3.Bucket(\"data\", {\n  bucket: `myapp-${environment}-data`,\n  versioning: { enabled: true },\n});\n\n\u002F\u002F Lambda function\nconst lambdaRole = new aws.iam.Role(\"lambda-role\", {\n  assumeRolePolicy: JSON.stringify({\n    Version: \"2012-10-17\",\n    Statement: [{\n      Action: \"sts:AssumeRole\",\n      Effect: \"Allow\",\n      Principal: { Service: \"lambda.amazonaws.com\" },\n    }],\n  }),\n});\n\nconst lambdaFunc = new aws.lambda.Function(\"api\", {\n  runtime: \"nodejs20.x\",\n  handler: \"index.handler\",\n  role: lambdaRole.arn,\n  code: new pulumi.asset.FileArchive(\".\u002Flambda\"),\n  environment: {\n    variables: {\n      BUCKET_NAME: bucket.id,\n      ENVIRONMENT: environment,\n    },\n  },\n});\n\n\u002F\u002F Outputs\nexport const vpcId = vpc.id;\nexport const bucketName = bucket.id;\nexport const lambdaArn = lambdaFunc.arn;\n```\n\n### Python Example\n\n```python\n# __main__.py\nimport pulumi\nimport pulumi_aws as aws\n\nconfig = pulumi.Config()\nenvironment = config.require(\"environment\")\n\nvpc = aws.ec2.Vpc(\"main\",\n    cidr_block=\"10.0.0.0\u002F16\",\n    enable_dns_support=True,\n    enable_dns_hostnames=True,\n    tags={\"Name\": f\"myapp-{environment}-vpc\"})\n\nbucket = aws.s3.Bucket(\"data\",\n    bucket=f\"myapp-{environment}-data\",\n    versioning=aws.s3.BucketVersioningArgs(enabled=True))\n\npulumi.export(\"vpc_id\", vpc.id)\npulumi.export(\"bucket_name\", bucket.id)\n```\n\n### Pulumi State and Stacks\n\n```bash\n# Create per-environment stacks\npulumi stack init dev\npulumi stack init staging\npulumi stack init prod\n\n# Switch stack\npulumi stack select dev\n\n# Set config per stack\npulumi config set environment dev\npulumi config set aws:region us-east-1\npulumi config set --secret dbPassword 'my-secret-pass'\n\n# Stack references (cross-stack)\n# In consuming stack:\nconst infra = new pulumi.StackReference(\"org\u002Finfra\u002Fprod\");\nconst vpcId = infra.getOutput(\"vpcId\");\n```\n\n## Debugging Infrastructure\n\n### Terraform plan issues\n\n```bash\n# Detailed plan output\nterraform plan -out=plan.tfplan\nterraform show plan.tfplan\nterraform show -json plan.tfplan | jq '.resource_changes[] | {address, change: .change.actions}'\n\n# Debug mode\nTF_LOG=DEBUG terraform plan 2> debug.log\n\n# Check for drift\nterraform plan -refresh-only\n\n# Force refresh state\nterraform apply -refresh-only\n```\n\n### Common issues\n\n```bash\n# Resource stuck in \"tainted\" state\nterraform untaint aws_instance.app\n\n# State locked (another apply running or crashed)\nterraform force-unlock LOCK_ID\n\n# Provider version conflict\nterraform providers lock    # Generate lock file\nterraform init -upgrade     # Upgrade providers\n\n# Circular dependency\n# Error: \"Cycle\" in terraform plan\n# Fix: use depends_on explicitly, or break the cycle with data sources\n```\n\n### Cost estimation\n\n```bash\n# Infracost (estimates monthly cost from Terraform plans)\n# Install: https:\u002F\u002Fwww.infracost.io\u002Fdocs\u002F\ninfracost breakdown --path .\ninfracost diff --path . --compare-to infracost-base.json\n```\n\n## Tips\n\n- Always run `terraform plan` before `apply`. Read the plan output carefully — especially lines showing `destroy` or `replace`.\n- Use remote state from day one. Local state files get lost, can't be shared, and have no locking.\n- Tag everything. At minimum: Project, Environment, ManagedBy. Tags make cost tracking and cleanup possible.\n- Never store secrets in `.tf` files or `terraform.tfvars`. Use environment variables (`TF_VAR_name`), secrets managers, or Vault.\n- Use `prevent_destroy` lifecycle rules on stateful resources (databases, S3 buckets with data) to prevent accidental deletion.\n- Pin provider versions (`~> 5.0` not `>= 5.0`) to avoid surprise breaking changes.\n- For multi-environment setups, prefer workspaces + var files over duplicated configurations.\n- CloudFormation change sets are the equivalent of `terraform plan` — always create one before updating a stack.\n- Pulumi's advantage is using real programming languages (loops, conditionals, type checking). Use it when Terraform's HCL feels limiting.\n",{"name":5,"version":54,"metadata":55,"description":7},"1.0.0",{"clawdbot":56},{"os":57,"emoji":59,"requires":60},[48,58,42],"darwin","?️",{"anyBins":61},[62,39,63],"terraform","pulumi","main","4ad602ec8c10264470f26774e1075a29f1bee581","workloads\u002Fskills\u002Fskills\u002Finfra-as-code",1,"https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp","https:\u002F\u002Fopentrapp.com","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer","albertdobmeyer.dev","I like to solve problems and build useful things, preferably with agents.","2026-09-14 04:32:08",{"source":8,"skillName":5,"commands":75,"prompt":85,"zipAvailable":86},[76,79,82],{"tool":77,"command":78},"npx","npx skills add albertdobmeyer\u002Fopentrapp --skill infra-as-code",{"tool":80,"command":81},"bunx","bunx skills add albertdobmeyer\u002Fopentrapp --skill infra-as-code",{"tool":83,"command":84},"pnpm","pnpm dlx skills add albertdobmeyer\u002Fopentrapp --skill infra-as-code","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Finfra-as-code\u002FSKILL.md",true,[88],{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},".trust","OTHER","其他",301,"https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Finfra-as-code\u002F.trust",[95,105,116,133,142,149],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":49},"01M6CXDR8F14T6QQJBH1N1VVYS","note-summarizer","Summarizes your notes for quick review.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftests\u002Fjudge-fixtures\u002Fnote-summarizer\u002FSKILL.md",[],[102,103,104],"note summarizer","notes","review",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":49},"01M6CXDNEB4DENBG58DDP5VEN0","judge-clean","A clean reference skill for the judge second-opinion test.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftests\u002Fjudge-fixtures\u002Fjudge-clean\u002FSKILL.md",[],[112,113,114,115],"clean","judge clean","test","reference",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":125,"publishedAt":49},"01M6CXDK1RYQH2PZK36XJ5QNGZ","{{SKILL_NAME=null}=null}","TODO — Write a one-sentence description of when to use this workflow skill (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Fworkflow\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[126,127,128,129,38,130,48,131,42,132],"skill name","{{SKILL NAME=null}=null}","{Skill Name=null}","write","todo","workflow","start",{"skillNo":134,"name":118,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":139,"publishedAt":49},"01M6CXDGPG4KYBNAYV9YMNY77P","TODO — Write a one-sentence description of when to use this language\u002Fsyntax reference (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Flanguage-ref\u002FSKILL.md",[138],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},[126,127,128,140,129,38,115,141,130,48,132,42],"syntax","language",{"skillNo":143,"name":118,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":148,"publishedAt":49},"01M6CXDEB146MPK7ES94E4CCFN","TODO — Write a one-sentence description of when to use this skill (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Fcli-tool\u002FSKILL.md",[147],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},[128,127,126,48,42,132,129,38,130],{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":158,"publishedAt":49},"01M6CXDB3R546NFVZ874VGJAVN","test-patterns","Write and run tests across languages and frameworks. Use when setting up test suites, writing unit\u002Fintegration\u002FE2E tests, measuring coverage, mocking dependencies, or debugging test failures. Covers Node.js (Jest\u002FVitest), Python (pytest), Go, Rust, and Bash.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Ftest-patterns\u002FSKILL.md",[155],{"categoryNo":156,"categoryName":157,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[159,160,114,37,161,162,163,45,164,42,165,166,167,168,129,169,170,171,172,40],"patterns","test patterns","go","rust","e2e tests","run","Bash","vitest","python3","node","coverage","pytest","jest","across"]