{
  "schemaVersion": "1.0",
  "item": {
    "slug": "terraform",
    "name": "Terraform",
    "source": "tencent",
    "type": "skill",
    "category": "金融交易",
    "sourceUrl": "https://clawhub.ai/ivangdavila/terraform",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/terraform",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/terraform",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=terraform",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/terraform"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/terraform",
    "agentPageUrl": "https://openagent3.xyz/skills/terraform/agent",
    "manifestUrl": "https://openagent3.xyz/skills/terraform/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/terraform/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "State Management",
        "body": "Local state gets corrupted/lost — use remote backend (S3, GCS, Terraform Cloud)\nMultiple people running simultaneously — enable state locking with DynamoDB or equivalent\nNever edit state manually — use terraform state mv, rm, import\nState contains secrets in plain text — encrypt at rest, restrict access"
      },
      {
        "title": "Count vs for_each",
        "body": "count uses index — removing item 0 shifts all indices, forces recreation\nfor_each uses keys — stable, removing one doesn't affect others\nCan't use both on same resource — choose one\nfor_each requires set or map — toset() to convert list"
      },
      {
        "title": "Lifecycle Rules",
        "body": "prevent_destroy = true — blocks accidental deletion, must be removed to destroy\ncreate_before_destroy = true — new resource created before old destroyed, for zero downtime\nignore_changes for external modifications — ignore_changes = [tags] ignores drift\nreplace_triggered_by to force recreation — when dependency changes"
      },
      {
        "title": "Dependencies",
        "body": "Implicit via reference — aws_instance.foo.id creates automatic dependency\ndepends_on for hidden dependencies — when reference isn't in config\ndepends_on accepts list — depends_on = [aws_iam_role.x, aws_iam_policy.y]\nData sources run during plan — may fail if resource doesn't exist yet"
      },
      {
        "title": "Data Sources",
        "body": "Data sources read existing resources — don't create\nRuns at plan time — dependency must exist before plan\nUse depends_on if implicit dependency not clear — or plan fails\nConsider using resource output instead — more explicit"
      },
      {
        "title": "Modules",
        "body": "Pin module versions — source = \"org/name/aws?version=1.2.3\"\nterraform init -upgrade to update — doesn't auto-update\nModule outputs must be explicitly defined — can't access internal resources from outside\nNested modules: output must bubble up — each layer needs to export"
      },
      {
        "title": "Variables",
        "body": "No type = any — explicit type = string, list(string), map(object({...}))\nsensitive = true hides from output — but still in state file\nvalidation block for constraints — custom error message\nnullable = false to reject null — default is nullable"
      },
      {
        "title": "Common Mistakes",
        "body": "terraform destroy is permanent — no undo, use -target carefully\nPlan succeeded ≠ apply succeeds — API errors, quotas, permissions discovered at apply\nRenaming resource = delete + create — use moved block or terraform state mv\nWorkspaces not for environments — use separate state files/backends per env\nProvisioners are last resort — use cloud-init, user_data, or config management instead"
      },
      {
        "title": "Import",
        "body": "terraform import aws_instance.foo i-1234 — imports existing resource to state\nDoesn't generate config — must write matching resource block manually\nimport block (TF 1.5+) — declarative import in config\nPlan after import to verify — should show no changes if config matches"
      }
    ],
    "body": "State Management\nLocal state gets corrupted/lost — use remote backend (S3, GCS, Terraform Cloud)\nMultiple people running simultaneously — enable state locking with DynamoDB or equivalent\nNever edit state manually — use terraform state mv, rm, import\nState contains secrets in plain text — encrypt at rest, restrict access\nCount vs for_each\ncount uses index — removing item 0 shifts all indices, forces recreation\nfor_each uses keys — stable, removing one doesn't affect others\nCan't use both on same resource — choose one\nfor_each requires set or map — toset() to convert list\nLifecycle Rules\nprevent_destroy = true — blocks accidental deletion, must be removed to destroy\ncreate_before_destroy = true — new resource created before old destroyed, for zero downtime\nignore_changes for external modifications — ignore_changes = [tags] ignores drift\nreplace_triggered_by to force recreation — when dependency changes\nDependencies\nImplicit via reference — aws_instance.foo.id creates automatic dependency\ndepends_on for hidden dependencies — when reference isn't in config\ndepends_on accepts list — depends_on = [aws_iam_role.x, aws_iam_policy.y]\nData sources run during plan — may fail if resource doesn't exist yet\nData Sources\nData sources read existing resources — don't create\nRuns at plan time — dependency must exist before plan\nUse depends_on if implicit dependency not clear — or plan fails\nConsider using resource output instead — more explicit\nModules\nPin module versions — source = \"org/name/aws?version=1.2.3\"\nterraform init -upgrade to update — doesn't auto-update\nModule outputs must be explicitly defined — can't access internal resources from outside\nNested modules: output must bubble up — each layer needs to export\nVariables\nNo type = any — explicit type = string, list(string), map(object({...}))\nsensitive = true hides from output — but still in state file\nvalidation block for constraints — custom error message\nnullable = false to reject null — default is nullable\nCommon Mistakes\nterraform destroy is permanent — no undo, use -target carefully\nPlan succeeded ≠ apply succeeds — API errors, quotas, permissions discovered at apply\nRenaming resource = delete + create — use moved block or terraform state mv\nWorkspaces not for environments — use separate state files/backends per env\nProvisioners are last resort — use cloud-init, user_data, or config management instead\nImport\nterraform import aws_instance.foo i-1234 — imports existing resource to state\nDoesn't generate config — must write matching resource block manually\nimport block (TF 1.5+) — declarative import in config\nPlan after import to verify — should show no changes if config matches"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/terraform",
    "publisherUrl": "https://clawhub.ai/ivangdavila/terraform",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/terraform",
    "downloadUrl": "https://openagent3.xyz/downloads/terraform",
    "agentUrl": "https://openagent3.xyz/skills/terraform/agent",
    "manifestUrl": "https://openagent3.xyz/skills/terraform/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/terraform/agent.md"
  }
}