open-weight/skills/pipeline-watch/SKILL.md
Use when a PR has been opened and CI/pipeline checks must be monitored before declaring the task complete. Use when asked to "watch the pipeline", "wait for CI", "make sure checks pass", or "don't declare done until CI is green". Apply after every PR is opened.
npx skillsauth add jon23d/skillz pipeline-watchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Disabled — do not load or follow this skill. The
teaCLI has a known bug affecting pipeline status polling. CI monitoring is the user's responsibility for now. The task is complete once the PR is open and@notifierhas been invoked.
Opening a PR is not done. Done means CI is green — all required checks pass and the PR is ready for the human to review and merge.
NEVER merge a PR. Merging is always the human's decision. Your job ends when you report CI status to the user.
Apply immediately after a PR is opened. The task is not complete until all required checks pass or a failure is handled.
Pre-PR quality gates (local tests, linting, code review) are not the same as CI pipeline checks. CI may run matrix builds, integration tests, deployment previews, or security scans that never ran locally.
After opening the PR:
git branch --show-currentsleep 30Run from the repo root. REMOTE_URL=$(git remote get-url origin) gives you the base for API calls (e.g. http://gitea.example.com). Parse owner and repo from it.
Poll run status for the current branch:
BRANCH=$(git branch --show-current)
# Wait for any run to appear for this branch, then poll until terminal
while true; do
RESULT=$(tea runs list --output json \
| jq -r --arg b "$BRANCH" \
'[.[] | select(.head_branch == $b)] | first | .status // "pending"')
echo "CI status: $RESULT"
case "$RESULT" in
success) echo "CI passed"; break ;;
failure|cancelled) echo "CI failed"; break ;;
esac
sleep 30
done
Get the run ID (needed for failure details):
RUN_ID=$(tea runs list --output json \
| jq -r --arg b "$BRANCH" \
'[.[] | select(.head_branch == $b)] | first | .id')
Fetch failure details via Gitea API:
# List jobs for the run and find failed ones
curl -s -H "Authorization: token ${GITEA_ACCESS_TOKEN}" \
"${GITEA_URL}/api/v1/repos/{owner}/{repo}/actions/runs/${RUN_ID}/jobs" \
| jq '.workflow_runs[] | select(.conclusion == "failure") | {name, conclusion}'
# Fetch logs for a specific job
curl -s -H "Authorization: token ${GITEA_ACCESS_TOKEN}" \
"${GITEA_URL}/api/v1/repos/{owner}/{repo}/actions/jobs/{job_id}/logs"
Re-run a failed workflow:
curl -s -X POST \
-H "Authorization: token ${GITEA_ACCESS_TOKEN}" \
"${GITEA_URL}/api/v1/repos/{owner}/{repo}/actions/runs/${RUN_ID}/rerun"
When a check fails:
Only after checks are green, include in your final user message:
PR #<N>: <title>
URL: <url>
CI: ✓ all checks passed
If checks are still pending at timeout:
PR #<N> is open but CI is still running after 20 minutes.
Pipeline URL: <url>
You may want to monitor it directly.
@backend-engineer or any agent with bash access.merge command (e.g. gh pr merge, git merge) — this is never permitteddevelopment
Use when adding or modifying environment variable handling in TypeScript projects or monorepos — especially when using process.env directly, missing startup validation, sharing env schemas across packages, or encountering "undefined is not a string" errors at runtime from missing env vars.
testing
Use when creating a new skill, editing an existing skill, writing a SKILL.md, or verifying a skill works before deployment.
development
React UI design principles and conventions. Load when building or modifying any user interface or React components. Covers application type detection, visual standards, component design and structure, Mantine (business apps) and Tailwind (consumer apps), accessibility, responsiveness, state management, data fetching, testing, and in-app help patterns.
development
Use when setting up ESLint and/or Prettier in a TypeScript project, adding linting to an existing TypeScript codebase, or configuring typescript-eslint, eslint-config-prettier, or related packages.