@slamb2k/mad-skills 2.0.48 → 2.0.50

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mad-skills",
3
3
  "description": "AI-assisted planning, development and governance tools",
4
- "version": "2.0.48",
4
+ "version": "2.0.50",
5
5
  "author": {
6
6
  "name": "slamb2k",
7
7
  "url": "https://github.com/slamb2k"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slamb2k/mad-skills",
3
- "version": "2.0.48",
3
+ "version": "2.0.50",
4
4
  "description": "Claude Code skills collection — full lifecycle development tools",
5
5
  "type": "module",
6
6
  "repository": {
@@ -308,17 +308,23 @@ unknown). Platform detection and all CLI/REST commands are in
308
308
  1. Detect platform from `git remote get-url origin`
309
309
  2. **GitHub:** Check existing protection via `gh api`. If unprotected, ask via
310
310
  AskUserQuestion:
311
- - "Yes, require PR reviews (Recommended)" — require 1 approval, block force push
311
+ - "Yes, require PR reviews (team project — Recommended)" — require 1 approval, block force push + deletion
312
+ - "Yes, protect branch without review requirement (solo project)" — block force push + deletion, no reviewer gate so `/ship` squash-merges without `--admin`
312
313
  - "Skip" — leave unprotected
313
314
  3. **Azure DevOps:** Extract org/project from remote URL. Check existing
314
315
  policies via `az repos` CLI or REST fallback. If no minimum reviewer
315
- policy, ask via AskUserQuestion (same options as GitHub).
316
+ policy, ask via AskUserQuestion:
317
+ - "Yes, require PR reviews (team project — Recommended)" — 1 approver, creator votes do not count
318
+ - "Yes, PR required, author can self-approve (solo project)" — same approver policy but `creator-vote-counts=true` so the author's own vote satisfies the gate
319
+ - "Skip" — no policy applied
316
320
  4. **Unknown platform:** Skip and report.
317
321
 
318
- If user accepts, apply using the procedures in
319
- `references/branch-protection-steps.md`.
322
+ Apply the variant matching the user's choice using the procedures in
323
+ `references/branch-protection-steps.md` (see "Apply protection — team
324
+ project" vs "Apply protection — solo project" for each platform).
320
325
 
321
- Include result in the final report under a "🔒 Branch protection" section.
326
+ Include result in the final report under a "🔒 Branch protection" section,
327
+ labelled with the chosen variant (team / solo / skipped).
322
328
 
323
329
  ---
324
330
 
@@ -30,7 +30,10 @@ gh api repos/{owner}/{repo}/branches/{default_branch}/protection
30
30
  ```
31
31
  404 = unprotected.
32
32
 
33
- ### Apply protection
33
+ ### Apply protection — team project (reviewer gate)
34
+
35
+ Requires 1 approving review before merge. Use when multiple humans work on
36
+ the repo.
34
37
 
35
38
  ```bash
36
39
  gh api repos/{owner}/{repo}/branches/{default_branch}/protection \
@@ -42,6 +45,34 @@ gh api repos/{owner}/{repo}/branches/{default_branch}/protection \
42
45
  -F allow_deletions=false
43
46
  ```
44
47
 
48
+ ### Apply protection — solo project (no reviewer gate)
49
+
50
+ Keeps force-push and deletion prevention but drops the reviewer
51
+ requirement. Use when you are the only contributor — this is what makes
52
+ `/ship` squash-merge succeed without `gh pr merge --admin`.
53
+
54
+ The only difference from the team variant is the absence of
55
+ `-f required_pull_request_reviews=...`:
56
+
57
+ ```bash
58
+ gh api repos/{owner}/{repo}/branches/{default_branch}/protection \
59
+ -X PUT \
60
+ -f enforce_admins=false \
61
+ -f restrictions=null \
62
+ -f required_status_checks=null \
63
+ -F allow_force_pushes=false \
64
+ -F allow_deletions=false
65
+ ```
66
+
67
+ **Migrating an existing team-project repo to solo:** if a reviewer policy
68
+ is already in place, remove just that sub-rule without tearing down the
69
+ rest of the protection:
70
+
71
+ ```bash
72
+ gh api --method DELETE \
73
+ repos/{owner}/{repo}/branches/{default_branch}/protection/required_pull_request_reviews
74
+ ```
75
+
45
76
  ---
46
77
 
47
78
  ## Azure DevOps
@@ -94,7 +125,10 @@ curl -s -H "$AUTH" \
94
125
  | jq "[.value[] | select(.settings.scope[]?.refName == \"refs/heads/$default_branch\" and .settings.scope[]?.repositoryId == \"$REPO_ID\")]"
95
126
  ```
96
127
 
97
- ### Create minimum reviewer policy
128
+ ### Create minimum reviewer policy — team project (reviewer gate)
129
+
130
+ Use when multiple humans review each other's PRs. The PR author's own
131
+ vote does not count toward the minimum approver count.
98
132
 
99
133
  **CLI:**
100
134
  ```bash
@@ -133,3 +167,24 @@ curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
133
167
  }
134
168
  }"
135
169
  ```
170
+
171
+ ### Create minimum reviewer policy — solo project (author self-approve)
172
+
173
+ Use when you are the only contributor. A PR is still required before
174
+ merge, but `--creator-vote-counts true` means the author's own vote
175
+ satisfies the 1-approver gate — no second human needed.
176
+
177
+ **CLI:**
178
+ ```bash
179
+ az repos policy approver-count create \
180
+ --org "$AZDO_ORG_URL" --project "$AZDO_PROJECT" \
181
+ --repository-id "$REPO_ID" --branch "$default_branch" \
182
+ --minimum-approver-count 1 \
183
+ --creator-vote-counts true \
184
+ --allow-downvotes false \
185
+ --reset-on-source-push true \
186
+ --blocking true --enabled true
187
+ ```
188
+
189
+ **REST fallback:** same body as the team variant, but with
190
+ `"creatorVoteCounts": true`.
@@ -115,9 +115,18 @@ jobs:
115
115
 
116
116
  - name: Smoke test
117
117
  run: |
118
- # Wait for deployment to be ready, then hit health endpoint
119
- sleep 10
120
- curl -f "$DEV_URL/healthz" || exit 1
118
+ # Poll the health endpoint until ready (bounded deadline so a
119
+ # genuinely broken deploy still fails fast). Do not use a blind
120
+ # `sleep N && curl` it flakes on slow cold starts and wastes
121
+ # time on fast ones.
122
+ deadline=$((SECONDS + 120))
123
+ until curl -fs "$DEV_URL/healthz" >/dev/null; do
124
+ if [ $SECONDS -ge $deadline ]; then
125
+ echo "Health check failed to pass within 120s" >&2
126
+ exit 1
127
+ fi
128
+ sleep 2
129
+ done
121
130
 
122
131
  # ── Promote to Staging (on release tag) ───────────────────────
123
132
  promote-staging:
@@ -173,8 +182,15 @@ jobs:
173
182
 
174
183
  - name: Post-deploy smoke test
175
184
  run: |
176
- sleep 10
177
- curl -f "$PROD_URL/healthz" || exit 1
185
+ # Poll until healthy, bounded deadline. Never `sleep N && curl`.
186
+ deadline=$((SECONDS + 120))
187
+ until curl -fs "$PROD_URL/healthz" >/dev/null; do
188
+ if [ $SECONDS -ge $deadline ]; then
189
+ echo "Production health check failed to pass within 120s" >&2
190
+ exit 1
191
+ fi
192
+ sleep 2
193
+ done
178
194
  ```
179
195
 
180
196
  ### Reusable deploy step patterns
@@ -0,0 +1,355 @@
1
+ ---
2
+ name: launch
3
+ description: "Run the full OMC idea-to-merged-PR pipeline — cancel + deep-interview + ralplan + autopilot + mad-skills:ship — in a single invocation. Explicit-only; this skill never auto-activates. Only run when the user literally types /launch. Do not invoke on phrases like \"launch this\", \"ship it\", \"full pipeline\", or similar — none of those should trigger this skill."
4
+ argument-hint: "<rough idea for the feature>"
5
+ allowed-tools: Bash, Read, Skill
6
+ disable-model-invocation: true
7
+ ---
8
+
9
+ # Launch — Idea → Merged PR, end-to-end
10
+
11
+ When this skill is invoked, IMMEDIATELY output the banner below before doing anything else.
12
+ Pick ONE tagline at random — vary your choice each time.
13
+ CRITICAL: Reproduce the banner EXACTLY character-for-character. The first line of the art has 4 leading characters (one invisible braille-blank + 3 spaces) — you MUST preserve them.
14
+
15
+ ```
16
+ {tagline}
17
+
18
+ ⠀ ██╗██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗
19
+ ██╔╝██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║
20
+ ██╔╝ ██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║
21
+ ██╔╝ ██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║
22
+ ██╔╝ ███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║
23
+ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝
24
+ ```
25
+
26
+ Taglines:
27
+ - 🚀 From idea to orbit!
28
+ - 🛫 Cleared for takeoff!
29
+ - 🎯 Zero-touch launch inbound!
30
+ - 🎆 3, 2, 1… liftoff!
31
+ - 🛰️ Launch sequence initiated!
32
+ - 🏁 One command, full launch!
33
+ - 🤖 Full auto, full send!
34
+ - ⚙️ The whole launchpad!
35
+
36
+ ---
37
+
38
+ ## Output Formatting
39
+
40
+ After the banner, display parsed input:
41
+
42
+ ```
43
+ ┌─ Input ────────────────────────────────────────
44
+ │ {Field}: {value}
45
+ │ Flags: {parsed flags or "none"}
46
+ └────────────────────────────────────────────────
47
+ ```
48
+
49
+ Pre-flight results:
50
+
51
+ ```
52
+ ── Pre-flight ───────────────────────────────────
53
+ ✅ {dep} {version or "found"}
54
+ ⚠️ {dep} not found → {fallback detail}
55
+ ❌ {dep} missing → stopping
56
+ ──────────────────────────────────────────────────
57
+ ```
58
+
59
+ Stage headers: `━━ {N} · {Name} ━━━━━━━━━━━━━━━━━━━━━━━━━`
60
+
61
+ Status icons: ✅ done · ❌ failed · ⚠️ degraded · ⏳ working · ⏭️ skipped
62
+
63
+ ---
64
+
65
+ ## Purpose
66
+
67
+ `/launch` is a thin orchestrator over five existing skills. Its job is to run them in order and keep going between them — nothing more. Each inner skill owns its own stage-level concerns (state, hooks, reviewers, regression). Treat this wrapper as dumb: if any inner stage fails, stop and report — do not attempt retry logic here.
68
+
69
+ The collaboration window is **Stage 2 (deep-interview)**. Everything after is autonomous; any mid-pipeline pauses come from the inner skills surfacing `AskUserQuestion` prompts (e.g. an autopilot Phase 4 reviewer needs a call), not from this wrapper.
70
+
71
+ ## Flags
72
+
73
+ Parse optional flags from the request:
74
+
75
+ - `--skip-cancel`: skip the Stage 1 stale-state cleanup (use when you *know* the session is clean)
76
+ - `--skip-interview`: skip Stage 2 if a usable spec already exists at `.omc/specs/deep-interview-*.md`
77
+ - `--pr-only`: stop after autopilot (Stage 4); don't run ship
78
+ - `--no-ship`: alias for `--pr-only`
79
+ - `--critic=architect|critic|codex`: forwarded to ralplan for the consensus reviewer
80
+
81
+ ---
82
+
83
+ ## Pre-flight
84
+
85
+ Before Stage 1, check all dependencies in this table:
86
+
87
+ | Dependency | Type | Check | Required | Resolution | Detail |
88
+ |---|---|---|---|---|---|
89
+ | git | cli | `git --version` | yes | stop | Install from https://git-scm.com |
90
+ | oh-my-claudecode | plugin | `ls "$HOME/.claude/plugins/cache/omc/oh-my-claudecode"/*/skills/cancel/SKILL.md 2>/dev/null` | yes | stop | OMC plugin not installed. Install via `/plugin add oh-my-claudecode` or follow the OMC installation docs. Without it, deep-interview / ralplan / autopilot / cancel are unavailable. |
91
+ | oh-my-claudecode:cancel | skill | `ls "$HOME/.claude/plugins/cache/omc/oh-my-claudecode"/*/skills/cancel/SKILL.md 2>/dev/null` | yes | stop | OMC cancel skill missing — reinstall OMC |
92
+ | oh-my-claudecode:deep-interview | skill | `ls "$HOME/.claude/plugins/cache/omc/oh-my-claudecode"/*/skills/deep-interview/SKILL.md 2>/dev/null` | yes | stop | OMC deep-interview skill missing — reinstall OMC |
93
+ | oh-my-claudecode:ralplan | skill | `ls "$HOME/.claude/plugins/cache/omc/oh-my-claudecode"/*/skills/ralplan/SKILL.md 2>/dev/null` | yes | stop | OMC ralplan skill missing — reinstall OMC |
94
+ | oh-my-claudecode:autopilot | skill | `ls "$HOME/.claude/plugins/cache/omc/oh-my-claudecode"/*/skills/autopilot/SKILL.md 2>/dev/null` | yes | stop | OMC autopilot skill missing — reinstall OMC |
95
+ | mad-skills:ship | skill | `ls "$HOME/.claude/plugins/marketplaces/slamb2k/skills/ship/SKILL.md" 2>/dev/null` | yes | stop | mad-skills:ship not installed. Skip with `--pr-only` to stop after autopilot. Install with: `npx skills add slamb2k/mad-skills --skill ship` |
96
+
97
+ For each row, in order:
98
+
99
+ 1. Skip rows that don't apply (e.g. the `mad-skills:ship` row when `--pr-only` is set — the skill isn't required in that path)
100
+ 2. Run the Check command
101
+ 3. If found: continue silently
102
+ 4. If missing: apply Resolution strategy
103
+ - **stop**: notify user with Detail, halt execution
104
+ 5. After all checks: summarize what's available and what's degraded
105
+
106
+ The most important check is the **oh-my-claudecode plugin** — without it, four of the five stages are impossible and the skill must abort. Do not try to proceed with only some OMC skills installed; if the cache directory exists but individual skills are missing, the OMC installation is corrupt and needs reinstalling.
107
+
108
+ **Additional state check (soft warning, not a blocker):** after the dependency table, run `git status --porcelain` once. If there is any output, warn the user that the working tree has uncommitted changes. `deep-interview` and `ralplan` don't touch source, but `autopilot` will. Let the user decide whether to stash / commit / proceed.
109
+
110
+ ---
111
+
112
+ ## Plan Resolution
113
+
114
+ Capture the user's argument as the **IDEA** (the rough feature description). This is what deep-interview will use as its starting input.
115
+
116
+ Display in the Input box as:
117
+
118
+ ```
119
+ │ Idea: {first 80 chars of idea}
120
+ │ Flags: {parsed flags or "none"}
121
+ ```
122
+
123
+ ---
124
+
125
+ ## Stage 1 · Cancel stale state
126
+
127
+ Unless `--skip-cancel` was set, invoke the OMC cancel skill to wipe any orphaned state:
128
+
129
+ ```
130
+ Skill("oh-my-claudecode:cancel", "--force")
131
+ ```
132
+
133
+ **Why force:** `/launch` is meant to be a clean-slate starting point. If previous OMC sessions left orphaned `awaiting_confirmation` entries (this is a known rough edge — e.g. the word "autopilot" in a prompt can trigger autopilot state without user consent), those will pollute later stages. `--force` wipes everything so the downstream stages start from zero.
134
+
135
+ After the cancel skill returns, confirm no modes are active before proceeding. Emit a short one-line status:
136
+
137
+ ```
138
+ ✅ state cleared — no active OMC modes
139
+ ```
140
+
141
+ If cancel reports lingering state it couldn't clear, stop and report. Don't press on.
142
+
143
+ ---
144
+
145
+ ## Stage 2 · Deep-interview (requirements Q&A)
146
+
147
+ Unless `--skip-interview` was set AND a pre-existing spec is found, invoke:
148
+
149
+ ```
150
+ Skill("oh-my-claudecode:deep-interview", "{IDEA}")
151
+ ```
152
+
153
+ Let deep-interview run to completion. It will:
154
+
155
+ - Conduct Socratic Q&A via `AskUserQuestion` — **these pauses surface to the user**, not the wrapper
156
+ - Continue until its ambiguity gate passes (≤ 20%)
157
+ - Write the final spec to `.omc/specs/deep-interview-{slug}.md`
158
+
159
+ **If `--skip-interview` was set:**
160
+
161
+ - Look for any file matching `.omc/specs/deep-interview-*.md`
162
+ - If found, use the most recently modified one and note its path in the stage output
163
+ - If not found, warn the user and fall back to running deep-interview anyway
164
+
165
+ When the stage completes, emit:
166
+
167
+ ```
168
+ ✅ spec written to .omc/specs/deep-interview-{slug}.md
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Stage 3 · Ralplan (plan + consensus review)
174
+
175
+ Invoke:
176
+
177
+ ```
178
+ Skill("oh-my-claudecode:ralplan", "--direct{critic-flag-if-any}")
179
+ ```
180
+
181
+ `--direct` tells ralplan to skip its own interview and consume the deep-interview spec directly. If the user passed `--critic=architect|critic|codex`, forward that flag to ralplan.
182
+
183
+ Ralplan will run Planner → Architect → Critic in sequence, looping until Critic approves. When it completes, the consensus plan lives at `.omc/plans/ralplan-{slug}.md`.
184
+
185
+ Emit:
186
+
187
+ ```
188
+ ✅ consensus plan at .omc/plans/ralplan-{slug}.md
189
+ ✅ Critic verdict: APPROVED
190
+ ```
191
+
192
+ If Critic keeps rejecting past its internal loop budget, ralplan will stop and report. In that case, stop this wrapper too — don't press into autopilot with a rejected plan.
193
+
194
+ ---
195
+
196
+ ## Stage 4 · Autopilot (execution + QA + validation)
197
+
198
+ Invoke:
199
+
200
+ ```
201
+ Skill("oh-my-claudecode:autopilot")
202
+ ```
203
+
204
+ No arguments. Autopilot will detect the consensus plan at `.omc/plans/ralplan-{slug}.md` and **skip its own Phase 0 + Phase 1** (expansion + planning), going straight to Phase 2 (Execution). It runs:
205
+
206
+ - Phase 2: parallel executor agents implement the plan
207
+ - Phase 3: QA cycling (up to 5 iterations) — build, lint, test, fix
208
+ - Phase 4: multi-perspective validation (Architect + Security-reviewer + Code-reviewer in parallel; all must approve)
209
+ - Phase 5: state cleanup
210
+
211
+ **Critical:** autopilot's output is *verified local code*, not a merged PR. Autopilot's Phase 5 is only state-file cleanup — it does not push, open a PR, watch CI, or merge. Ship is a separate stage.
212
+
213
+ Emit:
214
+
215
+ ```
216
+ ✅ all phases complete
217
+ ✅ tests pass, build green, validators approved
218
+ ```
219
+
220
+ If autopilot's Phase 3 QA cycle repeats the same error 3 times, or Phase 4 validation fails 3 rounds, autopilot stops and reports. In that case stop this wrapper too — a human needs to review.
221
+
222
+ ---
223
+
224
+ ## Stage 5 · Ship (push → PR → merge → sync)
225
+
226
+ **Skip if `--pr-only` or `--no-ship` was set.**
227
+
228
+ Invoke:
229
+
230
+ ```
231
+ Skill("mad-skills:ship", "{one-line summary of approach from ralplan} — Files: {files from autopilot IMPL_REPORT}")
232
+ ```
233
+
234
+ `mad-skills:ship` handles the PR lifecycle:
235
+
236
+ - Pushes the branch (creates one if needed)
237
+ - Creates PR via `gh pr create` (or AzDO equivalent)
238
+ - Watches CI — fixes failures in a separate sub-agent up to 2 attempts
239
+ - Squash-merges on green
240
+ - Syncs local back to default branch
241
+
242
+ Emit:
243
+
244
+ ```
245
+ ✅ PR #{number} merged ({merge_commit})
246
+ ✅ local synced to {default_branch}
247
+ ```
248
+
249
+ If ship's CI watch exhausts its fix attempts, ship stops and displays its own failure banner. In that case, stop — do not attempt additional retry here.
250
+
251
+ ---
252
+
253
+ ## Waiting patterns
254
+
255
+ Whenever this skill (or its inner invocations) needs to wait on a file or condition, use a polling loop with an explicit deadline — **never** `sleep N && <cmd>`:
256
+
257
+ ```bash
258
+ deadline=$((SECONDS + 600))
259
+ until [ -s "$path" ] || [ $SECONDS -ge $deadline ]; do sleep 2; done
260
+ ```
261
+
262
+ This keeps waits bounded and cache-friendly, and lets the loop exit early when the expected file appears.
263
+
264
+ ---
265
+
266
+ ## Final Report
267
+
268
+ ```
269
+ ┌─ Launch · Report ──────────────────────────────
270
+
271
+ │ ✅ Launch complete
272
+
273
+ │ 💡 Idea: {first line of idea}
274
+ │ 📄 Spec: .omc/specs/deep-interview-{slug}.md
275
+ │ 🗺️ Plan: .omc/plans/ralplan-{slug}.md
276
+
277
+ │ 📝 Stages
278
+ │ 1. State cleared ✅
279
+ │ 2. Requirements interview ✅ ({Q&A rounds} rounds)
280
+ │ 3. Plan + Critic consensus ✅ ({critic-approval-rounds} rounds)
281
+ │ 4. Execution + QA + review ✅ ({QA cycles} QA cycles, {validator} approved)
282
+ │ 5. PR + merge ✅ ({pr_url})
283
+
284
+ │ 📊 Code
285
+ │ Files changed: {count}
286
+ │ Tests: {passed}/{total}
287
+
288
+ │ 🔗 Links
289
+ │ PR: {pr_url}
290
+ │ Merge: {merge_commit}
291
+
292
+ │ ⚡ Next
293
+ │ {anything surfaced by debrief from autopilot or ship}
294
+
295
+ └─────────────────────────────────────────────────
296
+ ```
297
+
298
+ If the run stopped short (`--pr-only`, `--no-ship`, or a stage failure), adjust the stages list accordingly — mark later stages with ⏭️ (skipped) or ❌ (failed) and surface what's left to do manually in the `⚡ Next` section.
299
+
300
+ ### Pipeline Summary (always emit)
301
+
302
+ ```
303
+ ┌─ Pipeline Summary ─────────────────────────────
304
+
305
+ │ {icon} Cancel {"no-op" or "cleared N sessions"}
306
+ │ {icon} Deep-interview {".omc/specs/... or reused spec"}
307
+ │ {icon} Ralplan {critic verdict}
308
+ │ {icon} Autopilot {"green / N files changed"}
309
+ │ {icon} Ship {pr_url → merge_commit}
310
+
311
+ └─────────────────────────────────────────────────
312
+ ```
313
+
314
+ ---
315
+
316
+ ## Failure Handling
317
+
318
+ `/launch` is deliberately dumb about retries. Each inner skill already has its own retry/verification logic — trying to add more at this layer just fights with them. If any stage stops with a failure:
319
+
320
+ 1. Display the failure banner below (not the success report)
321
+ 2. List which stages completed, which failed, and which were skipped
322
+ 3. Stop. Do not advance to later stages. Do not invoke `/sync` or any cleanup.
323
+
324
+ ```
325
+ ┌─ Launch · FAILED ───────────────────────────────
326
+
327
+ │ ❌ Pipeline stopped at Stage {N}: {stage name}
328
+
329
+ │ Reason: {specific failure reason from the inner skill}
330
+ │ Stages completed: {list}
331
+ │ Stages skipped: {list}
332
+
333
+ │ ⚠️ Work may exist locally but is NOT merged.
334
+ │ Review the inner skill's output for next steps.
335
+
336
+ └──────────────────────────────────────────────────
337
+ ```
338
+
339
+ Rules on failure:
340
+
341
+ - Do not emit a "Pipeline Summary" with a ✅
342
+ - Do not suggest a cancel/sync/retry here — the inner skill that failed owns that
343
+ - Do not invoke any recovery skill automatically
344
+
345
+ ---
346
+
347
+ ## Trigger Behaviour
348
+
349
+ This skill has `disable-model-invocation: true`. That means:
350
+
351
+ - It will **never** auto-activate on keyword hits, even if the user says things like *"launch this feature"*, *"ship it end to end"*, *"run the full pipeline"*, or mentions any of the inner skill names.
352
+ - It runs **only** when the user literally types `/launch` as a slash command.
353
+ - Another skill can still invoke it explicitly via `Skill("launch", "...")` if desired.
354
+
355
+ This is deliberate: the inner skills (especially autopilot) have aggressive keyword triggers of their own, and a wrapper that also auto-triggered would compound the false-positive risk. Keep this file's `disable-model-invocation` flag set.
@@ -1,12 +1,12 @@
1
1
  {
2
- "generated": "2026-04-17T05:36:15.739Z",
3
- "count": 10,
2
+ "generated": "2026-04-20T02:56:39.184Z",
3
+ "count": 11,
4
4
  "skills": [
5
5
  {
6
6
  "name": "brace",
7
7
  "directory": "brace",
8
8
  "description": "'Initialize any project directory with a standard scaffold for AI-assisted development. Creates specs/ and context/ directories, a project CLAUDE.md with development workflow and guardrails, .gitignore, and branch protection. Recommends claude-mem for persistent memory. Idempotent — safe to run on existing projects. Triggers: \"init project\", \"setup brace\", \"brace\", \"initialize\", \"bootstrap\", \"scaffold\".'",
9
- "lines": 424,
9
+ "lines": 430,
10
10
  "hasScripts": false,
11
11
  "hasReferences": true,
12
12
  "hasAssets": true,
@@ -52,6 +52,16 @@
52
52
  "hasAssets": false,
53
53
  "hasTests": true
54
54
  },
55
+ {
56
+ "name": "launch",
57
+ "directory": "launch",
58
+ "description": "\"Run the full OMC idea-to-merged-PR pipeline — cancel + deep-interview + ralplan + autopilot + mad-skills:ship — in a single invocation. Explicit-only; this skill never auto-activates. Only run when the user literally types /launch. Do not invoke on phrases like \\\"launch this\\\", \\\"ship it\\\", \\\"full pipeline\\\", or similar — none of those should trigger this skill.\"",
59
+ "lines": 356,
60
+ "hasScripts": false,
61
+ "hasReferences": false,
62
+ "hasAssets": false,
63
+ "hasTests": false
64
+ },
55
65
  {
56
66
  "name": "prime",
57
67
  "directory": "prime",
@@ -94,30 +94,32 @@ if [ "$AZDO_MODE" = "cli" ]; then
94
94
  sleep 15
95
95
  done
96
96
 
97
- # Complete the PR
98
- if az repos pr update --id "$PR_NUMBER" --status completed \
99
- --org "$AZDO_ORG_URL" \
100
- --squash "$SQUASH_FLAG" \
101
- --delete-source-branch "$DELETE_FLAG" 2>/dev/null; then
102
- STATUS="success"
103
- MERGE_COMMIT=$(git rev-parse --short HEAD 2>/dev/null)
104
- BRANCH_DELETED=$DELETE_BRANCH
105
- else
106
- # Retry once after 30s (policies may still be evaluating)
107
- sleep 30
97
+ # Complete the PR — retry on a bounded deadline; policies may still be
98
+ # evaluating after the initial poll finished. First attempt runs
99
+ # immediately, then we poll every 5s up to a 30s total budget.
100
+ # Avoid `sleep 30 && retry` (blind wait) — this loop exits early on success.
101
+ MERGE_DEADLINE=$((SECONDS + 30))
102
+ MERGE_OK=false
103
+ while :; do
108
104
  if az repos pr update --id "$PR_NUMBER" --status completed \
109
105
  --org "$AZDO_ORG_URL" \
110
106
  --squash "$SQUASH_FLAG" \
111
107
  --delete-source-branch "$DELETE_FLAG" 2>/dev/null; then
112
- STATUS="success"
113
- MERGE_COMMIT=$(git rev-parse --short HEAD 2>/dev/null)
114
- BRANCH_DELETED=$DELETE_BRANCH
115
- else
116
- STATUS="failed"
117
- ERRORS="Merge failed after retry"
118
- MERGE_COMMIT=""; BRANCH_DELETED=false
119
- emit_report; exit 2
108
+ MERGE_OK=true
109
+ break
120
110
  fi
111
+ [ $SECONDS -ge $MERGE_DEADLINE ] && break
112
+ sleep 5
113
+ done
114
+ if $MERGE_OK; then
115
+ STATUS="success"
116
+ MERGE_COMMIT=$(git rev-parse --short HEAD 2>/dev/null)
117
+ BRANCH_DELETED=$DELETE_BRANCH
118
+ else
119
+ STATUS="failed"
120
+ ERRORS="Merge failed after retry"
121
+ MERGE_COMMIT=""; BRANCH_DELETED=false
122
+ emit_report; exit 2
121
123
  fi
122
124
  emit_report
123
125
  exit 0