Skip to content
Development
Command

/pipeline-status

Pipeline-wide situational awareness — groups open issues by workflow state, shows active PRs, flags stale items, and reports milestone progress

BOOST
From plugin
forgedock
11980 skills80 commands
Install
> /plugin marketplace add RapierCraftStudios/ForgeDock
> /plugin install forgedock@forgedock

How it fires

How this command gets triggered: by you, by Claude, or both.

  • Fires itselfClaude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/pipeline-status

Context preview

What this command does when you run it.

Pipeline-wide situational awareness — groups open issues by workflow state, shows active PRs, flags stale items, and reports milestone progress

Command definition

pipeline-status.md
description: Pipeline-wide situational awareness — groups open issues by workflow state, shows active PRs, flags stale items, and reports milestone progress
argument-hint: "[--repo <owner/repo> | --stale-days <N>]"
install: extras

/pipeline-status — Pipeline Status

**Input**: $ARGUMENTS (optional: `--repo <owner/repo>`, `--stale-days <N>`)

Read-only snapshot of the ForgeDock pipeline. Shows open issues grouped by workflow label, active PRs with age, stale items, and milestone progress.

**This command is fully read-only.** It makes no label changes, posts no comments, and creates no issues.

**NEVER use plan mode (EnterPlanMode)** — it breaks execution context.

---

Config Resolution

CONFIG_FILE="${FORGE_CONFIG:-forge.yaml}"
GH_REPO=$(yq '.project.owner + "/" + .project.repo' "$CONFIG_FILE")
GH_FLAG="-R $GH_REPO"
STAGING_BRANCH=$(yq '.branches.staging' "$CONFIG_FILE")

# Optional: --repo flag overrides the default repo
if echo "$ARGUMENTS" | grep -q -- "--repo"; then
    GH_REPO=$(echo "$ARGUMENTS" | sed 's/.*--repo[[:space:]]\([^[:space:]]*\).*/\1/')
    GH_FLAG="-R $GH_REPO"
fi

# Optional: --stale-days flag (default: 7)
STALE_DAYS=7
if echo "$ARGUMENTS" | grep -q -- "--stale-days"; then
    STALE_DAYS=$(echo "$ARGUMENTS" | sed 's/.*--stale-days[[:space:]]\([^[:space:]]*\).*/\1/')
fi

STALE_THRESHOLD=$(date -d "${STALE_DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \
  || date -v-${STALE_DAYS}d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \
  || echo "")

echo "Repo: $GH_REPO"
echo "Staging branch: $STAGING_BRANCH"
echo "Stale threshold: ${STALE_DAYS} days"

---

Phase 1: Issues by Workflow State

Fetch all open issues with `workflow:*` labels. Group and count by state.

echo ""
echo "=== Pipeline Issues — $(date +%Y-%m-%d) ==="
echo ""

# Workflow states to display (in pipeline order)
STATES="workflow:investigating workflow:building workflow:in-review workflow:remediating workflow:ready-to-build needs-human"

for LABEL in $STATES; do
    ISSUES=$(gh issue list $GH_FLAG \
        --state open \
        --label "$LABEL" \
        --limit 50 \
        --json number,title,updatedAt,assignees \
        --jq '.[] | "#\(.number) \(.title[:60]) [updated: \(.updatedAt[:10])]"' \
        2>/dev/null || echo "")

    COUNT=$(echo "$ISSUES" | grep -c '#' 2>/dev/null || echo 0)
    [ "$COUNT" = "0" ] && [ -z "$ISSUES" ] && COUNT=0

    if [ -n "$ISSUES" ] && [ "$COUNT" -gt 0 ]; then
        echo "[$LABEL] ($COUNT open)"
        echo "$ISSUES" | while IFS= read -r line; do
            echo "  $line"
        done
        echo ""
    else
        echo "[$LABEL] — none"
    fi
done

# Issues with no workflow label (untracked / not yet entered pipeline)
UNTRACKED=$(gh issue list $GH_FLAG \
    --state open \
    --limit 20 \
    --json number,title,labels,createdAt \
    --jq '.[] | select(
        (.labels | map(.name) | any(startswith("workflow:"))) | not
    ) | "#\(.number) \(.title[:60]) [created: \(.createdAt[:10])]"' \
    2>/dev/null || echo "")

UNTRACKED_COUNT=$(echo "$UNTRACKED" | grep -c '#' 2>/dev/null || echo 0)
if [ -n "$UNTRACKED" ] && [ "$UNTRACKED_COUNT" -gt 0 ]; then
    echo "[untracked] ($UNTRACKED_COUNT — not yet in pipeline)"
    echo "$UNTRACKED" | while IFS= read -r line; do
        echo "  $line"
    done
    echo ""
fi

# Decomposition trackers (workflow:decomposed) are NOT work: they are excluded from every
# work count in this report and listed separately. With decomposition.close_parent a tracker
# is CLOSED at decomposition, so query --state all and keep only trackers with unfinished
# `- [ ]` checklist items. <!-- Added: forge#3736 -->
TRACKERS=$(gh issue list $GH_FLAG \
    --state all \
    --label "workflow:decomposed" \
    --limit 100 \
    --json number,title,state,body \
    --jq '.[] | select(.body | test("(?m)^[[:space:]]*[-*+] \\[ \\]")) | "#\(.number) \(.title[:60]) [\(.state | ascii_downcase)]"' \
    2>/dev/null || echo "")
TRACKER_COUNT=$(printf '%s' "$TRACKERS" | grep -c '#' 2>/dev/null || true)
echo "[trackers] (${TRACKER_COUNT:-0} — decomposed parents awaiting children; not counted as work)"
if [ -n "$TRACKERS" ]; then
    echo "$TRACKERS" | while IFS= read -r line; do
        echo "  $line"
    done
fi
echo ""

---

Phase 2: Active PRs

Show open PRs targeting `staging` or any `milestone/*` branch, with age and review status.

echo "=== Active PRs ==="
echo ""

gh pr list $GH_FLAG \
    --state open \
    --limit 30 \
    --json number,title,headRefName,baseRefName,createdAt,reviews,isDraft \
    --jq '.[] | {
        number: .number,
        title: .title[:55],
        head: .headRefName,
        base: .baseRefName,
        age_days: (((now - (.createdAt | fromdateiso8601)) / 86400) | floor),
        draft: .isDraft,
        review_state: (
            if (.reviews | length) == 0 then "no review"
            elif (.reviews | map(select(.state == "APPROVED")) | length) > 0 then "APPROVED"
            elif (.reviews | map(select(.state == "CHANGES_REQUESTED")) | length) > 0 then "CHANGES REQUESTED"
            else "COMMENTED"
            end
        )
    } | "  PR #\(.number) \(.title) [\(.age_days)d old] [\(.review_state)]\(if .draft then " [DRAFT]" else "" end)\n    → \(.head) → \(.base)"' \
    2>/dev/null || echo "  (none)"

echo ""

---

Phase 3: Stale Items

Flag issues and PRs with no activity in the last `$STALE_DAYS` days.

echo "=== Stale Items (no activity > ${STALE_DAYS} days) ==="
echo ""

if [ -z "$STALE_THRESHOLD" ]; then
    echo "  (skipped — could not compute stale threshold on this platform)"
else
    # Stale open issues with workflow labels
    STALE_ISSUES=$(gh issue list $GH_FLAG \
        --state open \
        --limit 100 \
        --json number,title,updatedAt,labels \
        --jq --arg threshold "$STALE_THRESHOLD" \
        '[.[] |
            select(
                (.updatedAt < $threshold) and
                (.labels | map(.name) | any(startswith("workflow:")))
Read more
Ships withforgedock

ForgeDock — autonomous AI dev pipeline for Claude Code. GitHub as agent memory: issue in, PR out.

Get the whole plugin

Other commands on forgedock.