wrkflw
AGENTS.md3.3k starsChanged 8 months agoMITView on GitHub
wrkflw validates and runs GitHub Actions and GitLab CI workflows locally. Use it to check a workflow change before pushing. Prefer the MCP server if your client supports MCP. wrkflw mcp install registers it with Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, opencode, Claude Desktop, GitHub Copilot CLI, Grok Build, Kiro CLI, pi and Zed. Pass a name, such as wrkflw mcp install codex, for one agent, and --dry-run to see the change first. By hand: Run wrkflw…
Trending
More talk lately.about the whole repository
Who's talking about bahdotsh/wrkflw
- @orhun.dev“Here is how I test my GitHub CI from the terminal! 💯 🌀 wrkflw — Validate and execute GitHub Actions …”Bluesky · Apr 16, 2025 · 82 likes
- @matsuu.bsky.social“GitHub …”Bluesky · Apr 23, 2025 · 16 likes
- @bahdotsh.bsky.social“Just released WRKFLW v0.6.0 with Podman support! Full Podman support for rootless GitHub Actions workflow …”Bluesky · Aug 9, 2025 · 4 likes
- @louisacharlotte.inokashiraskey.jp.ap.brid.gy“【るいざの気になる記事】 GitHub - bahdotsh/wrkflw: Validate and execute GitHub Actions workflows locally. …”Bluesky · May 16, 2025 · 4 likes
- @spinscale.bsky.social“wrkflw - Validate and Run GitHub Actions locally Not just a CLI, but a TUI compared to Act. With podman …”Bluesky · Aug 22, 2025 · 3 likes
The biggest 5 of 39 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 39
Talked about on GitHub, Bluesky and Hacker News (39 times).
On GitHub · 20
- Aug 26, 2025wrkflw: 0.7.0 -> 0.7.1 — NixOS/nixpkgs1 reaction · 3 comments
- Aug 18, 2025wrkflw: 0.4.0 -> 0.7.0 — NixOS/nixpkgs1 reaction · 1 comment
- Oct 31, 2026[catalog-candidate] wrkflw-local-ci — ePlus-DEV/free-tier-hub0 reactions · 4 comments
- Sep 1, 2026chore(deps): bump the docker-minor-patch group in /docker with 3 updates — jsakatsume/workspace0 reactions · 1 comment
- Jul 12, 2026enhance wrkflw datum with v0.8.0 feature descriptions + expression evaluator details — elasticdotventures/_b00t_0 reactions
15 more on GitHub
- May 28, 2026Add wrkflw — b3nj5m1n/xdg-ninja0 reactions · 1 comment
- May 9, 2026wrkflw local runner — elasticdotventures/_b00t_0 reactions · 1 comment
- Apr 25, 2026add a makefile rule too ease local validation of workflows — cpcsdk/rust.cpclib0 reactions
- Apr 21, 2026wrkflw 0.8.0 — Homebrew/homebrew-core0 reactions · 1 comment
- Mar 18, 2026docs: add giff, wrkflw, blogr, and snipt — ratatui/awesome-ratatui0 reactions
- Sep 2, 2025wrkflw: 0.7.1 -> 0.7.3 — NixOS/nixpkgs0 reactions
- Aug 28, 2025wrkflw 0.7.3 — Homebrew/homebrew-core0 reactions · 1 comment
- Aug 28, 2025wrkflw 0.7.2 — Homebrew/homebrew-core0 reactions · 1 comment
- Aug 22, 2025wrkflw 0.7.1 — Homebrew/homebrew-core0 reactions · 1 comment
- Aug 13, 2025wrkflw 0.7.0 — Homebrew/homebrew-core0 reactions · 1 comment
- Aug 9, 2025wrkflw 0.6.0 — Homebrew/homebrew-core0 reactions · 1 comment
- May 17, 2025wrkflw: update checksum (wrkflw 0.4.0) — Homebrew/homebrew-core0 reactions · 1 comment
- Apr 27, 2025Introduce `wrkflw` — machupicchubeta/dotfiles0 reactions
- Apr 22, 2025Add github.com/bahdotsh/wrkflw — aquaproj/aqua-registry0 reactions · 2 comments
- Apr 16, 2025wrkflw: init at v0.3.0 — NixOS/nixpkgs0 reactions · 18 comments
On Bluesky · 16
- Apr 16, 2025Here is how I test my GitHub CI from the terminal! 💯 🌀 wrkflw — Validate and execute GitHub Actions workflows locally 🔥 Supports viewing… — @orhun.dev82 likes and reposts · 1 reply
- Apr 23, 2025GitHub Actionsのworkflowのvalidationとローカル実行ができるツール。Rust実装。いいね。少なくともvalidationとしてpre-commitに入れておきたい。ローカル実行はDocker上も手元も可能。brew install wrkflwだ。 — @matsuu.bsky.social16 likes and reposts
- Aug 9, 2025Just released WRKFLW v0.6.0 with Podman support! Full Podman support for rootless GitHub Actions workflow execution Built with #RustLang 🦀… — @bahdotsh.bsky.social4 likes and reposts · 1 reply
- May 16, 2025【るいざの気になる記事】 GitHub - bahdotsh/wrkflw: Validate and execute GitHub Actions workflows locally. https://github.com/bahdotsh/wrkflw by github… — @louisacharlotte.inokashiraskey.jp.ap.brid.gy4 likes and reposts
- Aug 22, 2025wrkflw - Validate and Run GitHub Actions locally Not just a CLI, but a TUI compared to Act. With podman support, the ability to trigger… — @spinscale.bsky.social3 likes and reposts
11 more on Bluesky
- Aug 18, 2025wrkflw: Validate and Run GitHub Actions locally https://lobste.rs/s/6jljsk #testing — @lobsters-feed.bsky.socialsays it tested it3 likes and reposts
- Apr 24, 2025GitHub - bahdotsh/wrkflw: Validate and execute GitHub Actions workflows locally. https://github.com/bahdotsh/wrkflw — @tech-trending.bsky.social3 likes and reposts
- Oct 3, 2025wrkflw just crossed 2.5k stars!🎉 github.com/bahdotsh/wrk... — @bahdotsh.bsky.social2 likes and reposts
- Sep 29, 2025wrkflw just crossed 10k downloads! Grateful to everyone who’s supported or contributed. I hope it’s made writing GitHub workflows a little… — @bahdotsh.bsky.social2 likes and reposts
- Aug 15, 2025bahdotsh/wrkflw: Validate and Run GitHub Actions locally. #github #actions #wrkflw #ci #cd #cicd #selfhosted — @latitude77.bsky.social2 likes and reposts
- Aug 10, 2025wrkflw just crossed 1000 stars on GitHub. A big thanks to everybody who supported it. I hope it continues to makes your life as a developer… — @bahdotsh.bsky.social2 likes and reposts
- Aug 31, 2025https://github.com/bahdotsh/wrkflw — @tom-doerr.bsky.social1 likes and repost
- Apr 27, 2025github.com/bahdotsh/wrkflw... GitHub - bahdotsh/wrkflw: Validate and execute GitHub Actions workflows locally. — @technews4869.bsky.social1 likes and repost
- Apr 27, 2025github.com/bahdotsh... yug1224 starred bahdotsh/wrkflw GitHub Actionsワークフローをローカルで検証・実行できるツールらしい。Docker有無を選べるみたいで、CI/CDのデバッグや動作確認が捗るかもしれない。 — @yug1224.com1 likes and repost
- Apr 21, 2025wrkflw Update: - Trigger workflows directly from the TUI interface by selecting a workflow and pressing `t` - Search functionality to find… — @bahdotsh.bsky.social1 likes and repost
- Apr 17, 2025bahdotsh/wrkflw: Validate and execute GitHub Actions workflows locally. — @fluid.sublimer.me1 likes and repost
On Hacker News · 3
- Apr 21, 2026Wrkflw v0.8.0 – Validate and Run GitHub Actions Locally2 points
- Sep 16, 2025Wrkflw: Validate and run Microsoft GitHub Actions locally2 points · 1 comment
- Aug 14, 2025Wrkflw: Validate and Run GitHub Actions Locally2 points
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,439 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
The file
We split this AGENTS.md into the rules it gives an agent
4 rules. About 0 are common, 0 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 7
After editing YAML, run wrkflw --format json validate.
- Very specific: line 8
Run wrkflw --format json plan <file> to see job order, matrix legs, whether a trigger fires, and under unverified which jobs would run as …
- Very specific: line 27
Add --activity-type opened if the workflow uses types:.
- Very specific: line 28
If the event has a paths: filter, pair --event with --diff or --changed-files a,b, or the command fails, because the filter would have …
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
wrkflw for coding agents
wrkflw validates and runs GitHub Actions and GitLab CI workflows locally. Use it to check a workflow change before pushing.
Loop
- After editing YAML, run
wrkflw --format json validate. - Run
wrkflw --format json plan <file>to see job order, matrix legs, whether a trigger fires, and underunverifiedwhich jobs would run as another OS thanruns-onasks for. Pass the--runtimeyou will run with. - Run
wrkflw --format json run <file> --intent "why you are running this". - On failure, read the
failureobject in the finalrun_finishedline. Don't rerun to see the error again. - For earlier runs, use
wrkflw runs list,runs failure <id>andruns logs <id> --step <name>. - Before calling a pass done, check
unverifiedonrun_finished. A job listed there asked for another OS inruns-onthan it ran as, such aswindows-latestrun as Linux, so steps gated onrunner.osand OS-specific behaviour were not checked. Say so instead of claiming CI will pass.
Prefer the MCP server if your client supports MCP. wrkflw mcp install registers it with Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, opencode, Claude Desktop, GitHub Copilot CLI, Grok Build, Kiro CLI, pi and Zed. Pass a name, such as wrkflw mcp install codex, for one agent, and --dry-run to see the change first. By hand:
{"mcpServers": {"wrkflw": {"command": "wrkflw", "args": ["mcp", "serve"]}}}Before pushing
Run wrkflw --format json gate, or the MCP gate tool. It runs what a push would run, reusing jobs that already passed on the same files, and exits 1 if anything fails. It prints one gate object: passed, failed (paths), unverified (with workflow), uncommitted_changes, and per workflow its status, run_id, jobs and failure digest. Add --reuse-results to wrkflw run, or reuse_results to the MCP run_workflow, to get the same reuse while iterating. A reused job reports one Reuse result step and an unaffected job one Not affected step, so their output isn't there to read. See "Spending less on CI" in the README for .wrkflw/affected.yml.
Simulating events
--event pull_requestneeds--base-branch main. Without it the command fails, on purpose.- Add
--activity-type openedif the workflow usestypes:. - If the event has a
paths:filter, pair--eventwith--diffor--changed-files a,b, or the command fails, because the filter would have nothing to match. - A skipped run exits 0 with
run_finishedstatusskipped. Checkstatus, not only the exit code.
Output contract
--format json is a global flag. stdout carries only JSON and logs go to stderr. Every object has schema_version and type.
| Command | stdout |
run, watch, runs replay | One object per line: run_started, job_started, step_started, step_output (with --stream-output), step_finished, job_finished, run_finished. watch adds watch_started and watch_cycle. |
validate, list, plan, runs ..., clean, gate | One object. |
| Any error | {"type": "error", "message": "..."}, exit 1. |
step_finished.output holds the last 64 KiB of a step's output, delivered when the step ends. To follow a long step before it ends, add --stream-output to run: it adds step_output lines, {job, step, index, lines}, as the step prints, masked like the rest. Without it no step_output lines are printed.
clean prints {"schema_version": 1, "type": "clean", "removed": n, "bytes": n, "in_use": n, "failed": [{"path": "...", "error": "..."}]}: workspaces removed, the bytes they held, workspaces left because a run holds them, and workspaces that could not be removed. It exits 1 when failed is not empty, after cleaning the rest.
A job that does not run, because of its if:, a failed needs job, fail-fast, a GitLab rule or gate: false, still gets job_started and job_finished, with status skipped and duration_ms 0.
run_finished has unverified, a list of {job, requested, ran_as, reason} for jobs that ran as another OS than runs-on asked for, empty when there are none. The same job's job_finished and its run_finished.jobs entry carry runner: {requested, ran_as}.
A job_finished with repeated_from is a matrix leg that did not run, because locally it would only have repeated the named leg. Its status is that leg's and its duration_ms is 0. Pass --every-matrix-leg to run every leg.
failures has one entry per distinct failure, not per failed job, so count jobs on run_finished instead. also_failed_in lists matrix legs where the same step failed with the same exit code and output, ignoring durations, and command is the first leg's script. error_lines holds lines above output_tail that look like errors. note warns about the run itself, such as --from-step having skipped earlier steps.
Workspace paths in step output are relative, so tests/test_app.py means that file in your repository.
Exit codes: 0 for success or skipped, 1 for a failed run or failed validation, 2 for a usage error.
Secrets
A secret no provider has expands to an empty string, as on GitHub. plan lists these under missing_secrets, and a step that reads one ends its output with a warning naming it. To provide a value, set an environment variable with the secret's exact name, such as DEPLOY_TOKEN, before running wrkflw. A secret read from a named provider, as in secrets.vault:TOKEN, is listed as vault:TOKEN and has to be added to that provider.
Validation
Each issue has a severity. An error makes the file invalid. A warning, such as a reference to an undefined step, leaves valid true because GitHub accepts it, but it usually means the value will be empty.
History
Runs are stored under $WRKFLW_HOME/runs, defaulting to the platform's local data directory. The newest 500 are kept, or WRKFLW_RUNS_KEEP. Use --no-record or WRKFLW_NO_HISTORY=1 to skip recording.
Known secrets and ::add-mask:: values are masked before output is stored. --variable values are masked in output and never stored, so pass them again to runs replay. Logs can still hold anything a step printed that wrkflw did not recognise as a secret, so run directories are readable only by the owner on Unix. On Windows they rely on the data directory's permissions.
Identify yourself with WRKFLW_AGENT=<name> or --agent. Without either, the agent comes from AI_AGENT, or from what Claude Code, Codex, Gemini CLI, opencode, Cursor or Augment set. Other agents aren't detected, so set WRKFLW_AGENT. WRKFLW_INTENT or --intent records why you ran it.
The run also records your session, from --session, WRKFLW_SESSION, CLAUDE_CODE_SESSION_ID or CODEX_THREAD_ID. Use wrkflw runs list --session <id> to find the runs of one session. Under MCP the server can outlive your session, so the inherited id is ignored: pass session to run_workflow instead.
Limits
--affectedtrusts the paths in.wrkflw/affected.yml. A path left out of a job's list won't rerun that job.wrkflw gatechecks the working tree, not the commits you push, and skips jobs markedgate: falsein.wrkflw/affected.yml.- Parallel jobs run one after another in emulation, so
--runtime emulationwon't show a race between jobs. --from-stepneeds--job. Earlier steps are skipped apart fromactions/checkout, so their outputs and files are missing. Use it to iterate on a step that doesn't depend on them.runs replayreruns against the current working tree. Comparegit_shaandgit_dirtyon the record if the result differs.--runtime emulationruns steps directly on this machine. Use a container runtime orsecure-emulationfor code you don't trust.planreports a matrix computed by expressions asdynamic, because it is only known at run time.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

