{"id":"a994bbfa-33ac-4942-a7ca-91a0ecddeae1","shortId":"xTSp6T","kind":"skill","title":"devops-infrastructure","tagline":"Guides Docker, CI/CD pipelines, deployment strategies, infrastructure as code, and observability setup. Use when writing Dockerfiles, configuring GitHub Actions, planning deployments, setting up monitoring, or when asked about containers, pipelines, Terraform, or production infra","description":"# DevOps & Infrastructure\n\n### When to Load\n\n- **Trigger**: Docker, CI/CD pipelines, deployment configuration, monitoring, infrastructure as code\n- **Skip**: Application logic only with no infrastructure or deployment concerns\n\n## DevOps Workflow\n\nCopy this checklist and track progress:\n\n```\nDevOps Setup Progress:\n- [ ] Step 1: Containerize application (Dockerfile)\n- [ ] Step 2: Set up CI/CD pipeline\n- [ ] Step 3: Define deployment strategy\n- [ ] Step 4: Configure monitoring & alerting\n- [ ] Step 5: Set up environment management\n- [ ] Step 6: Document runbooks\n- [ ] Step 7: Validate against anti-patterns checklist\n```\n\n## Docker Best Practices\n\n### Multi-Stage Build\n\n```dockerfile\n# WRONG: Single stage, bloated image\nFROM node:20\nWORKDIR /app\nCOPY . .\nRUN npm install\nRUN npm run build\nCMD [\"node\", \"dist/index.js\"]\n# Result: 1.2GB image with devDependencies and source code\n\n# CORRECT: Multi-stage build\nFROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM node:20-alpine AS runner\nWORKDIR /app\nENV NODE_ENV=production\nRUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -s /bin/sh -D appuser\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nUSER appuser\nEXPOSE 3000\nCMD [\"node\", \"dist/index.js\"]\n# Result: ~150MB image, no devDependencies, non-root user\n```\n\n### Python Multi-Stage\n\n```dockerfile\nFROM python:3.12-slim AS builder\nWORKDIR /app\nRUN pip install uv\nCOPY pyproject.toml uv.lock ./\nRUN uv sync --frozen --no-dev\nCOPY . .\n\nFROM python:3.12-slim AS runner\nWORKDIR /app\nRUN useradd -r -s /bin/false appuser\nCOPY --from=builder /app/.venv /app/.venv\nCOPY --from=builder /app/src ./src\nENV PATH=\"/app/.venv/bin:$PATH\"\nUSER appuser\nCMD [\"python\", \"-m\", \"src.main\"]\n```\n\n### Layer Caching\n\n```dockerfile\n# WRONG: Cache busted on every code change\nCOPY . .\nRUN npm ci\n\n# CORRECT: Dependencies cached separately\nCOPY package*.json ./\nRUN npm ci                  # cached unless package.json changes\nCOPY . .                    # only source code changes bust this layer\n```\n\n### .dockerignore\n\n```\nnode_modules\n.git\n.env\n*.md\n.vscode\ncoverage\ndist\n__pycache__\n.pytest_cache\n*.pyc\n```\n\n### Security\n\n```dockerfile\n# Always pin versions\nFROM node:20.11.0-alpine   # NOT node:latest\n\n# Don't run as root\nUSER appuser\n\n# Read-only filesystem where possible\n# docker run --read-only --tmpfs /tmp myapp\n\n# Scan images\n# docker scout cves myimage:latest\n# trivy image myimage:latest\n```\n\n## CI/CD Pipeline Design\n\n### GitHub Actions Structure\n\n```yaml\nname: CI/CD\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: \"npm\"\n      - run: npm ci\n      - run: npm run lint\n\n  test:\n    runs-on: ubuntu-latest\n    needs: lint\n    services:\n      postgres:\n        image: postgres:16\n        env:\n          POSTGRES_DB: testdb\n        ports: [\"5432:5432\"]\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: \"npm\"\n      - run: npm ci\n      - run: npm test\n\n  build:\n    runs-on: ubuntu-latest\n    needs: test\n    steps:\n      - uses: actions/checkout@v4\n      - uses: docker/setup-buildx-action@v3\n      - uses: docker/build-push-action@v5\n        with:\n          push: ${{ github.event_name == 'push' }}\n          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    if: github.ref == 'refs/heads/main'\n    environment: production\n    steps:\n      - run: echo \"Deploy to production\"\n```\n\n### Caching Strategies\n\n```yaml\n# Node modules\n- uses: actions/setup-node@v4\n  with:\n    cache: \"npm\"\n\n# Python with uv\n- name: Cache uv\n  uses: actions/cache@v4\n  with:\n    path: ~/.cache/uv\n    key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}\n\n# Docker layer caching\n- uses: docker/build-push-action@v5\n  with:\n    cache-from: type=gha\n    cache-to: type=gha,mode=max\n```\n\n## Deployment Strategies\n\n### Blue-Green Deployment\n\n```\n1. Run two identical environments: Blue (live) and Green (idle)\n2. Deploy new version to Green\n3. Run smoke tests on Green\n4. Switch load balancer to Green\n5. Green is now live, Blue is idle\n6. Rollback: switch back to Blue\n\nPros: Instant rollback, zero downtime\nCons: 2x infrastructure cost during deploy\n```\n\n### Canary Deployment\n\n```\n1. Deploy new version to small subset (5% of traffic)\n2. Monitor error rates and latency\n3. Gradually increase: 5% -> 25% -> 50% -> 100%\n4. Rollback: route all traffic back to old version\n\nPros: Limited blast radius, real-world testing\nCons: More complex routing, longer rollout\n```\n\n### Rolling Deployment\n\n```\n1. Replace instances one at a time\n2. Each new instance passes health checks before next starts\n3. Continue until all instances updated\n\nPros: No extra infrastructure, gradual rollout\nCons: Mixed versions during deploy, slower rollback\n```\n\n### Feature Flags\n\n```typescript\n// Simple feature flag implementation\nconst features = {\n  NEW_CHECKOUT: process.env.FF_NEW_CHECKOUT === \"true\",\n  DARK_MODE: process.env.FF_DARK_MODE === \"true\",\n};\n\nfunction getCheckoutFlow(user: User) {\n  if (features.NEW_CHECKOUT && user.betaGroup) {\n    return newCheckoutFlow(user);\n  }\n  return legacyCheckoutFlow(user);\n}\n\n// Use a proper service for production: LaunchDarkly, Unleash, Flagsmith\n```\n\n## Infrastructure as Code\n\n### Terraform Basics\n\n```hcl\n# main.tf\nterraform {\n  required_version = \">= 1.5\"\n  backend \"s3\" {\n    bucket = \"myapp-terraform-state\"\n    key    = \"prod/terraform.tfstate\"\n    region = \"us-east-1\"\n  }\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = var.ami_id\n  instance_type = var.instance_type\n  tags = {\n    Name        = \"web-${var.environment}\"\n    Environment = var.environment\n    ManagedBy   = \"terraform\"\n  }\n}\n\n# variables.tf\nvariable \"environment\" {\n  type    = string\n  default = \"dev\"\n}\n\nvariable \"instance_type\" {\n  type    = string\n  default = \"t3.micro\"\n}\n```\n\n### Terraform Rules\n\n```\n1. Always use remote state (S3, GCS, Terraform Cloud)\n2. Lock state files to prevent concurrent modifications\n3. Use variables and modules for reusability\n4. Tag all resources with environment and ManagedBy\n5. Run `terraform plan` before `terraform apply`\n6. Never edit infrastructure manually (all changes via code)\n7. Use workspaces or separate state files per environment\n```\n\n## Monitoring & Observability\n\n### The Three Pillars\n\n```\nMETRICS: Numeric measurements over time\n  - Request rate, error rate, latency (RED method)\n  - CPU, memory, disk, network (USE method)\n  - Business metrics (signups, purchases)\n  Tools: Prometheus, Datadog, CloudWatch\n\nLOGS: Discrete events with context\n  - Structured JSON format\n  - Correlation IDs across services\n  - Log levels: DEBUG, INFO, WARN, ERROR\n  Tools: ELK Stack, Loki, CloudWatch Logs\n\nTRACES: Request flow across services\n  - Distributed tracing with span context\n  - Latency breakdown per service\n  - Dependency mapping\n  Tools: Jaeger, Zipkin, Datadog APM\n```\n\n### Health Check Endpoint\n\n```typescript\n// Express health check\napp.get(\"/health\", async (req, res) => {\n  const checks = {\n    uptime: process.uptime(),\n    timestamp: Date.now(),\n    database: \"unknown\",\n    redis: \"unknown\",\n  };\n\n  try {\n    await db.query(\"SELECT 1\");\n    checks.database = \"healthy\";\n  } catch (e) {\n    checks.database = \"unhealthy\";\n  }\n\n  try {\n    await redis.ping();\n    checks.redis = \"healthy\";\n  } catch (e) {\n    checks.redis = \"unhealthy\";\n  }\n\n  const isHealthy = checks.database === \"healthy\";\n  res.status(isHealthy ? 200 : 503).json(checks);\n});\n```\n\n### Alerting Rules\n\n```\nGood alerts:\n- Error rate > 1% for 5 minutes (actionable)\n- P99 latency > 2s for 10 minutes (meaningful)\n- Disk usage > 80% (preventive)\n\nBad alerts:\n- CPU spike for 30 seconds (too noisy)\n- Any single 500 error (too sensitive)\n- \"Something might be wrong\" (not actionable)\n\nAlert fatigue is real. Every alert should require human action.\n```\n\n## Environment Management\n\n### Dev/Staging/Prod Parity\n\n```yaml\n# docker-compose.yml for local development\nservices:\n  app:\n    build: .\n    env_file: .env\n    ports: [\"3000:3000\"]\n    depends_on:\n      postgres:\n        condition: service_healthy\n\n  postgres:\n    image: postgres:16\n    environment:\n      POSTGRES_DB: myapp\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready\"]\n      interval: 5s\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n\n  redis:\n    image: redis:7-alpine\n    ports: [\"6379:6379\"]\n\nvolumes:\n  pgdata:\n```\n\n### Environment Variables\n\n```\n# .env.example (committed to git, no real values)\nDATABASE_URL=postgresql://user:placeholder@localhost:5432/myapp\nREDIS_URL=redis://localhost:6379\nLOG_LEVEL=debug\nAPI_KEY=your-key-here\n\n# .env (never committed, listed in .gitignore)\n# Contains real values for local development\n```\n\n## Common Anti-Patterns Summary\n\n```\nAVOID                              DO INSTEAD\n-------------------------------------------------------------------\nFROM node:latest                   Pin exact versions (node:20.11.0-alpine)\nRunning as root in container       Create and use non-root user\nNo .dockerignore                   Exclude .git, node_modules, .env\nSingle CI job does everything      Separate lint, test, build, deploy stages\nManual deployment                  Automated pipeline with approvals\nNo health checks                   Liveness + readiness probes\nAlerts on every error              Alert on error RATE thresholds\nSame config in all environments    Per-environment configuration\nNo rollback plan                   Test rollback before every deploy\nLogs as unstructured strings       Structured JSON logs with correlation IDs\n```","tags":["devops","infrastructure","claude","workflow","cloudai-x","agent-skills","ai-agents","claude-code","codex","cursor","skills"],"capabilities":["skill","source-cloudai-x","skill-devops-infrastructure","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-codex","topic-cursor","topic-skills","topic-workflow"],"categories":["claude-workflow-v2"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/CloudAI-X/claude-workflow-v2/devops-infrastructure","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add CloudAI-X/claude-workflow-v2","source_repo":"https://github.com/CloudAI-X/claude-workflow-v2","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1352 github stars · SKILL.md body (10,081 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-03T00:52:55.872Z","embedding":null,"createdAt":"2026-04-18T21:54:55.671Z","updatedAt":"2026-05-03T00:52:55.872Z","lastSeenAt":"2026-05-03T00:52:55.872Z","tsv":"'/$':518 '/.cache/uv':575 '/app':130,163,182,243,266 '/app/.venv':276,277 '/app/.venv/bin':285 '/app/dist':204 '/app/node_modules':209 '/app/package.json':214 '/app/src':281 '/bin/false':271 '/bin/sh':198 '/dist':205 '/health':990 '/node_modules':210 '/src':282 '/tmp':373 '/var/lib/postgresql/data':1130 '1':75,606,661,709,813,849,1008,1040 '1.2':143 '1.5':799 '10':1049 '100':683 '1001':190,194 '10s':462 '150mb':223 '16':445,1114 '2':80,616,671,716,858 '20':128,158,177,422,482 '20.11.0':349,1196 '200':1030 '25':681 '2s':1047 '2x':654 '3':86,622,677,726,866 '3.12':238,261 '30':1061 '3000':218,1103,1104 '4':91,628,684,873 '5':96,470,634,668,680,881,1042 '50':682 '500':1067 '503':1031 '5432':451,452 '5432/myapp':1155 '5s':466,1127 '6':102,642,888 '6379':1137,1138,1159 '7':106,897,1134 '80':1054 'across':947,964 'action':22,390,1044,1076,1086 'actions/cache':571 'actions/checkout':413,473,502 'actions/setup-node':416,476,559 'addgroup':188 'addus':192 'alert':94,1034,1037,1057,1077,1082,1240,1244 'alpin':159,178,350,1135,1197 'alway':344,850 'ami':818 'anti':110,1183 'anti-pattern':109,1182 'api':1163 'apm':981 'app':1097 'app.get':989 'appgroup':191,196 'appli':887 'applic':54,77 'approv':1233 'appus':200,216,272,288,360 'ask':30 'async':991 'autom':1230 'avoid':1186 'aw':815 'await':1005,1016 'back':645,689 'backend':800 'bad':1056 'balanc':631 'basic':793 'best':114 'blast':695 'bloat':124 'blue':603,611,639,647 'blue-green':602 'branch':397,401 'breakdown':972 'bucket':802 'build':119,138,155,174,491,541,1098,1225 'builder':161,203,208,213,241,275,280 'busi':929 'bust':298,326 'cach':294,297,309,317,340,423,483,522,527,553,562,568,583,589,594 'cache-from':521,588 'cache-to':526,593 'canari':659 'catch':1011,1020 'chang':302,320,325,894 'check':722,983,988,995,1033,1236 'checklist':67,112 'checkout':755,758,772 'checks.database':1009,1013,1026 'checks.redis':1018,1022 'ci':169,306,316,427,487,1218 'ci/cd':6,45,83,386,394 'cloud':857 'cloudwatch':936,959 'cmd':139,219,289,456,1122 'cmd-shell':1121 'code':12,52,150,301,324,791,896 'commit':1144,1171 'common':1181 'complex':703 'con':653,701,738 'concern':62 'concurr':864 'condit':1108 'config':1250 'configur':20,48,92,1257 'const':752,994,1024 'contain':32,1175,1202 'container':76 'context':941,970 'continu':727 'copi':65,131,164,170,201,206,211,248,258,273,278,303,311,321 'correct':151,307 'correl':945,1274 'cost':656 'coverag':336 'cpu':923,1058 'creat':1203 'cves':379 'd':199 'dark':760,763 'databas':1000,1150 'datadog':935,980 'date.now':999 'db':448,1117 'db.query':1006 'debug':951,1162 'default':838,845 'defin':87 'depend':308,975,1105 'deploy':8,24,47,61,88,533,550,600,605,617,658,660,662,708,742,1226,1229,1265 'design':388 'dev':257,839 'dev/staging/prod':1089 'devdepend':147,226 'develop':1095,1180 'devop':2,38,63,71 'devops-infrastructur':1 'discret':938 'disk':925,1052 'dist':337 'dist/index.js':141,221 'distribut':966 'docker':5,44,113,367,377,581 'docker-compose.yml':1092 'docker/build-push-action':508,585 'docker/setup-buildx-action':505 'dockerfil':19,78,120,235,295,343 'dockerignor':329,1211 'document':103 'downtim':652 'e':1012,1021 'east':812 'echo':549 'edit':890 'elk':956 'endpoint':984 'env':183,185,283,333,446,1099,1101,1169,1216 'env.example':1143 'environ':99,545,610,829,835,878,905,1087,1115,1141,1253,1256 'error':673,918,954,1038,1068,1243,1246 'event':939 'everi':300,1081,1242,1264 'everyth':1221 'exact':1193 'exclud':1212 'expos':217 'express':986 'extra':734 'fatigu':1078 'featur':745,749,753 'features.new':771 'file':861,903,1100 'filesystem':364 'flag':746,750 'flagsmith':788 'flow':963 'format':944 'frozen':254 'function':766 'g':189,195 'gb':144 'gcs':855 'getcheckoutflow':767 'gha':525,530,592,597 'ghcr.io':517 'ghcr.io/$':516 'git':332,1146,1213 'github':21,389 'github.event':512 'github.ref':543 'github.repository':519 'github.sha':520 'gitignor':1174 'good':1036 'gradual':678,736 'green':604,614,621,627,633,635 'guid':4 'hashfil':579 'hcl':794 'health':455,460,464,468,721,982,987,1235 'health-cmd':454 'health-interv':459 'health-retri':467 'health-timeout':463 'healthcheck':1119 'healthi':1010,1019,1027,1110 'human':1085 'id':820,946,1275 'ident':609 'idl':615,641 'imag':125,145,224,376,383,443,1112,1132 'implement':751 'increas':679 'info':952 'infra':37 'infrastructur':3,10,39,50,59,655,735,789,891 'instal':134,246 'instanc':711,719,730,816,821,841 'instant':649 'instead':1188 'interv':461,1126 'ishealthi':1025,1029 'isreadi':458,1125 'jaeger':978 'job':403,1219 'json':166,313,943,1032,1271 'key':576,807,1164,1167 'latenc':676,920,971,1046 'latest':353,381,385,410,438,497,539,1191 'launchdark':786 'layer':293,328,582 'legacycheckoutflow':778 'level':950,1161 'limit':694 'lint':404,431,440,1223 'list':1172 'live':612,638,1237 'load':42,630 'local':1094,1179 'localhost':1154,1158 'lock':859 'log':937,949,960,1160,1266,1272 'logic':55 'loki':958 'longer':705 'm':291 'main':398,402 'main.tf':795 'manag':100,1088 'managedbi':831,880 'manual':892,1228 'map':976 'max':532,599 'md':334 'meaning':1051 'measur':913 'memori':924 'method':922,928 'metric':911,930 'might':1072 'minut':1043,1050 'mix':739 'mode':531,598,761,764 'modif':865 'modul':331,557,870,1215 'monitor':27,49,93,672,906 'multi':117,153,233 'multi-stag':116,152,232 'myapp':374,804,1118 'myapp-terraform-st':803 'myimag':380,384 'name':393,513,567,826 'need':439,498,540 'network':926 'never':889,1170 'new':618,663,718,754,757 'newcheckoutflow':775 'next':724 'no-dev':255 'node':127,140,157,176,184,220,330,348,352,420,480,556,1190,1195,1214 'node-vers':419,479 'noisi':1064 'non':228,1207 'non-root':227,1206 'npm':133,136,168,172,305,315,424,426,429,484,486,489,563 'numer':912 'observ':14,907 'old':691 'one':712 'option':453 'p99':1045 'packag':165,312 'package.json':319 'pariti':1090 'pass':720 'path':284,286,574 'pattern':111,1184 'per':904,973,1255 'per-environ':1254 'pg':457,1124 'pgdata':1129,1140 'pillar':910 'pin':345,1192 'pip':245 'pipelin':7,33,46,84,387,1231 'placehold':1153 'plan':23,884,1260 'port':450,1102,1136 'possibl':366 'postgr':442,444,447,1107,1111,1113,1116 'practic':115 'prevent':863,1055 'probe':1239 'process.env.ff':756,762 'process.uptime':997 'prod/terraform.tfstate':808 'product':36,186,546,552,785 'progress':70,73 'prometheus':934 'proper':782 'pros':648,693,732 'pull':399 'purchas':932 'push':396,511,514 'pyc':341 'pycach':338 'pyproject.toml':249 'pytest':339 'python':231,237,260,290,564 'r':269 'radius':696 'rate':674,917,919,1039,1247 'read':362,370 'read-on':361,369 'readi':1238 'real':698,1080,1148,1176 'real-world':697 'red':921 'redi':1002,1131,1133,1156 'redis.ping':1017 'refs/heads/main':544 'region':809 'remot':852 'replac':710 'req':992 'request':400,916,962 'requir':797,1084 'res':993 'res.status':1028 'resourc':814,876 'result':142,222 'retri':469 'return':774,777 'reusabl':872 'roll':707 'rollback':643,650,685,744,1259,1262 'rollout':706,737 'root':229,358,1200,1208 'rout':686,704 'rule':848,1035 'run':132,135,137,167,171,173,187,244,251,267,304,314,356,368,406,425,428,430,434,485,488,493,535,548,607,623,882,1198 'runbook':104 'runner':180,264 'runner.os':578 'runs-on':405,433,492,534 's3':801,854 'scan':375 'scout':378 'second':1062 'secur':342 'select':1007 'sensit':1070 'separ':310,901,1222 'servic':441,783,948,965,974,1096,1109 'set':25,81,97 'setup':15,72 'shell':1123 'signup':931 'simpl':748 'singl':122,1066,1217 'skill' 'skill-devops-infrastructure' 'skip':53 'slim':239,262 'slower':743 'small':666 'smoke':624 'someth':1071 'sourc':149,323 'source-cloudai-x' 'span':969 'spike':1059 'src.main':292 'stack':957 'stage':118,123,154,234,1227 'start':725 'state':806,853,860,902 'step':74,79,85,90,95,101,105,411,471,500,547 'strategi':9,89,554,601 'string':837,844,1269 'structur':391,942,1270 'subset':667 'summari':1185 'switch':629,644 'sync':253 't3.micro':846 'tag':515,825,874 'terraform':34,792,796,805,832,847,856,883,886 'test':432,490,499,625,700,1120,1224,1261 'testdb':449 'three':909 'threshold':1248 'time':715,915 'timeout':465 'timestamp':998 'tmpfs':372 'tool':933,955,977 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-skills' 'topic-workflow' 'trace':961,967 'track':69 'traffic':670,688 'tri':1004,1015 'trigger':43 'trivi':382 'true':759,765 'two':608 'type':524,529,591,596,822,824,836,842,843 'typescript':747,985 'u':193 'ubuntu':409,437,496,538 'ubuntu-latest':408,436,495,537 'unhealthi':1014,1023 'unknown':1001,1003 'unleash':787 'unless':318 'unstructur':1268 'updat':731 'uptim':996 'url':1151,1157 'us':811 'us-east':810 'usag':1053 'use':16,412,415,472,475,501,504,507,558,570,584,780,851,867,898,927,1205 'user':215,230,287,359,768,769,776,779,1152,1209 'user.betagroup':773 'useradd':268 'uv':247,252,566,569,577 'uv.lock':250,580 'v3':506 'v4':414,417,474,477,503,560,572 'v5':509,586 'valid':107 'valu':1149,1177 'var.ami':819 'var.environment':828,830 'var.instance':823 'variabl':834,840,868,1142 'variables.tf':833 'version':346,421,481,619,664,692,740,798,1194 'via':895 'volum':1128,1139 'vscode':335 'warn':953 'web':817,827 'workdir':129,162,181,242,265 'workflow':64 'workspac':899 'world':699 'write':18 'wrong':121,296,1074 'yaml':392,555,1091 'your-key-her':1165 'zero':651 'zipkin':979","prices":[{"id":"8217aeda-d3d1-40f8-a9a5-a7ff2ad29381","listingId":"a994bbfa-33ac-4942-a7ca-91a0ecddeae1","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"CloudAI-X","category":"claude-workflow-v2","install_from":"skills.sh"},"createdAt":"2026-04-18T21:54:55.671Z"}],"sources":[{"listingId":"a994bbfa-33ac-4942-a7ca-91a0ecddeae1","source":"github","sourceId":"CloudAI-X/claude-workflow-v2/devops-infrastructure","sourceUrl":"https://github.com/CloudAI-X/claude-workflow-v2/tree/main/skills/devops-infrastructure","isPrimary":false,"firstSeenAt":"2026-04-18T21:54:55.671Z","lastSeenAt":"2026-05-03T00:52:55.872Z"}],"details":{"listingId":"a994bbfa-33ac-4942-a7ca-91a0ecddeae1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"CloudAI-X","slug":"devops-infrastructure","github":{"repo":"CloudAI-X/claude-workflow-v2","stars":1352,"topics":["agent-skills","ai","ai-agents","claude-code","codex","cursor","skills","workflow"],"license":"mit","html_url":"https://github.com/CloudAI-X/claude-workflow-v2","pushed_at":"2026-02-14T18:09:29Z","description":"Universal Claude Code workflow plugin with agents, skills, hooks, and commands","skill_md_sha":"492d7413241ebe830ede2a21531c8373cae4307c","skill_md_path":"skills/devops-infrastructure/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/CloudAI-X/claude-workflow-v2/tree/main/skills/devops-infrastructure"},"layout":"multi","source":"github","category":"claude-workflow-v2","frontmatter":{"name":"devops-infrastructure","description":"Guides Docker, CI/CD pipelines, deployment strategies, infrastructure as code, and observability setup. Use when writing Dockerfiles, configuring GitHub Actions, planning deployments, setting up monitoring, or when asked about containers, pipelines, Terraform, or production infrastructure."},"skills_sh_url":"https://skills.sh/CloudAI-X/claude-workflow-v2/devops-infrastructure"},"updatedAt":"2026-05-03T00:52:55.872Z"}}