[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BZS1MGBBZ7PFS4P5MFXF9K":3,"skill-same:01M6BZS1MGBBZ7PFS4P5MFXF9K":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":29,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M6BZS1MGBBZ7PFS4P5MFXF9K","provider-resources",null,"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.","twidxuga\u002Fdotfiles","twidxuga","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F12471681?v=4","01M6BZR45BH8JCC79Q9SKSS6SC","Ricardo Santos","01M6BZR49CRKSBZYQD1WNQWCXW",0,"MIT","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-provider-resources\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[30,31,32,33,34,35,36,37,38,39,40,41,42,43],"provider resources","testing","design","implement","plugin","state management","terraform","terraform provider","state","acceptance","framework","data","ibm","crud","2026-11-10 10:12:30",false,"---\nname: provider-resources\ndescription: 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.\nmetadata:\n  copyright: Copyright IBM Corp. 2026\n  version: \"0.0.1\"\n---\n\n# Terraform Provider Resources Implementation Guide\n\n## Overview\n\nThis guide covers developing Terraform Provider resources and data sources using the Terraform Plugin Framework. Resources represent infrastructure objects that Terraform manages through Create, Read, Update, and Delete (CRUD) operations.\n\n**References:**\n- [Terraform Plugin Framework](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework)\n- [Resource Development](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework\u002Fresources)\n- [Data Source Development](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework\u002Fdata-sources)\n\n## File Structure\n\nResources follow the standard service package structure:\n\n```\ninternal\u002Fservice\u002F\u003Cservice>\u002F\n├── \u003Cresource_name>.go           # Resource implementation\n├── \u003Cresource_name>_test.go      # Acceptance tests\n├── \u003Cresource_name>_data_source.go    # Data source (if applicable)\n├── find.go                      # Finder functions\n├── exports_test.go              # Test exports\n└── service_package_gen.go       # Auto-generated registration\n```\n\nDocumentation structure:\n```\nwebsite\u002Fdocs\u002Fr\u002F\n└── \u003Cservice>_\u003Cresource_name>.html.markdown  # Resource documentation\n\nwebsite\u002Fdocs\u002Fd\u002F\n└── \u003Cservice>_\u003Cresource_name>.html.markdown  # Data source documentation\n```\n\n## Resource Structure\n\n### SDKv2 Resource Pattern\n\n```go\nfunc ResourceExample() *schema.Resource {\n    return &schema.Resource{\n        CreateWithoutTimeout: resourceExampleCreate,\n        ReadWithoutTimeout:   resourceExampleRead,\n        UpdateWithoutTimeout: resourceExampleUpdate,\n        DeleteWithoutTimeout: resourceExampleDelete,\n\n        Importer: &schema.ResourceImporter{\n            StateContext: schema.ImportStatePassthroughContext,\n        },\n\n        Schema: map[string]*schema.Schema{\n            \"name\": {\n                Type:         schema.TypeString,\n                Required:     true,\n                ForceNew:     true,\n                ValidateFunc: validation.StringLenBetween(1, 255),\n            },\n            \"arn\": {\n                Type:     schema.TypeString,\n                Computed: true,\n            },\n            \"tags\":     tftags.TagsSchema(),\n            \"tags_all\": tftags.TagsSchemaComputed(),\n        },\n\n        CustomizeDiff: verify.SetTagsDiff,\n    }\n}\n```\n\n### Plugin Framework Resource Pattern\n\n```go\ntype resourceExample struct {\n    framework.ResourceWithConfigure\n}\n\nfunc (r *resourceExample) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {\n    resp.TypeName = req.ProviderTypeName + \"_example\"\n}\n\nfunc (r *resourceExample) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {\n    resp.Schema = schema.Schema{\n        Attributes: map[string]schema.Attribute{\n            \"id\": framework.IDAttribute(),\n            \"name\": schema.StringAttribute{\n                Required: true,\n                PlanModifiers: []planmodifier.String{\n                    stringplanmodifier.RequiresReplace(),\n                },\n                Validators: []validator.String{\n                    stringvalidator.LengthBetween(1, 255),\n                },\n            },\n            \"arn\": schema.StringAttribute{\n                Computed: true,\n                PlanModifiers: []planmodifier.String{\n                    stringplanmodifier.UseStateForUnknown(),\n                },\n            },\n        },\n    }\n}\n```\n\n## CRUD Operations\n\n### Create Operation\n\n```go\nfunc (r *resourceExample) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    input := &example.CreateExampleInput{\n        Name: data.Name.ValueStringPointer(),\n    }\n\n    output, err := conn.CreateExample(ctx, input)\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error creating Example\",\n            fmt.Sprintf(\"Could not create example %s: %s\", data.Name.ValueString(), err),\n        )\n        return\n    }\n\n    data.ID = types.StringPointerValue(output.Id)\n    data.ARN = types.StringPointerValue(output.Arn)\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)\n}\n```\n\n### Read Operation\n\n```go\nfunc (r *resourceExample) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.State.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    output, err := findExampleByID(ctx, conn, data.ID.ValueString())\n    if tfresource.NotFound(err) {\n        resp.Diagnostics.AddWarning(\n            \"Resource not found\",\n            fmt.Sprintf(\"Example %s not found, removing from state\", data.ID.ValueString()),\n        )\n        resp.State.RemoveResource(ctx)\n        return\n    }\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error reading Example\",\n            fmt.Sprintf(\"Could not read example %s: %s\", data.ID.ValueString(), err),\n        )\n        return\n    }\n\n    data.Name = types.StringPointerValue(output.Name)\n    data.ARN = types.StringPointerValue(output.Arn)\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)\n}\n```\n\n### Update Operation\n\n```go\nfunc (r *resourceExample) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {\n    var plan, state resourceExampleModel\n    resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)\n    resp.Diagnostics.Append(req.State.Get(ctx, &state)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    if !plan.Description.Equal(state.Description) {\n        input := &example.UpdateExampleInput{\n            Id:          plan.ID.ValueStringPointer(),\n            Description: plan.Description.ValueStringPointer(),\n        }\n\n        _, err := conn.UpdateExample(ctx, input)\n        if err != nil {\n            resp.Diagnostics.AddError(\n                \"Error updating Example\",\n                fmt.Sprintf(\"Could not update example %s: %s\", plan.ID.ValueString(), err),\n            )\n            return\n        }\n    }\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)\n}\n```\n\n### Delete Operation\n\n```go\nfunc (r *resourceExample) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.State.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    _, err := conn.DeleteExample(ctx, &example.DeleteExampleInput{\n        Id: data.ID.ValueStringPointer(),\n    })\n\n    if tfresource.NotFound(err) {\n        return\n    }\n\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error deleting Example\",\n            fmt.Sprintf(\"Could not delete example %s: %s\", data.ID.ValueString(), err),\n        )\n        return\n    }\n}\n```\n\n## Schema Design\n\n### Attribute Types\n\n| Terraform Type | Framework Type | Use Case |\n|----------------|----------------|----------|\n| `string` | `schema.StringAttribute` | Names, ARNs, IDs |\n| `number` | `schema.Int64Attribute`, `schema.Float64Attribute` | Counts, sizes |\n| `bool` | `schema.BoolAttribute` | Feature flags |\n| `list` | `schema.ListAttribute` | Ordered collections |\n| `set` | `schema.SetAttribute` | Unordered unique items |\n| `map` | `schema.MapAttribute` | Key-value pairs |\n| `object` | `schema.SingleNestedAttribute` | Complex nested config |\n\n### Plan Modifiers\n\n```go\n\u002F\u002F Force replacement when value changes\nstringplanmodifier.RequiresReplace()\n\n\u002F\u002F Preserve unknown value during plan\nstringplanmodifier.UseStateForUnknown()\n\n\u002F\u002F Custom plan modifier\nstringplanmodifier.RequiresReplaceIf(\n    func(ctx context.Context, req planmodifier.StringRequest, resp *stringplanmodifier.RequiresReplaceIfFuncResponse) {\n        \u002F\u002F Custom logic\n    },\n    \"description\",\n    \"markdown description\",\n)\n```\n\n### Validators\n\n```go\n\u002F\u002F String validators\nstringvalidator.LengthBetween(1, 255)\nstringvalidator.RegexMatches(regexp.MustCompile(`^[a-z0-9-]+$`), \"must be lowercase alphanumeric with hyphens\")\nstringvalidator.OneOf(\"option1\", \"option2\", \"option3\")\n\n\u002F\u002F Int64 validators\nint64validator.Between(1, 100)\nint64validator.AtLeast(1)\nint64validator.AtMost(1000)\n\n\u002F\u002F List validators\nlistvalidator.SizeAtLeast(1)\nlistvalidator.SizeAtMost(10)\n```\n\n### Sensitive Attributes\n\n```go\n\"password\": schema.StringAttribute{\n    Required:  true,\n    Sensitive: true,\n    Validators: []validator.String{\n        stringvalidator.LengthAtLeast(8),\n    },\n}\n```\n\n## State Management\n\n### Handling Resource Not Found\n\n```go\nfunc findExampleByID(ctx context.Context, conn *example.Client, id string) (*example.Example, error) {\n    input := &example.GetExampleInput{\n        Id: &id,\n    }\n\n    output, err := conn.GetExample(ctx, input)\n    if err != nil {\n        var notFound *types.ResourceNotFoundException\n        if errors.As(err, &notFound) {\n            return nil, &retry.NotFoundError{\n                LastError:   err,\n                LastRequest: input,\n            }\n        }\n        return nil, err\n    }\n\n    if output == nil || output.Example == nil {\n        return nil, tfresource.NewEmptyResultError(input)\n    }\n\n    return output.Example, nil\n}\n```\n\n### Waiting for Resource States\n\n```go\nfunc waitExampleCreated(ctx context.Context, conn *example.Client, id string, timeout time.Duration) (*example.Example, error) {\n    stateConf := &retry.StateChangeConf{\n        Pending: []string{\"CREATING\", \"PENDING\"},\n        Target:  []string{\"ACTIVE\", \"AVAILABLE\"},\n        Refresh: statusExample(ctx, conn, id),\n        Timeout: timeout,\n    }\n\n    outputRaw, err := stateConf.WaitForStateContext(ctx)\n    if output, ok := outputRaw.(*example.Example); ok {\n        return output, err\n    }\n\n    return nil, err\n}\n\nfunc statusExample(ctx context.Context, conn *example.Client, id string) retry.StateRefreshFunc {\n    return func() (interface{}, string, error) {\n        output, err := findExampleByID(ctx, conn, id)\n        if tfresource.NotFound(err) {\n            return nil, \"\", nil\n        }\n        if err != nil {\n            return nil, \"\", err\n        }\n        return output, string(output.Status), nil\n    }\n}\n```\n\n## Testing\n\n### Basic Acceptance Test\n\n```go\nfunc TestAccExampleResource_basic(t *testing.T) {\n    ctx := acctest.Context(t)\n    rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)\n    resourceName := \"provider_example.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { acctest.PreCheck(ctx, t) },\n        ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy(ctx),\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                Check: resource.ComposeTestCheckFunc(\n                    testAccCheckExampleExists(ctx, resourceName),\n                    resource.TestCheckResourceAttr(resourceName, \"name\", rName),\n                    resource.TestCheckResourceAttrSet(resourceName, \"arn\"),\n                ),\n            },\n            {\n                ResourceName:      resourceName,\n                ImportState:       true,\n                ImportStateVerify: true,\n            },\n        },\n    })\n}\n```\n\n### Disappears Test\n\n```go\nfunc TestAccExampleResource_disappears(t *testing.T) {\n    ctx := acctest.Context(t)\n    rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)\n    resourceName := \"provider_example.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { acctest.PreCheck(ctx, t) },\n        ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy(ctx),\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                Check: resource.ComposeTestCheckFunc(\n                    testAccCheckExampleExists(ctx, resourceName),\n                    acctest.CheckResourceDisappears(ctx, acctest.Provider, ResourceExample(), resourceName),\n                ),\n                ExpectNonEmptyPlan: true,\n            },\n        },\n    })\n}\n```\n\n### Test Helper Functions\n\n```go\nfunc testAccCheckExampleExists(ctx context.Context, name string) resource.TestCheckFunc {\n    return func(s *terraform.State) error {\n        rs, ok := s.RootModule().Resources[name]\n        if !ok {\n            return fmt.Errorf(\"Not found: %s\", name)\n        }\n\n        conn := acctest.Provider.Meta().(*conns.Client).ExampleClient(ctx)\n        _, err := findExampleByID(ctx, conn, rs.Primary.ID)\n\n        return err\n    }\n}\n\nfunc testAccCheckExampleDestroy(ctx context.Context) resource.TestCheckFunc {\n    return func(s *terraform.State) error {\n        conn := acctest.Provider.Meta().(*conns.Client).ExampleClient(ctx)\n\n        for _, rs := range s.RootModule().Resources {\n            if rs.Type != \"provider_example\" {\n                continue\n            }\n\n            _, err := findExampleByID(ctx, conn, rs.Primary.ID)\n            if tfresource.NotFound(err) {\n                continue\n            }\n            if err != nil {\n                return err\n            }\n\n            return fmt.Errorf(\"Example %s still exists\", rs.Primary.ID)\n        }\n\n        return nil\n    }\n}\n```\n\n### Running Tests\n\n```bash\n# Compile tests\ngo test -c -o \u002Fdev\u002Fnull .\u002Finternal\u002Fservice\u002F\u003Cservice>\n\n# Run acceptance tests\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -run TestAccExample -v -timeout 60m\n\n# Run with specific provider version\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -run TestAccExample -v\n\n# Run sweeper to clean up\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -sweep=\u003Cregion> -v\n```\n\n## Error Handling\n\n### Common Error Patterns\n\n```go\n\u002F\u002F Handle specific API errors\nvar notFound *types.ResourceNotFoundException\nif errors.As(err, &notFound) {\n    \u002F\u002F Resource doesn't exist\n}\n\nvar conflict *types.ConflictException\nif errors.As(err, &conflict) {\n    \u002F\u002F Resource state conflict\n}\n\nvar throttle *types.ThrottlingException\nif errors.As(err, &throttle) {\n    \u002F\u002F Rate limited - SDK handles retry\n}\n```\n\n### Diagnostics\n\n```go\n\u002F\u002F Add error\nresp.Diagnostics.AddError(\n    \"Error creating resource\",\n    fmt.Sprintf(\"Could not create resource: %s\", err),\n)\n\n\u002F\u002F Add warning\nresp.Diagnostics.AddWarning(\n    \"Resource modified outside Terraform\",\n    \"Resource was modified outside of Terraform, state may be inconsistent\",\n)\n\n\u002F\u002F Add attribute error\nresp.Diagnostics.AddAttributeError(\n    path.Root(\"name\"),\n    \"Invalid name\",\n    \"Name must be lowercase alphanumeric\",\n)\n```\n\n## Documentation Standards\n\n### Resource Documentation\n\n```markdown\n---\nsubcategory: \"Service Name\"\nlayout: \"provider\"\npage_title: \"Provider: provider_example\"\ndescription: |-\n  Manages an Example resource.\n---\n\n# Resource: provider_example\n\nManages an Example resource.\n\n## Example Usage\n\n### Basic Usage\n\n\\```hcl\nresource \"provider_example\" \"example\" {\n  name = \"my-example\"\n}\n\\```\n\n## Argument Reference\n\n* `name` - (Required) Name of the example.\n* `description` - (Optional) Description of the example.\n\n## Attribute Reference\n\n* `id` - ID of the example.\n* `arn` - ARN of the example.\n\n## Import\n\nExample can be imported using the ID:\n\n\\```\n$ terraform import provider_example.example example-id-12345\n\\```\n```\n\n## Pre-Submission Checklist\n\n- [ ] Code compiles without errors\n- [ ] All tests pass locally\n- [ ] Resource has all CRUD operations implemented\n- [ ] Import is implemented and tested\n- [ ] Disappears test is included\n- [ ] Documentation is complete with examples\n- [ ] Error messages are clear and actionable\n- [ ] Sensitive attributes are marked\n- [ ] Plan modifiers are appropriate\n- [ ] Validators cover edge cases\n\n## References\n\n- [Terraform Plugin Framework](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework)\n- [Terraform Plugin SDKv2](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fsdkv2)\n- [Acceptance Testing](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Ftesting\u002Facceptance-tests)\n- [terraform-plugin-framework GitHub](https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-framework)\n","# Terraform Provider Resources Implementation Guide\n\n## Overview\n\nThis guide covers developing Terraform Provider resources and data sources using the Terraform Plugin Framework. Resources represent infrastructure objects that Terraform manages through Create, Read, Update, and Delete (CRUD) operations.\n\n**References:**\n- [Terraform Plugin Framework](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework)\n- [Resource Development](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework\u002Fresources)\n- [Data Source Development](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework\u002Fdata-sources)\n\n## File Structure\n\nResources follow the standard service package structure:\n\n```\ninternal\u002Fservice\u002F\u003Cservice>\u002F\n├── \u003Cresource_name>.go           # Resource implementation\n├── \u003Cresource_name>_test.go      # Acceptance tests\n├── \u003Cresource_name>_data_source.go    # Data source (if applicable)\n├── find.go                      # Finder functions\n├── exports_test.go              # Test exports\n└── service_package_gen.go       # Auto-generated registration\n```\n\nDocumentation structure:\n```\nwebsite\u002Fdocs\u002Fr\u002F\n└── \u003Cservice>_\u003Cresource_name>.html.markdown  # Resource documentation\n\nwebsite\u002Fdocs\u002Fd\u002F\n└── \u003Cservice>_\u003Cresource_name>.html.markdown  # Data source documentation\n```\n\n## Resource Structure\n\n### SDKv2 Resource Pattern\n\n```go\nfunc ResourceExample() *schema.Resource {\n    return &schema.Resource{\n        CreateWithoutTimeout: resourceExampleCreate,\n        ReadWithoutTimeout:   resourceExampleRead,\n        UpdateWithoutTimeout: resourceExampleUpdate,\n        DeleteWithoutTimeout: resourceExampleDelete,\n\n        Importer: &schema.ResourceImporter{\n            StateContext: schema.ImportStatePassthroughContext,\n        },\n\n        Schema: map[string]*schema.Schema{\n            \"name\": {\n                Type:         schema.TypeString,\n                Required:     true,\n                ForceNew:     true,\n                ValidateFunc: validation.StringLenBetween(1, 255),\n            },\n            \"arn\": {\n                Type:     schema.TypeString,\n                Computed: true,\n            },\n            \"tags\":     tftags.TagsSchema(),\n            \"tags_all\": tftags.TagsSchemaComputed(),\n        },\n\n        CustomizeDiff: verify.SetTagsDiff,\n    }\n}\n```\n\n### Plugin Framework Resource Pattern\n\n```go\ntype resourceExample struct {\n    framework.ResourceWithConfigure\n}\n\nfunc (r *resourceExample) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {\n    resp.TypeName = req.ProviderTypeName + \"_example\"\n}\n\nfunc (r *resourceExample) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {\n    resp.Schema = schema.Schema{\n        Attributes: map[string]schema.Attribute{\n            \"id\": framework.IDAttribute(),\n            \"name\": schema.StringAttribute{\n                Required: true,\n                PlanModifiers: []planmodifier.String{\n                    stringplanmodifier.RequiresReplace(),\n                },\n                Validators: []validator.String{\n                    stringvalidator.LengthBetween(1, 255),\n                },\n            },\n            \"arn\": schema.StringAttribute{\n                Computed: true,\n                PlanModifiers: []planmodifier.String{\n                    stringplanmodifier.UseStateForUnknown(),\n                },\n            },\n        },\n    }\n}\n```\n\n## CRUD Operations\n\n### Create Operation\n\n```go\nfunc (r *resourceExample) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    input := &example.CreateExampleInput{\n        Name: data.Name.ValueStringPointer(),\n    }\n\n    output, err := conn.CreateExample(ctx, input)\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error creating Example\",\n            fmt.Sprintf(\"Could not create example %s: %s\", data.Name.ValueString(), err),\n        )\n        return\n    }\n\n    data.ID = types.StringPointerValue(output.Id)\n    data.ARN = types.StringPointerValue(output.Arn)\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)\n}\n```\n\n### Read Operation\n\n```go\nfunc (r *resourceExample) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.State.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    output, err := findExampleByID(ctx, conn, data.ID.ValueString())\n    if tfresource.NotFound(err) {\n        resp.Diagnostics.AddWarning(\n            \"Resource not found\",\n            fmt.Sprintf(\"Example %s not found, removing from state\", data.ID.ValueString()),\n        )\n        resp.State.RemoveResource(ctx)\n        return\n    }\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error reading Example\",\n            fmt.Sprintf(\"Could not read example %s: %s\", data.ID.ValueString(), err),\n        )\n        return\n    }\n\n    data.Name = types.StringPointerValue(output.Name)\n    data.ARN = types.StringPointerValue(output.Arn)\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)\n}\n```\n\n### Update Operation\n\n```go\nfunc (r *resourceExample) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {\n    var plan, state resourceExampleModel\n    resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)\n    resp.Diagnostics.Append(req.State.Get(ctx, &state)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    if !plan.Description.Equal(state.Description) {\n        input := &example.UpdateExampleInput{\n            Id:          plan.ID.ValueStringPointer(),\n            Description: plan.Description.ValueStringPointer(),\n        }\n\n        _, err := conn.UpdateExample(ctx, input)\n        if err != nil {\n            resp.Diagnostics.AddError(\n                \"Error updating Example\",\n                fmt.Sprintf(\"Could not update example %s: %s\", plan.ID.ValueString(), err),\n            )\n            return\n        }\n    }\n\n    resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)\n}\n```\n\n### Delete Operation\n\n```go\nfunc (r *resourceExample) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {\n    var data resourceExampleModel\n    resp.Diagnostics.Append(req.State.Get(ctx, &data)...)\n    if resp.Diagnostics.HasError() {\n        return\n    }\n\n    conn := r.Meta().ExampleClient(ctx)\n\n    _, err := conn.DeleteExample(ctx, &example.DeleteExampleInput{\n        Id: data.ID.ValueStringPointer(),\n    })\n\n    if tfresource.NotFound(err) {\n        return\n    }\n\n    if err != nil {\n        resp.Diagnostics.AddError(\n            \"Error deleting Example\",\n            fmt.Sprintf(\"Could not delete example %s: %s\", data.ID.ValueString(), err),\n        )\n        return\n    }\n}\n```\n\n## Schema Design\n\n### Attribute Types\n\n| Terraform Type | Framework Type | Use Case |\n|----------------|----------------|----------|\n| `string` | `schema.StringAttribute` | Names, ARNs, IDs |\n| `number` | `schema.Int64Attribute`, `schema.Float64Attribute` | Counts, sizes |\n| `bool` | `schema.BoolAttribute` | Feature flags |\n| `list` | `schema.ListAttribute` | Ordered collections |\n| `set` | `schema.SetAttribute` | Unordered unique items |\n| `map` | `schema.MapAttribute` | Key-value pairs |\n| `object` | `schema.SingleNestedAttribute` | Complex nested config |\n\n### Plan Modifiers\n\n```go\n\u002F\u002F Force replacement when value changes\nstringplanmodifier.RequiresReplace()\n\n\u002F\u002F Preserve unknown value during plan\nstringplanmodifier.UseStateForUnknown()\n\n\u002F\u002F Custom plan modifier\nstringplanmodifier.RequiresReplaceIf(\n    func(ctx context.Context, req planmodifier.StringRequest, resp *stringplanmodifier.RequiresReplaceIfFuncResponse) {\n        \u002F\u002F Custom logic\n    },\n    \"description\",\n    \"markdown description\",\n)\n```\n\n### Validators\n\n```go\n\u002F\u002F String validators\nstringvalidator.LengthBetween(1, 255)\nstringvalidator.RegexMatches(regexp.MustCompile(`^[a-z0-9-]+$`), \"must be lowercase alphanumeric with hyphens\")\nstringvalidator.OneOf(\"option1\", \"option2\", \"option3\")\n\n\u002F\u002F Int64 validators\nint64validator.Between(1, 100)\nint64validator.AtLeast(1)\nint64validator.AtMost(1000)\n\n\u002F\u002F List validators\nlistvalidator.SizeAtLeast(1)\nlistvalidator.SizeAtMost(10)\n```\n\n### Sensitive Attributes\n\n```go\n\"password\": schema.StringAttribute{\n    Required:  true,\n    Sensitive: true,\n    Validators: []validator.String{\n        stringvalidator.LengthAtLeast(8),\n    },\n}\n```\n\n## State Management\n\n### Handling Resource Not Found\n\n```go\nfunc findExampleByID(ctx context.Context, conn *example.Client, id string) (*example.Example, error) {\n    input := &example.GetExampleInput{\n        Id: &id,\n    }\n\n    output, err := conn.GetExample(ctx, input)\n    if err != nil {\n        var notFound *types.ResourceNotFoundException\n        if errors.As(err, &notFound) {\n            return nil, &retry.NotFoundError{\n                LastError:   err,\n                LastRequest: input,\n            }\n        }\n        return nil, err\n    }\n\n    if output == nil || output.Example == nil {\n        return nil, tfresource.NewEmptyResultError(input)\n    }\n\n    return output.Example, nil\n}\n```\n\n### Waiting for Resource States\n\n```go\nfunc waitExampleCreated(ctx context.Context, conn *example.Client, id string, timeout time.Duration) (*example.Example, error) {\n    stateConf := &retry.StateChangeConf{\n        Pending: []string{\"CREATING\", \"PENDING\"},\n        Target:  []string{\"ACTIVE\", \"AVAILABLE\"},\n        Refresh: statusExample(ctx, conn, id),\n        Timeout: timeout,\n    }\n\n    outputRaw, err := stateConf.WaitForStateContext(ctx)\n    if output, ok := outputRaw.(*example.Example); ok {\n        return output, err\n    }\n\n    return nil, err\n}\n\nfunc statusExample(ctx context.Context, conn *example.Client, id string) retry.StateRefreshFunc {\n    return func() (interface{}, string, error) {\n        output, err := findExampleByID(ctx, conn, id)\n        if tfresource.NotFound(err) {\n            return nil, \"\", nil\n        }\n        if err != nil {\n            return nil, \"\", err\n        }\n        return output, string(output.Status), nil\n    }\n}\n```\n\n## Testing\n\n### Basic Acceptance Test\n\n```go\nfunc TestAccExampleResource_basic(t *testing.T) {\n    ctx := acctest.Context(t)\n    rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)\n    resourceName := \"provider_example.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { acctest.PreCheck(ctx, t) },\n        ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy(ctx),\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                Check: resource.ComposeTestCheckFunc(\n                    testAccCheckExampleExists(ctx, resourceName),\n                    resource.TestCheckResourceAttr(resourceName, \"name\", rName),\n                    resource.TestCheckResourceAttrSet(resourceName, \"arn\"),\n                ),\n            },\n            {\n                ResourceName:      resourceName,\n                ImportState:       true,\n                ImportStateVerify: true,\n            },\n        },\n    })\n}\n```\n\n### Disappears Test\n\n```go\nfunc TestAccExampleResource_disappears(t *testing.T) {\n    ctx := acctest.Context(t)\n    rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)\n    resourceName := \"provider_example.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { acctest.PreCheck(ctx, t) },\n        ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy(ctx),\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                Check: resource.ComposeTestCheckFunc(\n                    testAccCheckExampleExists(ctx, resourceName),\n                    acctest.CheckResourceDisappears(ctx, acctest.Provider, ResourceExample(), resourceName),\n                ),\n                ExpectNonEmptyPlan: true,\n            },\n        },\n    })\n}\n```\n\n### Test Helper Functions\n\n```go\nfunc testAccCheckExampleExists(ctx context.Context, name string) resource.TestCheckFunc {\n    return func(s *terraform.State) error {\n        rs, ok := s.RootModule().Resources[name]\n        if !ok {\n            return fmt.Errorf(\"Not found: %s\", name)\n        }\n\n        conn := acctest.Provider.Meta().(*conns.Client).ExampleClient(ctx)\n        _, err := findExampleByID(ctx, conn, rs.Primary.ID)\n\n        return err\n    }\n}\n\nfunc testAccCheckExampleDestroy(ctx context.Context) resource.TestCheckFunc {\n    return func(s *terraform.State) error {\n        conn := acctest.Provider.Meta().(*conns.Client).ExampleClient(ctx)\n\n        for _, rs := range s.RootModule().Resources {\n            if rs.Type != \"provider_example\" {\n                continue\n            }\n\n            _, err := findExampleByID(ctx, conn, rs.Primary.ID)\n            if tfresource.NotFound(err) {\n                continue\n            }\n            if err != nil {\n                return err\n            }\n\n            return fmt.Errorf(\"Example %s still exists\", rs.Primary.ID)\n        }\n\n        return nil\n    }\n}\n```\n\n### Running Tests\n\n```bash\n# Compile tests\ngo test -c -o \u002Fdev\u002Fnull .\u002Finternal\u002Fservice\u002F\u003Cservice>\n\n# Run acceptance tests\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -run TestAccExample -v -timeout 60m\n\n# Run with specific provider version\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -run TestAccExample -v\n\n# Run sweeper to clean up\nTF_ACC=1 go test .\u002Finternal\u002Fservice\u002F\u003Cservice> -sweep=\u003Cregion> -v\n```\n\n## Error Handling\n\n### Common Error Patterns\n\n```go\n\u002F\u002F Handle specific API errors\nvar notFound *types.ResourceNotFoundException\nif errors.As(err, &notFound) {\n    \u002F\u002F Resource doesn't exist\n}\n\nvar conflict *types.ConflictException\nif errors.As(err, &conflict) {\n    \u002F\u002F Resource state conflict\n}\n\nvar throttle *types.ThrottlingException\nif errors.As(err, &throttle) {\n    \u002F\u002F Rate limited - SDK handles retry\n}\n```\n\n### Diagnostics\n\n```go\n\u002F\u002F Add error\nresp.Diagnostics.AddError(\n    \"Error creating resource\",\n    fmt.Sprintf(\"Could not create resource: %s\", err),\n)\n\n\u002F\u002F Add warning\nresp.Diagnostics.AddWarning(\n    \"Resource modified outside Terraform\",\n    \"Resource was modified outside of Terraform, state may be inconsistent\",\n)\n\n\u002F\u002F Add attribute error\nresp.Diagnostics.AddAttributeError(\n    path.Root(\"name\"),\n    \"Invalid name\",\n    \"Name must be lowercase alphanumeric\",\n)\n```\n\n## Documentation Standards\n\n### Resource Documentation\n\n```markdown\n---\nsubcategory: \"Service Name\"\nlayout: \"provider\"\npage_title: \"Provider: provider_example\"\ndescription: |-\n  Manages an Example resource.\n---\n\n# Resource: provider_example\n\nManages an Example resource.\n\n## Example Usage\n\n### Basic Usage\n\n\\```hcl\nresource \"provider_example\" \"example\" {\n  name = \"my-example\"\n}\n\\```\n\n## Argument Reference\n\n* `name` - (Required) Name of the example.\n* `description` - (Optional) Description of the example.\n\n## Attribute Reference\n\n* `id` - ID of the example.\n* `arn` - ARN of the example.\n\n## Import\n\nExample can be imported using the ID:\n\n\\```\n$ terraform import provider_example.example example-id-12345\n\\```\n```\n\n## Pre-Submission Checklist\n\n- [ ] Code compiles without errors\n- [ ] All tests pass locally\n- [ ] Resource has all CRUD operations implemented\n- [ ] Import is implemented and tested\n- [ ] Disappears test is included\n- [ ] Documentation is complete with examples\n- [ ] Error messages are clear and actionable\n- [ ] Sensitive attributes are marked\n- [ ] Plan modifiers are appropriate\n- [ ] Validators cover edge cases\n\n## References\n\n- [Terraform Plugin Framework](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fframework)\n- [Terraform Plugin SDKv2](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Fsdkv2)\n- [Acceptance Testing](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Ftesting\u002Facceptance-tests)\n- [terraform-plugin-framework GitHub](https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-framework)\n",{"name":5,"metadata":49,"description":7},{"version":50,"copyright":51},"0.0.1","Copyright IBM Corp. 2026","main","e25eb555e87aa9eeb59b520834f46fd926ad19a3","opencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-provider-resources","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles","https:\u002F\u002Fgithub.com\u002Ftwidxuga","Software developer, data scientist, applications architect and all round computer geek.","2026-10-28 03:46:24",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add twidxuga\u002Fdotfiles --skill provider-resources",{"tool":65,"command":66},"bunx","bunx skills add twidxuga\u002Fdotfiles --skill provider-resources",{"tool":68,"command":69},"pnpm","pnpm dlx skills add twidxuga\u002Fdotfiles --skill provider-resources","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-provider-resources\u002FSKILL.md",true,[73],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"README.md","REFERENCE","参考文档",8755,"https:\u002F\u002Fgithub.com\u002FBigdrops\u002Fbigdrops-app\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-judge\u002FREADME.md",[80,102,116,133,149,159],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":88,"publishedAt":44},"01M6C9Z7VKBN4HAFBDXD67K3E1","terraform-test","Comprehensive guide for writing and running Terraform tests. Use when creating test files (.tftest.hcl), writing test scenarios with run blocks, validating infrastructure behavior with assertions, mocking providers and data sources, testing module outputs and resource configurations, or troubleshooting Terraform test syntax and execution.","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-test\u002FSKILL.md",[86,87],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[89,36,90,31,91,92,93,41,42,94,95,96,97,98,99,100,101],"test","terraform test","writing","infrastructure","run","Providers","execution","troubleshooting","syntax","behavior","guide","use","files",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":109,"publishedAt":44},"01M6C9Z4GWWTXCXAS8NK747K07","terraform-style-guide","Generate Terraform HCL code following HashiCorp's official style conventions and best practices. Use when writing, reviewing, or generating Terraform configurations.","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-style-guide\u002FSKILL.md",[108],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[110,99,36,111,112,113,114,91,115,100],"terraform style guide","official","generate","code","best practices","hashicorp",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":44},"01M6C9Z1DCAC8YQQ1WS0AHBB14","terraform-stacks","Comprehensive guide for working with HashiCorp Terraform Stacks. Use when creating, modifying, or validating Terraform Stack configurations (.tfcomponent.hcl, .tfdeploy.hcl files), working with stack components and deployments from local modules, public registry, or private registry sources, managing multi-region or multi-environment infrastructure, or troubleshooting Terraform Stacks syntax and structure.","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-stacks\u002FSKILL.md",[122],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[36,124,125,101,126,127,128,129,92,130,42,115,131,96,97,132,99,100],"terraform stacks","multi-environment","deployments","public","modules","components","registry","stack","environment",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":44},"01M6C9YYAVCNTR81V4HGZWPFW1","terraform-search-import","Discover existing cloud resources using Terraform Search queries and bulk import them into Terraform management. Use when bringing unmanaged infrastructure under Terraform control, auditing cloud resources, or migrating to IaC.","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-search-import\u002FSKILL.md",[139],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[141,142,36,100,143,92,144,42,94,145,146,147,148],"terraform search import","search","support","cloud","list","management","version","iac",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":157,"publishedAt":44},"01M6BZS7EAXHWK32RG213VE65G","run-acceptance-tests","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`.","MPL-2.0","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-run-acceptance-tests\u002FSKILL.md",[156],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[158,39,93,89,36,37,42],"run acceptance tests",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":170,"publishedAt":44},"01M6BZS4MJD31PY7M7654ZWQ56","refactor-module","Transform monolithic Terraform configurations into reusable, maintainable modules following HashiCorp's module design principles and community best practices.","https:\u002F\u002Fgithub.com\u002Ftwidxuga\u002Fdotfiles\u002Fblob\u002Fmain\u002Fopencode\u002Fdot-config\u002Fopencode\u002Fskills\u002Fterraform-refactor-module\u002FSKILL.md",[165,168,169],{"categoryNo":166,"categoryName":167,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[171,172,114,36,42,115,32],"refactor module","refactor"]