Agent CI aims to run real GitHub Actions workflows locally. Below is current support against the official workflow syntax.
| Key | Status | Notes |
|---|---|---|
| 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) | ❌ | Reusable workflow calls 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 |
| Key | Status | Notes |
|---|---|---|
| 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) | ❌ | |
| jobs.<id>.secrets | ❌ | Use .env.agent-ci file instead |
| Key | Status | Notes |
|---|---|---|
| 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 |
| Key | Status | Notes |
|---|---|---|
| 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 | ❌ |
| Key | Status | Notes |
|---|---|---|
| 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 |
| Key | Status | Notes |
|---|---|---|
| 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 |