| name | getting-pr-artifacts |
| description | Use when needing workflow artifacts from PR - runs in subagent to find jobs with artifacts, returns gh commands to download them without consuming context |
Getting PR Artifacts
Overview
Find workflow jobs that produced artifacts and provide commands to download them.
Core principle: Return download commands, not artifacts themselves. Artifacts can be large (100MB+).
REQUIRED BACKGROUND: Use awaiting-pr-workflows first to ensure workflows are complete.
When to Use
Use when you need:
- List of available artifacts from PR workflows
- Commands to download specific artifacts
- Info about artifact contents (name, size)
When NOT to use:
- Workflows still running (use
awaiting-pr-workflows) - Need to actually download/analyze artifacts (use returned commands)
Workflow
Step 1: Get Workflow Runs for PR
# Get PR commit
PR_COMMIT=$(gh pr view $PR_NUM --json headRefOid -q '.headRefOid')
# Get runs for this commit
gh run list --commit $PR_COMMIT --json databaseId,name,conclusion
Step 2: Check Each Run for Artifacts
RUN_ID=<from step 1>
# List artifacts for this run
gh run view $RUN_ID --json artifacts --jq '.artifacts[] | {
name: .name,
size: .size_in_bytes,
expired: .expired,
id: .id
}'
Step 3: Build Download Commands
For each artifact, provide:
- Artifact name and size
- Which job/run it's from
ghcommand to download- Suggested extraction commands (if zip/tar)
Return Format
PR #{number} Workflow Artifacts (commit {sha}):
## Available Artifacts
### Run: iOS Test (id: 19727163744)
#### 1. ios-e2e-test-results (24.3 MB)
**Download:**
```bash
gh run download 19727163744 -n ios-e2e-test-results -D /tmp/ios-artifacts
Contents: Likely xcresult bundle, screenshots, logs
Extract/Analyze:
# List contents
ls -lh /tmp/ios-artifacts/
# If it's a zip:
unzip -l /tmp/ios-artifacts/ios-e2e-test-results.zip
# For xcresult bundles (iOS-specific):
# See the 'using-ios-xcresult-artifacts' skill
2. test-coverage-report (1.2 MB)
Download:
gh run download 19727163744 -n test-coverage-report -D /tmp/coverage
Contents: HTML coverage report
View:
open /tmp/coverage/index.html
Run: Backend Test (id: 19727163743)
No artifacts produced
Summary: 2 artifacts available (25.5 MB total)
List all: gh run list --commit {sha} | while read id; do gh run view $id --json artifacts; done
## Common Artifact Types
### iOS/Xcode Artifacts
- `*.xcresult` - Test results bundle (use `using-ios-xcresult-artifacts` skill)
- `*.app` - Application bundle
- `*.ipa` - iOS app package
- `screenshots/` - UI test screenshots
### Test Artifacts
- `coverage/` - Code coverage reports (HTML/XML)
- `test-results.xml` - JUnit test results
- `*.log` - Test execution logs
### Build Artifacts
- `dist/` - Built application files
- `*.tar.gz` - Compressed build outputs
- `build-logs/` - Compilation logs
## Download Strategies
### Download Single Artifact
```bash
# By name
gh run download $RUN_ID -n artifact-name -D /destination
# All artifacts from run
gh run download $RUN_ID -D /destination
Download to Specific Location
# Project-local (in .gitignore)
gh run download $RUN_ID -n ios-results -D .artifacts/
# System temp (cleaned automatically)
gh run download $RUN_ID -n ios-results -D /tmp/pr-artifacts/
# User's Downloads
gh run download $RUN_ID -n ios-results -D ~/Downloads/
Check Before Downloading Large Files
# Get size first
SIZE=$(gh api repos/{owner}/{repo}/actions/runs/$RUN_ID/artifacts \
--jq '.artifacts[] | select(.name == "ios-results") | .size_in_bytes')
# Convert to MB
SIZE_MB=$((SIZE / 1024 / 1024))
echo "Artifact is ${SIZE_MB}MB"
# Ask user if > 50MB
if [ $SIZE_MB -gt 50 ]; then
echo "Large artifact. Proceed? (y/n)"
fi
Example Implementation
#!/bin/bash
# Run in subagent
PR_NUM=$1
PR_COMMIT=$(gh pr view $PR_NUM --json headRefOid -q '.headRefOid')
REPO=$(gh repo view --json nameWithOwner -q '.nameWithOwner')
# Get all runs
RUN_IDS=$(gh run list --commit $PR_COMMIT --json databaseId -q '.[].databaseId')
# For each run, check for artifacts
for RUN_ID in $RUN_IDS; do
RUN_NAME=$(gh run view $RUN_ID --json name -q '.name')
ARTIFACTS=$(gh api "repos/$REPO/actions/runs/$RUN_ID/artifacts" \
--jq '.artifacts[] | {name: .name, size: .size_in_bytes}')
if [ -n "$ARTIFACTS" ]; then
echo "## Run: $RUN_NAME (id: $RUN_ID)"
echo "$ARTIFACTS" | jq -r '"### \(.name) (\(.size / 1024 / 1024 | floor)MB)"'
echo "Download: gh run download $RUN_ID -n {name} -D /tmp/artifacts"
fi
done
Common Mistakes
Downloading artifacts in main context
- Problem: Wastes tokens, slows down session
- Fix: Return commands, let user decide what to download
Not checking artifact size
- Problem: Downloads 500MB file unexpectedly
- Fix: Always show size, warn if large
Not suggesting next steps
- Problem: User has artifacts but doesn't know what to do
- Fix: Include extraction/viewing commands for common types
Quick Reference
| Task | Command |
|---|---|
| List artifacts for run | gh run view $RUN_ID --json artifacts |
| Download by name | gh run download $RUN_ID -n name -D path |
| Download all from run | gh run download $RUN_ID -D path |
| Get artifact metadata | gh api repos/{owner}/{repo}/actions/runs/$RUN_ID/artifacts |
| List all for commit | gh run list --commit $SHA then check each |
Integration with Other Skills
For xcresult bundles: After downloading iOS test artifacts, use the using-ios-xcresult-artifacts skill to analyze them.
For logs in artifacts: If logs are packaged in artifacts rather than workflow logs, download first then analyze locally.
Use Subagents
CRITICAL: Always run in subagent.
Use Task tool with subagent_type='general-purpose'.
Give them this skill and the PR number.
They return artifact list + download commands.
Why: Prevents downloading large files into context. Main agent gets commands and can selectively download.