Create a Pull Request for a Marshroom cart issue matching the current branch.
Critical Requirements
- state.json update is MANDATORY. After creating the PR, you MUST update the issue status to
pendingwithprNumberandprURLin${MARSHROOM_STATE:-~/.config/marshroom/state.json}. If this fails, stop and report the error — do NOT silently continue. - Use
marsh prif available; otherwise fall back to directjqatomic write (see step 9).
Steps
- Read
${MARSHROOM_STATE:-~/.config/marshroom/state.json}and parse the JSON - Run
git branch --show-currentto get the current branch name - Find the cart entry matching the current branch and repo. Use relaxed matching:
- First try exact branchName match - Then try /#N suffix match (e.g., current branch HotFix/#20 matches cart entry with branchName: "Feature/#20" because both end with /#20) - If no match, tell the user they're not on a cart issue branch 3-1. Commit the current changes. Give proper commit message to commits. Ask user permission if the changes are too large or suspicious (e.g. 100+ changes, dummy files, DB updates, logs, and so on)
- Push the current branch:
git push -u origin HEAD - Build the PR body:
- Start with a brief description of the changes made - If the matched cart entry has an issueBody field (non-null), include it under a "## Original Issue" section for reviewer context - The body MUST include close #<issueNumber> (this is mandatory for auto-closing the issue)
- Create the PR using
gh pr create:
- Title: the issue title from the matched cart entry - Body: the constructed body from step 5
- After PR creation, verify the body contains the closing keyword:
- Run gh pr view --json body -q '.body' - If close #<issueNumber> is NOT found in the body, fix it: gh pr edit --body "$(gh pr view --json body -q '.body')\n\nclose #<issueNumber>"
- Capture the PR URL and number:
- Run gh pr view --json number,url -q '.number,.url'
- Update issue status (MANDATORY):
- First try: marsh pr - If marsh is not found in PATH, fall back to direct atomic update using the PR number and URL from step 8: STATE_FILE="${MARSHROOM_STATE:-~/.config/marshroom/state.json}" TMP="$(mktemp "${STATE_FILE}.XXXXXX")" jq --argjson n ISSUE_NUMBER --argjson prNum PR_NUMBER --arg prUrl "PR_URL" \ '.cart |= map(if.issueNumber == $n then.status = "pending" |.prNumber = $prNum |.prURL = $prUrl else. end)' \ "$STATE_FILE" > "$TMP" && mv -f "$TMP" "$STATE_FILE" - Verify the update succeeded by reading state.json and confirming status is pending
- Display the result:
- PR URL - PR Number - Issue: #{issueNumber} {issueTitle} - Status: pending