neon-sprawl/.cursor/rules/story-end.md

44 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
description: When a Jira story is finished (merged or abandoned locally), return to main, pull, delete the local story branch
alwaysApply: true
---
# Story end (Jira)
When the user **ends story work** on a ticketed branch—phrases like “end story”, “story is merged”, “clean up branch after NEON-…”, or they confirm the PR is **merged** to `main`—run this **git** sequence so local state matches the remote default branch.
## 1. Preconditions
- **Merged:** Prefer deleting the local branch only after **`main`** on the remote includes the story (PR merged). If the PR is **not** merged, `git branch -d` will refuse; use **`git branch -D`** only when the user explicitly wants to drop unmerged work.
- **Uncommitted changes:** Stash, commit, or discard before switching branches; do not leave a dirty tree without the users choice.
## 2. Steps (run in order)
1. **`git checkout main`**
2. **`git pull origin main`** (or `git pull` if `main` already tracks `origin/main` and that is correct for this repo)
3. **`git branch -d <story-branch>`** — use the branch that was used for the issue (first path segment should be the Jira key, e.g. `NEON-7-move-validation`). If Git reports “not fully merged”, confirm whether **`origin/main`** already contains the story (e.g. squash merge or follow-up commits only cherry-picked to `main`). If yes, **`git branch -D <story-branch>`** is OK **only with user confirmation** so local unpushed tip is not lost by mistake.
## 2a. When `main` is push-protected
If the user asks to **push** changes that sit on **`main`** and **`git push origin main` fails** (required PR / status checks), create a branch from current `main` (e.g. `chore/…`), **`git push -u origin`** that branch, give them the PR link, then **`git reset --hard origin/main`** if you had temporarily advanced local `main` so local `main` matches remote until the PR merges.
## 3. What not to do
- Do **not** delete **`main`** or **`origin/*`**.
- Do **not** assume the remote story branch should be deleted unless the user asks (many teams keep `origin/NEON-…` for history or delete via GitHub UI).
## 4. Jira transition
- **Do not** call Jira transition APIs (e.g. Atlassian MCP `transitionJiraIssue`) until the user has **explicitly** chosen the next status. Typical options here are **`In Test`** or **`Done`**; use `getTransitionsForJiraIssue` if names differ.
- If the user only says “end story” / “merge cleanup” / similar **without** naming a target status: run the **git** steps in §2, then **ask** “**In Test** or **Done**?” and **wait for their answer** before transitioning. **Never assume Done** (or any status) without that confirmation.
- **Exception:** If the **same user message** already names the status (e.g. “end story, move NEON-28 to **Done**”), you may transition after git cleanup without a second ask.
- Perform the transition with Atlassian MCP when available (**MCP server id `plugin-atlassian-atlassian`**, not `atlassian`).
- If MCP is unavailable or the transition fails, tell the user and ask them to update the board manually.
## Related
- [story-kickoff](story-kickoff.md) — start of story workflow
- [git-workflow](git-workflow.md) — branch vs `main`
- [jira-git-naming](jira-git-naming.md) — branch names
- [commit-and-review](commit-and-review.md) — push only when the user requests it