Initial commit
This commit is contained in:
143
commands/cycle_review.md
Normal file
143
commands/cycle_review.md
Normal file
@@ -0,0 +1,143 @@
|
||||
---
|
||||
description: Review cycle progress and identify blockers using Linearis and GitHub
|
||||
category: project-task-management
|
||||
tools: Bash(linearis *), Bash(gh *), Read, Write, TodoWrite
|
||||
model: inherit
|
||||
version: 1.0.0
|
||||
status: placeholder
|
||||
---
|
||||
|
||||
# Cycle Review
|
||||
|
||||
**Status**: Placeholder for v1.0 - Full implementation coming in future release
|
||||
|
||||
## Planned Functionality
|
||||
|
||||
This command will help you review cycle progress by:
|
||||
|
||||
1. Fetching active cycle details
|
||||
2. Calculating completion percentage by status
|
||||
3. Identifying blocked tickets
|
||||
4. Generating velocity metrics
|
||||
5. Creating cycle summary report
|
||||
|
||||
## Current Workaround
|
||||
|
||||
Use Linearis CLI directly:
|
||||
|
||||
```bash
|
||||
# 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)
|
||||
```
|
||||
|
||||
### Example Workflow
|
||||
|
||||
```bash
|
||||
# 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}'
|
||||
```
|
||||
|
||||
## Future Implementation
|
||||
|
||||
When fully implemented, this command will:
|
||||
|
||||
- **Automated metrics** - Calculate completion, velocity, cycle time
|
||||
- **Status breakdown** - Show tickets grouped by status with percentages
|
||||
- **Blocker identification** - Highlight blocked tickets with reasons
|
||||
- **Trend analysis** - Compare to previous cycles
|
||||
- **Risk assessment** - Identify at-risk tickets (large, old, no progress)
|
||||
- **PR-based activity tracking** - Analyze GitHub PR data to:
|
||||
- Identify who completed what work during the cycle
|
||||
- Find work done without Linear tickets (untracked work)
|
||||
- Calculate actual velocity based on merged PRs
|
||||
- Show contributor activity breakdown
|
||||
- Flag stale PRs that need attention
|
||||
- **Work reconciliation** - Match PRs to Linear tickets, flag mismatches
|
||||
- **Team contribution report** - Show per-person breakdown of PRs and tickets
|
||||
- **Summary generation** - Create review document in thoughts/
|
||||
- **Burndown visualization** - Show progress over time (text-based chart)
|
||||
|
||||
Track progress at: https://github.com/coalesce-labs/catalyst/issues
|
||||
|
||||
## Configuration
|
||||
|
||||
Uses `.claude/config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"linear": {
|
||||
"teamKey": "ENG",
|
||||
"defaultTeam": "Backend"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Tips
|
||||
|
||||
- Review **mid-cycle** to course-correct
|
||||
- Review **end-of-cycle** for retrospectives
|
||||
- Track **blockers daily** - don't wait for review
|
||||
- Compare velocity across cycles for **capacity planning**
|
||||
- Document **lessons learned** for process improvement
|
||||
- Celebrate **wins** - acknowledge team progress
|
||||
- **Use PR data to understand actual work**:
|
||||
- Merged PRs show completed work (even if not in Linear)
|
||||
- Open PRs show current work in progress
|
||||
- PR activity reveals team contribution patterns
|
||||
- Missing ticket references indicate process gaps
|
||||
- **Reconcile Linear and GitHub regularly** to ensure all work is tracked
|
||||
Reference in New Issue
Block a user