Skill: Smarterr
Assume the @maintainer persona.
Use this skill to refactor error handling to use smarterr (internal/smerr[../../../internal/smerr/]).
When to use
Trigger this skill when the user:
- Says "use smarterr for error handling", "migrate to smerr", or similar.
Inputs
Required:
- The target resource name (e.g.
aws_s3_bucket).
If the user provides a human readable name (e.g. "S3 Bucket") rather than the Terraform resource, confirm the target resource before proceeding.
Core Concept
- Use
smerr (provider wrapper) for all diagnostic calls
- Use
smarterr only for bare error returns
- Framework uses "Add" verbs, SDKv2 uses "Append" verbs
Migration Patterns
1. Legacy Diagnostic Calls → smerr
| Legacy |
Replace With |
sdkdiag.AppendFromErr(diags, err) |
smerr.Append(ctx, diags, err) |
sdkdiag.AppendErrorf(diags, "msg", err) |
smerr.Append(ctx, diags, err, smerr.ID, id) |
response.Diagnostics.AddError("msg", err.Error()) |
smerr.AddError(ctx, &response.Diagnostics, err) |
create.AppendDiagError(diags, ..., err) |
smerr.Append(ctx, diags, err, smerr.ID, id) |
2. Bare Error Returns → smarterr
// Before
return nil, err
// After
return nil, smarterr.NewError(err)
3. tfresource Helpers → smarterr
// Before
return tfresource.AssertSingleValueResult(...)
// After
return smarterr.Assert(tfresource.AssertSingleValueResult(...))
4. Direct Diagnostics Calls
Framework:
// Before: resp.Diagnostics.Append(...)
// After: smerr.AddEnrich(ctx, &resp.Diagnostics, ...)
SDKv2:
// Before: return append(diags, someFunc()...)
// After: return smerr.AppendEnrich(ctx, diags, someFunc())
Function Reference
Framework (Add verbs):
smerr.AddError(ctx, &response.Diagnostics, err, smerr.ID, id)
smerr.AddEnrich(ctx, &response.Diagnostics, diagnosticFunc())
SDKv2 (Append verbs):
smerr.Append(ctx, diags, err, smerr.ID, id)
smerr.AppendEnrich(ctx, diags, diagnosticFunc())
Both contexts:
smarterr.NewError(err) - Wrap bare returns
smarterr.Assert(tfresource.AssertSingleValueResult(...)) - Wrap helpers
Key Rules
- Always pass
ctx first
- Always include
smerr.ID, resourceID when available (e.g., d.Id(), state.Name.String())
- Framework = Add verbs, SDKv2 = Append verbs
- Preserve all existing IDs and context
Identify Framework vs SDKv2
- Framework:
@FrameworkResource, uses terraform-plugin-framework
- SDKv2:
@SDKResource, uses terraform-plugin-sdk/v2, returns *schema.Resource
Apply these patterns exactly. No schema or logic changes.
1---2name: smarterr3description: Refactor error handling to use smarterr.4---56<!-- Copyright IBM Corp. 2014, 2026 -->7<!-- SPDX-License-Identifier: MPL-2.0 -->89# Skill: Smarterr1011Assume the @maintainer persona.1213Use this skill to refactor error handling to use smarterr (`internal/smerr`[../../../internal/smerr/]).1415## When to use1617Trigger this skill when the user:1819- Says "use smarterr for error handling", "migrate to smerr", or similar.2021## Inputs2223Required:2425- The target resource name (e.g. `aws_s3_bucket`).2627If the user provides a human readable name (e.g. "S3 Bucket") rather than the Terraform resource, confirm the target resource before proceeding.2829## Core Concept3031- **Use `smerr`** (provider wrapper) for all diagnostic calls32- **Use `smarterr`** only for bare error returns33- **Framework uses "Add" verbs, SDKv2 uses "Append" verbs**3435## Migration Patterns3637### 1. Legacy Diagnostic Calls → smerr3839| Legacy | Replace With |40|--------|-------------|41| `sdkdiag.AppendFromErr(diags, err)` | `smerr.Append(ctx, diags, err)` |42| `sdkdiag.AppendErrorf(diags, "msg", err)` | `smerr.Append(ctx, diags, err, smerr.ID, id)` |43| `response.Diagnostics.AddError("msg", err.Error())` | `smerr.AddError(ctx, &response.Diagnostics, err)` |44| `create.AppendDiagError(diags, ..., err)` | `smerr.Append(ctx, diags, err, smerr.ID, id)` |4546### 2. Bare Error Returns → smarterr4748```go49// Before50return nil, err5152// After53return nil, smarterr.NewError(err)54```5556### 3. tfresource Helpers → smarterr5758```go59// Before60return tfresource.AssertSingleValueResult(...)6162// After63return smarterr.Assert(tfresource.AssertSingleValueResult(...))64```6566### 4. Direct Diagnostics Calls6768**Framework:**6970```go71// Before: resp.Diagnostics.Append(...)72// After: smerr.AddEnrich(ctx, &resp.Diagnostics, ...)73```7475**SDKv2:**7677```go78// Before: return append(diags, someFunc()...)79// After: return smerr.AppendEnrich(ctx, diags, someFunc())80```8182## Function Reference8384**Framework (Add verbs):**8586- `smerr.AddError(ctx, &response.Diagnostics, err, smerr.ID, id)`87- `smerr.AddEnrich(ctx, &response.Diagnostics, diagnosticFunc())`8889**SDKv2 (Append verbs):**9091- `smerr.Append(ctx, diags, err, smerr.ID, id)`92- `smerr.AppendEnrich(ctx, diags, diagnosticFunc())`9394**Both contexts:**9596- `smarterr.NewError(err)` - Wrap bare returns97- `smarterr.Assert(tfresource.AssertSingleValueResult(...))` - Wrap helpers9899## Key Rules1001011. **Always pass `ctx` first**1022. **Always include `smerr.ID, resourceID` when available** (e.g., `d.Id()`, `state.Name.String()`)1033. **Framework = Add verbs, SDKv2 = Append verbs**1044. **Preserve all existing IDs and context**105106## Identify Framework vs SDKv2107108- **Framework:** `@FrameworkResource`, uses `terraform-plugin-framework`109- **SDKv2:** `@SDKResource`, uses `terraform-plugin-sdk/v2`, returns `*schema.Resource`110111---112113**Apply these patterns exactly. No schema or logic changes.**