Merge pull request 'feat: add skip-stale-REQUEST_CHANGES reviewer menu prompt (Closes #482)' (#491) from feat/issue-482-skip-stale-request-changes-pr into master
This commit was merged in pull request #491.
This commit is contained in:
+1
-1
@@ -41,7 +41,7 @@ The script must be executable (`chmod +x mcp-menu.sh`). It uses bash with
|
|||||||
|--------|-------------|
|
|--------|-------------|
|
||||||
| Project status / root checkout health | Shows cwd, branch, `git status --short --branch`, HEAD SHA, `prgs/master` SHA, and warnings when the root checkout is dirty or off `master`. |
|
| Project status / root checkout health | Shows cwd, branch, `git status --short --branch`, HEAD SHA, `prgs/master` SHA, and warnings when the root checkout is dirty or off `master`. |
|
||||||
| Author workflow prompts | Ready-to-copy prompts for issue work, conflict-fix sessions, and root checkout recovery. |
|
| Author workflow prompts | Ready-to-copy prompts for issue work, conflict-fix sessions, and root checkout recovery. |
|
||||||
| Reviewer workflow prompts | PR review prompt (review-only; no merge). |
|
| Reviewer workflow prompts | Standard PR review prompt, and a skip-already-reviewed-stale-`REQUEST_CHANGES` prompt that hands off to the author without a duplicate terminal mutation (review-only; no merge). |
|
||||||
| Merger workflow prompts | PR merge prompt (merge gates and explicit approval). |
|
| Merger workflow prompts | PR merge prompt (merge gates and explicit approval). |
|
||||||
| Reconciler workflow prompts | Already-landed / closed PR reconciliation prompt. |
|
| Reconciler workflow prompts | Already-landed / closed PR reconciliation prompt. |
|
||||||
| Onboarding new project | Checklist prompt for adding a repository to the MCP workflow. |
|
| Onboarding new project | Checklist prompt for adding a repository to the MCP workflow. |
|
||||||
|
|||||||
+38
-1
@@ -115,7 +115,15 @@ Workflow:
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_reviewer_prompts() {
|
show_reviewer_prompts() {
|
||||||
print_prompt_block "Reviewer — PR review" \
|
while true; do
|
||||||
|
printf '\n--- Reviewer workflow prompts ---\n'
|
||||||
|
printf ' 1) Standard PR review\n'
|
||||||
|
printf ' 2) Skip already-reviewed stale REQUEST_CHANGES PR and hand off to author\n'
|
||||||
|
printf ' 0) Back\n'
|
||||||
|
read -r -p 'Choice: ' choice
|
||||||
|
case "$choice" in
|
||||||
|
1)
|
||||||
|
print_prompt_block "Reviewer — PR review" \
|
||||||
"You are the REVIEWER session for <org>/<repo>.
|
"You are the REVIEWER session for <org>/<repo>.
|
||||||
|
|
||||||
Goal: review PR #<P> only — do not merge unless explicitly switched to merger mode.
|
Goal: review PR #<P> only — do not merge unless explicitly switched to merger mode.
|
||||||
@@ -126,6 +134,35 @@ Workflow:
|
|||||||
3. gitea_view_pr, validate scope, run required checks in the correct worktree.
|
3. gitea_view_pr, validate scope, run required checks in the correct worktree.
|
||||||
4. gitea_review_pr with approve, request-changes, or comment as warranted.
|
4. gitea_review_pr with approve, request-changes, or comment as warranted.
|
||||||
5. Final report: PR head SHA, verdict, validation evidence, mutation ledger. No merge in reviewer-only runs."
|
5. Final report: PR head SHA, verdict, validation evidence, mutation ledger. No merge in reviewer-only runs."
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
print_prompt_block "Reviewer — skip already-reviewed stale REQUEST_CHANGES PR and hand off to author" \
|
||||||
|
"You are the REVIEWER session for <org>/<repo>.
|
||||||
|
|
||||||
|
Goal: review PR #<P> only far enough to determine whether the current head already has a non-stale REQUEST_CHANGES verdict. If it does, do NOT submit another terminal review mutation — produce an author handoff and stop.
|
||||||
|
|
||||||
|
Workflow:
|
||||||
|
1. gitea_view_pr; pin the current head SHA.
|
||||||
|
2. Load prior reviews; find the latest REQUEST_CHANGES and the head SHA it was bound to.
|
||||||
|
3. If that REQUEST_CHANGES is still bound to the current head (non-stale), do not submit another terminal review mutation. Confirm the binding and summarize the blockers.
|
||||||
|
4. Run only the diagnostics needed to produce a useful author handoff — no full re-review.
|
||||||
|
5. Duplicate/supersession check: confirm no newer canonical PR or superseding head changes the decision.
|
||||||
|
6. Stop — no new review mutation.
|
||||||
|
|
||||||
|
Return:
|
||||||
|
- selected PR and issue
|
||||||
|
- current head SHA
|
||||||
|
- prior REQUEST_CHANGES proof (review id + bound head SHA)
|
||||||
|
- duplicate/supersession analysis
|
||||||
|
- validation summary
|
||||||
|
- why no new review mutation was submitted
|
||||||
|
- corrected mutation ledger, including local worktree create/remove if used
|
||||||
|
- author-ready fix prompt"
|
||||||
|
;;
|
||||||
|
0) return ;;
|
||||||
|
*) printf 'Invalid choice.\n' ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
show_merger_prompts() {
|
show_merger_prompts() {
|
||||||
|
|||||||
@@ -105,6 +105,19 @@ class TestMcpMenuScript(unittest.TestCase):
|
|||||||
self.assertIn("./mcp-menu.sh", docs_text)
|
self.assertIn("./mcp-menu.sh", docs_text)
|
||||||
self.assertIn("placeholder", docs_text.lower())
|
self.assertIn("placeholder", docs_text.lower())
|
||||||
|
|
||||||
|
def test_reviewer_skip_stale_request_changes_prompt_discoverable(self):
|
||||||
|
# #482: the skip-already-reviewed-stale-REQUEST_CHANGES reviewer prompt
|
||||||
|
# must be reachable from the reviewer menu and documented.
|
||||||
|
label = "Skip already-reviewed stale REQUEST_CHANGES PR and hand off to author"
|
||||||
|
reviewer_fn = self._extract_function("show_reviewer_prompts")
|
||||||
|
self.assertIn(label, reviewer_fn, "new reviewer prompt label must appear in the reviewer menu")
|
||||||
|
# The prompt must instruct: no duplicate terminal review mutation for a
|
||||||
|
# non-stale REQUEST_CHANGES head, and must carry the author handoff.
|
||||||
|
self.assertIn("do NOT submit another terminal review mutation", reviewer_fn)
|
||||||
|
self.assertIn("author-ready fix prompt", reviewer_fn)
|
||||||
|
docs_text = DOCS.read_text(encoding="utf-8")
|
||||||
|
self.assertIn("REQUEST_CHANGES", docs_text)
|
||||||
|
|
||||||
def _extract_function(self, name: str) -> str:
|
def _extract_function(self, name: str) -> str:
|
||||||
marker = f"{name}() {{"
|
marker = f"{name}() {{"
|
||||||
start = self.content.index(marker)
|
start = self.content.index(marker)
|
||||||
|
|||||||
Reference in New Issue
Block a user