Skip to main content

ciwalk

CI License: MIT

Run your CI pipeline locally, pause at any step, drop into a live shell to inspect or fix state, then retry / continue — no more commit-push-pray.

ciwalk demo: pause, fix, retry

uv tool install ciwalk   # or: pipx install ciwalk
ciwalk run examples/broken-ci.yml --pause-on-fail

Why

CI feedback is still mostly blind: edit YAML → commit → push → wait → read logs → guess. Tools like act run Actions locally but are still all-or-nothing. ciwalk keeps the container alive, opens a shell at the failure point, and lets you resume.

Install

Requires: Python 3.11+ and Docker (daemon running).

uv tool install ciwalk
# or
pipx install ciwalk
# or
pip install ciwalk

From GitHub (no wait for PyPI)

uv tool install git+https://github.com/kiwi-07/ciwalk.git
# or
pipx install git+https://github.com/kiwi-07/ciwalk.git

From a clone (dev)

git clone https://github.com/kiwi-07/ciwalk.git && cd ciwalk
pip install -e ".[dev]"

Standalone binary

GitHub Releases (starting with v0.1.0) attach a platform binary you can download and run without installing Python packages — still needs Docker on the machine.

chmod +x ./ciwalk
./ciwalk run examples/hello.yml

Usage

ciwalk run <workflow.yml> [OPTIONS]
Flag Meaning
--job / -j NAME Job id (required if the workflow has multiple jobs)
--pause-on-fail On failure, open a shell then ask retry / continue / abort
--breakpoint / -b NAME Pause before a step (exact step name)
--image IMAGE Override runner image (default: catthehacker/ubuntu:act-latest)
--workdir / -C PATH Host path mounted as /github/workspace (default: cwd)
--keep Leave the container running after the job ends
--input / -i KEY=VALUE Set ${{ inputs.* }} (repeatable; overrides workflow defaults)
ciwalk cleanup           # remove leftover ciwalk containers (e.g. after kill -9)
ciwalk cleanup --dry-run # list matching containers without removing them

Pause flow

  1. A step fails (with --pause-on-fail) or you hit --breakpoint.
  2. ciwalk attaches an interactive shell inside the same container (same bash flags, env, and working-directory as the step).
  3. Inspect / fix (mounted workspace is live on the host too).
  4. exit (or Ctrl+D) → choose retry | continue | abort.
  5. continue after a failure still exits non-zero (the failed step stays failed).

Demo

ciwalk run examples/broken-ci.yml --pause-on-fail

Matches examples/broken-ci.yml: checkout + Prepare workspace pass; Require marker file fails (build/MARKER missing). In the shell:

touch build/MARKER
exit

Then choose retry. The step passes, Finish runs, and the job completes.

Recording source: docs/demo.cast (replay with asciinema play docs/demo.cast).

Supported GitHub Actions subset (MVP)

  • Single job per run (--job if needed)
  • runs-on: ubuntu-latest (or omit)
  • Steps: run, name, env, working-directory
  • uses: actions/checkout@* → bind-mount workspace (no network clone)
  • ${{ inputs.* }} / ${{ env.* }} string substitution (--input KEY=VALUE)
  • Any other ${{ }} (or unknown inputs.* / env.* key) → error, not empty-string rewrite
  • Jobs that are reusable workflow calls, or use job-level needs: / if: → SKIPPED (loud, non-zero exit — never silent pass)

Not yet: matrix/parallel jobs, secrets, full expression language (github.*, secrets.*, …), arbitrary marketplace actions, GitLab/Circle/Jenkins, caching.

Roadmap / want to help?

Gaps above are intentional MVP cuts, not forever. Prefer contributions around expression support (github.*), matrix builds, and broader uses: allowlisting — file an issue or PR on develop. Good first issues welcome once labeled.

Development

pip install -e ".[dev]"
pytest

Linux smoke (T1–T4)

Native Linux Docker bind-mount behavior can differ from Docker Desktop on Mac. CI runs this on ubuntu-latest:

scripts/linux-smoke.sh

License

MIT

Metadata

Release files for ciwalk 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ciwalk 0.1.0
File Size Uploaded Provenance
ciwalk-0.1.0.tar.gz 18.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ciwalk 0.1.0
File Interpreter ABI Platform
ciwalk-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 38.2 kB

Release files / ciwalk-0.1.0.tar.gz

Download URL ciwalk-0.1.0.tar.gz
Size 18.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b21b7f24f737833b3e66fd2aced5644425ca5977e1252ccb00cb52a41086cd55
BLAKE2b-256 checksum
How to use checksums
f98da6f5bc8ac19b4520314292798329b7ba03349a2b1a2c633f3f99dc6e7b9e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / ciwalk-0.1.0-py3-none-any.whl

Download URL ciwalk-0.1.0-py3-none-any.whl
Size 19.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a23efe93fa432e6452f0d4bd8343213902d070912818e10893bfce103c501f0d
BLAKE2b-256 checksum
How to use checksums
b2dafa4ae1fcc195412036045ff0062099cde2002f9a8fabb734d41a644d0b71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for ciwalk 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page