@mmerterden/multi-agent-pipeline 11.3.2 → 11.5.0

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/README.md +1 -0
  3. package/index.js +9 -2
  4. package/install/_common.mjs +107 -5
  5. package/install/_telemetry.mjs +5 -23
  6. package/install/claude.mjs +113 -11
  7. package/install/copilot.mjs +75 -6
  8. package/package.json +4 -10
  9. package/pipeline/commands/multi-agent/SKILL.md +5 -1
  10. package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
  11. package/pipeline/commands/multi-agent/help/SKILL.md +6 -2
  12. package/pipeline/commands/multi-agent/review/SKILL.md +36 -4
  13. package/pipeline/commands/multi-agent/review-issue/SKILL.md +22 -0
  14. package/pipeline/commands/multi-agent/review-jira/SKILL.md +22 -0
  15. package/pipeline/commands/multi-agent/sync/SKILL.md +4 -4
  16. package/pipeline/lib/account-resolver.sh +61 -23
  17. package/pipeline/lib/channels-multi-repo.sh +7 -2
  18. package/pipeline/lib/count-lib.sh +27 -0
  19. package/pipeline/lib/credential-store.sh +23 -6
  20. package/pipeline/lib/extract-conventions.sh +27 -21
  21. package/pipeline/lib/fetch-confluence.sh +25 -13
  22. package/pipeline/lib/fetch-crashlytics.sh +30 -8
  23. package/pipeline/lib/fetch-fortify.sh +11 -2
  24. package/pipeline/lib/fetch-swagger.sh +18 -7
  25. package/pipeline/lib/figma-mcp-refresh.sh +26 -11
  26. package/pipeline/lib/figma-screenshot.sh +11 -2
  27. package/pipeline/lib/issue-fetcher.sh +31 -6
  28. package/pipeline/lib/multi-repo-pipeline.sh +84 -20
  29. package/pipeline/lib/plan-todos.sh +12 -3
  30. package/pipeline/lib/post-pr-review.sh +5 -3
  31. package/pipeline/lib/repo-cache.sh +53 -9
  32. package/pipeline/lib/review-watch.sh +26 -6
  33. package/pipeline/lib/shadow-git.sh +45 -4
  34. package/pipeline/lib/vercel-deploy.sh +10 -1
  35. package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
  36. package/pipeline/multi-agent-refs/readiness-review.md +65 -0
  37. package/pipeline/scripts/audit-log-rotate.sh +38 -10
  38. package/pipeline/scripts/check-md-links.mjs +34 -9
  39. package/pipeline/scripts/diff-risk-score.mjs +4 -1
  40. package/pipeline/scripts/evidence-gate.mjs +10 -1
  41. package/pipeline/scripts/fixtures/install-layout.tsv +7 -7
  42. package/pipeline/scripts/fixtures/pack-expected-count.txt +1 -0
  43. package/pipeline/scripts/keychain-save.sh +13 -9
  44. package/pipeline/scripts/lint-skills.mjs +40 -2
  45. package/pipeline/scripts/migrate-prefs.mjs +26 -7
  46. package/pipeline/scripts/phase-tracker.sh +71 -0
  47. package/pipeline/scripts/pre-commit-check.sh +39 -0
  48. package/pipeline/scripts/scan-skills.sh +217 -127
  49. package/pipeline/scripts/smoke-bitbucket-contract.sh +21 -5
  50. package/pipeline/scripts/smoke-fetchers-offline.sh +382 -0
  51. package/pipeline/scripts/smoke-generate-issue.sh +3 -3
  52. package/pipeline/scripts/smoke-install-layout.sh +11 -3
  53. package/pipeline/scripts/smoke-lib-scripts.sh +54 -1
  54. package/pipeline/scripts/smoke-pack-contents.sh +140 -0
  55. package/pipeline/scripts/smoke-plugin-validate.sh +64 -0
  56. package/pipeline/scripts/smoke-review-readiness.sh +91 -0
  57. package/pipeline/scripts/smoke-shadow-git.sh +48 -1
  58. package/pipeline/scripts/smoke-skill-authoring.sh +1 -1
  59. package/pipeline/scripts/smoke-workflow-audit.sh +69 -0
  60. package/pipeline/scripts/smoke-wrapper-preservation.sh +68 -0
  61. package/pipeline/scripts/test-gap-scan.mjs +12 -1
  62. package/pipeline/scripts/triage-memory.mjs +10 -1
  63. package/pipeline/scripts/uninstall.mjs +105 -36
  64. package/pipeline/scripts/update-issue-progress.sh +60 -41
  65. package/pipeline/scripts/write-state.mjs +14 -4
  66. package/pipeline/skills/.skill-manifest.json +13 -5
  67. package/pipeline/skills/.skills-index.json +20 -2
  68. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +6 -2
  69. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -10
  70. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +25 -0
  71. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +25 -0
  72. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  73. package/pipeline/skills/skills-index.md +4 -2
@@ -29,12 +29,63 @@
29
29
 
30
30
  set -euo pipefail
31
31
 
32
+ # Rewrite the `### Progress` block of the body file ($2) with $1 and print the
33
+ # result to stdout. The replaced region is bounded at the FIRST of:
34
+ # - a line starting with `<!--` (the legend comment, printed and kept), or
35
+ # - the next heading line (^#, printed and kept), or
36
+ # - EOF.
37
+ # Bounding at the next heading matters: bodies without the legend comment used
38
+ # to have everything from the table to EOF silently dropped and persisted.
39
+ rewrite_progress_body() {
40
+ # Block passed via environment: BSD awk rejects literal newlines in -v
41
+ # assignments ("newline in string"), so -v cannot carry the table.
42
+ NEW_BLOCK_ENV="$1" awk '
43
+ BEGIN { new_block = ENVIRON["NEW_BLOCK_ENV"] }
44
+ BEGIN { in_progress = 0 }
45
+ /^### Progress/ {
46
+ print
47
+ print ""
48
+ print new_block
49
+ print ""
50
+ in_progress = 1
51
+ next
52
+ }
53
+ in_progress && /^<!--/ { in_progress = 0; print; next }
54
+ in_progress && /^#/ { in_progress = 0; print; next }
55
+ in_progress { next }
56
+ { print }
57
+ ' "$2"
58
+ }
59
+
60
+ build_progress_block() {
61
+ cat <<EOF
62
+ | Flag | State |
63
+ |---|---|
64
+ | Implementation | ${1} |
65
+ | Testing | ${2} |
66
+ | Code Connect | ${3} |
67
+ | Wiki | ${4} |
68
+ EOF
69
+ }
70
+
32
71
  TASK_ID="${1:-}"
33
72
  if [ -z "$TASK_ID" ]; then
34
73
  echo "usage: update-issue-progress.sh <task-id>" >&2
35
74
  exit 64
36
75
  fi
37
76
 
77
+ # Internal test seam: `--rewrite <body-file>` runs only the Progress-block
78
+ # rewrite (placeholder glyphs) and prints the result. No state, no gh.
79
+ if [ "$TASK_ID" = "--rewrite" ]; then
80
+ BODY_IN="${2:-}"
81
+ if [ -z "$BODY_IN" ] || [ ! -f "$BODY_IN" ]; then
82
+ echo "usage: update-issue-progress.sh --rewrite <body-file>" >&2
83
+ exit 64
84
+ fi
85
+ rewrite_progress_body "$(build_progress_block "⚪" "⚪" "⚪" "⚪")" "$BODY_IN"
86
+ exit 0
87
+ fi
88
+
38
89
  # Resolve the project state directory (matches phase-tracker convention).
39
90
  STATE_GLOB="$HOME/.claude/projects/*"
40
91
  AGENT_STATE=""
@@ -75,9 +126,9 @@ F_WIKI=$(jq -r '.flags.wiki // false' "$AGENT_STATE")
75
126
  # Each flag may be: true | false | "yellow" (validated against older impl).
76
127
  glyph_for() {
77
128
  case "$1" in
78
- true|"true") echo "🟢" ;;
79
- yellow|"yellow") echo "🟡" ;;
80
- *) echo "⚪" ;;
129
+ true) echo "🟢" ;;
130
+ yellow) echo "🟡" ;;
131
+ *) echo "⚪" ;;
81
132
  esac
82
133
  }
83
134
 
@@ -87,49 +138,17 @@ G_CC=$(glyph_for "$F_CC")
87
138
  G_WIKI=$(glyph_for "$F_WIKI")
88
139
 
89
140
  # Fetch current body, replace the Progress table, write back.
90
- TMP_BODY=$(mktemp /tmp/issue-progress-${TASK_ID}-XXXXXX.md)
141
+ TMP_BODY=$(mktemp /tmp/issue-progress-"${TASK_ID}"-XXXXXX.md)
91
142
  trap 'rm -f "$TMP_BODY"' EXIT
92
143
 
93
144
  gh issue view "$ISSUE_NUM" --repo "$ORG_REPO" --json body --jq .body > "$TMP_BODY"
94
145
 
95
146
  # Build the new Progress block.
96
- NEW_BLOCK=$(cat <<EOF
97
- | Flag | State |
98
- |---|---|
99
- | Implementation | ${G_IMPL} |
100
- | Testing | ${G_TEST} |
101
- | Code Connect | ${G_CC} |
102
- | Wiki | ${G_WIKI} |
103
- EOF
104
- )
105
-
106
- # Replace the table between `### Progress` and the next `<!--` HTML comment.
107
- # Use awk to keep the legend comment in place.
108
- awk -v new_block="$NEW_BLOCK" '
109
- BEGIN { in_progress = 0; replaced = 0 }
110
- /^### Progress/ {
111
- print
112
- print ""
113
- print new_block
114
- print ""
115
- in_progress = 1
116
- replaced = 1
117
- next
118
- }
119
- in_progress && /^<!--/ {
120
- in_progress = 0
121
- print
122
- next
123
- }
124
- in_progress { next }
125
- { print }
126
- END {
127
- if (replaced == 0) {
128
- # Body had no Progress section; nothing to replace.
129
- exit 0
130
- }
131
- }
132
- ' "$TMP_BODY" > "${TMP_BODY}.new"
147
+ NEW_BLOCK=$(build_progress_block "$G_IMPL" "$G_TEST" "$G_CC" "$G_WIKI")
148
+
149
+ # Replace the table between `### Progress` and the first terminator (legend
150
+ # comment, next heading, or EOF) - see rewrite_progress_body above.
151
+ rewrite_progress_body "$NEW_BLOCK" "$TMP_BODY" > "${TMP_BODY}.new"
133
152
 
134
153
  # Check if body actually changed (idempotent no-op).
135
154
  if cmp -s "$TMP_BODY" "${TMP_BODY}.new"; then
@@ -130,6 +130,10 @@ function isLockStale(lockPath, staleMs) {
130
130
  }
131
131
  }
132
132
 
133
+ // Path whose lock this process currently holds (null when none). Lets the
134
+ // top-level error handler release our lock on unexpected failures.
135
+ let heldLockFor = null;
136
+
133
137
  /** @param {string} path */
134
138
  function releaseLock(path) {
135
139
  const lockPath = `${path}.lock`;
@@ -138,6 +142,7 @@ function releaseLock(path) {
138
142
  } catch {
139
143
  /* already gone - fine */
140
144
  }
145
+ if (heldLockFor === path) heldLockFor = null;
141
146
  }
142
147
 
143
148
  /**
@@ -178,6 +183,7 @@ async function main() {
178
183
 
179
184
  try {
180
185
  await acquireLock(path);
186
+ heldLockFor = path;
181
187
  } catch (err) {
182
188
  if (err.code === "LOCK_TIMEOUT") {
183
189
  console.error(err.message);
@@ -187,6 +193,10 @@ async function main() {
187
193
  process.exit(3);
188
194
  }
189
195
 
196
+ // process.exit() inside a try block skips `finally`, so every exit path in
197
+ // here must release OUR lock explicitly before exiting - otherwise a corrupt
198
+ // state file (or any I/O error) leaks agent-state.json.lock and blocks the
199
+ // next writer until the stale-lock window elapses.
190
200
  try {
191
201
  let next;
192
202
  if (replace) {
@@ -198,8 +208,7 @@ async function main() {
198
208
  try {
199
209
  current = JSON.parse(readFileSync(path, "utf-8"));
200
210
  } catch (err) {
201
- console.error(`write-state: existing state unreadable - ${err.message}`);
202
- process.exit(3);
211
+ throw new Error(`existing state unreadable - ${err.message}`, { cause: err });
203
212
  }
204
213
  }
205
214
  next = deepMerge(current, payload);
@@ -210,15 +219,16 @@ async function main() {
210
219
  renameSync(tmp, path); // atomic on POSIX
211
220
  } catch (err) {
212
221
  console.error(`write-state: ${err.message}`);
213
- process.exit(3);
214
- } finally {
215
222
  releaseLock(path);
223
+ process.exit(3);
216
224
  }
217
225
 
226
+ releaseLock(path);
218
227
  process.exit(0);
219
228
  }
220
229
 
221
230
  main().catch((err) => {
222
231
  console.error(`write-state: unhandled - ${err.message}`);
232
+ if (heldLockFor) releaseLock(heldLockFor);
223
233
  process.exit(3);
224
234
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-10T13:07:43Z",
4
- "skillCount": 187,
3
+ "generatedAt": "2026-07-10T13:33:19Z",
4
+ "skillCount": 189,
5
5
  "entries": [
6
6
  {
7
7
  "path": "shared/core/apple-archive-compliance/SKILL.md",
@@ -69,7 +69,7 @@
69
69
  },
70
70
  {
71
71
  "path": "shared/core/multi-agent-help/SKILL.md",
72
- "sha256": "15755c1abd508f708e548529c869bc937f1ea038bbabb1cf47dfc3a8b0343346"
72
+ "sha256": "00772bab27906cdbdcae72d115c4e1f12ddd914fa7aa274923618a3a906e6caa"
73
73
  },
74
74
  {
75
75
  "path": "shared/core/multi-agent-issue/SKILL.md",
@@ -119,9 +119,17 @@
119
119
  "path": "shared/core/multi-agent-resume/SKILL.md",
120
120
  "sha256": "2d781df8da65dc3def03e9064d191bbf7d17411470ecd16d8473cccd74a2927a"
121
121
  },
122
+ {
123
+ "path": "shared/core/multi-agent-review-issue/SKILL.md",
124
+ "sha256": "76c742bc7ac2cd1f909216989a235a8953aa4e6997a31801c9953bcd431c9317"
125
+ },
126
+ {
127
+ "path": "shared/core/multi-agent-review-jira/SKILL.md",
128
+ "sha256": "4121907fd27fae70491785f8e15e7c2c8fd6f1bf1b1846262070639063cc83ee"
129
+ },
122
130
  {
123
131
  "path": "shared/core/multi-agent-review/SKILL.md",
124
- "sha256": "e2b8cf23775cfd6be2727cef1c47d78030c6600240e4446f7ceb4297e8cf7d46"
132
+ "sha256": "b1fd57d2b80ee0fe2490439d9f2688fcf415857c2aab60549c5456e27693b9a9"
125
133
  },
126
134
  {
127
135
  "path": "shared/core/multi-agent-scan/SKILL.md",
@@ -145,7 +153,7 @@
145
153
  },
146
154
  {
147
155
  "path": "shared/core/multi-agent-sync/SKILL.md",
148
- "sha256": "0ec56a2a802bbd59843bf8e9a6adfdae8c1e626ea07700914cf12e0d0c00dace"
156
+ "sha256": "28a057b30ec642f5cc1f22c9c50834aae280e6abaf58194b36d85bde717cfb14"
149
157
  },
150
158
  {
151
159
  "path": "shared/core/multi-agent-test/SKILL.md",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "skillCount": 187,
3
+ "skillCount": 189,
4
4
  "entries": [
5
5
  {
6
6
  "name": "accessibility-compliance-accessibility-audit",
@@ -985,13 +985,31 @@
985
985
  },
986
986
  {
987
987
  "name": "multi-agent-review",
988
- "description": "Run parallel review on the current branch's diff: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Review-only slice of the pipeline.",
988
+ "description": "Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select.",
989
989
  "platform": null,
990
990
  "group": "core",
991
991
  "triggerKeywords": [],
992
992
  "triggerPaths": [],
993
993
  "relativePath": "shared/core/multi-agent-review/SKILL.md"
994
994
  },
995
+ {
996
+ "name": "multi-agent-review-issue",
997
+ "description": "Assess whether a GitHub issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack readiness, then (after confirm) post the gaps as an issue comment. Read-only on code.",
998
+ "platform": null,
999
+ "group": "core",
1000
+ "triggerKeywords": [],
1001
+ "triggerPaths": [],
1002
+ "relativePath": "shared/core/multi-agent-review-issue/SKILL.md"
1003
+ },
1004
+ {
1005
+ "name": "multi-agent-review-jira",
1006
+ "description": "Assess whether a Jira issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack readiness, then (after confirm) post the gaps as a Jira comment. Read-only on code.",
1007
+ "platform": null,
1008
+ "group": "core",
1009
+ "triggerKeywords": [],
1010
+ "triggerPaths": [],
1011
+ "relativePath": "shared/core/multi-agent-review-jira/SKILL.md"
1012
+ },
995
1013
  {
996
1014
  "name": "multi-agent-scan",
997
1015
  "description": "Skill security scan: walks local skill directories against a tiered pattern catalog.",
@@ -97,7 +97,9 @@ Utility Commands (dash form on Copilot, colon form on Claude Code):
97
97
  /multi-agent:clear-logs Clean global log directory
98
98
  /multi-agent:purge Worktree + logs - full reset (double confirm)
99
99
  /multi-agent:channels Post multi-channel report (Jira/Confluence/Wiki/PR)
100
- /multi-agent:review Review current diff only
100
+ /multi-agent:review Review a PR or branch diff; no URL -> pick open GitHub/Bitbucket PRs
101
+ /multi-agent:review-jira Grade a Jira issue's pipeline-readiness -> comment the gaps
102
+ /multi-agent:review-issue Grade a GitHub issue's pipeline-readiness -> comment the gaps
101
103
  /multi-agent:create-jira ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + preview + approval)
102
104
  /multi-agent:sync Sync ecosystem (Claude + Copilot + website)
103
105
  /multi-agent:setup Keychain tokens + Git identity + language onboarding
@@ -233,7 +235,9 @@ Utility Komutları:
233
235
  /multi-agent:clear-logs Global log dizinini temizle
234
236
  /multi-agent:purge Worktree + log'lar - tam reset (çift onay)
235
237
  /multi-agent:channels Multi-channel rapor gönder (Jira/Confluence/Wiki/PR)
236
- /multi-agent:review Sadece mevcut diff'i review et
238
+ /multi-agent:review PR veya branch diff'ini review et; URL yoksa -> açık GitHub/Bitbucket PR seç
239
+ /multi-agent:review-jira Jira maddesinin pipeline hazırlığını değerlendir -> eksikleri yorumla
240
+ /multi-agent:review-issue GitHub issue hazırlığını değerlendir -> eksikleri yorumla
237
241
  /multi-agent:create-jira ["açıklama"] [figma-url] [swagger-url] Takım standartlarına uygun Jira Task/Bug/Story oluştur (tip sorar + önizleme + onay)
238
242
  /multi-agent:sync Ekosistemi senkronize et
239
243
  /multi-agent:setup Keychain token + Git kimliği + dil onboarding
@@ -1,27 +1,34 @@
1
1
  ---
2
2
  name: multi-agent-review
3
3
  language: en
4
- description: "Run parallel review on the current branch's diff: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Review-only slice of the pipeline."
4
+ description: "Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select."
5
5
  user-invocable: true
6
- argument-hint: "[branch] - optional: branch to review. If omitted, the current branch is used."
6
+ argument-hint: "[#N | repo#N | PR-URL | branch] - PR by number/URL, repo+number, or branch (GitHub + Bitbucket Server). If omitted: interactive PR picker, else current branch."
7
7
  ---
8
8
 
9
9
  # multi-agent review - Review Only Mode
10
10
 
11
11
  **Input**: $ARGUMENTS
12
12
 
13
- Skip Phase 0-3 and review the current diff only.
13
+ Skip Phase 0-3 and review a diff only. Input shapes: a PR (`#N`, `repo#N`, GitHub/Bitbucket-Server PR URL), a branch name, or empty.
14
14
 
15
15
  ## Steps
16
16
 
17
- 1. **Determine the branch** - if there is an argument, that branch; otherwise the current branch:
18
- ```bash
19
- git rev-parse --abbrev-ref HEAD
20
- ```
17
+ 1. **Resolve the input** (`{kind, provider}`):
18
+ - PR URL / `#N` / `repo#N` -> `kind=pr` (`github` or `bitbucket-server`).
19
+ - branch name -> `kind=branch` (local).
20
+ - **empty + interactive** -> `kind=pick` (Step 1a picker); **empty + autopilot** -> current branch.
21
21
 
22
- 2. **Get the diff** - diff against the target branch:
22
+ 1a. **No-input PR picker** (interactive only): list open PRs across both providers and multi-select which to review.
23
+ - GitHub: `gh pr list --state open --json number,title,url,headRefName,updatedAt` (current repo) plus `gh search prs --state open --review-requested=@me`/`--author=@me`.
24
+ - Bitbucket Server: for each configured repo, `GET /rest/api/1.0/projects/{KEY}/repos/{slug}/pull-requests?state=OPEN` (creds via `credential-store`).
25
+ - Merge + label each row `(github)`/`(bitbucket)`, then AskUserQuestion `multiSelect: true` (breadcrumb per `multi-agent-refs/picker-contract.md`). Review each selected PR (loop steps 2-6). Empty list or none selected -> fall back to the current branch.
26
+
27
+ 2. **Get the diff** - kind-aware:
23
28
  ```bash
24
- git diff origin/develop...HEAD
29
+ # branch: git diff origin/develop...HEAD
30
+ # github PR: gh pr diff "$N" --repo "$org/$repo" (+ head SHA for inline anchors)
31
+ # bitbucket PR: curl -u "$BB_USER:$BB_TOKEN" .../pull-requests/$N/diff?contextLines=10
25
32
  ```
26
33
 
27
34
  3. **Start parallel reviewers** - reviewer set depends on the host CLI:
@@ -53,9 +60,11 @@ Skip Phase 0-3 and review the current diff only.
53
60
  - 🟡 **Important** → fix recommended
54
61
  - 🟢 **Suggestion** → optional
55
62
 
56
- 6. **Show a summary**:
63
+ 6. **Show a summary** (always prints, any mode):
57
64
  ```
58
65
  🔍 Review Complete
59
66
  | Model | Verdict | Blocking | Important | Suggestion |
60
67
  Consensus: ✅ APPROVED
61
68
  ```
69
+
70
+ 7. **Post to PR** - only when `kind=pr` (full contract: `$HOME/.copilot/multi-agent-refs/channels/pr-review-actions.md`). Decision from accepted findings: 0 accepted blocking AND 0 accepted important -> APPROVE, else NEEDS WORK. Posts one inline comment per accepted blocking/important finding (in `outputLanguage`), then sets the review state via the provider API. Interactive prompts to post (default yes); autopilot auto-posts; `--no-post` skips. Entry point: `bash $HOME/.copilot/lib/post-pr-review.sh "$TASK_ID"`. No monolithic advisory comment. Branch/pick-fallback runs stay chat-only.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: multi-agent-review-issue
3
+ language: en
4
+ description: "Assess whether a GitHub issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack readiness, then (after confirm) post the gaps as an issue comment. Read-only on code."
5
+ user-invocable: true
6
+ argument-hint: "[#N | repo#N | GitHub issue URL] - optional; with no argument, pick from open issues"
7
+ ---
8
+
9
+ # multi-agent review-issue - GitHub issue readiness review
10
+
11
+ **Input**: $ARGUMENTS
12
+
13
+ Grades an existing GitHub issue for pipeline-readiness and comments the gaps back onto it. No worktree, no branch, no code commits.
14
+
15
+ ## Flow
16
+
17
+ Read `$HOME/.copilot/multi-agent-refs/readiness-review.md` and execute the shared readiness flow with **provider = github**:
18
+
19
+ 1. Resolve the item (`#N` / `repo#N` / GitHub issue URL); no argument -> pick from `gh issue list`, single-select.
20
+ 2. Fetch + base maturity via `$HOME/.copilot/lib/issue-fetcher.sh` (`gh issue view`; reuse its `maturity`; no MCP).
21
+ 3. Apply the readiness rubric (testable scope, acceptance criteria / DoD, repro for bugs, design reference for UI, API contract for backend, stack signal, dependencies).
22
+ 4. Print the chat verdict (score + Blockers / Warnings / Gaps) using the maturity severity contract.
23
+ 5. Confirm, then post the gaps as an issue comment via `channels/issue-comment.md` (`gh issue comment "$N" --repo "$org/$repo" --body-file <file>`). Autopilot auto-posts.
24
+
25
+ Verdict + comment body follow `outputLanguage`; comment tone rules (no AI attribution, no em-dash / section-sign, `Ref:` never `Closes/Fixes`). No label/assignment change, no creation, no auto-close.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: multi-agent-review-jira
3
+ language: en
4
+ description: "Assess whether a Jira issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack readiness, then (after confirm) post the gaps as a Jira comment. Read-only on code."
5
+ user-invocable: true
6
+ argument-hint: "[JIRA-KEY | Jira URL] - optional; with no argument, pick from your open Jira issues"
7
+ ---
8
+
9
+ # multi-agent review-jira - Jira readiness review
10
+
11
+ **Input**: $ARGUMENTS
12
+
13
+ Grades an existing Jira issue for pipeline-readiness and comments the gaps back onto it. No worktree, no branch, no code commits. Inverse of `multi-agent-create-jira`.
14
+
15
+ ## Flow
16
+
17
+ Read `$HOME/.copilot/multi-agent-refs/readiness-review.md` and execute the shared readiness flow with **provider = jira**:
18
+
19
+ 1. Resolve the item (`KEY-123` / `.../browse/KEY-123`); no argument -> pick from the `jira` command's open-issue list, single-select.
20
+ 2. Fetch + base maturity via `$HOME/.copilot/lib/issue-fetcher.sh` (reuse its `maturity`; no MCP).
21
+ 3. Apply the readiness rubric (testable scope, acceptance criteria / DoD, repro for bugs, design reference for UI, API contract for backend, stack signal, dependencies).
22
+ 4. Print the chat verdict (score + Blockers / Warnings / Gaps) using the maturity severity contract.
23
+ 5. Confirm, then post the gaps as a Jira comment via `channels/jira.md` (`POST /rest/api/2/issue/{id}/comment`, Bearer token via `credential-store`, UTF-8 verbatim, markdown->wiki). Autopilot auto-posts.
24
+
25
+ Verdict + comment body follow `outputLanguage`; comment tone rules (no AI attribution, no em-dash / section-sign, `Ref:` never `Closes`). No status/assignment change, no creation.
@@ -29,7 +29,7 @@ Run all steps automatically:
29
29
 
30
30
  ```
31
31
  Step 1: DETECT Compare timestamps, find stale targets
32
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 36 sub-command skills)
32
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 38 sub-command skills)
33
33
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
34
34
  Step 4: WEBSITE Version + phase/model counts -> {website-host} (i18n + projects.ts)
35
35
  Step 5: Commit Commit + push all changed repos
@@ -136,13 +136,13 @@ When invoked with the `release` argument:
136
136
  |-------------|-------------|
137
137
  | `~/.claude/commands/multi-agent/{cmd}.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
138
138
 
139
- **36 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
139
+ **38 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
140
140
 
141
141
  ```
142
142
  analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, delete, dev,
143
143
  dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
144
144
  help, issue, jira, kill, language, local,
145
- local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review,
145
+ local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review, review-issue, review-jira,
146
146
  scan, search, setup, stack, status, sync, test, update
147
147
  ```
148
148
 
@@ -3,7 +3,7 @@
3
3
  > Auto-generated by `pipeline/scripts/build-skills-index.mjs` - do not hand-edit.
4
4
  > Regenerate with `node pipeline/scripts/build-skills-index.mjs`.
5
5
 
6
- **187 skills** across 2 groups.
6
+ **189 skills** across 2 groups.
7
7
 
8
8
  | Group | Name | Platform | Description |
9
9
  |-------|------|----------|-------------|
@@ -116,7 +116,9 @@
116
116
  | core | `multi-agent-purge` | - | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. |
117
117
  | core | `multi-agent-refactor` | - | Analyse the project: extract adapted best-practices, hunt real bugs + improvement areas, check upstream drift of derived skills, draft one p |
118
118
  | core | `multi-agent-resume` | - | Resume a stopped or failed task from the phase where it left off. |
119
- | core | `multi-agent-review` | - | Run parallel review on the current branch's diff: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). R |
119
+ | core | `multi-agent-review` | - | Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonn |
120
+ | core | `multi-agent-review-issue` | - | Assess whether a GitHub issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / sta |
121
+ | core | `multi-agent-review-jira` | - | Assess whether a Jira issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack |
120
122
  | core | `multi-agent-scan` | - | Skill security scan: walks local skill directories against a tiered pattern catalog. |
121
123
  | core | `multi-agent-search` | - | Log search across every agent-log.md with smart ranking and filters. Optional --semantic flag queries the per-repo triage corpus. |
122
124
  | core | `multi-agent-setup` | - | First-run setup wizard: keychain token discovery, Git Identity onboarding, and pipeline preparation. |