Help us improve
Share bugs, ideas, or general feedback.
From hero-skills
Check CI/CD pipeline status (default) or Kubernetes cluster health. Use after pushing to verify builds pass, debug pipelines, or get a cluster status overview.
npx claudepluginhub ai-hero/hero-skills --plugin hero-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/hero-skills:check-ciThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Check pipeline status or cluster health. Default is CI/CD for the current branch.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
Check pipeline status or cluster health. Default is CI/CD for the current branch.
$ARGUMENTS — Optional mode and scope:
ci — CI/CD status for the current branchci BRANCH — CI/CD for a specific branchci #PR — CI/CD checks for a PRci RUN_ID — A specific workflow runcluster [namespace] [--argocd] — Kubernetes cluster healthgh CLI (for CI mode) or kubectl (for cluster mode), installed and authenticatedROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
cat "$ROOT/HERO.md" 2>/dev/null || echo "NO_HERO_CONFIG"
Read HERO.md for:
If HERO.md is missing, suggest hero-skills:init-hero but proceed: assume GitHub Actions for CI, auto-detect namespace for cluster.
Parse the first token of $ARGUMENTS to determine mode. Default is ci.
gh repo view --json nameWithOwner -q .nameWithOwner
BRANCH=$(git branch --show-current)
gh workflow list
Current branch (default):
gh run list --branch "$BRANCH" --limit 5 \
--json databaseId,name,status,conclusion,headBranch,createdAt,url
Specific PR:
gh pr checks PR_NUMBER
Specific run:
gh run view RUN_ID
For each run report: workflow name, status (queued/in_progress/completed), conclusion (success/failure/cancelled/skipped), duration, branch.
If any run failed:
gh run view RUN_ID --json jobs \
--jq '.jobs[] | select(.conclusion=="failure") | {name, steps: [.steps[] | select(.conclusion=="failure") | .name]}'
gh run view RUN_ID --log-failed
# Container images
gh api repos/{owner}/{repo}/packages?package_type=container \
--jq '.[].name' 2>/dev/null
gh api repos/{owner}/{repo}/packages/container/{package}/versions \
--jq '.[0] | {tags: .metadata.container.tags, created: .created_at}' 2>/dev/null
# Deployments
gh api repos/{owner}/{repo}/deployments \
--jq '.[:3] | .[] | {environment: .environment, ref: .ref, created: .created_at}' 2>/dev/null
If runs are in_progress, offer:
gh run watch RUN_ID
Use run_in_background: true and report on completion.
CI Status
=========
Repo: owner/repo
Branch: feature/my-change
Workflow Runs (latest 5):
1. Build & Test SUCCESS 2m 15s
2. Lint SUCCESS 45s
3. Docker Build FAILURE 1m 48s
Failed Run Details:
Job: build-image
Step: docker push
Error: ...
Images:
ghcr.io/owner/repo:main - pushed 2h ago
Overall: PASSING | FAILING | IN PROGRESS | STALE
Status classification: PASSING (all succeeded), FAILING (any failed), IN PROGRESS (still running), STALE (no runs in 24h).
kubectl config current-context
kubectl cluster-info --request-timeout=5s
Stop if connection fails.
kubectl get nodes -o wide
kubectl top nodes 2>/dev/null || echo "Metrics server not available"
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .status.conditions[*]}{.type}={.status}{"\t"}{end}{"\n"}{end}'
Flag: NotReady nodes, >85% CPU/memory, MemoryPressure/DiskPressure/PIDPressure.
kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Succeeded -o wide 2>/dev/null
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.status.containerStatuses[]?.restartCount > 5) | "\(.metadata.namespace)/\(.metadata.name) restarts=\(.status.containerStatuses[0].restartCount)"'
kubectl get pods --all-namespaces --field-selector=status.phase=Pending -o wide
kubectl get deployments --all-namespaces -o json | \
jq -r '.items[] | select(.status.readyReplicas != .status.replicas) | "\(.metadata.namespace)/\(.metadata.name) ready=\(.status.readyReplicas // 0)/\(.status.replicas)"'
# Services without endpoints
kubectl get endpoints --all-namespaces -o json | \
jq -r '.items[] | select((.subsets == null) or (.subsets | length == 0)) | "\(.metadata.namespace)/\(.metadata.name) - NO ENDPOINTS"'
kubectl get ingress --all-namespaces -o wide 2>/dev/null
# Warning events (last hour)
kubectl get events --all-namespaces --field-selector type=Warning --sort-by='.lastTimestamp' | tail -20
# Top consumers
kubectl top pods --all-namespaces --sort-by=cpu 2>/dev/null | head -15
argocd app list -o json 2>/dev/null | \
jq -r '.[] | "\(.metadata.name)\t\(.status.sync.status)\t\(.status.health.status)"'
# Fallback via kubectl
kubectl get applications -n argocd -o json 2>/dev/null | \
jq -r '.items[] | "\(.metadata.name)\tsync=\(.status.sync.status)\thealth=\(.status.health.status)"'
Flag: OutOfSync, Degraded, Missing, Unknown.
Cluster Status
==============
Context: CLUSTER_NAME
Time: TIMESTAMP
Nodes: 3/3 Ready
- node-1: Ready (CPU 45%, Mem 62%)
Pods: 42/42 Running
CrashLooping: 0 | Pending: 0
Deployments: 15/15 Ready
Services: 18 total, 0 missing endpoints
Warnings (last hour): 3
- NAMESPACE/RESOURCE: MESSAGE
[ArgoCD: 12 Synced, 1 OutOfSync]
- APP_NAME: OutOfSync (Degraded)
Overall: HEALTHY | DEGRADED | CRITICAL
Status: HEALTHY (all nodes ready, no crashloops, all deployments at count), DEGRADED (some warnings), CRITICAL (nodes not ready, multiple crashloops).
argocd CLI or access to the argocd namespace.