@chris1807/claude-kit 2.1.55 → 2.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -10
- package/package.json +1 -1
- package/templates/commands/cherry-pick.md +125 -14
- package/templates/commands/create-release.md +1 -1
- package/templates/commands/deploy-release.md +134 -27
- package/templates/commands/promote.md +120 -11
- package/templates/infrastructure/CLAUDE-WORKFLOW.md +23 -12
package/README.md
CHANGED
|
@@ -329,7 +329,8 @@ Claude automatically:
|
|
|
329
329
|
2. Cherry-picks their commits into `release/23-to-staging`
|
|
330
330
|
3. Creates a PR targeting the `staging` branch — merging it triggers the Staging pipeline
|
|
331
331
|
4. Links all work items to the PR
|
|
332
|
-
5.
|
|
332
|
+
5. Asks who verifies each product group on Staging (`COM`, `PAY`, …) — candidates are the non-developer names already on those work items
|
|
333
|
+
6. Watches the PR and the Staging pipeline; once it's green, moves the work items to `Staging` and assigns them to the approved verifiers
|
|
333
334
|
|
|
334
335
|
The same command walks a release through `test` → `staging` → `prod`; with no environment given it picks the next one.
|
|
335
336
|
|
|
@@ -339,7 +340,7 @@ The same command walks a release through `test` → `staging` → `prod`; with n
|
|
|
339
340
|
/cherry-pick AB#1234 AB#1235 prod
|
|
340
341
|
```
|
|
341
342
|
|
|
342
|
-
Cherry-picks specific work items to an environment without a formal release. Same gate check and
|
|
343
|
+
Cherry-picks specific work items to an environment without a formal release. Same gate check, same verifier question, and the same automatic state advance + assignment once the pipeline is green as `/deploy-release`. `main` is also a valid target — that's how a hot fix that went straight to `prod` is brought back into the compare branch.
|
|
343
344
|
|
|
344
345
|
### Promote an Environment
|
|
345
346
|
|
|
@@ -349,7 +350,7 @@ Cherry-picks specific work items to an environment without a formal release. Sam
|
|
|
349
350
|
/promote ← auto-detects from the current branch
|
|
350
351
|
```
|
|
351
352
|
|
|
352
|
-
Creates a PR to promote all code from one branch to the next in the chain (`main → dev → test → staging → prod`). Shows every commit and work item before confirming, gate-checks the work items, and advances
|
|
353
|
+
Creates a PR to promote all code from one branch to the next in the chain (`main → dev → test → staging → prod`). Shows every commit and work item before confirming, gate-checks the work items, asks who verifies each product group, and advances and assigns them once the merge's pipeline is green. `main → dev` is the usual first hop after feature PRs merge — nothing has deployed before that.
|
|
353
354
|
|
|
354
355
|
### Rollback a Deployment
|
|
355
356
|
|
|
@@ -439,7 +440,7 @@ Every environment has a work item state, and the promotion commands keep them in
|
|
|
439
440
|
| `test → staging` | `Ready for Staging` (QA sign-off) | `Staging` |
|
|
440
441
|
| `staging → prod` | `Ready to Deploy` (stakeholder sign-off) | `Deployed` |
|
|
441
442
|
|
|
442
|
-
`/deploy-release`, `/cherry-pick`, and `/promote` check the gate before creating the PR,
|
|
443
|
+
`/deploy-release`, `/cherry-pick`, and `/promote` check the gate before creating the PR, ask who verifies each product group while the PR is in review, then watch the PR and the environment's CD pipeline — on a green pipeline they set the state and the assignee together. A failed pipeline changes nothing. `/status` flags anything whose state lags the branch it's on.
|
|
443
444
|
|
|
444
445
|
### Branch Naming
|
|
445
446
|
|
|
@@ -507,7 +508,7 @@ The PR merges into `main`. **That merge deploys nothing** — `main` is the comp
|
|
|
507
508
|
/promote main dev
|
|
508
509
|
```
|
|
509
510
|
|
|
510
|
-
Merge that PR,
|
|
511
|
+
Merge that PR. Claude asks who verifies each product group on Dev, watches the Dev pipeline, and once it's green moves the work items to `Ready for Testing` and assigns them to those people.
|
|
511
512
|
|
|
512
513
|
### Step 2: Deploy Changes (Quick Commits)
|
|
513
514
|
|
|
@@ -550,7 +551,8 @@ Claude will:
|
|
|
550
551
|
4. Cherry-pick all commits for each work item
|
|
551
552
|
5. Create a PR from `release/23-to-test` → `test`
|
|
552
553
|
6. Link all work items to the PR
|
|
553
|
-
7.
|
|
554
|
+
7. Ask who verifies each product group on Test
|
|
555
|
+
8. Watch the PR and the Test pipeline; on a green pipeline, move the work items to `Testing` and assign them to the approved verifiers
|
|
554
556
|
|
|
555
557
|
After the PR is reviewed and merged, the Test CD pipeline triggers automatically. QA tests there and sets each passing item to `Ready for Staging`; then `/deploy-release 23 staging` repeats the process (gate `Ready for Staging`, state after merge `Staging`).
|
|
556
558
|
|
|
@@ -566,7 +568,7 @@ When stakeholders have verified on Staging and set the items to `Ready to Deploy
|
|
|
566
568
|
/deploy-release 23 prod
|
|
567
569
|
```
|
|
568
570
|
|
|
569
|
-
Same process — gate `Ready to Deploy`, cherry-picks from `staging` into a PR targeting `prod`. After merge
|
|
571
|
+
Same process — gate `Ready to Deploy`, cherry-picks from `staging` into a PR targeting `prod`. After merge the Production CD pipeline triggers; when it comes back green the items move to `Deployed` and are assigned to whoever you named for each product group.
|
|
570
572
|
|
|
571
573
|
### Selective Deployment
|
|
572
574
|
|
|
@@ -671,10 +673,10 @@ Claude reviews for:
|
|
|
671
673
|
| `/fix-review` | `/fix-review 142` | Fix everything flagged on a PR — human reviewer comments and automated `/review` findings alike: implement in severity order, validate, push, resolve threads |
|
|
672
674
|
| `/deploy` | `/deploy "message"` | Commit, push, trigger pipeline if on an environment branch (`dev`/`test`/`staging`/`prod`) — never on `main` |
|
|
673
675
|
| `/create-release` | `/create-release 23` | Group work items into Release #23 iteration with tags |
|
|
674
|
-
| `/deploy-release` | `/deploy-release 23 staging` | Gate-check → cherry-pick release work items to environment via PR → advance
|
|
676
|
+
| `/deploy-release` | `/deploy-release 23 staging` | Gate-check → cherry-pick release work items to environment via PR → ask who verifies → advance + assign on a green pipeline |
|
|
675
677
|
| `/add-to-release` | `/add-to-release 24 AB#4599` | Add work items to an existing release |
|
|
676
|
-
| `/cherry-pick` | `/cherry-pick AB#1234 AB#1235 prod` | Gate-check → cherry-pick specific work items to environment via PR → advance
|
|
677
|
-
| `/promote` | `/promote main dev` | PR to promote all code to the next branch in the chain (`main → dev → test → staging → prod`) → advance
|
|
678
|
+
| `/cherry-pick` | `/cherry-pick AB#1234 AB#1235 prod` | Gate-check → cherry-pick specific work items to environment via PR → ask who verifies → advance + assign on a green pipeline |
|
|
679
|
+
| `/promote` | `/promote main dev` | PR to promote all code to the next branch in the chain (`main → dev → test → staging → prod`) → ask who verifies → advance + assign on a green pipeline |
|
|
678
680
|
| `/rollback` | `/rollback AB#1234 prod` | Revert specific commits on an environment via PR |
|
|
679
681
|
| `/status` | `/status release 24` | Check status of a release, pipeline, work item, or environment; flags work items whose state lags their environment |
|
|
680
682
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose one child task with hours per story |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chris1807/claude-kit",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.56",
|
|
4
4
|
"description": "Claude Code starter kit for Azure DevOps teams — agents, hooks, MCP servers, slash commands, and end-to-end work item → PR → release → deploy workflow automation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -73,7 +73,7 @@ Options:
|
|
|
73
73
|
Which option? (1 / 2 / 3)
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
- **Option 1:** Run `git cherry-pick --skip` and continue with remaining work items. Note the skipped item in the summary — it does **not** get its state advanced in Step
|
|
76
|
+
- **Option 1:** Run `git cherry-pick --skip` and continue with remaining work items. Note the skipped item in the summary — it does **not** get its state advanced or its assignee changed in Step 8.
|
|
77
77
|
- **Option 2:** Run `git cherry-pick --abort`, delete the cherry-pick branch, and switch back to the original branch.
|
|
78
78
|
- **Option 3:** Wait for the user to resolve conflicts and run `git cherry-pick --continue`, then proceed.
|
|
79
79
|
|
|
@@ -94,32 +94,143 @@ Cherry-picking:
|
|
|
94
94
|
- **description**: List all work items with IDs and titles
|
|
95
95
|
3. Link all work items to the PR via `wit_link_work_item_to_pull_request`
|
|
96
96
|
|
|
97
|
-
## Step 6:
|
|
97
|
+
## Step 6: Pick Who Verifies Each Group (before the merge)
|
|
98
|
+
|
|
99
|
+
When the target is `main` there is no pipeline, no state change, and **no assignment** — say so and skip to Step 8's summary.
|
|
100
|
+
|
|
101
|
+
Otherwise the items are about to land in {environment} for **someone** to verify. Decide who now, while the PR is still in review — nothing is written yet; the assignment is applied in Step 8 together with the state change, once the pipeline is green.
|
|
102
|
+
|
|
103
|
+
### 6a. Group by title prefix
|
|
104
|
+
|
|
105
|
+
Work item titles in the CSI Development project are `PREFIX - Title` (`COM`, `PAY`, `CDA`, `AUD`, `SER`, `PSSF`, `TPS`, `ILP`, `RBWO`, `MTG`, `CSI`). Group the cherry-picked **User Stories, Bugs, and Hot Fixes** by that prefix. Titles with a missing or unrecognized prefix go in a `(no prefix)` group. Items skipped on a conflict (Step 4) or dropped at the gate (Step 1) are not on the branch — leave them out. Features and Tasks are never assigned by this command.
|
|
106
|
+
|
|
107
|
+
One question per group. Different products usually have different verifiers, but the same person may take several groups — that is the normal case, not an error.
|
|
108
|
+
|
|
109
|
+
### 6b. Build each group's candidate list from the items themselves
|
|
110
|
+
|
|
111
|
+
For every item in the group, collect the distinct identities already on it:
|
|
112
|
+
|
|
113
|
+
- **whoever set the gate state** — `wit_work_item` `action: list_revisions`, then the `System.ChangedBy` on the revision where `System.State` became the target's gate state (`Ready for Staging`, `Ready to Deploy`, …). That is the QA person or stakeholder who signed the item off, and it is usually the right verifier.
|
|
114
|
+
- `System.CreatedBy` — who asked for the work
|
|
115
|
+
- comment authors — `wit_work_item` `action: list_comments`
|
|
116
|
+
- `System.ChangedBy` — the most recent editor
|
|
117
|
+
|
|
118
|
+
Then **drop the developers**, so what remains is the non-developer names on the item:
|
|
119
|
+
|
|
120
|
+
- each item's current `System.AssignedTo` (the dev who implemented it)
|
|
121
|
+
- the PR author
|
|
122
|
+
- the authors of the cherry-picked commits — `git log --format='%an <%ae>' <target-branch>..HEAD | sort -u`
|
|
123
|
+
|
|
124
|
+
Rank the survivors by how many items in the group they appear on — the gate-state signer first, then creators. **Do not invent names**, do not pull from the org directory or a team list, and do not carry a name over from another group's items — every candidate must come from the items in that group.
|
|
125
|
+
|
|
126
|
+
If the developer filter empties a group's list, say so and show the unfiltered names marked `(also a developer here)`, plus the option to type a name.
|
|
127
|
+
|
|
128
|
+
### 6c. Ask
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
## Who verifies on {environment}?
|
|
132
|
+
|
|
133
|
+
**COM** — 2 items (AB#1234, AB#1236)
|
|
134
|
+
1. Jane Doe (jane@caresolutions.com) — set Ready to Deploy on both
|
|
135
|
+
2. Sam Lee (sam@caresolutions.com) — commented on AB#1234
|
|
136
|
+
3. Someone else — give me a name or email
|
|
137
|
+
4. Leave the current assignee alone
|
|
138
|
+
|
|
139
|
+
**PAY** — 2 items (AB#1240, AB#1241)
|
|
140
|
+
1. Pat Ruiz (pat@caresolutions.com) — created both
|
|
141
|
+
2. Jane Doe (jane@caresolutions.com) — commented on AB#1240
|
|
142
|
+
3. Someone else
|
|
143
|
+
4. Leave the current assignee alone
|
|
144
|
+
|
|
145
|
+
Reply per group — `COM 1, PAY 1` — or `all 1` to give every group to the same person.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 6d. Confirm the mapping
|
|
149
|
+
|
|
150
|
+
Echo the resolved plan and wait for an explicit `yes`:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
When the {environment} pipeline goes green I will apply:
|
|
154
|
+
|
|
155
|
+
| ID | Title | Prefix | Assign to | State |
|
|
156
|
+
|----|-------|--------|-----------|-------|
|
|
157
|
+
| AB#1234 | COM - Add payment export | COM | Jane Doe | Deployed |
|
|
158
|
+
| AB#1240 | PAY - Fix login redirect | PAY | Pat Ruiz | Deployed |
|
|
159
|
+
|
|
160
|
+
Approve? (yes / change)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`change` re-asks 6c. Only after `yes` do you move on — if the PR merges before the user answers, keep waiting for the answer, then run Step 8.
|
|
164
|
+
|
|
165
|
+
## Step 7: Watch the Merge, Then the Pipeline
|
|
166
|
+
|
|
167
|
+
Do NOT merge the PR yourself — a reviewer approves and completes it. Report the PR, then watch for the deployment:
|
|
98
168
|
|
|
99
169
|
```
|
|
100
170
|
Cherry-pick PR created for {environment}.
|
|
101
171
|
|
|
102
172
|
PR: {pr-url}
|
|
103
173
|
Work items:
|
|
104
|
-
- AB#1234: Add payment export
|
|
105
|
-
- AB#
|
|
174
|
+
- AB#1234: COM - Add payment export
|
|
175
|
+
- AB#1240: PAY - Fix login redirect
|
|
176
|
+
|
|
177
|
+
Merging the PR triggers the CD pipeline for {environment}. I'm watching the PR
|
|
178
|
+
and that pipeline — when it comes back green I'll set these {count} items to
|
|
179
|
+
`{state after merge}` and assign them as approved above. Nothing is written
|
|
180
|
+
until then. Say `stop watching` to leave the states alone.
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
1. **Wait for the PR to complete.** Poll `repo_pull_request` until `status` is `completed`; note the merge commit and completion time. `abandoned` → stop, change nothing, report it.
|
|
184
|
+
2. **Find the CD run.** Look up the target branch's pipeline ID(s) in the Pipeline Configuration table, then poll `pipelines_build` for runs on `refs/heads/<target-branch>` queued at or after the merge time — match the merge commit when the run exposes it — and **capture each run's id**. A run that was already completed before the merge is not this deployment; ignore it. A branch with more than one pipeline (API + Client) must have **all** of them green.
|
|
185
|
+
3. **Wait for a terminal result** on each run: `succeeded`, `partiallySucceeded`, `failed`, or `canceled`.
|
|
186
|
+
|
|
187
|
+
**How to wait.** Never block on a foreground `sleep`. If the Azure CLI with the `azure-devops` extension is available, arm a background watch that notifies you on a terminal state:
|
|
106
188
|
|
|
107
|
-
|
|
108
|
-
|
|
189
|
+
```bash
|
|
190
|
+
# <run-id> is the run identified in step 2 — never "the latest run on the branch",
|
|
191
|
+
# which can be a run queued before the merge and already completed.
|
|
192
|
+
until az pipelines runs show --org <org-url> --project <project> \
|
|
193
|
+
--id <run-id> --query status -o tsv | grep -qx completed; do
|
|
194
|
+
sleep 60
|
|
195
|
+
done
|
|
196
|
+
az pipelines runs show --org <org-url> --project <project> \
|
|
197
|
+
--id <run-id> --query "[buildNumber,status,result]" -o tsv
|
|
109
198
|
```
|
|
110
199
|
|
|
111
|
-
|
|
200
|
+
Run it with `Monitor` (or Bash `run_in_background`) so the session stays usable. Watch the **run id**, and print `result` when it exits — a guard that only greps for success is silent through a failed or canceled deploy, which looks identical to one still running. One watch per pipeline when the branch has more than one.
|
|
201
|
+
|
|
202
|
+
Without the CLI, re-poll through the Azure DevOps MCP on roughly a 60-second cadence and report progress as you go. If the deploy outlasts the session's attention, say where it stands and that `check` will re-poll immediately — never claim a pipeline succeeded that you have not seen succeed.
|
|
203
|
+
|
|
204
|
+
## Step 8: Assign and Advance States (automatic, on a green pipeline)
|
|
112
205
|
|
|
113
|
-
|
|
206
|
+
This step runs **by itself** the moment the pipeline reports success — do not ask again; the approval in Step 6d covers it. All three preconditions must hold: the PR is `completed`, **every** CD run for {environment} is `succeeded`, and a Step 6d mapping was approved.
|
|
114
207
|
|
|
115
|
-
|
|
208
|
+
- `partiallySucceeded` → not green. Report which stage failed and ask `proceed` / `hold`.
|
|
209
|
+
- `failed` / `canceled` → change nothing. Report the run, the failing stage, and the log link (`pipelines_build_log`), and offer `/rollback` if the environment is broken.
|
|
210
|
+
- No Step 6d approval yet (user hasn't answered) → do the state changes only when they answer; don't guess an assignee.
|
|
116
211
|
|
|
117
|
-
|
|
118
|
-
|
|
212
|
+
For every cherry-picked work item of type **User Story**, **Bug**, or **Hot Fix**, one `wit_work_item_write` update per item setting both fields:
|
|
213
|
+
|
|
214
|
+
1. `System.State` → the target's state (`Ready for Testing` / `Testing` / `Staging` / `Deployed`).
|
|
119
215
|
- **Never move backward** — an item already past the target state keeps it; note it.
|
|
120
|
-
- **Never touch a Feature or Task.**
|
|
121
216
|
- Skipped (conflict) or dropped items are not on the branch — leave them alone.
|
|
122
217
|
- An invalid-state error means this project's template differs — confirm with `get_type`, report the item, continue. Don't silently swallow it.
|
|
123
|
-
|
|
218
|
+
2. `System.AssignedTo` → the person approved for that item's prefix group. Pass the identity's `uniqueName` / email, not the display name; if the update rejects it, resolve with `core_get_identity_ids` and retry once. A `Leave the current assignee alone` group keeps its assignee — never clear a field the user didn't ask you to clear.
|
|
219
|
+
|
|
220
|
+
**Never touch a Feature or Task** — neither state nor assignee.
|
|
221
|
+
|
|
222
|
+
Report both fields, so a wrong assignment is easy to put back:
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
Cherry-pick is deployed to {environment} (pipeline {build-number}, succeeded).
|
|
226
|
+
|
|
227
|
+
| ID | State: was → now | Assignee: was → now |
|
|
228
|
+
|----|------------------|---------------------|
|
|
229
|
+
| AB#1234 | Ready to Deploy → Deployed | Chris Waters → Jane Doe |
|
|
230
|
+
| AB#1240 | Ready to Deploy → Deployed | Chris Waters → Pat Ruiz |
|
|
231
|
+
| AB#1250 | Deployed (unchanged — already ahead) | unchanged |
|
|
232
|
+
|
|
233
|
+
Next: {the human step — "QA tests on Test and sets Ready for Staging" / "stakeholders verify on Staging and set Ready to Deploy" / "verify in production, then Close"}.
|
|
234
|
+
```
|
|
124
235
|
|
|
125
|
-
If the user
|
|
236
|
+
If the user said `stop watching`, or an update fails, leave the rest alone, say exactly which items were and were not updated, and note that `/status` will flag the lag later.
|
|
@@ -60,7 +60,7 @@ Work items assigned:
|
|
|
60
60
|
- AB#1235: Fix login redirect
|
|
61
61
|
- AB#1236: View history
|
|
62
62
|
|
|
63
|
-
Deploy it one environment at a time — each merge deploys, and the command advances the work items' states
|
|
63
|
+
Deploy it one environment at a time — each merge deploys, and once the pipeline is green the command advances the work items' states and assigns them to the verifiers you pick:
|
|
64
64
|
/deploy-release {N} test → items go to Testing
|
|
65
65
|
/deploy-release {N} staging → items go to Staging (after QA sets Ready for Staging)
|
|
66
66
|
/deploy-release {N} prod → items go to Deployed (after stakeholders set Ready to Deploy)
|
|
@@ -83,7 +83,8 @@ This will:
|
|
|
83
83
|
1. Create a release branch: release/{N}-to-{environment}
|
|
84
84
|
2. Cherry-pick all commits for the {count} work items
|
|
85
85
|
3. Create a PR targeting `{target-branch}` — merging it triggers the {environment} pipeline
|
|
86
|
-
4.
|
|
86
|
+
4. Ask who verifies each product group on {environment} (before the merge)
|
|
87
|
+
5. Watch the pipeline — once it's green, set the work items to `{state after merge}` and assign them to the approved verifiers
|
|
87
88
|
|
|
88
89
|
Proceed? (yes/no)
|
|
89
90
|
```
|
|
@@ -126,7 +127,7 @@ Options:
|
|
|
126
127
|
Which option? (1 / 2 / 3)
|
|
127
128
|
```
|
|
128
129
|
|
|
129
|
-
- **Option 1:** Run `git cherry-pick --skip` and continue. Note the skipped item in the summary — it does **not** get its state advanced in Step
|
|
130
|
+
- **Option 1:** Run `git cherry-pick --skip` and continue. Note the skipped item in the summary — it does **not** get its state advanced or its assignee changed in Step 10.
|
|
130
131
|
- **Option 2:** Run `git cherry-pick --abort`, delete the release branch, switch back. Report which items were NOT deployed.
|
|
131
132
|
- **Option 3:** Wait for the user to resolve and run `git cherry-pick --continue`, then proceed.
|
|
132
133
|
|
|
@@ -149,7 +150,76 @@ Cherry-picking commits for Release #{N}:
|
|
|
149
150
|
- **description**: List all work items included with their IDs and titles
|
|
150
151
|
3. Link all work items to the PR via `wit_link_work_item_to_pull_request`
|
|
151
152
|
|
|
152
|
-
## Step 8:
|
|
153
|
+
## Step 8: Pick Who Verifies Each Group (before the merge)
|
|
154
|
+
|
|
155
|
+
The release is about to land in {environment} for **someone** to verify. Decide who now, while the PR is still in review — nothing is written yet; the assignment is applied in Step 10 together with the state change, once the pipeline is green.
|
|
156
|
+
|
|
157
|
+
### 8a. Group by title prefix
|
|
158
|
+
|
|
159
|
+
Work item titles in the CSI Development project are `PREFIX - Title` (`COM`, `PAY`, `CDA`, `AUD`, `SER`, `PSSF`, `TPS`, `ILP`, `RBWO`, `MTG`, `CSI`). Group the deployed **User Stories, Bugs, and Hot Fixes** by that prefix. Titles with a missing or unrecognized prefix go in a `(no prefix)` group. Items skipped on a conflict (Step 6) or dropped at the gate (Step 3) are not on the branch — leave them out. Features and Tasks are never assigned by this command.
|
|
160
|
+
|
|
161
|
+
A release that spans products lands in several groups — one question each. Different products usually have different verifiers, but the same person may take several groups; that is the normal case, not an error.
|
|
162
|
+
|
|
163
|
+
### 8b. Build each group's candidate list from the items themselves
|
|
164
|
+
|
|
165
|
+
For every item in the group, collect the distinct identities already on it:
|
|
166
|
+
|
|
167
|
+
- **whoever set the gate state** — `wit_work_item` `action: list_revisions`, then the `System.ChangedBy` on the revision where `System.State` became the target's gate state (`Ready for Staging`, `Ready to Deploy`, …). That is the QA person or stakeholder who signed the item off, and it is usually the right verifier.
|
|
168
|
+
- `System.CreatedBy` — who asked for the work
|
|
169
|
+
- comment authors — `wit_work_item` `action: list_comments`
|
|
170
|
+
- `System.ChangedBy` — the most recent editor
|
|
171
|
+
|
|
172
|
+
Then **drop the developers**, so what remains is the non-developer names on the item:
|
|
173
|
+
|
|
174
|
+
- each item's current `System.AssignedTo` (the dev who implemented it)
|
|
175
|
+
- the PR author
|
|
176
|
+
- the authors of the release commits — `git log --format='%an <%ae>' <target-branch>..HEAD | sort -u`
|
|
177
|
+
|
|
178
|
+
Rank the survivors by how many items in the group they appear on — the gate-state signer first, then creators. **Do not invent names**, do not pull from the org directory or a team list, and do not carry a name over from another group's items — every candidate must come from the items in that group.
|
|
179
|
+
|
|
180
|
+
If the developer filter empties a group's list, say so and show the unfiltered names marked `(also a developer here)`, plus the option to type a name.
|
|
181
|
+
|
|
182
|
+
### 8c. Ask
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
## Who verifies Release #{N} on {environment}?
|
|
186
|
+
|
|
187
|
+
**COM** — 2 items (AB#1234, AB#1236)
|
|
188
|
+
1. Jane Doe (jane@caresolutions.com) — set Ready to Deploy on both
|
|
189
|
+
2. Sam Lee (sam@caresolutions.com) — commented on AB#1234
|
|
190
|
+
3. Someone else — give me a name or email
|
|
191
|
+
4. Leave the current assignee alone
|
|
192
|
+
|
|
193
|
+
**PAY** — 2 items (AB#1240, AB#1241)
|
|
194
|
+
1. Pat Ruiz (pat@caresolutions.com) — created both
|
|
195
|
+
2. Jane Doe (jane@caresolutions.com) — commented on AB#1240
|
|
196
|
+
3. Someone else
|
|
197
|
+
4. Leave the current assignee alone
|
|
198
|
+
|
|
199
|
+
Reply per group — `COM 1, PAY 1` — or `all 1` to give the whole release to one person.
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 8d. Confirm the mapping
|
|
203
|
+
|
|
204
|
+
Echo the resolved plan and wait for an explicit `yes`:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
When the {environment} pipeline goes green I will apply:
|
|
208
|
+
|
|
209
|
+
| ID | Title | Prefix | Assign to | State |
|
|
210
|
+
|----|-------|--------|-----------|-------|
|
|
211
|
+
| AB#1234 | COM - Add payment export | COM | Jane Doe | Staging |
|
|
212
|
+
| AB#1236 | COM - View history | COM | Jane Doe | Staging |
|
|
213
|
+
| AB#1240 | PAY - Fix login redirect | PAY | Pat Ruiz | Staging |
|
|
214
|
+
|
|
215
|
+
Approve? (yes / change)
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
`change` re-asks 8c. Only after `yes` do you move on — if the PR merges before the user answers, keep waiting for the answer, then run Step 10.
|
|
219
|
+
|
|
220
|
+
## Step 9: Watch the Merge, Then the Pipeline
|
|
221
|
+
|
|
222
|
+
Do NOT merge the PR yourself, and do NOT trigger the CD pipeline — it triggers on the merge. Report the PR, then watch for the deployment:
|
|
153
223
|
|
|
154
224
|
```
|
|
155
225
|
Release #{N} PR created for {environment}.
|
|
@@ -158,53 +228,90 @@ PR: {pr-url}
|
|
|
158
228
|
Branch: release/{N}-to-{environment} → {target-branch}
|
|
159
229
|
|
|
160
230
|
Work items included:
|
|
161
|
-
- AB#1234: Add payment export
|
|
162
|
-
- AB#
|
|
163
|
-
- AB#
|
|
231
|
+
- AB#1234: COM - Add payment export
|
|
232
|
+
- AB#1236: COM - View history
|
|
233
|
+
- AB#1240: PAY - Fix login redirect
|
|
234
|
+
|
|
235
|
+
Review and approve the PR — merging it triggers the CD pipeline for {environment}.
|
|
236
|
+
I'm watching the PR and that pipeline; when it comes back green I'll set these
|
|
237
|
+
{count} items to `{state after merge}` and assign them as approved above.
|
|
238
|
+
Nothing is written until then. Say `stop watching` to leave the states alone.
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
1. **Wait for the PR to complete.** Poll `repo_pull_request` until `status` is `completed`; note the merge commit and completion time. `abandoned` → stop, change nothing, report it.
|
|
242
|
+
2. **Find the CD run.** Look up the target branch's pipeline ID(s) in the Pipeline Configuration table, then poll `pipelines_build` for runs on `refs/heads/<target-branch>` queued at or after the merge time — match the merge commit when the run exposes it — and **capture each run's id**. A run that was already completed before the merge is not this deployment; ignore it. A branch with more than one pipeline (API + Client) must have **all** of them green.
|
|
243
|
+
3. **Wait for a terminal result** on each run: `succeeded`, `partiallySucceeded`, `failed`, or `canceled`.
|
|
244
|
+
|
|
245
|
+
**How to wait.** Never block on a foreground `sleep`. If the Azure CLI with the `azure-devops` extension is available, arm a background watch that notifies you on a terminal state:
|
|
164
246
|
|
|
165
|
-
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
|
|
247
|
+
```bash
|
|
248
|
+
# <run-id> is the run identified in step 2 — never "the latest run on the branch",
|
|
249
|
+
# which can be a run queued before the merge and already completed.
|
|
250
|
+
until az pipelines runs show --org <org-url> --project <project> \
|
|
251
|
+
--id <run-id> --query status -o tsv | grep -qx completed; do
|
|
252
|
+
sleep 60
|
|
253
|
+
done
|
|
254
|
+
az pipelines runs show --org <org-url> --project <project> \
|
|
255
|
+
--id <run-id> --query "[buildNumber,status,result]" -o tsv
|
|
169
256
|
```
|
|
170
257
|
|
|
171
|
-
|
|
258
|
+
Run it with `Monitor` (or Bash `run_in_background`) so the session stays usable. Watch the **run id**, and print `result` when it exits — a guard that only greps for success is silent through a failed or canceled deploy, which looks identical to one still running. One watch per pipeline when the branch has more than one.
|
|
259
|
+
|
|
260
|
+
Without the CLI, re-poll through the Azure DevOps MCP on roughly a 60-second cadence and report progress as you go. If the deploy outlasts the session's attention, say where it stands and that `check` will re-poll immediately — never claim a pipeline succeeded that you have not seen succeed.
|
|
261
|
+
|
|
262
|
+
## Step 10: Assign and Advance States (automatic, on a green pipeline)
|
|
172
263
|
|
|
173
|
-
|
|
264
|
+
This step runs **by itself** the moment the pipeline reports success — do not ask again; the approval in Step 8d covers it. All three preconditions must hold: the PR is `completed`, **every** CD run for {environment} is `succeeded`, and a Step 8d mapping was approved.
|
|
174
265
|
|
|
175
|
-
|
|
266
|
+
- `partiallySucceeded` → not green. Report which stage failed and ask `proceed` / `hold`.
|
|
267
|
+
- `failed` / `canceled` → change nothing. Report the run, the failing stage, and the log link (`pipelines_build_log`), and offer `/rollback` if the environment is broken.
|
|
268
|
+
- No Step 8d approval yet (user hasn't answered) → do the state changes only when they answer; don't guess an assignee.
|
|
176
269
|
|
|
177
|
-
|
|
178
|
-
|
|
270
|
+
For every carried work item of type **User Story**, **Bug**, or **Hot Fix**, one `wit_work_item_write` update per item (or the batch variant) setting both fields:
|
|
271
|
+
|
|
272
|
+
1. `System.State` → the target environment's state (`Ready for Testing` / `Testing` / `Staging` / `Deployed`).
|
|
179
273
|
- **Never move backward.** An item already past the target state (e.g. `Deployed` when deploying to `staging`) keeps its state; note it.
|
|
180
|
-
- **Never touch a Feature or Task.** Features advance as their stories do; Tasks were closed at PR creation.
|
|
181
274
|
- Items skipped in Step 6 (conflict) or dropped in Step 3 are not on the branch — leave them alone.
|
|
182
275
|
- An invalid-state error means this project's template differs — confirm with `get_type`, report the item, continue with the rest. Don't silently swallow it.
|
|
183
|
-
|
|
276
|
+
2. `System.AssignedTo` → the person approved for that item's prefix group. Pass the identity's `uniqueName` / email, not the display name; if the update rejects it, resolve with `core_get_identity_ids` and retry once. A `Leave the current assignee alone` group keeps its assignee — never clear a field the user didn't ask you to clear.
|
|
277
|
+
|
|
278
|
+
**Never touch a Feature or Task** — neither state nor assignee. Features advance as their stories do; Tasks were closed at PR creation.
|
|
279
|
+
|
|
280
|
+
Report both fields, so a wrong assignment is easy to put back:
|
|
184
281
|
|
|
185
282
|
```
|
|
186
|
-
Release #{N} is on {environment}.
|
|
283
|
+
Release #{N} is on {environment} (pipeline {build-number}, succeeded).
|
|
187
284
|
|
|
188
|
-
| ID |
|
|
189
|
-
|
|
190
|
-
| AB#1234 | Ready for Staging
|
|
191
|
-
| AB#
|
|
192
|
-
| AB#1240 |
|
|
285
|
+
| ID | State: was → now | Assignee: was → now |
|
|
286
|
+
|----|------------------|---------------------|
|
|
287
|
+
| AB#1234 | Ready for Staging → Staging | Chris Waters → Jane Doe |
|
|
288
|
+
| AB#1236 | Ready for Staging → Staging | Chris Waters → Jane Doe |
|
|
289
|
+
| AB#1240 | Ready for Staging → Staging | Chris Waters → Pat Ruiz |
|
|
290
|
+
| AB#1250 | Deployed (unchanged — already ahead) | unchanged |
|
|
193
291
|
|
|
194
292
|
Next: {the human step — "QA tests on Test and sets Ready for Staging" / "stakeholders verify on Staging and set Ready to Deploy" / "verify in production, then Close"}.
|
|
195
293
|
```
|
|
196
294
|
|
|
197
|
-
If the user
|
|
295
|
+
If the user said `stop watching`, or an update fails, leave the rest alone, say exactly which items were and were not updated, and note that `/status release {N}` will flag the lag later.
|
|
198
296
|
|
|
199
|
-
## Step
|
|
297
|
+
## Step 11: Notify Team (if Teams MCP is configured)
|
|
200
298
|
|
|
201
|
-
Send a notification to the project's Teams channel via the Microsoft Teams MCP server:
|
|
299
|
+
Send a notification to the project's Teams channel via the Microsoft Teams MCP server — once when the PR is created:
|
|
202
300
|
|
|
203
301
|
```
|
|
204
302
|
🚀 Release #{N} PR created for {environment}
|
|
205
303
|
PR: {pr-url}
|
|
206
|
-
Work items: AB#1234, AB#
|
|
304
|
+
Work items: AB#1234, AB#1236, AB#1240
|
|
207
305
|
Awaiting review and merge.
|
|
208
306
|
```
|
|
209
307
|
|
|
308
|
+
…and once when Step 10 completes, so the verifiers know it's their turn:
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
✅ Release #{N} deployed to {environment}
|
|
312
|
+
COM (AB#1234, AB#1236) → Jane Doe
|
|
313
|
+
PAY (AB#1240) → Pat Ruiz
|
|
314
|
+
Items are now `{state}` — please verify.
|
|
315
|
+
```
|
|
316
|
+
|
|
210
317
|
If the Teams MCP server is not configured, skip this step silently.
|
|
@@ -92,7 +92,76 @@ Create a PR directly from the source branch to the target branch via Azure DevOp
|
|
|
92
92
|
|
|
93
93
|
Link the associated work items to the PR.
|
|
94
94
|
|
|
95
|
-
## Step 5:
|
|
95
|
+
## Step 5: Pick Who Verifies Each Group (before the merge)
|
|
96
|
+
|
|
97
|
+
The items are about to land in {target environment} for **someone** to verify. Decide who now, while the PR is still in review — nothing is written yet; the assignment is applied in Step 7 together with the state change, once the pipeline is green.
|
|
98
|
+
|
|
99
|
+
### 5a. Group by title prefix
|
|
100
|
+
|
|
101
|
+
Work item titles in the CSI Development project are `PREFIX - Title` (`COM`, `PAY`, `CDA`, `AUD`, `SER`, `PSSF`, `TPS`, `ILP`, `RBWO`, `MTG`, `CSI`). Group the carried **User Stories, Bugs, and Hot Fixes** by that prefix. Titles with a missing or unrecognized prefix go in a `(no prefix)` group. Features and Tasks are never assigned by this command — leave them out of the grouping.
|
|
102
|
+
|
|
103
|
+
One question per group. Different products usually have different verifiers, but the same person may take several groups — that is the normal case, not an error.
|
|
104
|
+
|
|
105
|
+
### 5b. Build each group's candidate list from the items themselves
|
|
106
|
+
|
|
107
|
+
For every item in the group, collect the distinct identities already on it:
|
|
108
|
+
|
|
109
|
+
- **whoever set the gate state** — `wit_work_item` `action: list_revisions`, then the `System.ChangedBy` on the revision where `System.State` became the target's gate state (`Ready for Staging`, `Ready to Deploy`, …). That is the QA person or stakeholder who signed the item off, and it is usually the right verifier.
|
|
110
|
+
- `System.CreatedBy` — who asked for the work
|
|
111
|
+
- comment authors — `wit_work_item` `action: list_comments`
|
|
112
|
+
- `System.ChangedBy` — the most recent editor
|
|
113
|
+
|
|
114
|
+
Then **drop the developers**, so what remains is the non-developer names on the item:
|
|
115
|
+
|
|
116
|
+
- each item's current `System.AssignedTo` (the dev who implemented it)
|
|
117
|
+
- the PR author
|
|
118
|
+
- the authors of the promoted commits — `git log origin/<target>..origin/<source> --format='%an <%ae>' | sort -u`
|
|
119
|
+
|
|
120
|
+
Rank the survivors by how many items in the group they appear on — the gate-state signer first, then creators. **Do not invent names**, do not pull from the org directory or a team list, and do not carry a name over from another group's items — every candidate must come from the items in that group.
|
|
121
|
+
|
|
122
|
+
If the developer filter empties a group's list, say so and show the unfiltered names marked `(also a developer here)`, plus the option to type a name.
|
|
123
|
+
|
|
124
|
+
### 5c. Ask
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
## Who verifies on {environment}?
|
|
128
|
+
|
|
129
|
+
**COM** — 2 items (AB#1234, AB#1236)
|
|
130
|
+
1. Jane Doe (jane@caresolutions.com) — created both
|
|
131
|
+
2. Sam Lee (sam@caresolutions.com) — commented on AB#1234
|
|
132
|
+
3. Someone else — give me a name or email
|
|
133
|
+
4. Leave the current assignee alone
|
|
134
|
+
|
|
135
|
+
**PAY** — 2 items (AB#1240, AB#1241)
|
|
136
|
+
1. Jane Doe (jane@caresolutions.com) — created AB#1240
|
|
137
|
+
2. Pat Ruiz (pat@caresolutions.com) — commented on both
|
|
138
|
+
3. Someone else
|
|
139
|
+
4. Leave the current assignee alone
|
|
140
|
+
|
|
141
|
+
Reply per group — `COM 1, PAY 2` — or `all 1` to give every group to the same person.
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 5d. Confirm the mapping
|
|
145
|
+
|
|
146
|
+
Echo the resolved plan and wait for an explicit `yes`:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
When the {environment} pipeline goes green I will apply:
|
|
150
|
+
|
|
151
|
+
| ID | Title | Prefix | Assign to | State |
|
|
152
|
+
|----|-------|--------|-----------|-------|
|
|
153
|
+
| AB#1234 | COM - Add payment export | COM | Jane Doe | Staging |
|
|
154
|
+
| AB#1236 | COM - View history | COM | Jane Doe | Staging |
|
|
155
|
+
| AB#1240 | PAY - Fix login redirect | PAY | Pat Ruiz | Staging |
|
|
156
|
+
|
|
157
|
+
Approve? (yes / change)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`change` re-asks 5c. Only after `yes` do you move on — if the PR merges before the user answers, keep waiting for the answer, then run Step 7.
|
|
161
|
+
|
|
162
|
+
## Step 6: Watch the Merge, Then the Pipeline
|
|
163
|
+
|
|
164
|
+
Do NOT merge the PR yourself — a reviewer approves and completes it. Report the PR, then watch for the deployment:
|
|
96
165
|
|
|
97
166
|
```
|
|
98
167
|
Promotion PR created: {source} → {target}
|
|
@@ -100,22 +169,62 @@ Promotion PR created: {source} → {target}
|
|
|
100
169
|
PR: {pr-url}
|
|
101
170
|
|
|
102
171
|
{count} commits, {n} work items included.
|
|
103
|
-
Merging the PR triggers the CD pipeline for {target}.
|
|
172
|
+
Merging the PR triggers the CD pipeline for {target}. I'm watching the PR and
|
|
173
|
+
that pipeline — when it comes back green I'll set the {n} work items to
|
|
174
|
+
`{state after merge}` and assign them as approved above. Nothing is written
|
|
175
|
+
until then. Say `stop watching` to leave the states alone.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
1. **Wait for the PR to complete.** Poll `repo_pull_request` until `status` is `completed`; note the merge commit and the completion time. `abandoned` → stop, change nothing, report it.
|
|
179
|
+
2. **Find the CD run.** Look up the target branch's pipeline ID(s) in the Pipeline Configuration table, then poll `pipelines_build` for runs on `refs/heads/<target-branch>` queued at or after the merge time — match the merge commit when the run exposes it — and **capture each run's id**. A run that was already completed before the merge is not this deployment; ignore it. A branch with more than one pipeline (API + Client) must have **all** of them green.
|
|
180
|
+
3. **Wait for a terminal result** on each run: `succeeded`, `partiallySucceeded`, `failed`, or `canceled`.
|
|
104
181
|
|
|
105
|
-
|
|
182
|
+
**How to wait.** Never block on a foreground `sleep`. If the Azure CLI with the `azure-devops` extension is available, arm a background watch that notifies you on a terminal state:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# <run-id> is the run identified in step 2 — never "the latest run on the branch",
|
|
186
|
+
# which can be a run queued before the merge and already completed.
|
|
187
|
+
until az pipelines runs show --org <org-url> --project <project> \
|
|
188
|
+
--id <run-id> --query status -o tsv | grep -qx completed; do
|
|
189
|
+
sleep 60
|
|
190
|
+
done
|
|
191
|
+
az pipelines runs show --org <org-url> --project <project> \
|
|
192
|
+
--id <run-id> --query "[buildNumber,status,result]" -o tsv
|
|
106
193
|
```
|
|
107
194
|
|
|
108
|
-
|
|
195
|
+
Run it with `Monitor` (or Bash `run_in_background`) so the session stays usable. Watch the **run id**, and print `result` when it exits — a guard that only greps for success is silent through a failed or canceled deploy, which looks identical to one still running. One watch per pipeline when the branch has more than one.
|
|
109
196
|
|
|
110
|
-
|
|
197
|
+
Without the CLI, re-poll through the Azure DevOps MCP on roughly a 60-second cadence and report progress as you go. If the deploy outlasts the session's attention, say where it stands and that `check` will re-poll immediately — never claim a pipeline succeeded that you have not seen succeed.
|
|
111
198
|
|
|
112
|
-
|
|
199
|
+
## Step 7: Assign and Advance States (automatic, on a green pipeline)
|
|
113
200
|
|
|
114
|
-
|
|
115
|
-
|
|
201
|
+
This step runs **by itself** the moment the pipeline reports success — do not ask again; the approval in Step 5d covers it. All three preconditions must hold: the PR is `completed`, **every** CD run for {target} is `succeeded`, and a Step 5d mapping was approved.
|
|
202
|
+
|
|
203
|
+
- `partiallySucceeded` → not green. Report which stage failed and ask `proceed` / `hold`.
|
|
204
|
+
- `failed` / `canceled` → change nothing. Report the run, the failing stage, and the log link (`pipelines_build_log`), and offer `/rollback` if the environment is broken.
|
|
205
|
+
- No Step 5d approval yet (user hasn't answered) → do the state changes only when they answer; don't guess an assignee.
|
|
206
|
+
|
|
207
|
+
For every carried work item of type **User Story**, **Bug**, or **Hot Fix**, one `wit_work_item_write` update per item setting both fields:
|
|
208
|
+
|
|
209
|
+
1. `System.State` → the target's state (`Ready for Testing` / `Testing` / `Staging` / `Deployed`).
|
|
116
210
|
- **Never move backward** — an item already past the target state keeps it; note it.
|
|
117
|
-
- **Never touch a Feature or Task.**
|
|
118
211
|
- An invalid-state error means this project's template differs — confirm with `get_type`, report the item, continue with the rest. Don't silently swallow it.
|
|
119
|
-
|
|
212
|
+
2. `System.AssignedTo` → the person approved for that item's prefix group. Pass the identity's `uniqueName` / email, not the display name; if the update rejects it, resolve with `core_get_identity_ids` and retry once. A `Leave the current assignee alone` group keeps its assignee — never clear a field the user didn't ask you to clear.
|
|
213
|
+
|
|
214
|
+
**Never touch a Feature or Task** — neither state nor assignee.
|
|
215
|
+
|
|
216
|
+
Report both fields, so a wrong assignment is easy to put back:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
{source} → {target} is deployed (pipeline {build-number}, succeeded).
|
|
220
|
+
|
|
221
|
+
| ID | State: was → now | Assignee: was → now |
|
|
222
|
+
|----|------------------|---------------------|
|
|
223
|
+
| AB#1234 | Ready for Staging → Staging | Chris Waters → Jane Doe |
|
|
224
|
+
| AB#1240 | Ready for Staging → Staging | Chris Waters → Pat Ruiz |
|
|
225
|
+
| AB#1250 | Deployed (unchanged — already ahead) | unchanged |
|
|
226
|
+
|
|
227
|
+
Next: {the human step — "QA tests on Test and sets Ready for Staging" / "stakeholders verify on Staging and set Ready to Deploy" / "verify in production, then Close"}.
|
|
228
|
+
```
|
|
120
229
|
|
|
121
|
-
If the user
|
|
230
|
+
If the user said `stop watching`, or an update fails, leave the rest alone, say exactly which items were and were not updated, and note that `/status` will flag the lag later.
|
|
@@ -100,10 +100,11 @@ Claude maintains persistent memory across sessions in `~/.claude/projects/.../me
|
|
|
100
100
|
3. **Hooks guard** against secrets and bad patterns automatically
|
|
101
101
|
4. **PR merges** into `main` — the compare branch. **Nothing deploys yet.** The work item stays in `Code Review` until it is promoted
|
|
102
102
|
5. **Promote or release** — `/promote main dev` carries everything on `main` to Dev; `/create-release <N>` groups work items so `/deploy-release <N> test` → `staging` → `prod` can carry just those
|
|
103
|
-
6. **
|
|
104
|
-
7. **
|
|
105
|
-
8. **
|
|
106
|
-
9. **
|
|
103
|
+
6. **Say who verifies** — before the merge, the command asks who each product group (`COM`, `PAY`, …) should be assigned to in the target environment, offering the non-developer names already on those work items
|
|
104
|
+
7. **Merge each promotion PR** — that merge triggers the environment's CD pipeline. The command watches it and, once it's green, sets the work items to `Testing`, `Staging`, or `Deployed` **and** assigns them to the approved verifiers — automatically, no reply needed
|
|
105
|
+
8. **Test** using Playwright MCP for browser testing
|
|
106
|
+
9. **Track** work items via the Azure DevOps MCP server
|
|
107
|
+
10. **Learn** — Claude saves what worked for next time
|
|
107
108
|
|
|
108
109
|
### Story Points & Dev Ready Policy
|
|
109
110
|
|
|
@@ -159,7 +160,7 @@ feature/AB#1234-... ──PR──▸ main ──PR──▸ dev ──PR
|
|
|
159
160
|
|
|
160
161
|
#### Work Item States ↔ Environments
|
|
161
162
|
|
|
162
|
-
Every environment in the chain has a work item state, so the board shows where each story physically is. The **"Ready for …" states are human gates** — QA or stakeholders set them when something passes; the slash commands never do. The **environment states** (`Testing`, `Staging`, `Deployed`) are set by the promotion commands once the PR into that branch has merged.
|
|
163
|
+
Every environment in the chain has a work item state, so the board shows where each story physically is. The **"Ready for …" states are human gates** — QA or stakeholders set them when something passes; the slash commands never do. The **environment states** (`Testing`, `Staging`, `Deployed`) are set by the promotion commands once the PR into that branch has merged and its CD pipeline has come back green.
|
|
163
164
|
|
|
164
165
|
| Branch | Environment | Gate — items should already be in… | Set once the PR into this branch merges |
|
|
165
166
|
|---|---|---|---|
|
|
@@ -174,9 +175,19 @@ Human-only transitions — no slash command ever makes these: `Testing → Ready
|
|
|
174
175
|
How the commands use this table:
|
|
175
176
|
|
|
176
177
|
- **Gate check before the PR.** `/deploy-release`, `/cherry-pick`, and `/promote` compare each carried work item's state against the gate for the target environment. Anything behind the gate (e.g. still `Testing` when deploying to `staging`) is flagged and the user decides whether to include it. Items *ahead* of the gate (e.g. already `Deployed` on a cherry-pick to `prod`) are reported and left alone.
|
|
177
|
-
- **Advance
|
|
178
|
+
- **Advance on a green pipeline, automatically.** `/promote`, `/cherry-pick`, and `/deploy-release` do not stop at the PR. They poll it until it is `completed`, then poll the target branch's CD pipeline until every run finishes. Only on `succeeded` do they write the new state — for every carried User Story, Bug, and Hot Fix, never a Feature or Task, and never backward. A failed or canceled run changes **nothing** and is reported with the log link. `/status` reports items whose state lags the branch their commits are on and offers to catch them up.
|
|
179
|
+
- **Assign the verifier at the same time.** The state change hands the item to a person, so the same three commands ask **before the merge** who each group of items should go to, then apply the assignee alongside the state once the pipeline is green. See **Verifier Assignment** below.
|
|
178
180
|
- **Never assume the state list.** Confirm with `mcp__azure-devops__wit_work_item` (`action: get_type`) on an unfamiliar project before writing a state name — a bad name is accepted silently by a query and rejected only at write time.
|
|
179
181
|
|
|
182
|
+
#### Verifier Assignment
|
|
183
|
+
|
|
184
|
+
Moving an item to `Testing`, `Staging`, or `Deployed` puts it on someone's plate, so `/promote`, `/cherry-pick`, and `/deploy-release` also change who owns it. The developer implemented it; from here on it belongs to whoever checks it in that environment.
|
|
185
|
+
|
|
186
|
+
- **Grouped by product prefix.** Work item titles are `PREFIX - Title`, so the commands group the carried items by prefix (`COM`, `PAY`, `CDA`, …) and ask **one question per group**. A staging → prod deploy carrying 2 `COM` and 2 `PAY` items asks twice; answering with the same person both times is fine, and `all 1` gives the whole batch to one person.
|
|
187
|
+
- **Candidates come from the work items, never from a directory.** For each group the commands read the items' own history — who set the gate state (`Ready for Staging` / `Ready to Deploy`, from `list_revisions`), who created the item, who commented on it, who last edited it — then subtract the developers (current assignee, PR author, commit authors). What's left are the non-developer names actually attached to that work, ranked with the sign-off setter first. No name is ever invented.
|
|
188
|
+
- **Asked before the merge, applied after.** The question comes while the PR is still in review and requires an explicit `yes`; nothing is written until the CD pipeline reports success. Then state and `System.AssignedTo` are set in the same update, and the report shows `was → now` for both so a wrong assignment is one edit to undo.
|
|
189
|
+
- **`Leave the current assignee alone`** is always an option — the commands never clear an assignee, and never touch a Feature's or a Task's assignee.
|
|
190
|
+
|
|
180
191
|
#### Release Management
|
|
181
192
|
|
|
182
193
|
Releases group work items together for coordinated deployment across environments. Releases are tracked in Azure DevOps as iterations (`Release #N`) and work items are tagged with `release-{N}`.
|
|
@@ -193,7 +204,7 @@ This creates a `Release #23` iteration, assigns the selected work items to it, a
|
|
|
193
204
|
/deploy-release 23 staging
|
|
194
205
|
/deploy-release 23 prod
|
|
195
206
|
```
|
|
196
|
-
This finds all work items in Release #23, checks each one against the target environment's gate state, cherry-picks their commits into a release branch (`release/23-to-staging`), creates a PR targeting the environment branch, links all work items, and — once
|
|
207
|
+
This finds all work items in Release #23, checks each one against the target environment's gate state, cherry-picks their commits into a release branch (`release/23-to-staging`), creates a PR targeting the environment branch, links all work items, asks who verifies each product group, and — once the merge's CD pipeline comes back green — advances them to the environment's state (`Testing`, `Staging`, `Deployed`) and assigns them to those verifiers.
|
|
197
208
|
|
|
198
209
|
**Selective deployment:** Since releases are deployed via cherry-pick, you can deploy a full release or a subset. If staging has 5 user stories but only 3 are `Ready to Deploy`, create a release with just those 3 and deploy it.
|
|
199
210
|
|
|
@@ -213,7 +224,7 @@ Cherry-pick specific work items to an environment without a formal release:
|
|
|
213
224
|
```
|
|
214
225
|
/cherry-pick AB#1234 AB#1235 prod
|
|
215
226
|
```
|
|
216
|
-
This finds commits for the specified work items, checks them against the target's gate state, cherry-picks them into a branch (`cherry-pick/<date>-to-<environment>`), creates a PR, and
|
|
227
|
+
This finds commits for the specified work items, checks them against the target's gate state, cherry-picks them into a branch (`cherry-pick/<date>-to-<environment>`), creates a PR, asks who verifies each product group, and — once the merge's CD pipeline is green — advances and assigns the work items.
|
|
217
228
|
|
|
218
229
|
#### Promoting Environments
|
|
219
230
|
|
|
@@ -223,7 +234,7 @@ Promote all code from one environment to the next:
|
|
|
223
234
|
/promote staging prod
|
|
224
235
|
/promote ← auto-detects source and target from current branch
|
|
225
236
|
```
|
|
226
|
-
This creates a PR from the source branch to the target branch with a summary of all included commits and their work items, checks the work items against the target's gate state,
|
|
237
|
+
This creates a PR from the source branch to the target branch with a summary of all included commits and their work items, checks the work items against the target's gate state, asks who verifies each product group, and — once the merge's CD pipeline is green — advances and assigns them. `main → dev` is the usual first hop after feature PRs merge.
|
|
227
238
|
|
|
228
239
|
#### Rollbacks
|
|
229
240
|
|
|
@@ -288,10 +299,10 @@ All deployment and release operations are available as slash commands:
|
|
|
288
299
|
| `/resolve-feedback` | `/resolve-feedback 142` | Address unresolved PR comment threads, push fixes, reply + resolve threads |
|
|
289
300
|
| `/deploy` | `/deploy "commit message"` | Commit, push, trigger pipeline (only on `dev`/`test`/`staging`/`prod` — never on `main`) |
|
|
290
301
|
| `/create-release` | `/create-release 23` | Group work items into Release #23 |
|
|
291
|
-
| `/deploy-release` | `/deploy-release 23 staging` | Gate-check → cherry-pick release to environment → PR → advance
|
|
302
|
+
| `/deploy-release` | `/deploy-release 23 staging` | Gate-check → cherry-pick release to environment → PR → ask who verifies → advance + assign on a green pipeline |
|
|
292
303
|
| `/add-to-release` | `/add-to-release 24 AB#4599` | Add work items to existing release |
|
|
293
|
-
| `/cherry-pick` | `/cherry-pick AB#1234 AB#1235 prod` | Gate-check → cherry-pick specific work items → PR → advance
|
|
294
|
-
| `/promote` | `/promote main dev` | Promote all code between environments (`main → dev → test → staging → prod`) → advance
|
|
304
|
+
| `/cherry-pick` | `/cherry-pick AB#1234 AB#1235 prod` | Gate-check → cherry-pick specific work items → PR → ask who verifies → advance + assign on a green pipeline |
|
|
305
|
+
| `/promote` | `/promote main dev` | Promote all code between environments (`main → dev → test → staging → prod`) → ask who verifies → advance + assign on a green pipeline |
|
|
295
306
|
| `/rollback` | `/rollback AB#1234 prod` | Revert commits on an environment |
|
|
296
307
|
| `/status` | `/status release 24` | Check release, pipeline, environment, or work item status; flags work items whose state lags their environment |
|
|
297
308
|
| `/where` | `/where AB#1234` | Show which environment branches contain a work item's commits |
|