.claude/skills/ci/SKILL.md
Use when CI fails and you need to investigate. Fetches the latest failed workflow run for the current branch or PR and shows failed job logs.
npx skillsauth add enviodev/hyperindex ciInstall 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.
This repo is public, so unauthenticated GitHub API calls work. Use gh if
available, otherwise fall back to curl + python3.
branch=$(git rev-parse --abbrev-ref HEAD) && \
curl -sf "https://api.github.com/repos/enviodev/hyperindex/actions/runs?branch=${branch}&per_page=5" \
| python3 -c "
import sys, json
runs = json.load(sys.stdin)['workflow_runs']
if not runs:
print('No runs found'); sys.exit(0)
for r in runs[:5]:
status = 'FAIL' if r['conclusion'] == 'failure' else 'PASS' if r['conclusion'] == 'success' else r['status']
print(f'[{status}] {r[\"id\"]} {r[\"name\"]} {r[\"created_at\"]}')"
Then list jobs for the failed run:
curl -sf "https://api.github.com/repos/enviodev/hyperindex/actions/runs/RUN_ID/jobs" \
| python3 -c "
import sys, json
jobs = json.load(sys.stdin)['jobs']
for j in jobs:
mark = 'FAIL' if j['conclusion'] == 'failure' else 'ok'
print(f'[{mark}] {j[\"name\"]} (job id: {j[\"id\"]})')
if j['conclusion'] == 'failure':
for s in j['steps']:
if s['conclusion'] == 'failure':
print(f' step failed: {s[\"name\"]}')"
Use gh if available (best output), otherwise use WebFetch on the job URL:
# Option A: gh (if available)
gh run view RUN_ID --log-failed
# Option B: WebFetch the job page for a summary
# https://github.com/enviodev/hyperindex/actions/runs/RUN_ID/job/JOB_ID
The output can be large. Focus on the last 200 lines per job, or grep for
error, FAILED, assert, or panic.
Annotations give file:line locations when available (e.g., lint errors, compiler errors), but many failures (tests, build) produce no annotations:
curl -sf "https://api.github.com/repos/enviodev/hyperindex/check-runs/JOB_ID/annotations" \
| python3 -c "
import sys, json
anns = json.load(sys.stdin)
if not anns:
print('No annotations found')
else:
for a in anns:
print(f'{a[\"path\"]}:{a[\"start_line\"]} - {a[\"message\"][:300]}')"
gh is available, re-run with gh run rerun RUN_ID --faileddevelopment
Write and run tests for HyperIndex indexers using Vitest and createTestIndexer(). Covers test setup, processing block ranges, asserting entity changes with toMatchInlineSnapshot, and TDD workflow. Use when writing tests, debugging handler output, or verifying indexer behavior.
data-ai
Migrate a TheGraph subgraph to Envio HyperIndex using TDD. Covers schema conversion (remove @entity, Bytes->String, @derivedFrom), handler translation (save->set, store.get->context.get, templates->contractRegister), and verification against subgraph data.
data-ai
Use when indexing all instances of a contract across all addresses (e.g., all ERC-20 transfers on a chain). Config setup (no address), wildcard handler option, and event.srcAddress.
data-ai
Use when needing transaction-level data in handlers. Configure field_selection to include transaction fields on events, and access via event.transaction. No native transaction handler — access through event handlers.