--- description: Reconcile beads with merged PRs and close completed beads --- # Reconcile Beads Workflow This skill reconciles beads that are in `in_review` status with their corresponding PRs. If a PR has been merged, the bead is closed and any linked Gitea issue is also closed. ## Prerequisites - Custom status `in_review` must be configured: `bd config set status.custom "in_review"` - Beads in `in_review` status should have a PR URL in their notes - `tea` CLI must be configured for closing Gitea issues ## Workflow ### Step 1: Find beads in review ```bash bd list --status=in_review ``` ### Step 2: For each bead, check PR status 1. **Get the PR URL from bead notes**: ```bash bd show [BEAD_ID] --json | jq -r '.[0].notes' ``` Note: `bd show --json` returns an array, so use `.[0]` to access the first element. Extract the PR URL (look for lines starting with "PR:" or containing pull request URLs). Extract the PR number: `echo "$NOTES" | grep -oP '/pulls/\K\d+'` 2. **Detect hosting provider**: - Run `git remote get-url origin` - If URL contains `github.com`, use `gh`; otherwise use `tea` (Gitea/Forgejo) 3. **Check PR status**: - For GitHub: ```bash gh pr view [PR_NUMBER] --json state,merged ``` - For Gitea: ```bash tea pr list --state=closed ``` Look for the PR number in the INDEX column with STATE "merged". Note: `tea pr view [PR_NUMBER]` lists all PRs, not a specific one. Use `tea pr list --state=closed` and look for your PR number in the results. ### Step 3: Close merged beads If the PR is merged: ```bash bd close [BEAD_ID] --reason="PR merged: [PR_URL]" ``` ### Step 3.1: Close corresponding Gitea issue (if any) After closing a bead, check if it has a linked Gitea issue: 1. **Check for Gitea issue URL in bead notes**: Look for the pattern `Gitea issue: ` in the notes. Extract the URL. 2. **Extract issue number from URL**: ```bash # Example: https://git.johnogle.info/johno/nixos-configs/issues/16 -> 16 echo "$GITEA_URL" | grep -oP '/issues/\K\d+' ``` 3. **Close the Gitea issue**: ```bash tea issues close [ISSUE_NUMBER] ``` 4. **Handle errors gracefully**: - If issue is already closed: Log warning, continue - If issue not found: Log warning, continue - If `tea` fails: Log error, continue with other beads Example warning output: ``` Warning: Could not close Gitea issue #16: issue already closed ``` ### Step 4: Report summary Present results: ``` ## Beads Reconciliation Summary ### Closed (PR Merged) | Bead | PR | Gitea Issue | Title | |------|-----|-------------|-------| | beads-abc | #123 | #16 closed | Feature X | | beads-xyz | #456 | (none) | Bug fix Y | ### Gitea Issues Closed | Issue | Bead | Status | |-------|------|--------| | #16 | beads-abc | Closed successfully | | #17 | beads-def | Already closed (skipped) | | #99 | beads-ghi | Error: issue not found | ### Still in Review | Bead | PR | Status | Title | |------|-----|--------|-------| | beads-def | #789 | Open | Feature Z | ### Issues Found - beads-ghi: No PR URL found in notes - beads-jkl: PR #999 not found (may have been deleted) ``` ## Error Handling - **Missing PR URL**: Skip the bead and report it - **PR not found**: Report the error but continue with other beads - **API errors**: Report and continue - **Gitea issue already closed**: Log warning, continue (not an error) - **Gitea issue not found**: Log warning, continue (issue may have been deleted) - **No Gitea issue linked**: Normal case, no action needed - **tea command fails**: Log error with output, continue with other beads ## Notes - This skill complements `/parallel_beads` which sets beads to `in_review` status - Run this skill periodically or after merging PRs to keep beads in sync - Beads with closed (but not merged) PRs are not automatically closed - they may need rework - Gitea issues are only closed for beads that have a `Gitea issue: ` in their notes