mcpField
L
local-ci

local-ci

github.com/redwoodjsTesting & quality81068 installsUpdated 7w ago
Repository

About local-ci

Local CI is a command-line tool for running a full CI pipeline locally before pushing changes. It pauses on failures, supports retries from selected steps, and can emit NDJSON events for programmatic monitoring.

Key features

  1. 01Run the full CI pipeline locally
  2. 02Pause automatically on failure
  3. 03Retry from a failed or selected step
  4. 04Emit an NDJSON event stream
  5. 05Provide structured run status

Use cases

  1. 01Check code changes before pushing
  2. 02Resume after fixing a failed step
  3. 03Let an agent monitor CI progress

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/redwoodjs/local-ci --skill local-ci

After installing, type/local-ciin Claude Code to confirm it loaded.

Details

From the project README

Local CI

Run the full CI pipeline locally before pushing. CI was green before you started — any failure is caused by your changes.

Run

npx run-local-ci run --quiet --all --pause-on-failure

Pipes are safe — pause-on-failure works through | tee log, > log.txt, etc. When stdout isn't a TTY the launcher detaches the run and the foreground process exits 77 the moment a step pauses, freeing the pipe while the container stays paused for retry.

Retry

When a step fails, the run pauses automatically. Fix the issue, then retry:

npx run-local-ci retry --name <runner-name>

To re-run from an earlier step:

npx run-local-ci retry --name <runner-name> --from-step <N>

Repeat until all jobs pass. Do not push to trigger remote CI when local-ci can run it locally.

Machine-readable output (--json)

For programmatic monitoring, add --json (or set LOCAL_CI_JSON=1) to emit an NDJSON event stream on stdout — one JSON object per line. Events:

  • run.start (with schemaVersion: 1, runId)
  • job.start, job.finish (status: passed|failed)
  • step.start, step.finish (status: passed|failed|skipped)
  • run.paused (carries runner + retry_cmd)
  • run.finish (status: passed|failed)
  • diagnostic

--json is decoupled from --quiet, and the diff renderer is auto-suppressed under --json so ANSI sequences don't collide with the stream. Combined with the exit-77 pause signal above, this gives agents a robust contract: parse run.paused events, react, and call retry — no plaintext grep required.

Comments

Markdown supported