All skills
ntcoding avatar

/fetching-circleci-logs

@baf17f6
by Nick Tunentcoding/claude-skillz351 stars
46

Fetches CircleCI job logs via the v1.1 API and displays step-level output. Focuses on failed steps. Use when: CI checks fail on a PR, user shares a CircleCI job URL, user asks to check build logs, 'circleci', 'build failed', 'CI failed', 'check the logs'.

Use this Skill: https://skilld.dev/gh/ntcoding/claude-skillz/fetching-circleci-logs

This session only. Nothing lands on disk.

SKILL.md

≈70 tokens always: the name and description. ≈689 when used: this file.

Fetching CircleCI Logs

Fetch step-level build logs from CircleCI jobs using the v1.1 API.

When to use

  • PR checks failed and you need to see why
  • User shares a CircleCI URL (e.g. https://circleci.com/gh/org/repo/169955)
  • User asks to investigate a CI failure

Extract job details from URL

CircleCI URLs follow this pattern:

https://circleci.com/gh/{org}/{repo}/{job_number}

Extract org, repo, and job_number from the URL. If the user provides only a job number, ask for the org/repo or check the current git remote:

git remote get-url origin | sed -E 's|.*github\.com[:/]([^/]+)/([^/.]+).*|\1/\2|'

Fetch logs

Step 1: Get the CircleCI token

grep 'token' ~/.circleci/cli.yml | awk '{print $2}'

If the file doesn't exist or has no token, tell the user to run circleci setup or set the token manually.

Step 2: Fetch job data and display step output

Run this as a single command, substituting {org}, {repo}, and {job_number}:

TOKEN=$(grep 'token' ~/.circleci/cli.yml | awk '{print $2}') && \
curl -s -H "Circle-Token: $TOKEN" \
  "https://circleci.com/api/v1.1/project/gh/{org}/{repo}/{job_number}" | \
python3 -c "
import sys, json, urllib.request
data = json.load(sys.stdin)
for step in data.get('steps', []):
    for action in step.get('actions', []):
        status = action.get('status', '')
        name = action.get('name', '')
        exit_code = action.get('exit_code')
        failed = action.get('failed', False)
        print(f'STEP: {name} | status: {status} | exit: {exit_code}')
        if failed and action.get('output_url'):
            with urllib.request.urlopen(action['output_url']) as r:
                for msg in json.load(r):
                    print(msg.get('message', '')[:2000])
"

Step 3: Analyze the output

After fetching, summarize:

  1. Which steps failed and why
  2. The relevant error messages (not the full log)
  3. Suggested fix if the cause is clear

Important notes

  • Use API v1.1 — v2 does not return step-level output with log URLs.
  • The output_url is a pre-signed S3 URL — no additional auth needed to fetch it.
  • Truncate log messages to 2000 chars per action to avoid context window bloat.
  • If the API returns 404, the job number is likely wrong or the token lacks access to that project.

Mandatory Checklist

When fetching CircleCI logs, complete this checklist:

  1. Verify the CircleCI token exists in ~/.circleci/cli.yml
  2. Verify org, repo, and job number are correctly extracted from the URL or git remote
  3. Verify you are using the v1.1 API (not v2)
  4. Verify you summarized the failure cause, not just dumped raw logs

Do not proceed to suggest fixes until all checks pass.

Source: SKILL.md on GitHub

2 warnings5mo3 checks · Risk MEDIUM
  • Gen Agent Trust Hub5mo

    This skill fetches build logs from CircleCI by reading an API token from the local filesystem and performing network requests. It utilizes dynamic Python execution to parse job data and fetch log content from external URLs, which presents a surface for indirect prompt injection from the log data itself.

  • Socket5mo

    No alerts

  • Snyk5mo

    Risk: MEDIUM · 1 issue

Signed by skilld at baf17f6. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Dormantupdated 6 months ago

README badge

README badge for ntcoding/claude-skillz/fetching-circleci-logs