name: "GHA Expression Proof"
description: "Evaluate GitHub Actions expressions with offline receipts."
author: "Wildmason"
branding:
icon: "code"
color: "gray-dark"
inputs:
mode:
description: "Mode to run: eval or template."
required: false
default: "eval"
version:
description: "Crate version to install, or latest."
required: false
default: "latest"
expr:
description: "Expression for eval mode."
required: false
template:
description: "Template text for template mode."
required: false
template-file:
description: "Template file path for template mode."
required: false
context:
description: "Root context JSON file."
required: false
github-context:
description: "Eventsmith-style github-context.json file."
required: false
event:
description: "Event JSON file to inject into github.event."
required: false
context-file:
description: "Newline-separated NAME=PATH context file entries."
required: false
context-json:
description: "Newline-separated NAME=JSON inline context entries."
required: false
workspace:
description: "Workspace directory for hashFiles()."
required: false
if-condition:
description: "Apply implicit success() behavior for workflow if conditions."
required: false
default: "false"
job-status:
description: "Synthetic job status for status functions: success, failure, or cancelled."
required: false
default: "success"
format:
description: "Receipt format: text, json, or markdown."
required: false
default: "text"
output:
description: "Optional receipt output path."
required: false
strict:
description: "Treat warnings as failures."
required: false
default: "false"
runs:
using: "composite"
steps:
- name: "Install gha-expression-proof"
shell: "bash"
run: |
if command -v gha-expression-proof >/dev/null 2>&1; then
exit 0
fi
if [ "${EXPRESSION_PROOF_VERSION}" = "latest" ]; then
cargo install gha-expression-proof --locked
else
cargo install gha-expression-proof --version "${EXPRESSION_PROOF_VERSION}" --locked
fi
env:
EXPRESSION_PROOF_VERSION: ${{ inputs.version }}
- name: "Run gha-expression-proof"
shell: "bash"
run: |
set -euo pipefail
append_if_set() {
local flag="$1"
local value="$2"
if [ -n "$value" ]; then
args+=("$flag" "$value")
fi
}
append_lines() {
local flag="$1"
local value="$2"
while IFS= read -r line; do
if [ -n "$line" ]; then
args+=("$flag" "$line")
fi
done <<< "$value"
}
case "$EXPRESSION_PROOF_MODE" in
eval)
if [ -z "$EXPRESSION_PROOF_EXPR" ]; then
echo "expr input is required for eval mode" >&2
exit 2
fi
args=(eval --expr "$EXPRESSION_PROOF_EXPR")
if [ "$EXPRESSION_PROOF_IF_CONDITION" = "true" ]; then
args+=(--if-condition)
fi
;;
template)
args=(template)
append_if_set --template "$EXPRESSION_PROOF_TEMPLATE"
append_if_set --template-file "$EXPRESSION_PROOF_TEMPLATE_FILE"
;;
*)
echo "mode must be eval or template" >&2
exit 2
;;
esac
append_if_set --context "$EXPRESSION_PROOF_CONTEXT"
append_if_set --github-context "$EXPRESSION_PROOF_GITHUB_CONTEXT"
append_if_set --event "$EXPRESSION_PROOF_EVENT"
append_if_set --workspace "$EXPRESSION_PROOF_WORKSPACE"
append_lines --context-file "$EXPRESSION_PROOF_CONTEXT_FILE"
append_lines --context-json "$EXPRESSION_PROOF_CONTEXT_JSON"
args+=(--job-status "$EXPRESSION_PROOF_JOB_STATUS" --format "$EXPRESSION_PROOF_FORMAT")
append_if_set --output "$EXPRESSION_PROOF_OUTPUT"
if [ "$EXPRESSION_PROOF_STRICT" = "true" ]; then
args+=(--strict)
fi
gha-expression-proof "${args[@]}"
env:
EXPRESSION_PROOF_MODE: ${{ inputs.mode }}
EXPRESSION_PROOF_EXPR: ${{ inputs.expr }}
EXPRESSION_PROOF_TEMPLATE: ${{ inputs.template }}
EXPRESSION_PROOF_TEMPLATE_FILE: ${{ inputs.template-file }}
EXPRESSION_PROOF_CONTEXT: ${{ inputs.context }}
EXPRESSION_PROOF_GITHUB_CONTEXT: ${{ inputs.github-context }}
EXPRESSION_PROOF_EVENT: ${{ inputs.event }}
EXPRESSION_PROOF_CONTEXT_FILE: ${{ inputs.context-file }}
EXPRESSION_PROOF_CONTEXT_JSON: ${{ inputs.context-json }}
EXPRESSION_PROOF_WORKSPACE: ${{ inputs.workspace }}
EXPRESSION_PROOF_IF_CONDITION: ${{ inputs.if-condition }}
EXPRESSION_PROOF_JOB_STATUS: ${{ inputs.job-status }}
EXPRESSION_PROOF_FORMAT: ${{ inputs.format }}
EXPRESSION_PROOF_OUTPUT: ${{ inputs.output }}
EXPRESSION_PROOF_STRICT: ${{ inputs.strict }}