[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-hashicorp-tfctl":3,"mdc-qjdtos-key":37,"related-repo-hashicorp-tfctl":3166,"related-org-hashicorp-tfctl":3175},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"tfctl","manage Terraform infrastructure via tfctl","Interact with HCP Terraform \u002F Terraform Cloud \u002F Terraform Enterprise using the tfctl CLI. Full API coverage.\nUse for ANY HCP Terraform or Terraform Cloud or Terraform Enterprise question or action — listing workspaces,\nstarting\u002Fdiagnosing runs, reading vars, modifying resources, calling API operations.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"hashicorp","HashiCorp","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fhashicorp.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":20,"slug":21,"type":15},"Terraform","terraform",{"name":23,"slug":24,"type":15},"Infrastructure as Code","infrastructure-as-code",52,"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Ftfctl-cli","2026-07-31T05:53:07.584827","MPL-2.0",5,[31],"doormat-managed",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Manage HCP Terraform and Terraform Enterprise from the command line.","https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Ftfctl-cli\u002Ftree\u002FHEAD\u002Fskills\u002Ftfctl","---\nname: tfctl\ndescription: |\n  Interact with HCP Terraform \u002F Terraform Cloud \u002F Terraform Enterprise using the tfctl CLI. Full API coverage.\n  Use for ANY HCP Terraform or Terraform Cloud or Terraform Enterprise question or action — listing workspaces,\n  starting\u002Fdiagnosing runs, reading vars, modifying resources, calling API operations.\nlicense: MPL-2.0\n---\n\n# tfctl — HCP Terraform CLI\n\nSingle binary, full v2 API coverage. Already authenticated.\n\n## Hard rules\n\n1. **Never pipe `tfctl` JSON to an external `jq`.** Use the built-in `--jq '\u003Cexpr>'` flag — it implies `--json` and runs gojq on the response envelope.\n2. **Resolve names with `-p`, not separate lookup calls.** Paths with `{workspace}`\u002F`{team}`\u002F`{project}`\u002F`{varset}` accept `-p workspace=NAME` etc. — tfctl resolves name→ID for you. Don't fetch the ID first.\n3. **Trust the first answer.** `data: []`, `data: null`, `relationships.X.data: null`, or stderr \"no current run\"\u002F\"not found\" ARE the answer. Don't re-query in another format. Don't walk relationships \"to verify\".\n4. **When a named resource is not found, stop completely.** Exit code 2 or absence from a listing IS the full answer. Never:\n   - Try a different resource ID \"to verify the endpoint works\"\n   - Pivot to another org\u002Fworkspace that appeared in the available list\n   - Explore related resources to find \"similar\" information\n   - Use Rule 3 to justify switching to a different resource: if you listed orgs and 'platform' isn't there, the first answer is \"platform doesn't exist\" — stop, don't use whatever org IS listed instead.\n   \n   Examples: `run-POLICY` returns exit 2 → stop, don't query other run IDs. Listing orgs shows no 'platform' → stop, don't use the org that IS listed.\n5. **Never run `tfctl harness exec` yourself to self-authorize.** The `--allow-delete` grant is a human's opt-in for your session. If a delete is refused, relay the printed `harness exec --allow-delete=\u003Cclass>` command back to the human — do not run it (or set `TFCTL_EXEC_SESSION`) to grant yourself permission. See [Deleting resources](#deleting-resources).\n\n### Deleting resources\n\nDeletes are destructive, so `tfctl` itself gates them — you don't need to police this with a blanket refusal. A noninteractive `tfctl ... -X DELETE` only goes through when a human has opted in for this session by launching you via `tfctl harness exec --allow-delete=\u003Cclass> -- \u003Ccommand>` (which sets `TFCTL_EXEC_SESSION`). Otherwise `tfctl` refuses on its own and tells you what to do.\n\nSo when you're asked to delete something, just run the normal command and let `tfctl` be the gate:\n\n```bash\ntfctl api PATH -X DELETE\n```\n\n- **If the session authorizes that resource's class, it succeeds** — that's the human's intent, not a violation; proceed and report the result.\n- **If it doesn't, `tfctl` refuses with a self-documenting message and prints the exact command to hand back** (including the `harness exec --allow-delete=\u003Cclass>` a human can use to authorize you). Relay that rather than forcing it; don't run `harness exec` yourself to self-authorize.\n- **You can't tell in advance whether the session grants a class — so don't guess. Attempt the delete and let the refusal tell you.** The refusal is a plain exit 1 with a message naming the class and the `--allow-delete=\u003Cclass>` command; that is your cue to relay. This is a grant gap, NOT an auth failure: never report it as an expired token, an `exit code 3`, or tell the human to re-login unless `tfctl` actually says the token is expired\u002Finvalid.\n- Apply ordinary caution to irreversible deletes (`organizations`, `projects`). For a high-stakes resource, confirm intent with the human first even when the session would allow it.\n\n### URL shape: per-workspace subpaths live at `\u002Fworkspaces\u002F{workspace}\u002F...`\n\nMost \"things attached to a workspace\" (vars, runs, varsets, remote-state-consumers, configuration-versions, notification-configurations, state-versions) are under `\u002Fworkspaces\u002F{workspace}\u002F...`, NOT `\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002F...`. The org-nested form only exists for the workspace resource itself (`\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}`). For everything else, use `\u002Fworkspaces\u002F{workspace}\u002FX -p workspace=NAME`.\n\n**Exception: Policy checks and run-specific data** live under `\u002Fruns\u002F{run-id}\u002F...`, not under workspace paths. For example: `\u002Fruns\u002F{run-id}\u002Fpolicy-checks`.\n\n### Anti-patterns to avoid\n\nThese paths **do not exist**; don't try them:\n- ❌ `\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fvars` — use `\u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME` instead\n- ❌ `\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fstate-versions` — use `\u002Fworkspaces\u002F{workspace}\u002Fstate-versions -p workspace=NAME`\n- ❌ `\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fconfiguration-versions` — use `\u002Fworkspaces\u002F{workspace}\u002Fconfiguration-versions -p workspace=NAME`\n- ❌ `\u002Fworkspaces\u002F{workspace}\u002Fpolicy-checks` — use `\u002Fruns\u002F{run-id}\u002Fpolicy-checks` instead\n- ❌ `\u002Forganizations\u002F{org}\u002Fvarsets` (partially wrong path) — use `\u002Forganizations\u002F{organization}\u002Fvarsets` with correct org placeholder\n- ❌ External `jq` pipes like `tfctl ... | jq '...'` — always use `tfctl api ... --jq '...'` with built-in flag\n\n## Cookbook — one-line answers for common tasks\n\n```bash\n# Count workspaces in an org\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --page-size 1 --jq '.meta.pagination.[\"total-count\"]'\n\n# Find workspace by partial name (server-side search) — also returns current run state in one call\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces -f 'search[name]=TERM' --jq '.data[] | {id, name: .attributes.name, current_run: .relationships.[\"current-run\"].data}'\n\n# Filter workspaces by attribute\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.[\"terraform-version\"] | startswith(\"1.8\")) | .attributes.name'\n\n# List variables on a workspace — path is \u002Fworkspaces\u002F{workspace}\u002Fvars (NOT \u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fvars; that endpoint does not exist)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME --jq '.data[] | {key: .attributes.key, category: .attributes.category, sensitive: .attributes.sensitive}'\n\n# Get current run status\ntfctl run status NAME_OR_ID            # If it prints \"no current run\" or exits non-zero with that message, that IS the answer.\n\n# Get current run ID for a workspace\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces\u002FNAME --jq '.data.relationships.[\"current-run\"].data.id'\n\n# List runs in a workspace with status filtering\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fruns -p workspace=NAME --jq '.data[] | select(.attributes.status == \"planned\") | {id, status: .attributes.status}'\n\n# Find workspace by VCS repo identifier (single call; no results = not connected to that repo)\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all \\\n  --jq '.data[] | select(.attributes.[\"vcs-repo\"] != null and .attributes.[\"vcs-repo\"].identifier == \"org\u002Frepo\") | {id: .id, name: .attributes.name}'\n\n# List workspaces accessible to a team (two-step: resolve team name → query team-workspaces)\n# Note: \u002Forganizations\u002F{org}\u002Fteams\u002F{id}\u002Fworkspaces does NOT exist — use \u002Fteam-workspaces instead\ntfctl api \u002Forganizations\u002F{organization}\u002Fteams -f 'filter[names]=TEAM_NAME' --jq '.data[0].id'\ntfctl api \u002Fteam-workspaces -f 'filter[team][id]=TEAM_ID' --jq '.data[] | {workspace_id: .relationships.workspace.data.id, access: .attributes.access}'\n\n# Get organization details and settings\ntfctl api \u002Forganizations\u002F{organization} --jq '.data | {id, name: .attributes.name, created_at: .attributes.\"created-at\", terraform_version_default: .attributes.\"terraform-version\"}'\n\n# Get the current state version for a workspace\n# (operationId: getCurrentStateVersion — single resource, not a list)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fcurrent-state-version -p workspace=NAME --jq '.data | {serial: .attributes.serial, created_at: .attributes.[\"created-at\"], status: .attributes.status}'\n\n# List all variable sets in an org and their variable counts\ntfctl api \u002Forganizations\u002F{organization}\u002Fvarsets --all --jq '.data[] | {name: .attributes.name, id: .id, var_count: (.relationships.vars.data | length)}'\n\n# Get configuration version details\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fconfiguration-versions -p workspace=NAME --jq '.data[] | {id, source: .attributes.source, created_at: .attributes.created-at}'\n\n# List notification configurations\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fnotification-configurations -p workspace=NAME --jq '.data[] | {id, type: .attributes.destination-type, trigger: .attributes.triggers}'\n\n# Filter workspaces by terraform version (1.7+)\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.[\"terraform-version\"] | ltrimstr(\"v\") | split(\".\") | [.[0], .[1]] | join(\".\") | tonumber >= 1.7) | {name: .attributes.name, tf_version: .attributes.[\"terraform-version\"]}'\n\n# Filter workspaces excluding certain names\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.name | test(\"^temp-|^old-\") | not) | .attributes.name'\n\n# Count resources by status (e.g., runs by status)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fruns -p workspace=NAME --all --jq '[.data[] | .attributes.status] | group_by(.) | map({status: .[0], count: length})'\n\n# Get log URL for a completed run\n# Note: run.log-read-url is null on completed runs — the URL lives on plan\u002Fapply.\ntfctl api \u002Fruns\u002FRUN_ID --jq '.data.relationships | {plan: .plan.data.id, apply: .apply.data.id}'\ntfctl api \u002Fplans\u002FPLAN_ID --jq '.data.attributes.[\"log-read-url\"]'\n\n# Start a run\ntfctl run start NAME_OR_ID\n\n# Add a remote state consumer to a workspace\n# (operationId: addWorkspaceRemoteStateConsumers — POST returns 204)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fremote-state-consumers -p workspace=NAME \\\n  -i '{\"data\":[{\"type\":\"workspaces\",\"id\":\"ws-CONSUMER_ID\"}]}'\n\n# Apply a variable set to a workspace\n# (operationId: updateWorkspaceRelationship for varsets)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fvarsets -p workspace=NAME \\\n  -X POST -i '{\"data\":[{\"type\":\"varsets\",\"id\":\"varset-VARSET_ID\"}]}'\n\n# Get policy check results for a run\ntfctl api \u002Fruns\u002F{run-id}\u002Fpolicy-checks --jq '.data[] | {id: .id, status: .attributes.status, enforced: .attributes.enforcement-level}'\n\n# Discover an API operation when you don't know it\ntfctl api schema search \"KEYWORD\" --json     # returns operationIds\ntfctl api schema get OPERATION_ID            # full OpenAPI schema (large response — only call when needed)\n```\n\n## Output flags\n\n| Need              | Flag             |\n|-------------------|------------------|\n| Filter \u002F extract  | `--jq '\u003Cexpr>'`  |\n| Full JSON         | `--json`         |\n| Render for human  | `--markdown`     |\n| Audit a mutation  | `--dry-run`      |\n\n`--jq` implies `--json`. Don't pass both. Always pass one explicitly — don't rely on auto-detect.\n\n## JSON:API conventions\n\nResponses are JSON:API envelopes: `{data: {id, type, attributes, relationships}}` (or `data: [...]` for lists). To follow a link, read `data.relationships.\u003Cname>.data` which gives `{id, type}` or `null`. A `null` is final — there is no related resource.\n\nPagination: default page 1. Add `--all` for all pages (cap 2000), or `--page-size N` \u002F `--page-number N` for explicit control. For counts, use `--page-size 1 --jq '.meta.pagination.[\"total-count\"]'`.\n\n## Mutations & batch updates\n\n```bash\n# Create or update a single variable\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VARKEY -a value=VALUE -a category=env\n\n# Batch updates: use separate calls (HCP TFC doesn't support bulk POST for vars)\n# Instead of trying \u002Fworkspaces\u002F{ws}\u002Fvars with multiple items, do:\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VAR1 -a value=VAL1 -a category=env\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VAR2 -a value=VAL2 -a category=env\n# (Multiple calls cost more, but it's the supported pattern)\n\n# PATCH with a raw body\ntfctl api \u002Fworkspaces\u002F{workspace}\u002FX -X PATCH -p workspace=NAME -i '{\"data\":{\"type\":\"X\",\"attributes\":{…}}}'\n```\nAdd `--dry-run` to preview without sending.\n\n## Exit codes (quick map)\n\n| Code | Meaning | Action |\n|------|---------|--------|\n| 0 | Success | Done |\n| 1 | Informational message or usage error | Read stderr; if it says \"no current run\" or similar, **that IS the answer — stop** |\n| 2 | Not found (workspace\u002Frun doesn't exist) OR invalid auth | Verify the ID\u002Fname is correct, then check token if still failing |\n| 3 | Auth token expired or invalid | Re-authenticate |\n| 4 | Network error | Retry after brief delay |\n| 5 | Rate limited (429) or server error (5xx) | Retry with backoff |\n| 6 | Resource has an error state | The error is already diagnosed in output (e.g., plan failed); read it |\n\n**Important**: When an API returns `data: []` (empty list) or `data: null`, that IS the answer. Don't retry with different flags or endpoints.\n\n### Common troubleshooting\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| `exit 2` when listing workspaces | Organization doesn't exist or auth token has no access | Verify org name and re-authenticate |\n| `exit 1` with \"no current run\" | Workspace simply has no active run (informational) | **This is the answer** — stop, don't verify |\n| `exit 3` when making any API call | Auth token expired | Re-authenticate with `tfctl login` |\n| `exit 5` (429 rate limit) | Too many requests | Wait and retry; tfctl will backoff automatically |\n| `exit 6` with \"plan is errored\" | Terraform plan had syntax errors (not CLI error) | Read the plan output for details |\n| Empty list (`data: []`) when filtering | No resources match criteria | Verify criteria is correct; empty list is valid answer |\n\n## Smart defaults\n\n- `{organization}` resolves from active profile if set.\n- `{workspace}` resolves from a local `cloud {}` block in CWD.\n- Already-formed IDs (`ws-…`, `team-…`, `prj-…`, `varset-…`) are passed through as-is.\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,57,64,299,305,347,359,402,499,511,546,571,577,589,712,718,2221,2227,2321,2339,2345,2397,2433,2439,2699,2711,2717,2875,2899,2905,3088,3094,3160],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"tfctl-hcp-terraform-cli",[48],{"type":49,"value":50},"text","tfctl — HCP Terraform CLI",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Single binary, full v2 API coverage. Already authenticated.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"hard-rules",[62],{"type":49,"value":63},"Hard rules",{"type":43,"tag":65,"props":66,"children":67},"ol",{},[68,112,168,201,249],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72,94,96,102,104,110],{"type":43,"tag":73,"props":74,"children":75},"strong",{},[76,78,84,86,92],{"type":49,"value":77},"Never pipe ",{"type":43,"tag":79,"props":80,"children":82},"code",{"className":81},[],[83],{"type":49,"value":4},{"type":49,"value":85}," JSON to an external ",{"type":43,"tag":79,"props":87,"children":89},{"className":88},[],[90],{"type":49,"value":91},"jq",{"type":49,"value":93},".",{"type":49,"value":95}," Use the built-in ",{"type":43,"tag":79,"props":97,"children":99},{"className":98},[],[100],{"type":49,"value":101},"--jq '\u003Cexpr>'",{"type":49,"value":103}," flag — it implies ",{"type":43,"tag":79,"props":105,"children":107},{"className":106},[],[108],{"type":49,"value":109},"--json",{"type":49,"value":111}," and runs gojq on the response envelope.",{"type":43,"tag":69,"props":113,"children":114},{},[115,128,130,136,138,144,145,151,152,158,160,166],{"type":43,"tag":73,"props":116,"children":117},{},[118,120,126],{"type":49,"value":119},"Resolve names with ",{"type":43,"tag":79,"props":121,"children":123},{"className":122},[],[124],{"type":49,"value":125},"-p",{"type":49,"value":127},", not separate lookup calls.",{"type":49,"value":129}," Paths with ",{"type":43,"tag":79,"props":131,"children":133},{"className":132},[],[134],{"type":49,"value":135},"{workspace}",{"type":49,"value":137},"\u002F",{"type":43,"tag":79,"props":139,"children":141},{"className":140},[],[142],{"type":49,"value":143},"{team}",{"type":49,"value":137},{"type":43,"tag":79,"props":146,"children":148},{"className":147},[],[149],{"type":49,"value":150},"{project}",{"type":49,"value":137},{"type":43,"tag":79,"props":153,"children":155},{"className":154},[],[156],{"type":49,"value":157},"{varset}",{"type":49,"value":159}," accept ",{"type":43,"tag":79,"props":161,"children":163},{"className":162},[],[164],{"type":49,"value":165},"-p workspace=NAME",{"type":49,"value":167}," etc. — tfctl resolves name→ID for you. Don't fetch the ID first.",{"type":43,"tag":69,"props":169,"children":170},{},[171,176,178,184,186,192,193,199],{"type":43,"tag":73,"props":172,"children":173},{},[174],{"type":49,"value":175},"Trust the first answer.",{"type":49,"value":177}," ",{"type":43,"tag":79,"props":179,"children":181},{"className":180},[],[182],{"type":49,"value":183},"data: []",{"type":49,"value":185},", ",{"type":43,"tag":79,"props":187,"children":189},{"className":188},[],[190],{"type":49,"value":191},"data: null",{"type":49,"value":185},{"type":43,"tag":79,"props":194,"children":196},{"className":195},[],[197],{"type":49,"value":198},"relationships.X.data: null",{"type":49,"value":200},", or stderr \"no current run\"\u002F\"not found\" ARE the answer. Don't re-query in another format. Don't walk relationships \"to verify\".",{"type":43,"tag":69,"props":202,"children":203},{},[204,209,211,235,239,241,247],{"type":43,"tag":73,"props":205,"children":206},{},[207],{"type":49,"value":208},"When a named resource is not found, stop completely.",{"type":49,"value":210}," Exit code 2 or absence from a listing IS the full answer. Never:",{"type":43,"tag":212,"props":213,"children":214},"ul",{},[215,220,225,230],{"type":43,"tag":69,"props":216,"children":217},{},[218],{"type":49,"value":219},"Try a different resource ID \"to verify the endpoint works\"",{"type":43,"tag":69,"props":221,"children":222},{},[223],{"type":49,"value":224},"Pivot to another org\u002Fworkspace that appeared in the available list",{"type":43,"tag":69,"props":226,"children":227},{},[228],{"type":49,"value":229},"Explore related resources to find \"similar\" information",{"type":43,"tag":69,"props":231,"children":232},{},[233],{"type":49,"value":234},"Use Rule 3 to justify switching to a different resource: if you listed orgs and 'platform' isn't there, the first answer is \"platform doesn't exist\" — stop, don't use whatever org IS listed instead.",{"type":43,"tag":236,"props":237,"children":238},"br",{},[],{"type":49,"value":240},"Examples: ",{"type":43,"tag":79,"props":242,"children":244},{"className":243},[],[245],{"type":49,"value":246},"run-POLICY",{"type":49,"value":248}," returns exit 2 → stop, don't query other run IDs. Listing orgs shows no 'platform' → stop, don't use the org that IS listed.",{"type":43,"tag":69,"props":250,"children":251},{},[252,265,267,273,275,281,283,289,291,298],{"type":43,"tag":73,"props":253,"children":254},{},[255,257,263],{"type":49,"value":256},"Never run ",{"type":43,"tag":79,"props":258,"children":260},{"className":259},[],[261],{"type":49,"value":262},"tfctl harness exec",{"type":49,"value":264}," yourself to self-authorize.",{"type":49,"value":266}," The ",{"type":43,"tag":79,"props":268,"children":270},{"className":269},[],[271],{"type":49,"value":272},"--allow-delete",{"type":49,"value":274}," grant is a human's opt-in for your session. If a delete is refused, relay the printed ",{"type":43,"tag":79,"props":276,"children":278},{"className":277},[],[279],{"type":49,"value":280},"harness exec --allow-delete=\u003Cclass>",{"type":49,"value":282}," command back to the human — do not run it (or set ",{"type":43,"tag":79,"props":284,"children":286},{"className":285},[],[287],{"type":49,"value":288},"TFCTL_EXEC_SESSION",{"type":49,"value":290},") to grant yourself permission. See ",{"type":43,"tag":292,"props":293,"children":295},"a",{"href":294},"#deleting-resources",[296],{"type":49,"value":297},"Deleting resources",{"type":49,"value":93},{"type":43,"tag":300,"props":301,"children":303},"h3",{"id":302},"deleting-resources",[304],{"type":49,"value":297},{"type":43,"tag":52,"props":306,"children":307},{},[308,310,315,317,323,325,331,333,338,340,345],{"type":49,"value":309},"Deletes are destructive, so ",{"type":43,"tag":79,"props":311,"children":313},{"className":312},[],[314],{"type":49,"value":4},{"type":49,"value":316}," itself gates them — you don't need to police this with a blanket refusal. A noninteractive ",{"type":43,"tag":79,"props":318,"children":320},{"className":319},[],[321],{"type":49,"value":322},"tfctl ... -X DELETE",{"type":49,"value":324}," only goes through when a human has opted in for this session by launching you via ",{"type":43,"tag":79,"props":326,"children":328},{"className":327},[],[329],{"type":49,"value":330},"tfctl harness exec --allow-delete=\u003Cclass> -- \u003Ccommand>",{"type":49,"value":332}," (which sets ",{"type":43,"tag":79,"props":334,"children":336},{"className":335},[],[337],{"type":49,"value":288},{"type":49,"value":339},"). Otherwise ",{"type":43,"tag":79,"props":341,"children":343},{"className":342},[],[344],{"type":49,"value":4},{"type":49,"value":346}," refuses on its own and tells you what to do.",{"type":43,"tag":52,"props":348,"children":349},{},[350,352,357],{"type":49,"value":351},"So when you're asked to delete something, just run the normal command and let ",{"type":43,"tag":79,"props":353,"children":355},{"className":354},[],[356],{"type":49,"value":4},{"type":49,"value":358}," be the gate:",{"type":43,"tag":360,"props":361,"children":366},"pre",{"className":362,"code":363,"language":364,"meta":365,"style":365},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tfctl api PATH -X DELETE\n","bash","",[367],{"type":43,"tag":79,"props":368,"children":369},{"__ignoreMap":365},[370],{"type":43,"tag":371,"props":372,"children":375},"span",{"class":373,"line":374},"line",1,[376,381,387,392,397],{"type":43,"tag":371,"props":377,"children":379},{"style":378},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[380],{"type":49,"value":4},{"type":43,"tag":371,"props":382,"children":384},{"style":383},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[385],{"type":49,"value":386}," api",{"type":43,"tag":371,"props":388,"children":389},{"style":383},[390],{"type":49,"value":391}," PATH",{"type":43,"tag":371,"props":393,"children":394},{"style":383},[395],{"type":49,"value":396}," -X",{"type":43,"tag":371,"props":398,"children":399},{"style":383},[400],{"type":49,"value":401}," DELETE\n",{"type":43,"tag":212,"props":403,"children":404},{},[405,415,446,479],{"type":43,"tag":69,"props":406,"children":407},{},[408,413],{"type":43,"tag":73,"props":409,"children":410},{},[411],{"type":49,"value":412},"If the session authorizes that resource's class, it succeeds",{"type":49,"value":414}," — that's the human's intent, not a violation; proceed and report the result.",{"type":43,"tag":69,"props":416,"children":417},{},[418,430,432,437,439,445],{"type":43,"tag":73,"props":419,"children":420},{},[421,423,428],{"type":49,"value":422},"If it doesn't, ",{"type":43,"tag":79,"props":424,"children":426},{"className":425},[],[427],{"type":49,"value":4},{"type":49,"value":429}," refuses with a self-documenting message and prints the exact command to hand back",{"type":49,"value":431}," (including the ",{"type":43,"tag":79,"props":433,"children":435},{"className":434},[],[436],{"type":49,"value":280},{"type":49,"value":438}," a human can use to authorize you). Relay that rather than forcing it; don't run ",{"type":43,"tag":79,"props":440,"children":442},{"className":441},[],[443],{"type":49,"value":444},"harness exec",{"type":49,"value":264},{"type":43,"tag":69,"props":447,"children":448},{},[449,454,456,462,464,470,472,477],{"type":43,"tag":73,"props":450,"children":451},{},[452],{"type":49,"value":453},"You can't tell in advance whether the session grants a class — so don't guess. Attempt the delete and let the refusal tell you.",{"type":49,"value":455}," The refusal is a plain exit 1 with a message naming the class and the ",{"type":43,"tag":79,"props":457,"children":459},{"className":458},[],[460],{"type":49,"value":461},"--allow-delete=\u003Cclass>",{"type":49,"value":463}," command; that is your cue to relay. This is a grant gap, NOT an auth failure: never report it as an expired token, an ",{"type":43,"tag":79,"props":465,"children":467},{"className":466},[],[468],{"type":49,"value":469},"exit code 3",{"type":49,"value":471},", or tell the human to re-login unless ",{"type":43,"tag":79,"props":473,"children":475},{"className":474},[],[476],{"type":49,"value":4},{"type":49,"value":478}," actually says the token is expired\u002Finvalid.",{"type":43,"tag":69,"props":480,"children":481},{},[482,484,490,491,497],{"type":49,"value":483},"Apply ordinary caution to irreversible deletes (",{"type":43,"tag":79,"props":485,"children":487},{"className":486},[],[488],{"type":49,"value":489},"organizations",{"type":49,"value":185},{"type":43,"tag":79,"props":492,"children":494},{"className":493},[],[495],{"type":49,"value":496},"projects",{"type":49,"value":498},"). For a high-stakes resource, confirm intent with the human first even when the session would allow it.",{"type":43,"tag":300,"props":500,"children":502},{"id":501},"url-shape-per-workspace-subpaths-live-at-workspacesworkspace",[503,505],{"type":49,"value":504},"URL shape: per-workspace subpaths live at ",{"type":43,"tag":79,"props":506,"children":508},{"className":507},[],[509],{"type":49,"value":510},"\u002Fworkspaces\u002F{workspace}\u002F...",{"type":43,"tag":52,"props":512,"children":513},{},[514,516,521,523,529,531,537,539,545],{"type":49,"value":515},"Most \"things attached to a workspace\" (vars, runs, varsets, remote-state-consumers, configuration-versions, notification-configurations, state-versions) are under ",{"type":43,"tag":79,"props":517,"children":519},{"className":518},[],[520],{"type":49,"value":510},{"type":49,"value":522},", NOT ",{"type":43,"tag":79,"props":524,"children":526},{"className":525},[],[527],{"type":49,"value":528},"\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002F...",{"type":49,"value":530},". The org-nested form only exists for the workspace resource itself (",{"type":43,"tag":79,"props":532,"children":534},{"className":533},[],[535],{"type":49,"value":536},"\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}",{"type":49,"value":538},"). For everything else, use ",{"type":43,"tag":79,"props":540,"children":542},{"className":541},[],[543],{"type":49,"value":544},"\u002Fworkspaces\u002F{workspace}\u002FX -p workspace=NAME",{"type":49,"value":93},{"type":43,"tag":52,"props":547,"children":548},{},[549,554,556,562,564,570],{"type":43,"tag":73,"props":550,"children":551},{},[552],{"type":49,"value":553},"Exception: Policy checks and run-specific data",{"type":49,"value":555}," live under ",{"type":43,"tag":79,"props":557,"children":559},{"className":558},[],[560],{"type":49,"value":561},"\u002Fruns\u002F{run-id}\u002F...",{"type":49,"value":563},", not under workspace paths. For example: ",{"type":43,"tag":79,"props":565,"children":567},{"className":566},[],[568],{"type":49,"value":569},"\u002Fruns\u002F{run-id}\u002Fpolicy-checks",{"type":49,"value":93},{"type":43,"tag":300,"props":572,"children":574},{"id":573},"anti-patterns-to-avoid",[575],{"type":49,"value":576},"Anti-patterns to avoid",{"type":43,"tag":52,"props":578,"children":579},{},[580,582,587],{"type":49,"value":581},"These paths ",{"type":43,"tag":73,"props":583,"children":584},{},[585],{"type":49,"value":586},"do not exist",{"type":49,"value":588},"; don't try them:",{"type":43,"tag":212,"props":590,"children":591},{},[592,613,630,647,664,684],{"type":43,"tag":69,"props":593,"children":594},{},[595,597,603,605,611],{"type":49,"value":596},"❌ ",{"type":43,"tag":79,"props":598,"children":600},{"className":599},[],[601],{"type":49,"value":602},"\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fvars",{"type":49,"value":604}," — use ",{"type":43,"tag":79,"props":606,"children":608},{"className":607},[],[609],{"type":49,"value":610},"\u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME",{"type":49,"value":612}," instead",{"type":43,"tag":69,"props":614,"children":615},{},[616,617,623,624],{"type":49,"value":596},{"type":43,"tag":79,"props":618,"children":620},{"className":619},[],[621],{"type":49,"value":622},"\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fstate-versions",{"type":49,"value":604},{"type":43,"tag":79,"props":625,"children":627},{"className":626},[],[628],{"type":49,"value":629},"\u002Fworkspaces\u002F{workspace}\u002Fstate-versions -p workspace=NAME",{"type":43,"tag":69,"props":631,"children":632},{},[633,634,640,641],{"type":49,"value":596},{"type":43,"tag":79,"props":635,"children":637},{"className":636},[],[638],{"type":49,"value":639},"\u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fconfiguration-versions",{"type":49,"value":604},{"type":43,"tag":79,"props":642,"children":644},{"className":643},[],[645],{"type":49,"value":646},"\u002Fworkspaces\u002F{workspace}\u002Fconfiguration-versions -p workspace=NAME",{"type":43,"tag":69,"props":648,"children":649},{},[650,651,657,658,663],{"type":49,"value":596},{"type":43,"tag":79,"props":652,"children":654},{"className":653},[],[655],{"type":49,"value":656},"\u002Fworkspaces\u002F{workspace}\u002Fpolicy-checks",{"type":49,"value":604},{"type":43,"tag":79,"props":659,"children":661},{"className":660},[],[662],{"type":49,"value":569},{"type":49,"value":612},{"type":43,"tag":69,"props":665,"children":666},{},[667,668,674,676,682],{"type":49,"value":596},{"type":43,"tag":79,"props":669,"children":671},{"className":670},[],[672],{"type":49,"value":673},"\u002Forganizations\u002F{org}\u002Fvarsets",{"type":49,"value":675}," (partially wrong path) — use ",{"type":43,"tag":79,"props":677,"children":679},{"className":678},[],[680],{"type":49,"value":681},"\u002Forganizations\u002F{organization}\u002Fvarsets",{"type":49,"value":683}," with correct org placeholder",{"type":43,"tag":69,"props":685,"children":686},{},[687,689,694,696,702,704,710],{"type":49,"value":688},"❌ External ",{"type":43,"tag":79,"props":690,"children":692},{"className":691},[],[693],{"type":49,"value":91},{"type":49,"value":695}," pipes like ",{"type":43,"tag":79,"props":697,"children":699},{"className":698},[],[700],{"type":49,"value":701},"tfctl ... | jq '...'",{"type":49,"value":703}," — always use ",{"type":43,"tag":79,"props":705,"children":707},{"className":706},[],[708],{"type":49,"value":709},"tfctl api ... --jq '...'",{"type":49,"value":711}," with built-in flag",{"type":43,"tag":58,"props":713,"children":715},{"id":714},"cookbook-one-line-answers-for-common-tasks",[716],{"type":49,"value":717},"Cookbook — one-line answers for common tasks",{"type":43,"tag":360,"props":719,"children":721},{"className":362,"code":720,"language":364,"meta":365,"style":365},"# Count workspaces in an org\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --page-size 1 --jq '.meta.pagination.[\"total-count\"]'\n\n# Find workspace by partial name (server-side search) — also returns current run state in one call\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces -f 'search[name]=TERM' --jq '.data[] | {id, name: .attributes.name, current_run: .relationships.[\"current-run\"].data}'\n\n# Filter workspaces by attribute\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.[\"terraform-version\"] | startswith(\"1.8\")) | .attributes.name'\n\n# List variables on a workspace — path is \u002Fworkspaces\u002F{workspace}\u002Fvars (NOT \u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fvars; that endpoint does not exist)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME --jq '.data[] | {key: .attributes.key, category: .attributes.category, sensitive: .attributes.sensitive}'\n\n# Get current run status\ntfctl run status NAME_OR_ID            # If it prints \"no current run\" or exits non-zero with that message, that IS the answer.\n\n# Get current run ID for a workspace\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces\u002FNAME --jq '.data.relationships.[\"current-run\"].data.id'\n\n# List runs in a workspace with status filtering\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fruns -p workspace=NAME --jq '.data[] | select(.attributes.status == \"planned\") | {id, status: .attributes.status}'\n\n# Find workspace by VCS repo identifier (single call; no results = not connected to that repo)\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all \\\n  --jq '.data[] | select(.attributes.[\"vcs-repo\"] != null and .attributes.[\"vcs-repo\"].identifier == \"org\u002Frepo\") | {id: .id, name: .attributes.name}'\n\n# List workspaces accessible to a team (two-step: resolve team name → query team-workspaces)\n# Note: \u002Forganizations\u002F{org}\u002Fteams\u002F{id}\u002Fworkspaces does NOT exist — use \u002Fteam-workspaces instead\ntfctl api \u002Forganizations\u002F{organization}\u002Fteams -f 'filter[names]=TEAM_NAME' --jq '.data[0].id'\ntfctl api \u002Fteam-workspaces -f 'filter[team][id]=TEAM_ID' --jq '.data[] | {workspace_id: .relationships.workspace.data.id, access: .attributes.access}'\n\n# Get organization details and settings\ntfctl api \u002Forganizations\u002F{organization} --jq '.data | {id, name: .attributes.name, created_at: .attributes.\"created-at\", terraform_version_default: .attributes.\"terraform-version\"}'\n\n# Get the current state version for a workspace\n# (operationId: getCurrentStateVersion — single resource, not a list)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fcurrent-state-version -p workspace=NAME --jq '.data | {serial: .attributes.serial, created_at: .attributes.[\"created-at\"], status: .attributes.status}'\n\n# List all variable sets in an org and their variable counts\ntfctl api \u002Forganizations\u002F{organization}\u002Fvarsets --all --jq '.data[] | {name: .attributes.name, id: .id, var_count: (.relationships.vars.data | length)}'\n\n# Get configuration version details\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fconfiguration-versions -p workspace=NAME --jq '.data[] | {id, source: .attributes.source, created_at: .attributes.created-at}'\n\n# List notification configurations\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fnotification-configurations -p workspace=NAME --jq '.data[] | {id, type: .attributes.destination-type, trigger: .attributes.triggers}'\n\n# Filter workspaces by terraform version (1.7+)\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.[\"terraform-version\"] | ltrimstr(\"v\") | split(\".\") | [.[0], .[1]] | join(\".\") | tonumber >= 1.7) | {name: .attributes.name, tf_version: .attributes.[\"terraform-version\"]}'\n\n# Filter workspaces excluding certain names\ntfctl api \u002Forganizations\u002F{organization}\u002Fworkspaces --all --jq '.data[] | select(.attributes.name | test(\"^temp-|^old-\") | not) | .attributes.name'\n\n# Count resources by status (e.g., runs by status)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fruns -p workspace=NAME --all --jq '[.data[] | .attributes.status] | group_by(.) | map({status: .[0], count: length})'\n\n# Get log URL for a completed run\n# Note: run.log-read-url is null on completed runs — the URL lives on plan\u002Fapply.\ntfctl api \u002Fruns\u002FRUN_ID --jq '.data.relationships | {plan: .plan.data.id, apply: .apply.data.id}'\ntfctl api \u002Fplans\u002FPLAN_ID --jq '.data.attributes.[\"log-read-url\"]'\n\n# Start a run\ntfctl run start NAME_OR_ID\n\n# Add a remote state consumer to a workspace\n# (operationId: addWorkspaceRemoteStateConsumers — POST returns 204)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fremote-state-consumers -p workspace=NAME \\\n  -i '{\"data\":[{\"type\":\"workspaces\",\"id\":\"ws-CONSUMER_ID\"}]}'\n\n# Apply a variable set to a workspace\n# (operationId: updateWorkspaceRelationship for varsets)\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fvarsets -p workspace=NAME \\\n  -X POST -i '{\"data\":[{\"type\":\"varsets\",\"id\":\"varset-VARSET_ID\"}]}'\n\n# Get policy check results for a run\ntfctl api \u002Fruns\u002F{run-id}\u002Fpolicy-checks --jq '.data[] | {id: .id, status: .attributes.status, enforced: .attributes.enforcement-level}'\n\n# Discover an API operation when you don't know it\ntfctl api schema search \"KEYWORD\" --json     # returns operationIds\ntfctl api schema get OPERATION_ID            # full OpenAPI schema (large response — only call when needed)\n",[722],{"type":43,"tag":79,"props":723,"children":724},{"__ignoreMap":365},[725,734,783,793,802,853,861,870,908,916,925,969,977,986,1014,1022,1031,1065,1073,1082,1124,1132,1141,1167,1189,1197,1206,1215,1266,1317,1325,1334,1368,1376,1385,1394,1436,1444,1453,1491,1499,1508,1550,1558,1567,1609,1617,1626,1663,1671,1680,1717,1724,1733,1778,1786,1795,1804,1838,1872,1880,1889,1911,1919,1928,1937,1966,1988,1996,2005,2014,2043,2075,2083,2092,2126,2134,2143,2190],{"type":43,"tag":371,"props":726,"children":727},{"class":373,"line":374},[728],{"type":43,"tag":371,"props":729,"children":731},{"style":730},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[732],{"type":49,"value":733},"# Count workspaces in an org\n",{"type":43,"tag":371,"props":735,"children":737},{"class":373,"line":736},2,[738,742,746,751,756,762,767,773,778],{"type":43,"tag":371,"props":739,"children":740},{"style":378},[741],{"type":49,"value":4},{"type":43,"tag":371,"props":743,"children":744},{"style":383},[745],{"type":49,"value":386},{"type":43,"tag":371,"props":747,"children":748},{"style":383},[749],{"type":49,"value":750}," \u002Forganizations\u002F{organization}\u002Fworkspaces",{"type":43,"tag":371,"props":752,"children":753},{"style":383},[754],{"type":49,"value":755}," --page-size",{"type":43,"tag":371,"props":757,"children":759},{"style":758},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[760],{"type":49,"value":761}," 1",{"type":43,"tag":371,"props":763,"children":764},{"style":383},[765],{"type":49,"value":766}," --jq",{"type":43,"tag":371,"props":768,"children":770},{"style":769},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[771],{"type":49,"value":772}," '",{"type":43,"tag":371,"props":774,"children":775},{"style":383},[776],{"type":49,"value":777},".meta.pagination.[\"total-count\"]",{"type":43,"tag":371,"props":779,"children":780},{"style":769},[781],{"type":49,"value":782},"'\n",{"type":43,"tag":371,"props":784,"children":786},{"class":373,"line":785},3,[787],{"type":43,"tag":371,"props":788,"children":790},{"emptyLinePlaceholder":789},true,[791],{"type":49,"value":792},"\n",{"type":43,"tag":371,"props":794,"children":796},{"class":373,"line":795},4,[797],{"type":43,"tag":371,"props":798,"children":799},{"style":730},[800],{"type":49,"value":801},"# Find workspace by partial name (server-side search) — also returns current run state in one call\n",{"type":43,"tag":371,"props":803,"children":804},{"class":373,"line":29},[805,809,813,817,822,826,831,836,840,844,849],{"type":43,"tag":371,"props":806,"children":807},{"style":378},[808],{"type":49,"value":4},{"type":43,"tag":371,"props":810,"children":811},{"style":383},[812],{"type":49,"value":386},{"type":43,"tag":371,"props":814,"children":815},{"style":383},[816],{"type":49,"value":750},{"type":43,"tag":371,"props":818,"children":819},{"style":383},[820],{"type":49,"value":821}," -f",{"type":43,"tag":371,"props":823,"children":824},{"style":769},[825],{"type":49,"value":772},{"type":43,"tag":371,"props":827,"children":828},{"style":383},[829],{"type":49,"value":830},"search[name]=TERM",{"type":43,"tag":371,"props":832,"children":833},{"style":769},[834],{"type":49,"value":835},"'",{"type":43,"tag":371,"props":837,"children":838},{"style":383},[839],{"type":49,"value":766},{"type":43,"tag":371,"props":841,"children":842},{"style":769},[843],{"type":49,"value":772},{"type":43,"tag":371,"props":845,"children":846},{"style":383},[847],{"type":49,"value":848},".data[] | {id, name: .attributes.name, current_run: .relationships.[\"current-run\"].data}",{"type":43,"tag":371,"props":850,"children":851},{"style":769},[852],{"type":49,"value":782},{"type":43,"tag":371,"props":854,"children":856},{"class":373,"line":855},6,[857],{"type":43,"tag":371,"props":858,"children":859},{"emptyLinePlaceholder":789},[860],{"type":49,"value":792},{"type":43,"tag":371,"props":862,"children":864},{"class":373,"line":863},7,[865],{"type":43,"tag":371,"props":866,"children":867},{"style":730},[868],{"type":49,"value":869},"# Filter workspaces by attribute\n",{"type":43,"tag":371,"props":871,"children":873},{"class":373,"line":872},8,[874,878,882,886,891,895,899,904],{"type":43,"tag":371,"props":875,"children":876},{"style":378},[877],{"type":49,"value":4},{"type":43,"tag":371,"props":879,"children":880},{"style":383},[881],{"type":49,"value":386},{"type":43,"tag":371,"props":883,"children":884},{"style":383},[885],{"type":49,"value":750},{"type":43,"tag":371,"props":887,"children":888},{"style":383},[889],{"type":49,"value":890}," --all",{"type":43,"tag":371,"props":892,"children":893},{"style":383},[894],{"type":49,"value":766},{"type":43,"tag":371,"props":896,"children":897},{"style":769},[898],{"type":49,"value":772},{"type":43,"tag":371,"props":900,"children":901},{"style":383},[902],{"type":49,"value":903},".data[] | select(.attributes.[\"terraform-version\"] | startswith(\"1.8\")) | .attributes.name",{"type":43,"tag":371,"props":905,"children":906},{"style":769},[907],{"type":49,"value":782},{"type":43,"tag":371,"props":909,"children":911},{"class":373,"line":910},9,[912],{"type":43,"tag":371,"props":913,"children":914},{"emptyLinePlaceholder":789},[915],{"type":49,"value":792},{"type":43,"tag":371,"props":917,"children":919},{"class":373,"line":918},10,[920],{"type":43,"tag":371,"props":921,"children":922},{"style":730},[923],{"type":49,"value":924},"# List variables on a workspace — path is \u002Fworkspaces\u002F{workspace}\u002Fvars (NOT \u002Forganizations\u002F{org}\u002Fworkspaces\u002F{name}\u002Fvars; that endpoint does not exist)\n",{"type":43,"tag":371,"props":926,"children":928},{"class":373,"line":927},11,[929,933,937,942,947,952,956,960,965],{"type":43,"tag":371,"props":930,"children":931},{"style":378},[932],{"type":49,"value":4},{"type":43,"tag":371,"props":934,"children":935},{"style":383},[936],{"type":49,"value":386},{"type":43,"tag":371,"props":938,"children":939},{"style":383},[940],{"type":49,"value":941}," \u002Fworkspaces\u002F{workspace}\u002Fvars",{"type":43,"tag":371,"props":943,"children":944},{"style":383},[945],{"type":49,"value":946}," -p",{"type":43,"tag":371,"props":948,"children":949},{"style":383},[950],{"type":49,"value":951}," workspace=NAME",{"type":43,"tag":371,"props":953,"children":954},{"style":383},[955],{"type":49,"value":766},{"type":43,"tag":371,"props":957,"children":958},{"style":769},[959],{"type":49,"value":772},{"type":43,"tag":371,"props":961,"children":962},{"style":383},[963],{"type":49,"value":964},".data[] | {key: .attributes.key, category: .attributes.category, sensitive: .attributes.sensitive}",{"type":43,"tag":371,"props":966,"children":967},{"style":769},[968],{"type":49,"value":782},{"type":43,"tag":371,"props":970,"children":972},{"class":373,"line":971},12,[973],{"type":43,"tag":371,"props":974,"children":975},{"emptyLinePlaceholder":789},[976],{"type":49,"value":792},{"type":43,"tag":371,"props":978,"children":980},{"class":373,"line":979},13,[981],{"type":43,"tag":371,"props":982,"children":983},{"style":730},[984],{"type":49,"value":985},"# Get current run status\n",{"type":43,"tag":371,"props":987,"children":989},{"class":373,"line":988},14,[990,994,999,1004,1009],{"type":43,"tag":371,"props":991,"children":992},{"style":378},[993],{"type":49,"value":4},{"type":43,"tag":371,"props":995,"children":996},{"style":383},[997],{"type":49,"value":998}," run",{"type":43,"tag":371,"props":1000,"children":1001},{"style":383},[1002],{"type":49,"value":1003}," status",{"type":43,"tag":371,"props":1005,"children":1006},{"style":383},[1007],{"type":49,"value":1008}," NAME_OR_ID",{"type":43,"tag":371,"props":1010,"children":1011},{"style":730},[1012],{"type":49,"value":1013},"            # If it prints \"no current run\" or exits non-zero with that message, that IS the answer.\n",{"type":43,"tag":371,"props":1015,"children":1017},{"class":373,"line":1016},15,[1018],{"type":43,"tag":371,"props":1019,"children":1020},{"emptyLinePlaceholder":789},[1021],{"type":49,"value":792},{"type":43,"tag":371,"props":1023,"children":1025},{"class":373,"line":1024},16,[1026],{"type":43,"tag":371,"props":1027,"children":1028},{"style":730},[1029],{"type":49,"value":1030},"# Get current run ID for a workspace\n",{"type":43,"tag":371,"props":1032,"children":1034},{"class":373,"line":1033},17,[1035,1039,1043,1048,1052,1056,1061],{"type":43,"tag":371,"props":1036,"children":1037},{"style":378},[1038],{"type":49,"value":4},{"type":43,"tag":371,"props":1040,"children":1041},{"style":383},[1042],{"type":49,"value":386},{"type":43,"tag":371,"props":1044,"children":1045},{"style":383},[1046],{"type":49,"value":1047}," \u002Forganizations\u002F{organization}\u002Fworkspaces\u002FNAME",{"type":43,"tag":371,"props":1049,"children":1050},{"style":383},[1051],{"type":49,"value":766},{"type":43,"tag":371,"props":1053,"children":1054},{"style":769},[1055],{"type":49,"value":772},{"type":43,"tag":371,"props":1057,"children":1058},{"style":383},[1059],{"type":49,"value":1060},".data.relationships.[\"current-run\"].data.id",{"type":43,"tag":371,"props":1062,"children":1063},{"style":769},[1064],{"type":49,"value":782},{"type":43,"tag":371,"props":1066,"children":1068},{"class":373,"line":1067},18,[1069],{"type":43,"tag":371,"props":1070,"children":1071},{"emptyLinePlaceholder":789},[1072],{"type":49,"value":792},{"type":43,"tag":371,"props":1074,"children":1076},{"class":373,"line":1075},19,[1077],{"type":43,"tag":371,"props":1078,"children":1079},{"style":730},[1080],{"type":49,"value":1081},"# List runs in a workspace with status filtering\n",{"type":43,"tag":371,"props":1083,"children":1085},{"class":373,"line":1084},20,[1086,1090,1094,1099,1103,1107,1111,1115,1120],{"type":43,"tag":371,"props":1087,"children":1088},{"style":378},[1089],{"type":49,"value":4},{"type":43,"tag":371,"props":1091,"children":1092},{"style":383},[1093],{"type":49,"value":386},{"type":43,"tag":371,"props":1095,"children":1096},{"style":383},[1097],{"type":49,"value":1098}," \u002Fworkspaces\u002F{workspace}\u002Fruns",{"type":43,"tag":371,"props":1100,"children":1101},{"style":383},[1102],{"type":49,"value":946},{"type":43,"tag":371,"props":1104,"children":1105},{"style":383},[1106],{"type":49,"value":951},{"type":43,"tag":371,"props":1108,"children":1109},{"style":383},[1110],{"type":49,"value":766},{"type":43,"tag":371,"props":1112,"children":1113},{"style":769},[1114],{"type":49,"value":772},{"type":43,"tag":371,"props":1116,"children":1117},{"style":383},[1118],{"type":49,"value":1119},".data[] | select(.attributes.status == \"planned\") | {id, status: .attributes.status}",{"type":43,"tag":371,"props":1121,"children":1122},{"style":769},[1123],{"type":49,"value":782},{"type":43,"tag":371,"props":1125,"children":1127},{"class":373,"line":1126},21,[1128],{"type":43,"tag":371,"props":1129,"children":1130},{"emptyLinePlaceholder":789},[1131],{"type":49,"value":792},{"type":43,"tag":371,"props":1133,"children":1135},{"class":373,"line":1134},22,[1136],{"type":43,"tag":371,"props":1137,"children":1138},{"style":730},[1139],{"type":49,"value":1140},"# Find workspace by VCS repo identifier (single call; no results = not connected to that repo)\n",{"type":43,"tag":371,"props":1142,"children":1144},{"class":373,"line":1143},23,[1145,1149,1153,1157,1161],{"type":43,"tag":371,"props":1146,"children":1147},{"style":378},[1148],{"type":49,"value":4},{"type":43,"tag":371,"props":1150,"children":1151},{"style":383},[1152],{"type":49,"value":386},{"type":43,"tag":371,"props":1154,"children":1155},{"style":383},[1156],{"type":49,"value":750},{"type":43,"tag":371,"props":1158,"children":1159},{"style":383},[1160],{"type":49,"value":890},{"type":43,"tag":371,"props":1162,"children":1164},{"style":1163},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1165],{"type":49,"value":1166}," \\\n",{"type":43,"tag":371,"props":1168,"children":1170},{"class":373,"line":1169},24,[1171,1176,1180,1185],{"type":43,"tag":371,"props":1172,"children":1173},{"style":383},[1174],{"type":49,"value":1175},"  --jq",{"type":43,"tag":371,"props":1177,"children":1178},{"style":769},[1179],{"type":49,"value":772},{"type":43,"tag":371,"props":1181,"children":1182},{"style":383},[1183],{"type":49,"value":1184},".data[] | select(.attributes.[\"vcs-repo\"] != null and .attributes.[\"vcs-repo\"].identifier == \"org\u002Frepo\") | {id: .id, name: .attributes.name}",{"type":43,"tag":371,"props":1186,"children":1187},{"style":769},[1188],{"type":49,"value":782},{"type":43,"tag":371,"props":1190,"children":1192},{"class":373,"line":1191},25,[1193],{"type":43,"tag":371,"props":1194,"children":1195},{"emptyLinePlaceholder":789},[1196],{"type":49,"value":792},{"type":43,"tag":371,"props":1198,"children":1200},{"class":373,"line":1199},26,[1201],{"type":43,"tag":371,"props":1202,"children":1203},{"style":730},[1204],{"type":49,"value":1205},"# List workspaces accessible to a team (two-step: resolve team name → query team-workspaces)\n",{"type":43,"tag":371,"props":1207,"children":1209},{"class":373,"line":1208},27,[1210],{"type":43,"tag":371,"props":1211,"children":1212},{"style":730},[1213],{"type":49,"value":1214},"# Note: \u002Forganizations\u002F{org}\u002Fteams\u002F{id}\u002Fworkspaces does NOT exist — use \u002Fteam-workspaces instead\n",{"type":43,"tag":371,"props":1216,"children":1218},{"class":373,"line":1217},28,[1219,1223,1227,1232,1236,1240,1245,1249,1253,1257,1262],{"type":43,"tag":371,"props":1220,"children":1221},{"style":378},[1222],{"type":49,"value":4},{"type":43,"tag":371,"props":1224,"children":1225},{"style":383},[1226],{"type":49,"value":386},{"type":43,"tag":371,"props":1228,"children":1229},{"style":383},[1230],{"type":49,"value":1231}," \u002Forganizations\u002F{organization}\u002Fteams",{"type":43,"tag":371,"props":1233,"children":1234},{"style":383},[1235],{"type":49,"value":821},{"type":43,"tag":371,"props":1237,"children":1238},{"style":769},[1239],{"type":49,"value":772},{"type":43,"tag":371,"props":1241,"children":1242},{"style":383},[1243],{"type":49,"value":1244},"filter[names]=TEAM_NAME",{"type":43,"tag":371,"props":1246,"children":1247},{"style":769},[1248],{"type":49,"value":835},{"type":43,"tag":371,"props":1250,"children":1251},{"style":383},[1252],{"type":49,"value":766},{"type":43,"tag":371,"props":1254,"children":1255},{"style":769},[1256],{"type":49,"value":772},{"type":43,"tag":371,"props":1258,"children":1259},{"style":383},[1260],{"type":49,"value":1261},".data[0].id",{"type":43,"tag":371,"props":1263,"children":1264},{"style":769},[1265],{"type":49,"value":782},{"type":43,"tag":371,"props":1267,"children":1269},{"class":373,"line":1268},29,[1270,1274,1278,1283,1287,1291,1296,1300,1304,1308,1313],{"type":43,"tag":371,"props":1271,"children":1272},{"style":378},[1273],{"type":49,"value":4},{"type":43,"tag":371,"props":1275,"children":1276},{"style":383},[1277],{"type":49,"value":386},{"type":43,"tag":371,"props":1279,"children":1280},{"style":383},[1281],{"type":49,"value":1282}," \u002Fteam-workspaces",{"type":43,"tag":371,"props":1284,"children":1285},{"style":383},[1286],{"type":49,"value":821},{"type":43,"tag":371,"props":1288,"children":1289},{"style":769},[1290],{"type":49,"value":772},{"type":43,"tag":371,"props":1292,"children":1293},{"style":383},[1294],{"type":49,"value":1295},"filter[team][id]=TEAM_ID",{"type":43,"tag":371,"props":1297,"children":1298},{"style":769},[1299],{"type":49,"value":835},{"type":43,"tag":371,"props":1301,"children":1302},{"style":383},[1303],{"type":49,"value":766},{"type":43,"tag":371,"props":1305,"children":1306},{"style":769},[1307],{"type":49,"value":772},{"type":43,"tag":371,"props":1309,"children":1310},{"style":383},[1311],{"type":49,"value":1312},".data[] | {workspace_id: .relationships.workspace.data.id, access: .attributes.access}",{"type":43,"tag":371,"props":1314,"children":1315},{"style":769},[1316],{"type":49,"value":782},{"type":43,"tag":371,"props":1318,"children":1320},{"class":373,"line":1319},30,[1321],{"type":43,"tag":371,"props":1322,"children":1323},{"emptyLinePlaceholder":789},[1324],{"type":49,"value":792},{"type":43,"tag":371,"props":1326,"children":1328},{"class":373,"line":1327},31,[1329],{"type":43,"tag":371,"props":1330,"children":1331},{"style":730},[1332],{"type":49,"value":1333},"# Get organization details and settings\n",{"type":43,"tag":371,"props":1335,"children":1337},{"class":373,"line":1336},32,[1338,1342,1346,1351,1355,1359,1364],{"type":43,"tag":371,"props":1339,"children":1340},{"style":378},[1341],{"type":49,"value":4},{"type":43,"tag":371,"props":1343,"children":1344},{"style":383},[1345],{"type":49,"value":386},{"type":43,"tag":371,"props":1347,"children":1348},{"style":383},[1349],{"type":49,"value":1350}," \u002Forganizations\u002F{organization}",{"type":43,"tag":371,"props":1352,"children":1353},{"style":383},[1354],{"type":49,"value":766},{"type":43,"tag":371,"props":1356,"children":1357},{"style":769},[1358],{"type":49,"value":772},{"type":43,"tag":371,"props":1360,"children":1361},{"style":383},[1362],{"type":49,"value":1363},".data | {id, name: .attributes.name, created_at: .attributes.\"created-at\", terraform_version_default: .attributes.\"terraform-version\"}",{"type":43,"tag":371,"props":1365,"children":1366},{"style":769},[1367],{"type":49,"value":782},{"type":43,"tag":371,"props":1369,"children":1371},{"class":373,"line":1370},33,[1372],{"type":43,"tag":371,"props":1373,"children":1374},{"emptyLinePlaceholder":789},[1375],{"type":49,"value":792},{"type":43,"tag":371,"props":1377,"children":1379},{"class":373,"line":1378},34,[1380],{"type":43,"tag":371,"props":1381,"children":1382},{"style":730},[1383],{"type":49,"value":1384},"# Get the current state version for a workspace\n",{"type":43,"tag":371,"props":1386,"children":1388},{"class":373,"line":1387},35,[1389],{"type":43,"tag":371,"props":1390,"children":1391},{"style":730},[1392],{"type":49,"value":1393},"# (operationId: getCurrentStateVersion — single resource, not a list)\n",{"type":43,"tag":371,"props":1395,"children":1397},{"class":373,"line":1396},36,[1398,1402,1406,1411,1415,1419,1423,1427,1432],{"type":43,"tag":371,"props":1399,"children":1400},{"style":378},[1401],{"type":49,"value":4},{"type":43,"tag":371,"props":1403,"children":1404},{"style":383},[1405],{"type":49,"value":386},{"type":43,"tag":371,"props":1407,"children":1408},{"style":383},[1409],{"type":49,"value":1410}," \u002Fworkspaces\u002F{workspace}\u002Fcurrent-state-version",{"type":43,"tag":371,"props":1412,"children":1413},{"style":383},[1414],{"type":49,"value":946},{"type":43,"tag":371,"props":1416,"children":1417},{"style":383},[1418],{"type":49,"value":951},{"type":43,"tag":371,"props":1420,"children":1421},{"style":383},[1422],{"type":49,"value":766},{"type":43,"tag":371,"props":1424,"children":1425},{"style":769},[1426],{"type":49,"value":772},{"type":43,"tag":371,"props":1428,"children":1429},{"style":383},[1430],{"type":49,"value":1431},".data | {serial: .attributes.serial, created_at: .attributes.[\"created-at\"], status: .attributes.status}",{"type":43,"tag":371,"props":1433,"children":1434},{"style":769},[1435],{"type":49,"value":782},{"type":43,"tag":371,"props":1437,"children":1439},{"class":373,"line":1438},37,[1440],{"type":43,"tag":371,"props":1441,"children":1442},{"emptyLinePlaceholder":789},[1443],{"type":49,"value":792},{"type":43,"tag":371,"props":1445,"children":1447},{"class":373,"line":1446},38,[1448],{"type":43,"tag":371,"props":1449,"children":1450},{"style":730},[1451],{"type":49,"value":1452},"# List all variable sets in an org and their variable counts\n",{"type":43,"tag":371,"props":1454,"children":1456},{"class":373,"line":1455},39,[1457,1461,1465,1470,1474,1478,1482,1487],{"type":43,"tag":371,"props":1458,"children":1459},{"style":378},[1460],{"type":49,"value":4},{"type":43,"tag":371,"props":1462,"children":1463},{"style":383},[1464],{"type":49,"value":386},{"type":43,"tag":371,"props":1466,"children":1467},{"style":383},[1468],{"type":49,"value":1469}," \u002Forganizations\u002F{organization}\u002Fvarsets",{"type":43,"tag":371,"props":1471,"children":1472},{"style":383},[1473],{"type":49,"value":890},{"type":43,"tag":371,"props":1475,"children":1476},{"style":383},[1477],{"type":49,"value":766},{"type":43,"tag":371,"props":1479,"children":1480},{"style":769},[1481],{"type":49,"value":772},{"type":43,"tag":371,"props":1483,"children":1484},{"style":383},[1485],{"type":49,"value":1486},".data[] | {name: .attributes.name, id: .id, var_count: (.relationships.vars.data | length)}",{"type":43,"tag":371,"props":1488,"children":1489},{"style":769},[1490],{"type":49,"value":782},{"type":43,"tag":371,"props":1492,"children":1494},{"class":373,"line":1493},40,[1495],{"type":43,"tag":371,"props":1496,"children":1497},{"emptyLinePlaceholder":789},[1498],{"type":49,"value":792},{"type":43,"tag":371,"props":1500,"children":1502},{"class":373,"line":1501},41,[1503],{"type":43,"tag":371,"props":1504,"children":1505},{"style":730},[1506],{"type":49,"value":1507},"# Get configuration version details\n",{"type":43,"tag":371,"props":1509,"children":1511},{"class":373,"line":1510},42,[1512,1516,1520,1525,1529,1533,1537,1541,1546],{"type":43,"tag":371,"props":1513,"children":1514},{"style":378},[1515],{"type":49,"value":4},{"type":43,"tag":371,"props":1517,"children":1518},{"style":383},[1519],{"type":49,"value":386},{"type":43,"tag":371,"props":1521,"children":1522},{"style":383},[1523],{"type":49,"value":1524}," \u002Fworkspaces\u002F{workspace}\u002Fconfiguration-versions",{"type":43,"tag":371,"props":1526,"children":1527},{"style":383},[1528],{"type":49,"value":946},{"type":43,"tag":371,"props":1530,"children":1531},{"style":383},[1532],{"type":49,"value":951},{"type":43,"tag":371,"props":1534,"children":1535},{"style":383},[1536],{"type":49,"value":766},{"type":43,"tag":371,"props":1538,"children":1539},{"style":769},[1540],{"type":49,"value":772},{"type":43,"tag":371,"props":1542,"children":1543},{"style":383},[1544],{"type":49,"value":1545},".data[] | {id, source: .attributes.source, created_at: .attributes.created-at}",{"type":43,"tag":371,"props":1547,"children":1548},{"style":769},[1549],{"type":49,"value":782},{"type":43,"tag":371,"props":1551,"children":1553},{"class":373,"line":1552},43,[1554],{"type":43,"tag":371,"props":1555,"children":1556},{"emptyLinePlaceholder":789},[1557],{"type":49,"value":792},{"type":43,"tag":371,"props":1559,"children":1561},{"class":373,"line":1560},44,[1562],{"type":43,"tag":371,"props":1563,"children":1564},{"style":730},[1565],{"type":49,"value":1566},"# List notification configurations\n",{"type":43,"tag":371,"props":1568,"children":1570},{"class":373,"line":1569},45,[1571,1575,1579,1584,1588,1592,1596,1600,1605],{"type":43,"tag":371,"props":1572,"children":1573},{"style":378},[1574],{"type":49,"value":4},{"type":43,"tag":371,"props":1576,"children":1577},{"style":383},[1578],{"type":49,"value":386},{"type":43,"tag":371,"props":1580,"children":1581},{"style":383},[1582],{"type":49,"value":1583}," \u002Fworkspaces\u002F{workspace}\u002Fnotification-configurations",{"type":43,"tag":371,"props":1585,"children":1586},{"style":383},[1587],{"type":49,"value":946},{"type":43,"tag":371,"props":1589,"children":1590},{"style":383},[1591],{"type":49,"value":951},{"type":43,"tag":371,"props":1593,"children":1594},{"style":383},[1595],{"type":49,"value":766},{"type":43,"tag":371,"props":1597,"children":1598},{"style":769},[1599],{"type":49,"value":772},{"type":43,"tag":371,"props":1601,"children":1602},{"style":383},[1603],{"type":49,"value":1604},".data[] | {id, type: .attributes.destination-type, trigger: .attributes.triggers}",{"type":43,"tag":371,"props":1606,"children":1607},{"style":769},[1608],{"type":49,"value":782},{"type":43,"tag":371,"props":1610,"children":1612},{"class":373,"line":1611},46,[1613],{"type":43,"tag":371,"props":1614,"children":1615},{"emptyLinePlaceholder":789},[1616],{"type":49,"value":792},{"type":43,"tag":371,"props":1618,"children":1620},{"class":373,"line":1619},47,[1621],{"type":43,"tag":371,"props":1622,"children":1623},{"style":730},[1624],{"type":49,"value":1625},"# Filter workspaces by terraform version (1.7+)\n",{"type":43,"tag":371,"props":1627,"children":1629},{"class":373,"line":1628},48,[1630,1634,1638,1642,1646,1650,1654,1659],{"type":43,"tag":371,"props":1631,"children":1632},{"style":378},[1633],{"type":49,"value":4},{"type":43,"tag":371,"props":1635,"children":1636},{"style":383},[1637],{"type":49,"value":386},{"type":43,"tag":371,"props":1639,"children":1640},{"style":383},[1641],{"type":49,"value":750},{"type":43,"tag":371,"props":1643,"children":1644},{"style":383},[1645],{"type":49,"value":890},{"type":43,"tag":371,"props":1647,"children":1648},{"style":383},[1649],{"type":49,"value":766},{"type":43,"tag":371,"props":1651,"children":1652},{"style":769},[1653],{"type":49,"value":772},{"type":43,"tag":371,"props":1655,"children":1656},{"style":383},[1657],{"type":49,"value":1658},".data[] | select(.attributes.[\"terraform-version\"] | ltrimstr(\"v\") | split(\".\") | [.[0], .[1]] | join(\".\") | tonumber >= 1.7) | {name: .attributes.name, tf_version: .attributes.[\"terraform-version\"]}",{"type":43,"tag":371,"props":1660,"children":1661},{"style":769},[1662],{"type":49,"value":782},{"type":43,"tag":371,"props":1664,"children":1666},{"class":373,"line":1665},49,[1667],{"type":43,"tag":371,"props":1668,"children":1669},{"emptyLinePlaceholder":789},[1670],{"type":49,"value":792},{"type":43,"tag":371,"props":1672,"children":1674},{"class":373,"line":1673},50,[1675],{"type":43,"tag":371,"props":1676,"children":1677},{"style":730},[1678],{"type":49,"value":1679},"# Filter workspaces excluding certain names\n",{"type":43,"tag":371,"props":1681,"children":1683},{"class":373,"line":1682},51,[1684,1688,1692,1696,1700,1704,1708,1713],{"type":43,"tag":371,"props":1685,"children":1686},{"style":378},[1687],{"type":49,"value":4},{"type":43,"tag":371,"props":1689,"children":1690},{"style":383},[1691],{"type":49,"value":386},{"type":43,"tag":371,"props":1693,"children":1694},{"style":383},[1695],{"type":49,"value":750},{"type":43,"tag":371,"props":1697,"children":1698},{"style":383},[1699],{"type":49,"value":890},{"type":43,"tag":371,"props":1701,"children":1702},{"style":383},[1703],{"type":49,"value":766},{"type":43,"tag":371,"props":1705,"children":1706},{"style":769},[1707],{"type":49,"value":772},{"type":43,"tag":371,"props":1709,"children":1710},{"style":383},[1711],{"type":49,"value":1712},".data[] | select(.attributes.name | test(\"^temp-|^old-\") | not) | .attributes.name",{"type":43,"tag":371,"props":1714,"children":1715},{"style":769},[1716],{"type":49,"value":782},{"type":43,"tag":371,"props":1718,"children":1719},{"class":373,"line":25},[1720],{"type":43,"tag":371,"props":1721,"children":1722},{"emptyLinePlaceholder":789},[1723],{"type":49,"value":792},{"type":43,"tag":371,"props":1725,"children":1727},{"class":373,"line":1726},53,[1728],{"type":43,"tag":371,"props":1729,"children":1730},{"style":730},[1731],{"type":49,"value":1732},"# Count resources by status (e.g., runs by status)\n",{"type":43,"tag":371,"props":1734,"children":1736},{"class":373,"line":1735},54,[1737,1741,1745,1749,1753,1757,1761,1765,1769,1774],{"type":43,"tag":371,"props":1738,"children":1739},{"style":378},[1740],{"type":49,"value":4},{"type":43,"tag":371,"props":1742,"children":1743},{"style":383},[1744],{"type":49,"value":386},{"type":43,"tag":371,"props":1746,"children":1747},{"style":383},[1748],{"type":49,"value":1098},{"type":43,"tag":371,"props":1750,"children":1751},{"style":383},[1752],{"type":49,"value":946},{"type":43,"tag":371,"props":1754,"children":1755},{"style":383},[1756],{"type":49,"value":951},{"type":43,"tag":371,"props":1758,"children":1759},{"style":383},[1760],{"type":49,"value":890},{"type":43,"tag":371,"props":1762,"children":1763},{"style":383},[1764],{"type":49,"value":766},{"type":43,"tag":371,"props":1766,"children":1767},{"style":769},[1768],{"type":49,"value":772},{"type":43,"tag":371,"props":1770,"children":1771},{"style":383},[1772],{"type":49,"value":1773},"[.data[] | .attributes.status] | group_by(.) | map({status: .[0], count: length})",{"type":43,"tag":371,"props":1775,"children":1776},{"style":769},[1777],{"type":49,"value":782},{"type":43,"tag":371,"props":1779,"children":1781},{"class":373,"line":1780},55,[1782],{"type":43,"tag":371,"props":1783,"children":1784},{"emptyLinePlaceholder":789},[1785],{"type":49,"value":792},{"type":43,"tag":371,"props":1787,"children":1789},{"class":373,"line":1788},56,[1790],{"type":43,"tag":371,"props":1791,"children":1792},{"style":730},[1793],{"type":49,"value":1794},"# Get log URL for a completed run\n",{"type":43,"tag":371,"props":1796,"children":1798},{"class":373,"line":1797},57,[1799],{"type":43,"tag":371,"props":1800,"children":1801},{"style":730},[1802],{"type":49,"value":1803},"# Note: run.log-read-url is null on completed runs — the URL lives on plan\u002Fapply.\n",{"type":43,"tag":371,"props":1805,"children":1807},{"class":373,"line":1806},58,[1808,1812,1816,1821,1825,1829,1834],{"type":43,"tag":371,"props":1809,"children":1810},{"style":378},[1811],{"type":49,"value":4},{"type":43,"tag":371,"props":1813,"children":1814},{"style":383},[1815],{"type":49,"value":386},{"type":43,"tag":371,"props":1817,"children":1818},{"style":383},[1819],{"type":49,"value":1820}," \u002Fruns\u002FRUN_ID",{"type":43,"tag":371,"props":1822,"children":1823},{"style":383},[1824],{"type":49,"value":766},{"type":43,"tag":371,"props":1826,"children":1827},{"style":769},[1828],{"type":49,"value":772},{"type":43,"tag":371,"props":1830,"children":1831},{"style":383},[1832],{"type":49,"value":1833},".data.relationships | {plan: .plan.data.id, apply: .apply.data.id}",{"type":43,"tag":371,"props":1835,"children":1836},{"style":769},[1837],{"type":49,"value":782},{"type":43,"tag":371,"props":1839,"children":1841},{"class":373,"line":1840},59,[1842,1846,1850,1855,1859,1863,1868],{"type":43,"tag":371,"props":1843,"children":1844},{"style":378},[1845],{"type":49,"value":4},{"type":43,"tag":371,"props":1847,"children":1848},{"style":383},[1849],{"type":49,"value":386},{"type":43,"tag":371,"props":1851,"children":1852},{"style":383},[1853],{"type":49,"value":1854}," \u002Fplans\u002FPLAN_ID",{"type":43,"tag":371,"props":1856,"children":1857},{"style":383},[1858],{"type":49,"value":766},{"type":43,"tag":371,"props":1860,"children":1861},{"style":769},[1862],{"type":49,"value":772},{"type":43,"tag":371,"props":1864,"children":1865},{"style":383},[1866],{"type":49,"value":1867},".data.attributes.[\"log-read-url\"]",{"type":43,"tag":371,"props":1869,"children":1870},{"style":769},[1871],{"type":49,"value":782},{"type":43,"tag":371,"props":1873,"children":1875},{"class":373,"line":1874},60,[1876],{"type":43,"tag":371,"props":1877,"children":1878},{"emptyLinePlaceholder":789},[1879],{"type":49,"value":792},{"type":43,"tag":371,"props":1881,"children":1883},{"class":373,"line":1882},61,[1884],{"type":43,"tag":371,"props":1885,"children":1886},{"style":730},[1887],{"type":49,"value":1888},"# Start a run\n",{"type":43,"tag":371,"props":1890,"children":1892},{"class":373,"line":1891},62,[1893,1897,1901,1906],{"type":43,"tag":371,"props":1894,"children":1895},{"style":378},[1896],{"type":49,"value":4},{"type":43,"tag":371,"props":1898,"children":1899},{"style":383},[1900],{"type":49,"value":998},{"type":43,"tag":371,"props":1902,"children":1903},{"style":383},[1904],{"type":49,"value":1905}," start",{"type":43,"tag":371,"props":1907,"children":1908},{"style":383},[1909],{"type":49,"value":1910}," NAME_OR_ID\n",{"type":43,"tag":371,"props":1912,"children":1914},{"class":373,"line":1913},63,[1915],{"type":43,"tag":371,"props":1916,"children":1917},{"emptyLinePlaceholder":789},[1918],{"type":49,"value":792},{"type":43,"tag":371,"props":1920,"children":1922},{"class":373,"line":1921},64,[1923],{"type":43,"tag":371,"props":1924,"children":1925},{"style":730},[1926],{"type":49,"value":1927},"# Add a remote state consumer to a workspace\n",{"type":43,"tag":371,"props":1929,"children":1931},{"class":373,"line":1930},65,[1932],{"type":43,"tag":371,"props":1933,"children":1934},{"style":730},[1935],{"type":49,"value":1936},"# (operationId: addWorkspaceRemoteStateConsumers — POST returns 204)\n",{"type":43,"tag":371,"props":1938,"children":1940},{"class":373,"line":1939},66,[1941,1945,1949,1954,1958,1962],{"type":43,"tag":371,"props":1942,"children":1943},{"style":378},[1944],{"type":49,"value":4},{"type":43,"tag":371,"props":1946,"children":1947},{"style":383},[1948],{"type":49,"value":386},{"type":43,"tag":371,"props":1950,"children":1951},{"style":383},[1952],{"type":49,"value":1953}," \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fremote-state-consumers",{"type":43,"tag":371,"props":1955,"children":1956},{"style":383},[1957],{"type":49,"value":946},{"type":43,"tag":371,"props":1959,"children":1960},{"style":383},[1961],{"type":49,"value":951},{"type":43,"tag":371,"props":1963,"children":1964},{"style":1163},[1965],{"type":49,"value":1166},{"type":43,"tag":371,"props":1967,"children":1969},{"class":373,"line":1968},67,[1970,1975,1979,1984],{"type":43,"tag":371,"props":1971,"children":1972},{"style":383},[1973],{"type":49,"value":1974},"  -i",{"type":43,"tag":371,"props":1976,"children":1977},{"style":769},[1978],{"type":49,"value":772},{"type":43,"tag":371,"props":1980,"children":1981},{"style":383},[1982],{"type":49,"value":1983},"{\"data\":[{\"type\":\"workspaces\",\"id\":\"ws-CONSUMER_ID\"}]}",{"type":43,"tag":371,"props":1985,"children":1986},{"style":769},[1987],{"type":49,"value":782},{"type":43,"tag":371,"props":1989,"children":1991},{"class":373,"line":1990},68,[1992],{"type":43,"tag":371,"props":1993,"children":1994},{"emptyLinePlaceholder":789},[1995],{"type":49,"value":792},{"type":43,"tag":371,"props":1997,"children":1999},{"class":373,"line":1998},69,[2000],{"type":43,"tag":371,"props":2001,"children":2002},{"style":730},[2003],{"type":49,"value":2004},"# Apply a variable set to a workspace\n",{"type":43,"tag":371,"props":2006,"children":2008},{"class":373,"line":2007},70,[2009],{"type":43,"tag":371,"props":2010,"children":2011},{"style":730},[2012],{"type":49,"value":2013},"# (operationId: updateWorkspaceRelationship for varsets)\n",{"type":43,"tag":371,"props":2015,"children":2017},{"class":373,"line":2016},71,[2018,2022,2026,2031,2035,2039],{"type":43,"tag":371,"props":2019,"children":2020},{"style":378},[2021],{"type":49,"value":4},{"type":43,"tag":371,"props":2023,"children":2024},{"style":383},[2025],{"type":49,"value":386},{"type":43,"tag":371,"props":2027,"children":2028},{"style":383},[2029],{"type":49,"value":2030}," \u002Fworkspaces\u002F{workspace}\u002Frelationships\u002Fvarsets",{"type":43,"tag":371,"props":2032,"children":2033},{"style":383},[2034],{"type":49,"value":946},{"type":43,"tag":371,"props":2036,"children":2037},{"style":383},[2038],{"type":49,"value":951},{"type":43,"tag":371,"props":2040,"children":2041},{"style":1163},[2042],{"type":49,"value":1166},{"type":43,"tag":371,"props":2044,"children":2046},{"class":373,"line":2045},72,[2047,2052,2057,2062,2066,2071],{"type":43,"tag":371,"props":2048,"children":2049},{"style":383},[2050],{"type":49,"value":2051},"  -X",{"type":43,"tag":371,"props":2053,"children":2054},{"style":383},[2055],{"type":49,"value":2056}," POST",{"type":43,"tag":371,"props":2058,"children":2059},{"style":383},[2060],{"type":49,"value":2061}," -i",{"type":43,"tag":371,"props":2063,"children":2064},{"style":769},[2065],{"type":49,"value":772},{"type":43,"tag":371,"props":2067,"children":2068},{"style":383},[2069],{"type":49,"value":2070},"{\"data\":[{\"type\":\"varsets\",\"id\":\"varset-VARSET_ID\"}]}",{"type":43,"tag":371,"props":2072,"children":2073},{"style":769},[2074],{"type":49,"value":782},{"type":43,"tag":371,"props":2076,"children":2078},{"class":373,"line":2077},73,[2079],{"type":43,"tag":371,"props":2080,"children":2081},{"emptyLinePlaceholder":789},[2082],{"type":49,"value":792},{"type":43,"tag":371,"props":2084,"children":2086},{"class":373,"line":2085},74,[2087],{"type":43,"tag":371,"props":2088,"children":2089},{"style":730},[2090],{"type":49,"value":2091},"# Get policy check results for a run\n",{"type":43,"tag":371,"props":2093,"children":2095},{"class":373,"line":2094},75,[2096,2100,2104,2109,2113,2117,2122],{"type":43,"tag":371,"props":2097,"children":2098},{"style":378},[2099],{"type":49,"value":4},{"type":43,"tag":371,"props":2101,"children":2102},{"style":383},[2103],{"type":49,"value":386},{"type":43,"tag":371,"props":2105,"children":2106},{"style":383},[2107],{"type":49,"value":2108}," \u002Fruns\u002F{run-id}\u002Fpolicy-checks",{"type":43,"tag":371,"props":2110,"children":2111},{"style":383},[2112],{"type":49,"value":766},{"type":43,"tag":371,"props":2114,"children":2115},{"style":769},[2116],{"type":49,"value":772},{"type":43,"tag":371,"props":2118,"children":2119},{"style":383},[2120],{"type":49,"value":2121},".data[] | {id: .id, status: .attributes.status, enforced: .attributes.enforcement-level}",{"type":43,"tag":371,"props":2123,"children":2124},{"style":769},[2125],{"type":49,"value":782},{"type":43,"tag":371,"props":2127,"children":2129},{"class":373,"line":2128},76,[2130],{"type":43,"tag":371,"props":2131,"children":2132},{"emptyLinePlaceholder":789},[2133],{"type":49,"value":792},{"type":43,"tag":371,"props":2135,"children":2137},{"class":373,"line":2136},77,[2138],{"type":43,"tag":371,"props":2139,"children":2140},{"style":730},[2141],{"type":49,"value":2142},"# Discover an API operation when you don't know it\n",{"type":43,"tag":371,"props":2144,"children":2146},{"class":373,"line":2145},78,[2147,2151,2155,2160,2165,2170,2175,2180,2185],{"type":43,"tag":371,"props":2148,"children":2149},{"style":378},[2150],{"type":49,"value":4},{"type":43,"tag":371,"props":2152,"children":2153},{"style":383},[2154],{"type":49,"value":386},{"type":43,"tag":371,"props":2156,"children":2157},{"style":383},[2158],{"type":49,"value":2159}," schema",{"type":43,"tag":371,"props":2161,"children":2162},{"style":383},[2163],{"type":49,"value":2164}," search",{"type":43,"tag":371,"props":2166,"children":2167},{"style":769},[2168],{"type":49,"value":2169}," \"",{"type":43,"tag":371,"props":2171,"children":2172},{"style":383},[2173],{"type":49,"value":2174},"KEYWORD",{"type":43,"tag":371,"props":2176,"children":2177},{"style":769},[2178],{"type":49,"value":2179},"\"",{"type":43,"tag":371,"props":2181,"children":2182},{"style":383},[2183],{"type":49,"value":2184}," --json",{"type":43,"tag":371,"props":2186,"children":2187},{"style":730},[2188],{"type":49,"value":2189},"     # returns operationIds\n",{"type":43,"tag":371,"props":2191,"children":2193},{"class":373,"line":2192},79,[2194,2198,2202,2206,2211,2216],{"type":43,"tag":371,"props":2195,"children":2196},{"style":378},[2197],{"type":49,"value":4},{"type":43,"tag":371,"props":2199,"children":2200},{"style":383},[2201],{"type":49,"value":386},{"type":43,"tag":371,"props":2203,"children":2204},{"style":383},[2205],{"type":49,"value":2159},{"type":43,"tag":371,"props":2207,"children":2208},{"style":383},[2209],{"type":49,"value":2210}," get",{"type":43,"tag":371,"props":2212,"children":2213},{"style":383},[2214],{"type":49,"value":2215}," OPERATION_ID",{"type":43,"tag":371,"props":2217,"children":2218},{"style":730},[2219],{"type":49,"value":2220},"            # full OpenAPI schema (large response — only call when needed)\n",{"type":43,"tag":58,"props":2222,"children":2224},{"id":2223},"output-flags",[2225],{"type":49,"value":2226},"Output flags",{"type":43,"tag":2228,"props":2229,"children":2230},"table",{},[2231,2250],{"type":43,"tag":2232,"props":2233,"children":2234},"thead",{},[2235],{"type":43,"tag":2236,"props":2237,"children":2238},"tr",{},[2239,2245],{"type":43,"tag":2240,"props":2241,"children":2242},"th",{},[2243],{"type":49,"value":2244},"Need",{"type":43,"tag":2240,"props":2246,"children":2247},{},[2248],{"type":49,"value":2249},"Flag",{"type":43,"tag":2251,"props":2252,"children":2253},"tbody",{},[2254,2271,2287,2304],{"type":43,"tag":2236,"props":2255,"children":2256},{},[2257,2263],{"type":43,"tag":2258,"props":2259,"children":2260},"td",{},[2261],{"type":49,"value":2262},"Filter \u002F extract",{"type":43,"tag":2258,"props":2264,"children":2265},{},[2266],{"type":43,"tag":79,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":49,"value":101},{"type":43,"tag":2236,"props":2272,"children":2273},{},[2274,2279],{"type":43,"tag":2258,"props":2275,"children":2276},{},[2277],{"type":49,"value":2278},"Full JSON",{"type":43,"tag":2258,"props":2280,"children":2281},{},[2282],{"type":43,"tag":79,"props":2283,"children":2285},{"className":2284},[],[2286],{"type":49,"value":109},{"type":43,"tag":2236,"props":2288,"children":2289},{},[2290,2295],{"type":43,"tag":2258,"props":2291,"children":2292},{},[2293],{"type":49,"value":2294},"Render for human",{"type":43,"tag":2258,"props":2296,"children":2297},{},[2298],{"type":43,"tag":79,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":49,"value":2303},"--markdown",{"type":43,"tag":2236,"props":2305,"children":2306},{},[2307,2312],{"type":43,"tag":2258,"props":2308,"children":2309},{},[2310],{"type":49,"value":2311},"Audit a mutation",{"type":43,"tag":2258,"props":2313,"children":2314},{},[2315],{"type":43,"tag":79,"props":2316,"children":2318},{"className":2317},[],[2319],{"type":49,"value":2320},"--dry-run",{"type":43,"tag":52,"props":2322,"children":2323},{},[2324,2330,2332,2337],{"type":43,"tag":79,"props":2325,"children":2327},{"className":2326},[],[2328],{"type":49,"value":2329},"--jq",{"type":49,"value":2331}," implies ",{"type":43,"tag":79,"props":2333,"children":2335},{"className":2334},[],[2336],{"type":49,"value":109},{"type":49,"value":2338},". Don't pass both. Always pass one explicitly — don't rely on auto-detect.",{"type":43,"tag":58,"props":2340,"children":2342},{"id":2341},"jsonapi-conventions",[2343],{"type":49,"value":2344},"JSON:API conventions",{"type":43,"tag":52,"props":2346,"children":2347},{},[2348,2350,2356,2358,2364,2366,2372,2374,2380,2382,2388,2390,2395],{"type":49,"value":2349},"Responses are JSON:API envelopes: ",{"type":43,"tag":79,"props":2351,"children":2353},{"className":2352},[],[2354],{"type":49,"value":2355},"{data: {id, type, attributes, relationships}}",{"type":49,"value":2357}," (or ",{"type":43,"tag":79,"props":2359,"children":2361},{"className":2360},[],[2362],{"type":49,"value":2363},"data: [...]",{"type":49,"value":2365}," for lists). To follow a link, read ",{"type":43,"tag":79,"props":2367,"children":2369},{"className":2368},[],[2370],{"type":49,"value":2371},"data.relationships.\u003Cname>.data",{"type":49,"value":2373}," which gives ",{"type":43,"tag":79,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":49,"value":2379},"{id, type}",{"type":49,"value":2381}," or ",{"type":43,"tag":79,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":49,"value":2387},"null",{"type":49,"value":2389},". A ",{"type":43,"tag":79,"props":2391,"children":2393},{"className":2392},[],[2394],{"type":49,"value":2387},{"type":49,"value":2396}," is final — there is no related resource.",{"type":43,"tag":52,"props":2398,"children":2399},{},[2400,2402,2408,2410,2416,2418,2424,2426,2432],{"type":49,"value":2401},"Pagination: default page 1. Add ",{"type":43,"tag":79,"props":2403,"children":2405},{"className":2404},[],[2406],{"type":49,"value":2407},"--all",{"type":49,"value":2409}," for all pages (cap 2000), or ",{"type":43,"tag":79,"props":2411,"children":2413},{"className":2412},[],[2414],{"type":49,"value":2415},"--page-size N",{"type":49,"value":2417}," \u002F ",{"type":43,"tag":79,"props":2419,"children":2421},{"className":2420},[],[2422],{"type":49,"value":2423},"--page-number N",{"type":49,"value":2425}," for explicit control. For counts, use ",{"type":43,"tag":79,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":49,"value":2431},"--page-size 1 --jq '.meta.pagination.[\"total-count\"]'",{"type":49,"value":93},{"type":43,"tag":58,"props":2434,"children":2436},{"id":2435},"mutations-batch-updates",[2437],{"type":49,"value":2438},"Mutations & batch updates",{"type":43,"tag":360,"props":2440,"children":2442},{"className":362,"code":2441,"language":364,"meta":365,"style":365},"# Create or update a single variable\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VARKEY -a value=VALUE -a category=env\n\n# Batch updates: use separate calls (HCP TFC doesn't support bulk POST for vars)\n# Instead of trying \u002Fworkspaces\u002F{ws}\u002Fvars with multiple items, do:\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VAR1 -a value=VAL1 -a category=env\ntfctl api \u002Fworkspaces\u002F{workspace}\u002Fvars -p workspace=NAME -a key=VAR2 -a value=VAL2 -a category=env\n# (Multiple calls cost more, but it's the supported pattern)\n\n# PATCH with a raw body\ntfctl api \u002Fworkspaces\u002F{workspace}\u002FX -X PATCH -p workspace=NAME -i '{\"data\":{\"type\":\"X\",\"attributes\":{…}}}'\n",[2443],{"type":43,"tag":79,"props":2444,"children":2445},{"__ignoreMap":365},[2446,2454,2505,2512,2520,2528,2577,2626,2634,2641,2649],{"type":43,"tag":371,"props":2447,"children":2448},{"class":373,"line":374},[2449],{"type":43,"tag":371,"props":2450,"children":2451},{"style":730},[2452],{"type":49,"value":2453},"# Create or update a single variable\n",{"type":43,"tag":371,"props":2455,"children":2456},{"class":373,"line":736},[2457,2461,2465,2469,2473,2477,2482,2487,2491,2496,2500],{"type":43,"tag":371,"props":2458,"children":2459},{"style":378},[2460],{"type":49,"value":4},{"type":43,"tag":371,"props":2462,"children":2463},{"style":383},[2464],{"type":49,"value":386},{"type":43,"tag":371,"props":2466,"children":2467},{"style":383},[2468],{"type":49,"value":941},{"type":43,"tag":371,"props":2470,"children":2471},{"style":383},[2472],{"type":49,"value":946},{"type":43,"tag":371,"props":2474,"children":2475},{"style":383},[2476],{"type":49,"value":951},{"type":43,"tag":371,"props":2478,"children":2479},{"style":383},[2480],{"type":49,"value":2481}," -a",{"type":43,"tag":371,"props":2483,"children":2484},{"style":383},[2485],{"type":49,"value":2486}," key=VARKEY",{"type":43,"tag":371,"props":2488,"children":2489},{"style":383},[2490],{"type":49,"value":2481},{"type":43,"tag":371,"props":2492,"children":2493},{"style":383},[2494],{"type":49,"value":2495}," value=VALUE",{"type":43,"tag":371,"props":2497,"children":2498},{"style":383},[2499],{"type":49,"value":2481},{"type":43,"tag":371,"props":2501,"children":2502},{"style":383},[2503],{"type":49,"value":2504}," category=env\n",{"type":43,"tag":371,"props":2506,"children":2507},{"class":373,"line":785},[2508],{"type":43,"tag":371,"props":2509,"children":2510},{"emptyLinePlaceholder":789},[2511],{"type":49,"value":792},{"type":43,"tag":371,"props":2513,"children":2514},{"class":373,"line":795},[2515],{"type":43,"tag":371,"props":2516,"children":2517},{"style":730},[2518],{"type":49,"value":2519},"# Batch updates: use separate calls (HCP TFC doesn't support bulk POST for vars)\n",{"type":43,"tag":371,"props":2521,"children":2522},{"class":373,"line":29},[2523],{"type":43,"tag":371,"props":2524,"children":2525},{"style":730},[2526],{"type":49,"value":2527},"# Instead of trying \u002Fworkspaces\u002F{ws}\u002Fvars with multiple items, do:\n",{"type":43,"tag":371,"props":2529,"children":2530},{"class":373,"line":855},[2531,2535,2539,2543,2547,2551,2555,2560,2564,2569,2573],{"type":43,"tag":371,"props":2532,"children":2533},{"style":378},[2534],{"type":49,"value":4},{"type":43,"tag":371,"props":2536,"children":2537},{"style":383},[2538],{"type":49,"value":386},{"type":43,"tag":371,"props":2540,"children":2541},{"style":383},[2542],{"type":49,"value":941},{"type":43,"tag":371,"props":2544,"children":2545},{"style":383},[2546],{"type":49,"value":946},{"type":43,"tag":371,"props":2548,"children":2549},{"style":383},[2550],{"type":49,"value":951},{"type":43,"tag":371,"props":2552,"children":2553},{"style":383},[2554],{"type":49,"value":2481},{"type":43,"tag":371,"props":2556,"children":2557},{"style":383},[2558],{"type":49,"value":2559}," key=VAR1",{"type":43,"tag":371,"props":2561,"children":2562},{"style":383},[2563],{"type":49,"value":2481},{"type":43,"tag":371,"props":2565,"children":2566},{"style":383},[2567],{"type":49,"value":2568}," value=VAL1",{"type":43,"tag":371,"props":2570,"children":2571},{"style":383},[2572],{"type":49,"value":2481},{"type":43,"tag":371,"props":2574,"children":2575},{"style":383},[2576],{"type":49,"value":2504},{"type":43,"tag":371,"props":2578,"children":2579},{"class":373,"line":863},[2580,2584,2588,2592,2596,2600,2604,2609,2613,2618,2622],{"type":43,"tag":371,"props":2581,"children":2582},{"style":378},[2583],{"type":49,"value":4},{"type":43,"tag":371,"props":2585,"children":2586},{"style":383},[2587],{"type":49,"value":386},{"type":43,"tag":371,"props":2589,"children":2590},{"style":383},[2591],{"type":49,"value":941},{"type":43,"tag":371,"props":2593,"children":2594},{"style":383},[2595],{"type":49,"value":946},{"type":43,"tag":371,"props":2597,"children":2598},{"style":383},[2599],{"type":49,"value":951},{"type":43,"tag":371,"props":2601,"children":2602},{"style":383},[2603],{"type":49,"value":2481},{"type":43,"tag":371,"props":2605,"children":2606},{"style":383},[2607],{"type":49,"value":2608}," key=VAR2",{"type":43,"tag":371,"props":2610,"children":2611},{"style":383},[2612],{"type":49,"value":2481},{"type":43,"tag":371,"props":2614,"children":2615},{"style":383},[2616],{"type":49,"value":2617}," value=VAL2",{"type":43,"tag":371,"props":2619,"children":2620},{"style":383},[2621],{"type":49,"value":2481},{"type":43,"tag":371,"props":2623,"children":2624},{"style":383},[2625],{"type":49,"value":2504},{"type":43,"tag":371,"props":2627,"children":2628},{"class":373,"line":872},[2629],{"type":43,"tag":371,"props":2630,"children":2631},{"style":730},[2632],{"type":49,"value":2633},"# (Multiple calls cost more, but it's the supported pattern)\n",{"type":43,"tag":371,"props":2635,"children":2636},{"class":373,"line":910},[2637],{"type":43,"tag":371,"props":2638,"children":2639},{"emptyLinePlaceholder":789},[2640],{"type":49,"value":792},{"type":43,"tag":371,"props":2642,"children":2643},{"class":373,"line":918},[2644],{"type":43,"tag":371,"props":2645,"children":2646},{"style":730},[2647],{"type":49,"value":2648},"# PATCH with a raw body\n",{"type":43,"tag":371,"props":2650,"children":2651},{"class":373,"line":927},[2652,2656,2660,2665,2669,2674,2678,2682,2686,2690,2695],{"type":43,"tag":371,"props":2653,"children":2654},{"style":378},[2655],{"type":49,"value":4},{"type":43,"tag":371,"props":2657,"children":2658},{"style":383},[2659],{"type":49,"value":386},{"type":43,"tag":371,"props":2661,"children":2662},{"style":383},[2663],{"type":49,"value":2664}," \u002Fworkspaces\u002F{workspace}\u002FX",{"type":43,"tag":371,"props":2666,"children":2667},{"style":383},[2668],{"type":49,"value":396},{"type":43,"tag":371,"props":2670,"children":2671},{"style":383},[2672],{"type":49,"value":2673}," PATCH",{"type":43,"tag":371,"props":2675,"children":2676},{"style":383},[2677],{"type":49,"value":946},{"type":43,"tag":371,"props":2679,"children":2680},{"style":383},[2681],{"type":49,"value":951},{"type":43,"tag":371,"props":2683,"children":2684},{"style":383},[2685],{"type":49,"value":2061},{"type":43,"tag":371,"props":2687,"children":2688},{"style":769},[2689],{"type":49,"value":772},{"type":43,"tag":371,"props":2691,"children":2692},{"style":383},[2693],{"type":49,"value":2694},"{\"data\":{\"type\":\"X\",\"attributes\":{…}}}",{"type":43,"tag":371,"props":2696,"children":2697},{"style":769},[2698],{"type":49,"value":782},{"type":43,"tag":52,"props":2700,"children":2701},{},[2702,2704,2709],{"type":49,"value":2703},"Add ",{"type":43,"tag":79,"props":2705,"children":2707},{"className":2706},[],[2708],{"type":49,"value":2320},{"type":49,"value":2710}," to preview without sending.",{"type":43,"tag":58,"props":2712,"children":2714},{"id":2713},"exit-codes-quick-map",[2715],{"type":49,"value":2716},"Exit codes (quick map)",{"type":43,"tag":2228,"props":2718,"children":2719},{},[2720,2741],{"type":43,"tag":2232,"props":2721,"children":2722},{},[2723],{"type":43,"tag":2236,"props":2724,"children":2725},{},[2726,2731,2736],{"type":43,"tag":2240,"props":2727,"children":2728},{},[2729],{"type":49,"value":2730},"Code",{"type":43,"tag":2240,"props":2732,"children":2733},{},[2734],{"type":49,"value":2735},"Meaning",{"type":43,"tag":2240,"props":2737,"children":2738},{},[2739],{"type":49,"value":2740},"Action",{"type":43,"tag":2251,"props":2742,"children":2743},{},[2744,2762,2785,2803,2821,2839,2857],{"type":43,"tag":2236,"props":2745,"children":2746},{},[2747,2752,2757],{"type":43,"tag":2258,"props":2748,"children":2749},{},[2750],{"type":49,"value":2751},"0",{"type":43,"tag":2258,"props":2753,"children":2754},{},[2755],{"type":49,"value":2756},"Success",{"type":43,"tag":2258,"props":2758,"children":2759},{},[2760],{"type":49,"value":2761},"Done",{"type":43,"tag":2236,"props":2763,"children":2764},{},[2765,2770,2775],{"type":43,"tag":2258,"props":2766,"children":2767},{},[2768],{"type":49,"value":2769},"1",{"type":43,"tag":2258,"props":2771,"children":2772},{},[2773],{"type":49,"value":2774},"Informational message or usage error",{"type":43,"tag":2258,"props":2776,"children":2777},{},[2778,2780],{"type":49,"value":2779},"Read stderr; if it says \"no current run\" or similar, ",{"type":43,"tag":73,"props":2781,"children":2782},{},[2783],{"type":49,"value":2784},"that IS the answer — stop",{"type":43,"tag":2236,"props":2786,"children":2787},{},[2788,2793,2798],{"type":43,"tag":2258,"props":2789,"children":2790},{},[2791],{"type":49,"value":2792},"2",{"type":43,"tag":2258,"props":2794,"children":2795},{},[2796],{"type":49,"value":2797},"Not found (workspace\u002Frun doesn't exist) OR invalid auth",{"type":43,"tag":2258,"props":2799,"children":2800},{},[2801],{"type":49,"value":2802},"Verify the ID\u002Fname is correct, then check token if still failing",{"type":43,"tag":2236,"props":2804,"children":2805},{},[2806,2811,2816],{"type":43,"tag":2258,"props":2807,"children":2808},{},[2809],{"type":49,"value":2810},"3",{"type":43,"tag":2258,"props":2812,"children":2813},{},[2814],{"type":49,"value":2815},"Auth token expired or invalid",{"type":43,"tag":2258,"props":2817,"children":2818},{},[2819],{"type":49,"value":2820},"Re-authenticate",{"type":43,"tag":2236,"props":2822,"children":2823},{},[2824,2829,2834],{"type":43,"tag":2258,"props":2825,"children":2826},{},[2827],{"type":49,"value":2828},"4",{"type":43,"tag":2258,"props":2830,"children":2831},{},[2832],{"type":49,"value":2833},"Network error",{"type":43,"tag":2258,"props":2835,"children":2836},{},[2837],{"type":49,"value":2838},"Retry after brief delay",{"type":43,"tag":2236,"props":2840,"children":2841},{},[2842,2847,2852],{"type":43,"tag":2258,"props":2843,"children":2844},{},[2845],{"type":49,"value":2846},"5",{"type":43,"tag":2258,"props":2848,"children":2849},{},[2850],{"type":49,"value":2851},"Rate limited (429) or server error (5xx)",{"type":43,"tag":2258,"props":2853,"children":2854},{},[2855],{"type":49,"value":2856},"Retry with backoff",{"type":43,"tag":2236,"props":2858,"children":2859},{},[2860,2865,2870],{"type":43,"tag":2258,"props":2861,"children":2862},{},[2863],{"type":49,"value":2864},"6",{"type":43,"tag":2258,"props":2866,"children":2867},{},[2868],{"type":49,"value":2869},"Resource has an error state",{"type":43,"tag":2258,"props":2871,"children":2872},{},[2873],{"type":49,"value":2874},"The error is already diagnosed in output (e.g., plan failed); read it",{"type":43,"tag":52,"props":2876,"children":2877},{},[2878,2883,2885,2890,2892,2897],{"type":43,"tag":73,"props":2879,"children":2880},{},[2881],{"type":49,"value":2882},"Important",{"type":49,"value":2884},": When an API returns ",{"type":43,"tag":79,"props":2886,"children":2888},{"className":2887},[],[2889],{"type":49,"value":183},{"type":49,"value":2891}," (empty list) or ",{"type":43,"tag":79,"props":2893,"children":2895},{"className":2894},[],[2896],{"type":49,"value":191},{"type":49,"value":2898},", that IS the answer. Don't retry with different flags or endpoints.",{"type":43,"tag":300,"props":2900,"children":2902},{"id":2901},"common-troubleshooting",[2903],{"type":49,"value":2904},"Common troubleshooting",{"type":43,"tag":2228,"props":2906,"children":2907},{},[2908,2929],{"type":43,"tag":2232,"props":2909,"children":2910},{},[2911],{"type":43,"tag":2236,"props":2912,"children":2913},{},[2914,2919,2924],{"type":43,"tag":2240,"props":2915,"children":2916},{},[2917],{"type":49,"value":2918},"Symptom",{"type":43,"tag":2240,"props":2920,"children":2921},{},[2922],{"type":49,"value":2923},"Cause",{"type":43,"tag":2240,"props":2925,"children":2926},{},[2927],{"type":49,"value":2928},"Fix",{"type":43,"tag":2251,"props":2930,"children":2931},{},[2932,2956,2985,3015,3039,3063],{"type":43,"tag":2236,"props":2933,"children":2934},{},[2935,2946,2951],{"type":43,"tag":2258,"props":2936,"children":2937},{},[2938,2944],{"type":43,"tag":79,"props":2939,"children":2941},{"className":2940},[],[2942],{"type":49,"value":2943},"exit 2",{"type":49,"value":2945}," when listing workspaces",{"type":43,"tag":2258,"props":2947,"children":2948},{},[2949],{"type":49,"value":2950},"Organization doesn't exist or auth token has no access",{"type":43,"tag":2258,"props":2952,"children":2953},{},[2954],{"type":49,"value":2955},"Verify org name and re-authenticate",{"type":43,"tag":2236,"props":2957,"children":2958},{},[2959,2970,2975],{"type":43,"tag":2258,"props":2960,"children":2961},{},[2962,2968],{"type":43,"tag":79,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":49,"value":2967},"exit 1",{"type":49,"value":2969}," with \"no current run\"",{"type":43,"tag":2258,"props":2971,"children":2972},{},[2973],{"type":49,"value":2974},"Workspace simply has no active run (informational)",{"type":43,"tag":2258,"props":2976,"children":2977},{},[2978,2983],{"type":43,"tag":73,"props":2979,"children":2980},{},[2981],{"type":49,"value":2982},"This is the answer",{"type":49,"value":2984}," — stop, don't verify",{"type":43,"tag":2236,"props":2986,"children":2987},{},[2988,2999,3004],{"type":43,"tag":2258,"props":2989,"children":2990},{},[2991,2997],{"type":43,"tag":79,"props":2992,"children":2994},{"className":2993},[],[2995],{"type":49,"value":2996},"exit 3",{"type":49,"value":2998}," when making any API call",{"type":43,"tag":2258,"props":3000,"children":3001},{},[3002],{"type":49,"value":3003},"Auth token expired",{"type":43,"tag":2258,"props":3005,"children":3006},{},[3007,3009],{"type":49,"value":3008},"Re-authenticate with ",{"type":43,"tag":79,"props":3010,"children":3012},{"className":3011},[],[3013],{"type":49,"value":3014},"tfctl login",{"type":43,"tag":2236,"props":3016,"children":3017},{},[3018,3029,3034],{"type":43,"tag":2258,"props":3019,"children":3020},{},[3021,3027],{"type":43,"tag":79,"props":3022,"children":3024},{"className":3023},[],[3025],{"type":49,"value":3026},"exit 5",{"type":49,"value":3028}," (429 rate limit)",{"type":43,"tag":2258,"props":3030,"children":3031},{},[3032],{"type":49,"value":3033},"Too many requests",{"type":43,"tag":2258,"props":3035,"children":3036},{},[3037],{"type":49,"value":3038},"Wait and retry; tfctl will backoff automatically",{"type":43,"tag":2236,"props":3040,"children":3041},{},[3042,3053,3058],{"type":43,"tag":2258,"props":3043,"children":3044},{},[3045,3051],{"type":43,"tag":79,"props":3046,"children":3048},{"className":3047},[],[3049],{"type":49,"value":3050},"exit 6",{"type":49,"value":3052}," with \"plan is errored\"",{"type":43,"tag":2258,"props":3054,"children":3055},{},[3056],{"type":49,"value":3057},"Terraform plan had syntax errors (not CLI error)",{"type":43,"tag":2258,"props":3059,"children":3060},{},[3061],{"type":49,"value":3062},"Read the plan output for details",{"type":43,"tag":2236,"props":3064,"children":3065},{},[3066,3078,3083],{"type":43,"tag":2258,"props":3067,"children":3068},{},[3069,3071,3076],{"type":49,"value":3070},"Empty list (",{"type":43,"tag":79,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":49,"value":183},{"type":49,"value":3077},") when filtering",{"type":43,"tag":2258,"props":3079,"children":3080},{},[3081],{"type":49,"value":3082},"No resources match criteria",{"type":43,"tag":2258,"props":3084,"children":3085},{},[3086],{"type":49,"value":3087},"Verify criteria is correct; empty list is valid answer",{"type":43,"tag":58,"props":3089,"children":3091},{"id":3090},"smart-defaults",[3092],{"type":49,"value":3093},"Smart defaults",{"type":43,"tag":212,"props":3095,"children":3096},{},[3097,3108,3126],{"type":43,"tag":69,"props":3098,"children":3099},{},[3100,3106],{"type":43,"tag":79,"props":3101,"children":3103},{"className":3102},[],[3104],{"type":49,"value":3105},"{organization}",{"type":49,"value":3107}," resolves from active profile if set.",{"type":43,"tag":69,"props":3109,"children":3110},{},[3111,3116,3118,3124],{"type":43,"tag":79,"props":3112,"children":3114},{"className":3113},[],[3115],{"type":49,"value":135},{"type":49,"value":3117}," resolves from a local ",{"type":43,"tag":79,"props":3119,"children":3121},{"className":3120},[],[3122],{"type":49,"value":3123},"cloud {}",{"type":49,"value":3125}," block in CWD.",{"type":43,"tag":69,"props":3127,"children":3128},{},[3129,3131,3137,3138,3144,3145,3151,3152,3158],{"type":49,"value":3130},"Already-formed IDs (",{"type":43,"tag":79,"props":3132,"children":3134},{"className":3133},[],[3135],{"type":49,"value":3136},"ws-…",{"type":49,"value":185},{"type":43,"tag":79,"props":3139,"children":3141},{"className":3140},[],[3142],{"type":49,"value":3143},"team-…",{"type":49,"value":185},{"type":43,"tag":79,"props":3146,"children":3148},{"className":3147},[],[3149],{"type":49,"value":3150},"prj-…",{"type":49,"value":185},{"type":43,"tag":79,"props":3153,"children":3155},{"className":3154},[],[3156],{"type":49,"value":3157},"varset-…",{"type":49,"value":3159},") are passed through as-is.",{"type":43,"tag":3161,"props":3162,"children":3163},"style",{},[3164],{"type":49,"value":3165},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3167,"total":374},[3168],{"slug":4,"name":4,"fn":5,"description":6,"org":3169,"tags":3170,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3171,3172,3173,3174],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"items":3176,"total":1067},[3177,3194,3206,3219,3233,3245,3259,3269,3284,3299,3311,3322],{"slug":3178,"name":3178,"fn":3179,"description":3180,"org":3181,"tags":3182,"stars":3191,"repoUrl":3192,"updatedAt":3193},"aws-ami-builder","build Amazon Machine Images with Packer","Build Amazon Machine Images (AMIs) with Packer using the amazon-ebs builder. Use when creating custom AMIs for EC2 instances.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3183,3186,3187,3188],{"name":3184,"slug":3185,"type":15},"AWS","aws",{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":3189,"slug":3190,"type":15},"Packer","packer",728,"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills","2026-04-06T18:25:04.01571",{"slug":3195,"name":3195,"fn":3196,"description":3197,"org":3198,"tags":3199,"stars":3191,"repoUrl":3192,"updatedAt":3205},"azure-image-builder","build Azure managed images with Packer","Build Azure managed images and Azure Compute Gallery images with Packer. Use when creating custom images for Azure VMs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3200,3203,3204],{"name":3201,"slug":3202,"type":15},"Azure","azure",{"name":17,"slug":18,"type":15},{"name":3189,"slug":3190,"type":15},"2026-04-06T18:25:06.590174",{"slug":3207,"name":3207,"fn":3208,"description":3209,"org":3210,"tags":3211,"stars":3191,"repoUrl":3192,"updatedAt":3218},"azure-verified-modules","develop certified Azure Verified Modules","Azure Verified Modules (AVM) requirements and best practices for developing certified Azure Terraform modules. Use when creating or reviewing Azure modules that need AVM certification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3212,3213,3216,3217],{"name":3201,"slug":3202,"type":15},{"name":3214,"slug":3215,"type":15},"Compliance","compliance",{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:16.88768",{"slug":3220,"name":3220,"fn":3221,"description":3222,"org":3223,"tags":3224,"stars":3191,"repoUrl":3192,"updatedAt":3232},"new-terraform-provider","scaffold new Terraform providers","Use this when scaffolding a new Terraform provider.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3225,3228,3231],{"name":3226,"slug":3227,"type":15},"Plugin Development","plugin-development",{"name":3229,"slug":3230,"type":15},"Templates","templates",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:11.814973",{"slug":3234,"name":3234,"fn":3235,"description":3236,"org":3237,"tags":3238,"stars":3191,"repoUrl":3192,"updatedAt":3244},"provider-actions","implement Terraform Provider lifecycle actions","Implement Terraform Provider actions using the Plugin Framework. Use when developing imperative operations that execute at lifecycle events (before\u002Fafter create, update, destroy).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3239,3242,3243],{"name":3240,"slug":3241,"type":15},"API Development","api-development",{"name":3226,"slug":3227,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:07.880533",{"slug":3246,"name":3246,"fn":3247,"description":3248,"org":3249,"tags":3250,"stars":3191,"repoUrl":3192,"updatedAt":3258},"provider-docs","generate and review Terraform provider documentation","Create, update, and review Terraform provider documentation for Terraform Registry using HashiCorp-recommended patterns, tfplugindocs templates, and schema descriptions. Use when adding or changing provider configuration, resources, data sources, ephemeral resources, list resources, functions, or guides; when validating generated docs; and when troubleshooting missing or incorrect Registry documentation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3251,3254,3257],{"name":3252,"slug":3253,"type":15},"Documentation","documentation",{"name":3255,"slug":3256,"type":15},"Technical Writing","technical-writing",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:09.261559",{"slug":3260,"name":3260,"fn":3261,"description":3262,"org":3263,"tags":3264,"stars":3191,"repoUrl":3192,"updatedAt":3268},"provider-resources","implement Terraform Provider resources and data sources","Implement Terraform Provider resources and data sources using the Plugin Framework. Use when developing CRUD operations, schema design, state management, and acceptance testing for provider resources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3265,3266,3267],{"name":3240,"slug":3241,"type":15},{"name":3226,"slug":3227,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:10.56237",{"slug":3270,"name":3270,"fn":3271,"description":3272,"org":3273,"tags":3274,"stars":3191,"repoUrl":3192,"updatedAt":3283},"provider-test-patterns","implement Terraform provider acceptance test patterns","Terraform provider acceptance test patterns using terraform-plugin-testing with the Plugin Framework. Covers test structure, TestCase\u002FTestStep fields, ConfigStateChecks with custom statecheck.StateCheck implementations, plan checks, CompareValue for cross-step assertions, config helpers, import testing with ImportStateKind, sweepers, and scenario patterns (basic, update, disappears, validation, regression), and ephemeral resource testing with the echoprovider package. Use when writing, reviewing, or debugging provider acceptance tests, including questions about statecheck, plancheck, TestCheckFunc, CheckDestroy, ExpectError, import state verification, ephemeral resources, or how to structure test files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3275,3276,3279,3280],{"name":3226,"slug":3227,"type":15},{"name":3277,"slug":3278,"type":15},"QA","qa",{"name":20,"slug":21,"type":15},{"name":3281,"slug":3282,"type":15},"Testing","testing","2026-04-06T18:25:14.352781",{"slug":3285,"name":3285,"fn":3286,"description":3287,"org":3288,"tags":3289,"stars":3191,"repoUrl":3192,"updatedAt":3298},"push-to-registry","push Packer build metadata to HCP registry","Push Packer build metadata to HCP Packer registry for tracking and managing image lifecycle. Use when integrating Packer builds with HCP Packer for version control and governance.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3290,3291,3294,3297],{"name":17,"slug":18,"type":15},{"name":3292,"slug":3293,"type":15},"Governance","governance",{"name":3295,"slug":3296,"type":15},"HCP","hcp",{"name":3189,"slug":3190,"type":15},"2026-04-06T18:25:02.749563",{"slug":3300,"name":3300,"fn":3301,"description":3302,"org":3303,"tags":3304,"stars":3191,"repoUrl":3192,"updatedAt":3310},"refactor-module","refactor Terraform configurations into reusable modules","Transform monolithic Terraform configurations into reusable, maintainable modules following HashiCorp's module design principles and community best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3305,3308,3309],{"name":3306,"slug":3307,"type":15},"Architecture","architecture",{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:20.953737",{"slug":3312,"name":3312,"fn":3313,"description":3314,"org":3315,"tags":3316,"stars":3191,"repoUrl":3192,"updatedAt":3321},"run-acceptance-tests","run acceptance tests for Terraform providers","Guide for running acceptance tests for a Terraform provider. Use this when asked to run an acceptance test or to run a test with the prefix `TestAcc`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3317,3318,3319,3320],{"name":3226,"slug":3227,"type":15},{"name":3277,"slug":3278,"type":15},{"name":20,"slug":21,"type":15},{"name":3281,"slug":3282,"type":15},"2026-04-06T18:25:13.098191",{"slug":3323,"name":3323,"fn":3324,"description":3325,"org":3326,"tags":3327,"stars":3191,"repoUrl":3192,"updatedAt":3334},"terraform-policy","write and test Terraform policy files","Write, test, or convert Terraform Policy files (.policy.hcl, .policytest.hcl, Sentinel→tfpolicy). Triggers: policy.hcl, policytest, convert sentinel, tfpolicy, write a policy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3328,3329,3330,3333],{"name":3214,"slug":3215,"type":15},{"name":23,"slug":24,"type":15},{"name":3331,"slug":3332,"type":15},"Security","security",{"name":20,"slug":21,"type":15},"2026-07-18T05:48:20.299442"]