YAML Compatibility

Agent CI aims to run real GitHub Actions workflows locally. Below is current support against the official workflow syntax.

✅Supported⚠️Partial❌Not supported🟡Ignored (no-op)🚫Not planned

Workflow

Top-level keys that control when and how a workflow runs — triggers, environment defaults, and concurrency.

KeyStatusNotes
name✅
run-name🟡Parsed but not displayed
on (push, pull_request)✅Branch/path filters evaluated by --all
on (schedule, workflow_dispatch)🟡Accepted but triggers are not simulated
on (workflow_call)⚠️Local refs (./) inlined into caller graph; remote refs, inputs/outputs, and nesting not supported
on (other events)🟡Parsed, not simulated
env✅Workflow-level env propagated to steps
defaults.run.shell✅Passed through to the runner
defaults.run.working-directory✅Passed through to the runner
permissions🟡Accepted, not enforced (mock GITHUB_TOKEN)
concurrency🚫Concurrency groups are a server-side queue/cancel mechanism; there is no persistent local server to coordinate across runs

Jobs

Per-job configuration — runner selection, dependencies, conditional execution, containers, and service sidecars.

KeyStatusNotes
jobs.<id>✅Multiple jobs in a single workflow
jobs.<id>.name✅
jobs.<id>.needs✅Topological sort into dependency waves
jobs.<id>.if⚠️Simplified evaluator: always(), success(), failure(), ==/!=, &&/||
jobs.<id>.runs-on🟡Accepted; always runs in a Linux container
jobs.<id>.environment🟡Accepted, not enforced
jobs.<id>.env✅
jobs.<id>.defaults.run✅shell, working-directory
jobs.<id>.outputs✅Resolved via resolveJobOutputs, accumulated across waves
jobs.<id>.timeout-minutes❌
jobs.<id>.continue-on-error❌
jobs.<id>.concurrency🚫See workflow-level concurrency
jobs.<id>.container✅Short & long form; image, env, ports, volumes, options
jobs.<id>.services✅Sidecar containers with image, env, ports, options
jobs.<id>.uses (reusable workflows)⚠️Local refs (./) expanded inline; remote refs skipped with warning
jobs.<id>.secrets🚫Agent CI cannot access GitHub's secret storage — use .env.agent-ci file instead

Strategy

Matrix builds and failure behavior — how jobs are multiplied across configurations and when to stop on errors.

KeyStatusNotes
strategy.matrix✅Cartesian product expansion
strategy.matrix.include❌
strategy.matrix.exclude❌
strategy.fail-fast✅Respects false to continue on failure
strategy.max-parallel❌Controlled by host concurrency, not per-job

Steps

Individual step configuration — shell commands, action references, conditional execution, and environment variables.

KeyStatusNotes
steps[*].id✅
steps[*].name✅Expression expansion in names
steps[*].if⚠️Evaluated by runner; steps.*.outputs.cache-hit resolves to empty string
steps[*].run✅Multiline scripts, ${{ }} expansion
steps[*].uses✅Public actions downloaded via GitHub API
steps[*].uses (local, e.g. ./)❌Local actions defined within the repo are not supported; agent-ci fails fast with a clear error
steps[*].with✅Expression expansion in values
steps[*].env✅Expression expansion in values
steps[*].working-directory✅
steps[*].shell✅Passed through to the runner
steps[*].continue-on-error❌
steps[*].timeout-minutes❌

Expressions

The ${{ }} expression language — built-in functions, context variables, and operators available in workflow YAML.

KeyStatusNotes
hashFiles(...)✅SHA-256 of matching files, multi-glob
format(...)✅Template substitution with recursive expansion
matrix.*✅
secrets.*✅Via .env.agent-ci file
runner.os✅Always returns Linux
runner.arch✅Always returns X64
github.sha, github.ref_name, etc.⚠️Returns static/dummy values
github.event.*⚠️Returns empty strings
strategy.job-total, strategy.job-index✅
steps.*.outputs.*⚠️Resolves to empty string at parse time
needs.*.outputs.*⚠️Resolved from needsContext when provided
Boolean/comparison operators⚠️==, !=, &&, || in job-level if
toJSON, fromJSON✅
contains, startsWith, endsWith❌
success(), failure(), always(), cancelled()✅Evaluated by Agent CI for job-level if

GitHub API

Interactions with GitHub's API — action downloads, common actions (cache, checkout, setup-*), artifacts, and tokens.

KeyStatusNotes
Action downloads✅Resolves tarballs from github.com
actions/cache✅Local filesystem cache with bind-mount fast path
actions/checkout✅Workspace is rsynced; configured with clean: false
actions/setup-node, actions/setup-python, etc.✅Run natively within the runner
actions/upload-artifact / download-artifact✅Local filesystem storage
GITHUB_TOKEN✅Mock token, all API calls answered locally
Workflow commands (::set-output::, ::error::, etc.)✅Handled by the runner