@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.
- package/CHANGELOG.md +141 -0
- package/README.md +1 -0
- package/index.js +9 -2
- package/install/_common.mjs +107 -5
- package/install/_telemetry.mjs +5 -23
- package/install/claude.mjs +113 -11
- package/install/copilot.mjs +75 -6
- package/package.json +4 -10
- package/pipeline/commands/multi-agent/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/review/SKILL.md +36 -4
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +22 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +22 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +4 -4
- package/pipeline/lib/account-resolver.sh +61 -23
- package/pipeline/lib/channels-multi-repo.sh +7 -2
- package/pipeline/lib/count-lib.sh +27 -0
- package/pipeline/lib/credential-store.sh +23 -6
- package/pipeline/lib/extract-conventions.sh +27 -21
- package/pipeline/lib/fetch-confluence.sh +25 -13
- package/pipeline/lib/fetch-crashlytics.sh +30 -8
- package/pipeline/lib/fetch-fortify.sh +11 -2
- package/pipeline/lib/fetch-swagger.sh +18 -7
- package/pipeline/lib/figma-mcp-refresh.sh +26 -11
- package/pipeline/lib/figma-screenshot.sh +11 -2
- package/pipeline/lib/issue-fetcher.sh +31 -6
- package/pipeline/lib/multi-repo-pipeline.sh +84 -20
- package/pipeline/lib/plan-todos.sh +12 -3
- package/pipeline/lib/post-pr-review.sh +5 -3
- package/pipeline/lib/repo-cache.sh +53 -9
- package/pipeline/lib/review-watch.sh +26 -6
- package/pipeline/lib/shadow-git.sh +45 -4
- package/pipeline/lib/vercel-deploy.sh +10 -1
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/readiness-review.md +65 -0
- package/pipeline/scripts/audit-log-rotate.sh +38 -10
- package/pipeline/scripts/check-md-links.mjs +34 -9
- package/pipeline/scripts/diff-risk-score.mjs +4 -1
- package/pipeline/scripts/evidence-gate.mjs +10 -1
- package/pipeline/scripts/fixtures/install-layout.tsv +7 -7
- package/pipeline/scripts/fixtures/pack-expected-count.txt +1 -0
- package/pipeline/scripts/keychain-save.sh +13 -9
- package/pipeline/scripts/lint-skills.mjs +40 -2
- package/pipeline/scripts/migrate-prefs.mjs +26 -7
- package/pipeline/scripts/phase-tracker.sh +71 -0
- package/pipeline/scripts/pre-commit-check.sh +39 -0
- package/pipeline/scripts/scan-skills.sh +217 -127
- package/pipeline/scripts/smoke-bitbucket-contract.sh +21 -5
- package/pipeline/scripts/smoke-fetchers-offline.sh +382 -0
- package/pipeline/scripts/smoke-generate-issue.sh +3 -3
- package/pipeline/scripts/smoke-install-layout.sh +11 -3
- package/pipeline/scripts/smoke-lib-scripts.sh +54 -1
- package/pipeline/scripts/smoke-pack-contents.sh +140 -0
- package/pipeline/scripts/smoke-plugin-validate.sh +64 -0
- package/pipeline/scripts/smoke-review-readiness.sh +91 -0
- package/pipeline/scripts/smoke-shadow-git.sh +48 -1
- package/pipeline/scripts/smoke-skill-authoring.sh +1 -1
- package/pipeline/scripts/smoke-workflow-audit.sh +69 -0
- package/pipeline/scripts/smoke-wrapper-preservation.sh +68 -0
- package/pipeline/scripts/test-gap-scan.mjs +12 -1
- package/pipeline/scripts/triage-memory.mjs +10 -1
- package/pipeline/scripts/uninstall.mjs +105 -36
- package/pipeline/scripts/update-issue-progress.sh +60 -41
- package/pipeline/scripts/write-state.mjs +14 -4
- package/pipeline/skills/.skill-manifest.json +13 -5
- package/pipeline/skills/.skills-index.json +20 -2
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +6 -2
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -10
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +25 -0
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +25 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
- 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
|
|
79
|
-
yellow
|
|
80
|
-
*)
|
|
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
|
|
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=$(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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:
|
|
4
|
-
"skillCount":
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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":
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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] -
|
|
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
|
|
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. **
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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 +
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
|
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. |
|