Provider Output Shapes#

Quick reference for what each built-in provider returns in resolver output — the data shape you can access via _.resolverName in CEL expressions and Go templates.

How Provider Output Works#

When a resolver uses a provider, the resolved value becomes accessible to other resolvers. The output shape determines what fields are available:

flowchart LR
  A["Resolver: api_data<br/>provider: http<br/>output: body, statusCode, headers"] --> B["Resolver: summary<br/>expr: _.api_data<br/>.body.items | size()"]

Tip: Use the MCP tool get_provider_output_shape to query output schemas programmatically, or get_provider_schema for full provider documentation.


Core Providers#

static#

Returns the literal value as-is.

CapabilityOutputType
from<value>any
transform<value>any
# Output is whatever you set as the value
resolve:
  with:
    - provider: static
      inputs:
        value: "hello"
# _.my_resolver == "hello"

cel#

Returns the result of evaluating a CEL expression.

CapabilityOutputType
from<expression result>any
transform<expression result>any
# Output is the CEL evaluation result
resolve:
  with:
    - provider: cel
      inputs:
        expression: "size(_.items)"
# _.my_resolver == 42  (or whatever the expression returns)

parameter#

Returns the value from CLI -r key=value flags.

CapabilityOutputType
from<parameter value>string

env#

Returns the value of an environment variable.

CapabilityOutputType
from<env value>string

Data Providers#

http#

CapabilityFieldsTypeDescription
from / transformbodyany (string or parsed JSON if autoParseJson)Response body
statusCodeintHTTP status code
headersmap[string]stringResponse headers
actionbodyanyResponse body
statusCodeintHTTP status code
headersmap[string]stringResponse headers
successboolWhether statusCode < 400
# Access HTTP response fields
transform:
  with:
    - provider: cel
      inputs:
        expression: "_.api_data.body.items[0].name"

github#

Uses GitHub GraphQL API for reads and mutations, and REST API for releases.

CapabilityFieldsTypeDescription
from / transformresultanyAPI response (structure varies by operation)
actionsuccessboolWhether the write operation succeeded
operationstringThe operation that was performed
resultanyAPI response data
errorstringError message if failed

Read operations (from / transform) — result shapes:

Operationresult typeKey fields
get_repoobjectname, full_name, description, default_branch, isPrivate, url, stargazerCount
get_fileobjectname, content (plain text), sha, size
list_releasesarrayEach: tagName, name, description, publishedAt, isPrerelease
get_latest_releaseobjecttagName, name, description, publishedAt
list_pull_requestsarrayEach: number, title, state, author, createdAt, headRefName
get_pull_requestobjectnumber, title, state, body, author, mergeable, isDraft
list_issuesarrayEach: number, title, state, author, createdAt
get_issueobjectnumber, title, state, body, author, labels
list_issue_commentsarrayEach: body, author, createdAt
list_branchesarrayEach: name, target.oid
get_branchobjectname, target.oid
list_tagsarrayEach: name, target.oid
get_head_oidobjectoid, branch

Write operations (action) — result shapes:

Operationresult key fields
create_issueid, number, title, url, state
create_pull_requestid, number, title, url, headRefName, baseRefName
create_commitoid, url, message, signature.isValid
create_branchname, target.oid
create_releaseid, tag_name, name, url (REST)
# Access GitHub API results (read)
transform:
  with:
    - provider: cel
      inputs:
        expression: "_.repo_info.result.default_branch"

# Check write operation success (action)
transform:
  with:
    - provider: cel
      inputs:
        expression: "_.commit_result.success && _.commit_result.result.signature.isValid"

file#

Returns file content, or for write-tree, information about written files.

CapabilityFieldsTypeDescription
fromcontentstringRaw file content
pathstringResolved file path
sizeintFile size in bytes
action (write-tree)successboolWhether all files were written
operationstring"write-tree"
basePathstringResolved base directory path
filesWrittenintNumber of files written
pathsarrayRelative paths of written files

directory#

Returns directory listings.

CapabilityFieldsTypeDescription
fromentriesarrayDirectory entries
pathstringDirectory path

Each entry: { name, path, isDir, size, modTime }


Processing Providers#

exec#

CapabilityFieldsTypeDescription
from / transformstdoutstringStandard output
stderrstringStandard error
exitCodeintExit code
commandstringFull command string
shellstringShell used
actionsuccessboolWhether exit code is 0
stdoutstringStandard output
stderrstringStandard error
exitCodeintExit code
commandstringFull command string
shellstringShell used
# Parse exec output
transform:
  with:
    - provider: cel
      inputs:
        expression: "_.git_info.stdout.trim()"

go-template#

Returns rendered template output. For render-tree, returns an array of rendered entries.

CapabilityFieldsTypeDescription
transform (render)<rendered text>stringTemplate output as string
transform (render-tree)[{path, content}]arrayArray of rendered file entries. Each entry has path (string) and content (string).

hcl#

Varies by operation — parse returns structured data, format/validate return strings.

validation#

CapabilityFieldsTypeDescription
validationvalidboolAlways true on success
detailsstring"all validations passed"

message#

CapabilityFieldsTypeDescription
actionsuccessboolAlways true on success
messagestringRendered message text

Discovering Output Shapes#

CLI#

# View full provider info including output schemas
scafctl get provider http -o json

# View all providers
scafctl get providers
# View full provider info including output schemas
scafctl get provider http -o json

# View all providers
scafctl get providers

MCP Tools#

# Get output shape for a specific provider
get_provider_output_shape(name: "http", capability: "from")

# Get full provider docs
get_provider_schema(name: "http")

In CEL Expressions#

When writing CEL that references resolver output, the shape depends on the provider used:

# HTTP provider → access .body, .statusCode, .headers
expression: "_.api_call.body.count > 0"

# Exec provider → access .stdout, .exitCode
expression: "_.cmd_result.exitCode == 0"

# Static/CEL provider → direct value
expression: "_.my_string == 'expected'"

Next Steps#