feat(bitwarden-delivery-tools): add stacked pull request support - #218
feat(bitwarden-delivery-tools): add stacked pull request support#218withinfocus wants to merge 1 commit into
Conversation
Claude Code validationResult: Issues found Validated 22 changed files across three plugins ( The verdict is CriticalNone. Major
Minor
Checks run
Independently verified while writing this report: |
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Reviewed layer 4 of stack #221: the new Not covered: Skill review did not run — this review path cannot launch |
fa8d082 to
eda42c0
Compare
eda42c0 to
73176c6
Compare
73176c6 to
d2f763c
Compare
d2f763c to
a7a868a
Compare
a7a868a to
efaeccc
Compare
efaeccc to
80a356d
Compare
80a356d to
98dedc0
Compare
98dedc0 to
677b665
Compare
677b665 to
b3a8547
Compare
b3a8547 to
382b8a1
Compare
GitHub's gh-stack extension is now in use across the organization, but Bitwarden's PR conventions are per-PR and `gh stack submit` accepts no title, body, or label flag — so a stack submitted the documented way ships every layer with a generated title, no `t:` label, and no template body. The new `stacking-pull-requests` skill owns that conventions layer and delegates every `gh stack` command to GitHub's own `gh-stack` skill, gating on both the extension and the skill being present and falling back to a single-branch PR when they are not. The three existing mechanics skills gain the per-layer semantics a stack implies.
382b8a1 to
b35ef3e
Compare
🎟️ Tracking
Layer 4 of 4 in stack #221, bottom to top: #220, #217, #219, #218. Based on #219. Touches
bitwarden-delivery-toolsonly.No Jira ticket. GitHub's
gh stackextension is now in use across the organization, and none of the delivery skills knew about it.📔 Objective
A stacked pull request is one layer of a chain, based on the layer below it rather than on trunk. Bitwarden's PR conventions are per pull request, so a stack multiplies every decision
creating-pull-requestmakes by the number of layers.gh stack submitcannot carry any of them: its only flags are--auto,--open, and--remote, and--autogenerates titles with no conventional commit prefix, so CI applies not:label.stacking-pull-requestsowns that conventions layer and hands thegh stackcommand surface to GitHub's owngh-stackskill. Step 0 checks for both the extension and the skill, and falls back to a single-branch PR when either is missing rather than improvising commands against a pre-1.0 tool. That fallback records that the stack path was declined, socreating-pull-requestproceeds as one PR instead of routing back.Ownership between the two skills is explicit, because overlapping halves are how you get duplicate prompts and duplicate reviews. The stack skill runs preflight and the code-review gate per layer, then calls
creating-pull-requestfor its Steps 2 through 4 only: title, body, label. Step 1's gates already ran; Step 5's per-PR preview and Step 6's submission belong to the stack, which shows one whole-stack preview and submits the chain itself.Per-layer review needs an explicit base override. Both review paths resolve their base from
origin/HEAD, so on layer 3 the gate would diff against trunk and re-review layers 1 and 2 while reporting itself satisfied. Step 2 tells the review to use the layer's parent branch instead.Two
gh-stackbehaviors verified against v0.0.8 and encoded:gh stack view --jsonprintsis not part of a stackand still exits 0. Stack detection incommitting-changesandperform-preflighttherefore requires positive proof: the extension present, and a payload naming the current branch. A non-zero exit, empty output, or a missing extension all read as no stack, so an ordinary branch is never routed into the stack workflow.gh stack submithas no title, body, or label flag.references/submitting-a-stack.mdcreates each PR withgh pr create --base <layer below>and joins them withgh stack link, with submit-then-gh pr editas the fallback. Bodies go through--body-filewritten with the Write tool; titles reach the shell inside a double-quoted argument, so$, backticks, backslashes, and"are rejected before composing.perform-preflightgains checks scoped to the layer it is on, with its own detection test since it is commonly invoked directly.committing-changesroutes a new branch only when it continues the stack. The new skill ships a 20-case trigger eval with negatives routing tocreating-pull-requestandforce-multiplier, plus the runner and README; no baseline is committed, since the skill and its eval ship together and there is no prior run to compare against.Version 3.1.0 to 3.2.0.