gha-expression-proof 1.0.0

GitHub Actions expression evaluator and receipt generator for offline CI compatibility testing
Documentation
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 }}