Review cycle progress and identify blockers using Linearis and GitHub
Analyzes cycle progress by calculating completion metrics, identifying blockers, and tracking GitHub PR activity.
/plugin marketplace add coalesce-labs/catalyst/plugin install catalyst-dev@catalystinheritStatus: Placeholder for v1.0 - Full implementation coming in future release
This command will help you review cycle progress by:
Use Linearis CLI directly:
# Get active cycle with tickets
linearis cycles read "Sprint 2025-10" --team TEAM
# List tickets by status (use cycles read to get all issues, then filter)
linearis cycles read "Sprint 2025-10" --team TEAM | \
jq '.issues[] | select(.state.name == "In Progress")'
linearis cycles read "Sprint 2025-10" --team TEAM | \
jq '.issues[] | select(.state.name == "Done")'
# Calculate completion manually (count tickets)
# 1. Get active cycle info
CYCLE=$(linearis cycles list --team ENG --active | jq -r '.[0].name')
echo "Active cycle: $CYCLE"
# 2. Get all tickets in cycle
linearis issues list --team ENG | \
jq --arg cycle "$CYCLE" '.[] | select(.cycle.name == $cycle)'
# 3. Count by status (use cycles read to get issues)
CYCLE_DATA=$(linearis cycles read "$CYCLE" --team ENG)
echo "Backlog:"
echo "$CYCLE_DATA" | jq '[.issues[] | select(.state.name == "Backlog")] | length'
echo "In Progress:"
echo "$CYCLE_DATA" | jq '[.issues[] | select(.state.name == "In Progress")] | length'
echo "Done:"
echo "$CYCLE_DATA" | jq '[.issues[] | select(.state.name == "Done")] | length'
# 4. Calculate completion percentage
# total_tickets = backlog + in_progress + done
# completion = (done / total_tickets) * 100
# 5. Find blocked tickets (use cycles read)
linearis cycles read "$CYCLE" --team ENG | \
jq '.issues[] | select(.state.name == "Blocked") | {id, title, blockedReason}'
# 6. Review PRs merged during cycle
# Get cycle start date (example: 2 weeks ago)
CYCLE_START=$(date -v-14d +%Y-%m-%d)
# List all PRs merged during cycle
gh pr list --state merged --search "merged:>=$CYCLE_START" \
--json number,title,author,mergedAt --jq \
'.[] | "\(.mergedAt | split("T")[0]) - \(.author.login): \(.title)"'
# 7. Identify active contributors
gh pr list --state merged --search "merged:>=$CYCLE_START" \
--json author --jq '[.[].author.login] | group_by(.) | map({author: .[0], count: length}) | sort_by(-.count)'
# 8. Check open PRs (work in progress)
gh pr list --state open --json number,title,author,createdAt,isDraft | \
jq '.[] | {author: .author.login, title, days_open: ((now - (.createdAt | fromdateiso8601)) / 86400 | floor), draft: .isDraft}'
# 9. Find work without Linear tickets
# Compare PR titles with Linear ticket IDs (TEAM-XXX pattern)
gh pr list --state merged --search "merged:>=$CYCLE_START" \
--json number,title --jq '.[] | select(.title | test("TEAM-[0-9]+") | not) | {number, title}'
When fully implemented, this command will:
Track progress at: https://github.com/coalesce-labs/catalyst/issues
Uses .claude/config.json:
{
"linear": {
"teamKey": "ENG",
"defaultTeam": "Backend"
}
}