CI Gate
Run every CI check locally. Fail fast, report everything.
1. Detect project types
Look for marker files in the working directory:
| Marker | Stack | Checks |
|---|---|---|
go.mod |
Go | go vet ./..., golangci-lint run ./..., go test -race -count=1 ./..., govulncheck ./... |
package.json |
JS/TS | lint, typecheck, test (detect pm: bun.lockb->bun, pnpm-lock.yaml->pnpm, yarn.lock->yarn, else npm). If turbo.json exists, use turbo run lint typecheck test instead. |
Cargo.toml |
Rust | cargo clippy -- -D warnings, cargo test, cargo audit |
pyproject.toml |
Python | ruff check ., ruff format --check ., python -m pytest |
If multiple markers exist, run checks for ALL detected stacks.
2. Prerequisites
Before running, command -v check every tool needed for the detected stack(s). Collect ALL missing tools into a single list and report them together. If a critical tool is missing (go, cargo, node, python), stop and tell the user. If only optional tools are missing (golangci-lint, govulncheck, cargo-audit, turbo), warn but continue without those checks.
3. Execution
Run all checks for all detected stacks in parallel using background jobs in a single Bash call. Capture each check's exit code, wall-clock duration (via SECONDS), and stderr/stdout.
4. Output
Print a summary table FIRST:
| Check | Status | Duration |
|----------------------------|--------|----------|
| go vet ./... | PASS | 2.1s |
| cargo clippy -- -D warnings| FAIL | 5.4s |
For any FAIL row, print its full error output below the table. Exit with code 1 if any check failed, 0 if all passed.
5. --fix mode
If $ARGUMENTS contains --fix, run auto-fix variants BEFORE the regular checks:
- Go:
golangci-lint run --fix ./... - JS/TS:
<pm> run lint -- --fix(the--is required for npm to forward args) orturbo run lint -- --fix - Rust:
cargo clippy --fix --allow-dirty -- -D warnings - Python:
ruff check --fix .,ruff format .
Then re-run all checks to verify fixes. Without --fix, change nothing.
6. Idempotency
Without --fix: read-only, no side effects. With --fix: changes are visible via git diff.
Check $ARGUMENTS for flags.