get-shit-done/workflows/inbox.md
<required_reading> Before starting, read these project files to understand the review criteria:
.github/ISSUE_TEMPLATE/feature_request.yml — required fields for feature issues.github/ISSUE_TEMPLATE/enhancement.yml — required fields for enhancement issues.github/ISSUE_TEMPLATE/chore.yml — required fields for chore issues.github/ISSUE_TEMPLATE/bug_report.yml — required fields for bug reports.github/PULL_REQUEST_TEMPLATE/feature.md — required checklist for feature PRs.github/PULL_REQUEST_TEMPLATE/enhancement.md — required checklist for enhancement PRs.github/PULL_REQUEST_TEMPLATE/fix.md — required checklist for fix PRsCONTRIBUTING.md — the issue-first rule and approval gates
</required_reading>gh CLI available and authenticated?
which gh && gh auth status 2>&1
If not available: print setup instructions and exit.
Detect repository:
If --repo flag provided, use that. Otherwise:
gh repo view --json nameWithOwner -q '.nameWithOwner' 2>/dev/null
If no repo detected: error — must be in a git repo with a GitHub remote.
Parse flags:
--issues → set REVIEW_ISSUES=true, REVIEW_PRS=false--prs → set REVIEW_ISSUES=false, REVIEW_PRS=true--label → set AUTO_LABEL=true--close-incomplete → set AUTO_CLOSE=trueFetch all open issues:
gh issue list --state open --json number,title,labels,body,author,createdAt,updatedAt --limit 100
For each issue, classify by labels and body content:
| Label/Pattern | Type | Template |
|---|---|---|
feature-request | Feature | feature_request.yml |
enhancement | Enhancement | enhancement.yml |
bug | Bug | bug_report.yml |
type: chore | Chore | chore.yml |
| No matching label | Unknown | Flag for manual triage |
If an issue has no type label, attempt to classify from the body content:
needs-triage
</step>
For each classified issue, review against its template requirements.
Feature Request Review Checklist:
needs-review label? Has approved-feature label?approved-feature?Enhancement Review Checklist:
needs-review label? Has approved-enhancement label?approved-enhancement?Bug Report Review Checklist:
needs-triage or confirmed-bug label?Chore Review Checklist:
needs-triage label?Scoring: For each issue, calculate a completeness percentage:
Fetch all open PRs:
gh pr list --state open --json number,title,labels,body,author,headRefName,baseRefName,isDraft,createdAt,reviewDecision,statusCheckRollup --limit 100
For each PR, classify by body content and linked issue:
| Body Pattern | Type | Template |
|---|---|---|
| Contains "## Feature PR" or "## Feature summary" | Feature PR | feature.md |
| Contains "## Enhancement PR" or "## What this enhancement improves" | Enhancement PR | enhancement.md |
| Contains "## Fix PR" or "## What was broken" | Fix PR | fix.md |
| Uses default template | Wrong Template | Flag — must use typed template |
| Cannot determine | Unknown | Flag for manual review |
Also check for linked issues:
gh pr view {number} --json body -q '.body' | grep -oE '(Closes|Fixes|Resolves) #[0-9]+'
For each classified PR, review against its template requirements.
Feature PR Review Checklist:
Closes #NNNapproved-feature labelEnhancement PR Review Checklist:
Closes #NNNapproved-enhancement labelFix PR Review Checklist:
Fixes #NNNconfirmed-bug labelCross-cutting PR Checks (all types):
--no-verify or skipping hooksScoring: Same as issues — completeness percentage per PR. </step>
<step name="check_gates"> Cross-reference issues and PRs to enforce the issue-first rule:For each open PR:
approved-featureapproved-enhancementconfirmed-bugReport gate violations prominently — these are the most important findings because the project auto-closes PRs without proper approval gates. </step>
<step name="generate_report"> Produce a structured triage report:===================================================================
GSD INBOX TRIAGE — {repo} — {date}
===================================================================
SUMMARY
-------
Open issues: {count} Open PRs: {count}
Features: {n} Feature PRs: {n}
Enhancements:{n} Enhancement PRs: {n}
Bugs: {n} Fix PRs: {n}
Chores: {n} Wrong template: {n}
Unclassified:{n} No linked issue: {n}
GATE VIOLATIONS (action required)
---------------------------------
{For each violation:}
PR #{number}: {title}
Problem: {description — e.g., "No approved-feature label on linked issue #45"}
Action: {what to do — e.g., "Close PR or approve issue #45 first"}
ISSUES NEEDING ATTENTION
------------------------
{For each issue sorted by completeness score, lowest first:}
#{number} [{type}] {title}
Score: {percentage}% complete
Missing: {list of missing required fields}
Labels: {current labels} → Suggested: {recommended labels}
Age: {days since created}
PRS NEEDING ATTENTION
---------------------
{For each PR sorted by completeness score, lowest first:}
#{number} [{type}] {title}
Score: {percentage}% complete
Missing: {list of missing checklist items}
CI: {passing/failing/pending}
Review: {approved/changes_requested/none}
Linked issue: #{issue_number} ({issue_status})
Age: {days since created}
READY TO MERGE
--------------
{PRs that are 100% complete, CI passing, approved:}
#{number} {title} — ready
STALE ITEMS (>30 days, no activity)
------------------------------------
{Issues and PRs with no updates in 30+ days}
===================================================================
Write this report to .planning/INBOX-TRIAGE.md if a .planning/ directory exists,
otherwise print to console only.
</step>
If --label: For each issue/PR where labels are missing or incorrect:
gh issue edit {number} --add-label "{label}"
Or:
gh pr edit {number} --add-label "{label}"
Label recommendations:
needs-triageneeds-reviewneeds-reviewneeds-triagegate-violationIf --close-incomplete: For issues scoring below 50% completeness:
gh issue close {number} --comment "Closed by GSD inbox triage: this issue is missing required fields per the issue template. Missing: {list}. Please reopen with a complete submission. See CONTRIBUTING.md for requirements."
For PRs with gate violations:
gh pr close {number} --comment "Closed by GSD inbox triage: this PR does not meet the issue-first requirement. {specific violation}. See CONTRIBUTING.md for the correct process."
Always confirm with the user before closing anything:
Text mode (workflow.text_mode: true in config or --text flag): Set TEXT_MODE=true if --text is present in $ARGUMENTS OR text_mode from init JSON is true. When TEXT_MODE is active, replace every AskUserQuestion call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where AskUserQuestion is not available.
AskUserQuestion:
question: "Found {N} items to close. Review the list above — proceed with closing?"
options:
- label: "Close all"
description: "Close all {N} non-compliant items with explanation comments"
- label: "Let me pick"
description: "I'll choose which ones to close"
- label: "Skip"
description: "Don't close anything — report only"
Reviewed: {issue_count} issues, {pr_count} PRs Gate violations: {violation_count} Ready to merge: {ready_count} Needing attention: {attention_count} Stale (30+ days): {stale_count} {If report saved: "Report saved to .planning/INBOX-TRIAGE.md"}
Next steps:
───────────────────────────────────────────────────────────────
</step>
</process>
<offer_next>
After triage:
- /gsd-review — Run cross-AI peer review on a specific phase plan
- /gsd-ship — Create a PR from completed work
- /gsd-progress — See overall project state
- /gsd-inbox --label — Re-run with auto-labeling enabled
</offer_next>
<success_criteria>
- [ ] All open issues fetched and classified by type
- [ ] Each issue reviewed against its template requirements
- [ ] All open PRs fetched and classified by type
- [ ] Each PR reviewed against its template checklist
- [ ] Issue-first gate violations identified
- [ ] Structured report generated with scores and action items
- [ ] Auto-actions executed only when flagged and user-confirmed
</success_criteria>