Full CI pipeline: run local tests, type check, push branch, and return the pipeline URL. The only command you need before opening a PR.
Runs everything in order: local tests → type check → push → pipeline URL.
One /ci:all replaces: manual tests + git push + copying the pipeline URL.
if [ -f "uv.lock" ]; then STACK="python"
elif [ -f "pnpm-lock.yaml" ]; then STACK="node"
elif [ -f "package-lock.json" ]; then STACK="node-npm"
elif [ -f "Cargo.toml" ]; then STACK="rust"
fiPython (uv/pytest):
uv run pytest --tb=short -q
# Failure → STOP + print failing testsNode (pnpm/vitest):
pnpm vitest run
pnpm tsc --noEmit
# Failure → STOPRust:
cargo test --quiet 2>&1If --skip-tests is passed → skip to step 2.
BRANCH=$(git branch --show-current)
# Verify commits exist to push
AHEAD=$(git rev-list --count origin/$BRANCH..HEAD 2>/dev/null || echo "1")
if [ "$AHEAD" = "0" ]; then
echo "Branch already up to date on origin."
else
git push origin "$BRANCH"
fiREMOTE=$(git remote get-url origin)
WEB_URL=$(echo "$REMOTE" | sed 's/git@gitlab\.com:/https:\/\/gitlab.com\//' | sed 's/\.git$//')
echo "Pipeline: $WEB_URL/-/pipelines?ref=$BRANCH"
# Optional: live status via glab CLI
if command -v glab &>/dev/null; then
sleep 3
glab ci status --branch "$BRANCH" 2>/dev/null || true
fiREMOTE=$(git remote get-url origin)
WEB_URL=$(echo "$REMOTE" | sed 's/git@github\.com:/https:\/\/github.com\//' | sed 's/\.git$//')
echo "Actions: $WEB_URL/actions?query=branch%3A$BRANCH"
# Optional: live status via gh CLI
if command -v gh &>/dev/null; then
sleep 5
gh run list --branch "$BRANCH" --limit 3 2>/dev/null || true
fiCI: my-app (Node/Vitest)
──────────────────────────
① Local tests
✅ 47 passed in 8.2s
② Type check
✅ No errors
③ Push
✅ origin/feat/my-feature
④ Pipeline
🔗 https://gitlab.com/org/my-app/-/pipelines?ref=feat/my-feature
Next step: open a PR with /pr or directly on GitLab/GitHub.If tests fail:
CI: my-api (Python/pytest)
────────────────────────────
① Local tests
❌ 2 failed
FAILED tests/test_orders.py::TestOrderService::test_refund_validation
AssertionError: expected 400, got 500
→ Fix tests before pushing. Pipeline not triggered./ci:all
/ci:all --skip-tests # push without re-running tests
/ci:all --e2e # include E2E tests (if configured)Target: $ARGUMENTS
f499217
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.