@mmerterden/multi-agent-pipeline 10.9.0 → 11.0.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 +170 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/channels.md +42 -6
- package/pipeline/commands/multi-agent/finish.md +15 -6
- package/pipeline/commands/multi-agent/generate.md +34 -0
- package/pipeline/commands/multi-agent/help.md +10 -0
- package/pipeline/commands/multi-agent/manual-test.md +9 -2
- package/pipeline/commands/multi-agent/refs/channels/pr.md +1 -1
- package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +7 -6
- package/pipeline/commands/multi-agent/refs/generate-issue.md +267 -0
- package/pipeline/commands/multi-agent/refs/keychain.md +12 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +31 -2
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +2 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +2 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +6 -1
- package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +5 -1
- package/pipeline/commands/multi-agent/refs/progress-contract.md +1 -0
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +56 -13
- package/pipeline/commands/multi-agent/resume.md +6 -2
- package/pipeline/commands/multi-agent/sync.md +9 -9
- package/pipeline/commands/multi-agent.md +2 -0
- package/pipeline/lib/figma-mcp-refresh.sh +79 -0
- package/pipeline/preferences-template.json +2 -1
- package/pipeline/schemas/prefs.schema.json +11 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +6 -6
- package/pipeline/scripts/phase-tracker.sh +134 -22
- package/pipeline/scripts/smoke-channels-approval-gate.sh +60 -0
- package/pipeline/scripts/smoke-generate-issue.sh +119 -0
- package/pipeline/scripts/smoke-phase-tracker.sh +69 -0
- package/pipeline/scripts/smoke-progress-contract.sh +9 -0
- package/pipeline/scripts/smoke-tasklist-ordering.sh +1 -0
- package/pipeline/scripts/smoke-token-preflight.sh +82 -0
- package/pipeline/scripts/smoke-tracker-contract.sh +62 -0
- package/pipeline/skills/.skills-index.json +13 -4
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +4 -2
- package/pipeline/skills/shared/core/multi-agent-generate/SKILL.md +51 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +5 -5
- package/pipeline/skills/skills-index.md +4 -3
|
@@ -250,6 +250,75 @@ STATE_LIVE="$HOME/.claude/logs/multi-agent/TOK-LIVE/tracker-state.json"
|
|
|
250
250
|
TIN_LIVE=$(jq -r '.phases[0].tokens_in // 0' "$STATE_LIVE")
|
|
251
251
|
[ "$TIN_LIVE" = "600" ] && pass "TRACKER_QUIET still accumulates state (500+100=600)" || fail "quiet mode broke accumulation (got $TIN_LIVE)"
|
|
252
252
|
|
|
253
|
+
echo ""
|
|
254
|
+
echo "→ 20. now action: quiet, truncating current-action line"
|
|
255
|
+
run_plain init NOW-1 >/dev/null
|
|
256
|
+
run_plain add 3 "Dev" >/dev/null
|
|
257
|
+
run_plain update 3 in_progress >/dev/null
|
|
258
|
+
NOW_OUT=$(run_plain now 3 "editing TopBarView.swift")
|
|
259
|
+
if [ -n "$NOW_OUT" ]; then
|
|
260
|
+
fail "now must not render (got: $NOW_OUT)"
|
|
261
|
+
else
|
|
262
|
+
pass "now is quiet (no stdout)"
|
|
263
|
+
fi
|
|
264
|
+
STATE_NOW="$HOME/.claude/logs/multi-agent/NOW-1/tracker-state.json"
|
|
265
|
+
NOW_VAL=$(jq -r '.phases[0].meta.Now' "$STATE_NOW")
|
|
266
|
+
[ "$NOW_VAL" = "editing TopBarView.swift" ] && pass "now stored in meta.Now" || fail "meta.Now wrong: $NOW_VAL"
|
|
267
|
+
run_plain now 3 "this is a deliberately very long current action description that exceeds sixty characters"
|
|
268
|
+
NOW_LEN=$(jq -r '.phases[0].meta.Now | length' "$STATE_NOW")
|
|
269
|
+
[ "$NOW_LEN" = "60" ] && pass "now truncates to 60 chars" || fail "expected 60 chars, got $NOW_LEN"
|
|
270
|
+
RENDER_NOW=$(run_plain render)
|
|
271
|
+
echo "$RENDER_NOW" | grep -q "Now:" && pass "render shows Now: line for active phase" || fail "render missing Now: line"
|
|
272
|
+
|
|
273
|
+
echo ""
|
|
274
|
+
echo "→ 21. add is idempotent (continuation contract)"
|
|
275
|
+
run_plain tokens 3 1000 200 >/dev/null
|
|
276
|
+
run_plain add 3 "DevRenamed" >/dev/null
|
|
277
|
+
CNT=$(jq '.phases | length' "$STATE_NOW")
|
|
278
|
+
[ "$CNT" = "1" ] && pass "duplicate add does not append" || fail "expected 1 phase, got $CNT"
|
|
279
|
+
NAME3=$(jq -r '.phases[0].name' "$STATE_NOW")
|
|
280
|
+
[ "$NAME3" = "Dev" ] && pass "duplicate add preserves original name" || fail "name overwritten: $NAME3"
|
|
281
|
+
TIN3=$(jq -r '.phases[0].tokens_in' "$STATE_NOW")
|
|
282
|
+
[ "$TIN3" = "1000" ] && pass "duplicate add preserves token history" || fail "tokens lost: $TIN3"
|
|
283
|
+
|
|
284
|
+
echo ""
|
|
285
|
+
echo "→ 22. cost action prices via cost-table.json"
|
|
286
|
+
run_plain init COST-1 >/dev/null
|
|
287
|
+
run_plain add 3 "Dev" >/dev/null
|
|
288
|
+
run_plain update 3 in_progress >/dev/null
|
|
289
|
+
TRACKER_QUIET=1 run_plain model 3 opus >/dev/null
|
|
290
|
+
TRACKER_QUIET=1 run_plain tokens 3 100000 20000 >/dev/null
|
|
291
|
+
# opus: 0.1*5 + 0.02*25 = 0.5 + 0.5 = 1.00
|
|
292
|
+
COST3=$(run_plain cost 3)
|
|
293
|
+
[ "$COST3" = "1" ] && pass "cost 3 = 1 (opus 100k in + 20k out)" || fail "expected 1, got $COST3"
|
|
294
|
+
TRACKER_QUIET=1 run_plain tokens 3 0 0 50000 >/dev/null
|
|
295
|
+
# + 50k cached * 0.5/M = 0.025 -> total 1.025 -> floored 1.02
|
|
296
|
+
COST3C=$(run_plain cost 3)
|
|
297
|
+
[ "$COST3C" = "1.02" ] && pass "cached tokens priced at cacheReadPerMtok (1.02)" || fail "expected 1.02, got $COST3C"
|
|
298
|
+
COSTTOT=$(run_plain cost total)
|
|
299
|
+
[ "$COSTTOT" = "1.02" ] && pass "cost total sums priceable phases" || fail "expected 1.02, got $COSTTOT"
|
|
300
|
+
run_plain add 4 "Review" >/dev/null
|
|
301
|
+
TRACKER_QUIET=1 run_plain tokens 4 5000 1000 >/dev/null
|
|
302
|
+
COST4=$(run_plain cost 4)
|
|
303
|
+
[ "$COST4" = "-" ] && pass "cost is '-' for a phase without a model" || fail "expected -, got $COST4"
|
|
304
|
+
COSTBAD=$(run_plain cost 9)
|
|
305
|
+
[ "$COSTBAD" = "-" ] && pass "cost is '-' for unknown phase id" || fail "expected -, got $COSTBAD"
|
|
306
|
+
|
|
307
|
+
echo ""
|
|
308
|
+
echo "→ 23. render shows per-tile USD and cached footer"
|
|
309
|
+
RENDER_COST=$(run_plain render)
|
|
310
|
+
echo "$RENDER_COST" | grep -q '~\$1.02' && pass "tile shows ~\$ estimate for priced phase" || fail "render missing tile USD"
|
|
311
|
+
echo "$RENDER_COST" | grep -q "cached" && pass "footer shows cached tokens" || fail "render missing cached footer"
|
|
312
|
+
echo "$RENDER_COST" | grep -qE "Total.*~\\\$" && pass "footer shows total USD" || fail "render missing total USD"
|
|
313
|
+
|
|
314
|
+
echo ""
|
|
315
|
+
echo "→ 24. render sorts phases by numeric id (continuation ordering)"
|
|
316
|
+
run_plain init ORDER-1 >/dev/null
|
|
317
|
+
for pp in "0:Init" "5:Test"; do run_plain add "${pp%%:*}" "${pp#*:}" >/dev/null; done
|
|
318
|
+
for pp in "4:Review" "6:Commit"; do run_plain add "${pp%%:*}" "${pp#*:}" >/dev/null; done
|
|
319
|
+
ORDER_OUT=$(run_plain render | grep -oE "Phase [0-9]+" | tr -d 'Phase ' | tr '\n' ',')
|
|
320
|
+
[ "$ORDER_OUT" = "0,4,5,6," ] && pass "phases render sorted by id (0,4,5,6)" || fail "order wrong: $ORDER_OUT"
|
|
321
|
+
|
|
253
322
|
echo ""
|
|
254
323
|
echo "══ phase-tracker smoke: $PASS passed, $FAIL failed ══"
|
|
255
324
|
[ "$FAIL" -eq 0 ]
|
|
@@ -113,6 +113,15 @@ if [ "$ADOPTED" -eq 0 ]; then
|
|
|
113
113
|
warn "no phases have adopted yet - this is expected until WS-4/5/6 land"
|
|
114
114
|
fi
|
|
115
115
|
|
|
116
|
+
echo ""
|
|
117
|
+
echo "→ Live mirror cross-link (tracker coupling)"
|
|
118
|
+
if grep -q "Live mirror to the phase tracker" "$CONTRACT" \
|
|
119
|
+
&& grep -q "phase-tracker.sh now" "$CONTRACT"; then
|
|
120
|
+
pass "contract cross-links the tracker mirror rule"
|
|
121
|
+
else
|
|
122
|
+
fail "contract missing the live-mirror cross-link to tracker-contract.md"
|
|
123
|
+
fi
|
|
124
|
+
|
|
116
125
|
echo ""
|
|
117
126
|
echo "══ progress-contract smoke: $PASS passed, $WARN warnings, $FAIL failed ══"
|
|
118
127
|
[ "$FAIL" -eq 0 ]
|
|
@@ -57,6 +57,7 @@ MODE_ENTRY_DOCS=(
|
|
|
57
57
|
"pipeline/commands/multi-agent/dev-autopilot.md"
|
|
58
58
|
"pipeline/commands/multi-agent/dev-local.md"
|
|
59
59
|
"pipeline/commands/multi-agent/dev-local-autopilot.md"
|
|
60
|
+
"pipeline/commands/multi-agent/finish.md"
|
|
60
61
|
)
|
|
61
62
|
for rel in "${MODE_ENTRY_DOCS[@]}"; do
|
|
62
63
|
abs="$ROOT/$rel"
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# smoke-token-preflight.sh - contract for the Phase 0 Step 0.7 token expiry pre-flight
|
|
3
|
+
# and the Figma MCP token lifecycle (silent refresh + generation-script escalation).
|
|
4
|
+
#
|
|
5
|
+
# Verifies:
|
|
6
|
+
# 1. phase-0-init.md has Step 0.7 with the probe table and figma-mcp-critical path.
|
|
7
|
+
# 2. Silent renewal runs BEFORE any question; autopilot never prompts.
|
|
8
|
+
# 3. keychain.md documents the Figma MCP lifecycle (refresh entry, tokenScripts, init cross-ref).
|
|
9
|
+
# 4. lib/figma-mcp-refresh.sh exists, is executable, parses, and never prints token values.
|
|
10
|
+
# 5. prefs.schema.json + preferences-template.json declare global.tokenScripts.
|
|
11
|
+
# 6. Network failure is not treated as expiry; mid-run 401 stays as safety net.
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
+
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
17
|
+
PHASE0="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-0-init.md"
|
|
18
|
+
KEYCHAIN="$ROOT/pipeline/commands/multi-agent/refs/keychain.md"
|
|
19
|
+
REFRESH="$ROOT/pipeline/lib/figma-mcp-refresh.sh"
|
|
20
|
+
SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
21
|
+
TEMPLATE="$ROOT/pipeline/preferences-template.json"
|
|
22
|
+
|
|
23
|
+
PASS=0
|
|
24
|
+
FAIL=0
|
|
25
|
+
pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
|
|
26
|
+
fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
|
|
27
|
+
|
|
28
|
+
need() { command -v "$1" >/dev/null 2>&1 || { echo "error: $1 required" >&2; exit 127; }; }
|
|
29
|
+
need jq
|
|
30
|
+
|
|
31
|
+
for f in "$PHASE0" "$KEYCHAIN" "$REFRESH" "$SCHEMA" "$TEMPLATE"; do
|
|
32
|
+
[ -f "$f" ] || { echo "error: missing $f" >&2; exit 1; }
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
echo "→ 1. Step 0.7 pre-flight section"
|
|
36
|
+
grep -Fq "Step 0.7 - Token expiry pre-flight" "$PHASE0" && pass "Step 0.7 present" || fail "Step 0.7 missing"
|
|
37
|
+
for marker in "rest/api/2/myself" "mcp.figma.com/mcp" "serviceStatus" "CRITICAL"; do
|
|
38
|
+
grep -Fq "$marker" "$PHASE0" && pass "probe marker: $marker" || fail "probe marker missing: $marker"
|
|
39
|
+
done
|
|
40
|
+
|
|
41
|
+
echo ""
|
|
42
|
+
echo "→ 2. silent renewal first, autopilot never prompts"
|
|
43
|
+
grep -Fq "figma-mcp-refresh.sh" "$PHASE0" && pass "silent renewal wired" || fail "silent renewal missing"
|
|
44
|
+
grep -Fq "Silent renewal first" "$PHASE0" && pass "renewal precedes question" || fail "renewal-first rule missing"
|
|
45
|
+
grep -Fq "never prompt" "$PHASE0" && pass "autopilot no-prompt rule" || fail "autopilot no-prompt rule missing"
|
|
46
|
+
grep -Fq "Regenerate now (script)" "$PHASE0" && pass "script escalation option" || fail "script escalation option missing"
|
|
47
|
+
grep -Fq "Continue degraded" "$PHASE0" && pass "degrade option" || fail "degrade option missing"
|
|
48
|
+
|
|
49
|
+
echo ""
|
|
50
|
+
echo "→ 3. keychain.md lifecycle section"
|
|
51
|
+
grep -Fq "Figma MCP token lifecycle" "$KEYCHAIN" && pass "lifecycle section present" || fail "lifecycle section missing"
|
|
52
|
+
grep -Fq "_Refresh" "$KEYCHAIN" && pass "refresh Keychain entry documented" || fail "refresh entry missing"
|
|
53
|
+
grep -Fq "tokenScripts" "$KEYCHAIN" && pass "tokenScripts documented" || fail "tokenScripts missing"
|
|
54
|
+
grep -Fq "Step 0.7" "$KEYCHAIN" && pass "init cross-ref present" || fail "init cross-ref missing"
|
|
55
|
+
grep -Fq "never in synced command files" "$KEYCHAIN" && pass "personal-path hygiene rule" || fail "personal-path hygiene rule missing"
|
|
56
|
+
|
|
57
|
+
echo ""
|
|
58
|
+
echo "→ 4. figma-mcp-refresh.sh integrity"
|
|
59
|
+
[ -x "$REFRESH" ] && pass "executable" || fail "not executable"
|
|
60
|
+
bash -n "$REFRESH" && pass "parses (bash -n)" || fail "syntax error"
|
|
61
|
+
grep -Fq "grant_type=refresh_token" "$REFRESH" && pass "refresh grant" || fail "refresh grant missing"
|
|
62
|
+
if grep -E 'echo .*\$(NEW_ACCESS|NEW_REFRESH|REFRESH_TOKEN)' "$REFRESH" >/dev/null; then
|
|
63
|
+
fail "token value printed to stdout"
|
|
64
|
+
else
|
|
65
|
+
pass "no token values printed"
|
|
66
|
+
fi
|
|
67
|
+
grep -Fq 'security add-generic-password' "$REFRESH" && pass "saves back to Keychain" || fail "Keychain save missing"
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
echo "→ 5. prefs schema + template declare tokenScripts"
|
|
71
|
+
TS_TYPE=$(jq -r '.properties.global.properties.tokenScripts.type // "missing"' "$SCHEMA")
|
|
72
|
+
[ "$TS_TYPE" = "object" ] && pass "schema tokenScripts is object" || fail "schema tokenScripts type = '$TS_TYPE'"
|
|
73
|
+
jq -e '.global | has("tokenScripts")' "$TEMPLATE" >/dev/null && pass "template has tokenScripts" || fail "template missing tokenScripts"
|
|
74
|
+
|
|
75
|
+
echo ""
|
|
76
|
+
echo "→ 6. network failure is not expiry; 401 safety net stays"
|
|
77
|
+
grep -Fq "NOT treated as expiry" "$PHASE0" && pass "network-failure rule" || fail "network-failure rule missing"
|
|
78
|
+
grep -Fq "safety net" "$PHASE0" && pass "401 safety net documented" || fail "401 safety net missing"
|
|
79
|
+
|
|
80
|
+
echo ""
|
|
81
|
+
echo "══ token-preflight smoke: $PASS passed, $FAIL failed ══"
|
|
82
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -123,6 +123,68 @@ for mode_file in "${MODE_FILES[@]}"; do
|
|
|
123
123
|
fi
|
|
124
124
|
done
|
|
125
125
|
|
|
126
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
127
|
+
echo "→ 7. Live-tracker UX contract (now/cost actions, mirror rule, continuation)"
|
|
128
|
+
if grep -q 'phase-tracker.sh now' "$CONTRACT_FILE" \
|
|
129
|
+
&& grep -q 'cost <N>' "$CONTRACT_FILE"; then
|
|
130
|
+
pass "tracker-contract documents now + cost actions"
|
|
131
|
+
else
|
|
132
|
+
fail "tracker-contract missing now/cost action docs"
|
|
133
|
+
fi
|
|
134
|
+
if grep -q '\[cached\]' "$CONTRACT_FILE" || grep -q '\[cached_count\]' "$CONTRACT_FILE"; then
|
|
135
|
+
pass "tracker-contract documents the 4th cached tokens arg"
|
|
136
|
+
else
|
|
137
|
+
fail "tracker-contract missing the cached tokens arg"
|
|
138
|
+
fi
|
|
139
|
+
if grep -q 'Progress-line mirror' "$CONTRACT_FILE"; then
|
|
140
|
+
pass "tracker-contract declares the progress-line mirror rule"
|
|
141
|
+
else
|
|
142
|
+
fail "tracker-contract missing the progress-line mirror rule"
|
|
143
|
+
fi
|
|
144
|
+
if grep -q 'Continuation runs' "$CONTRACT_FILE" \
|
|
145
|
+
&& grep -q 'never re-initialized' "$CONTRACT_FILE"; then
|
|
146
|
+
pass "tracker-contract declares the continuation-runs rule"
|
|
147
|
+
else
|
|
148
|
+
fail "tracker-contract missing the continuation-runs rule"
|
|
149
|
+
fi
|
|
150
|
+
if grep -q 'Completion tile suffix' "$CONTRACT_FILE"; then
|
|
151
|
+
pass "tracker-contract declares the completion tile suffix"
|
|
152
|
+
else
|
|
153
|
+
fail "tracker-contract missing the completion tile suffix"
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
157
|
+
echo "→ 8. Continuation wiring in finish + manual-test + phase-5"
|
|
158
|
+
FINISH_FILE="$CMDS_DIR/finish.md"
|
|
159
|
+
if grep -q '\[ ! -f "\$STATE" \]' "$FINISH_FILE"; then
|
|
160
|
+
pass "finish.md guards init behind a state-file existence check"
|
|
161
|
+
else
|
|
162
|
+
fail "finish.md must not init the tracker unconditionally"
|
|
163
|
+
fi
|
|
164
|
+
if grep -q 'Continuing' "$FINISH_FILE" && grep -q 'cost total' "$FINISH_FILE"; then
|
|
165
|
+
pass "finish.md prints the inherited-history line via cost total"
|
|
166
|
+
else
|
|
167
|
+
fail "finish.md missing the continuation summary line"
|
|
168
|
+
fi
|
|
169
|
+
MANUAL_FILE="$CMDS_DIR/manual-test.md"
|
|
170
|
+
if grep -q 'now 5 "awaiting local test (user)"' "$MANUAL_FILE"; then
|
|
171
|
+
pass "manual-test.md sets the waiting state via now 5"
|
|
172
|
+
else
|
|
173
|
+
fail "manual-test.md missing the now 5 waiting state"
|
|
174
|
+
fi
|
|
175
|
+
PHASE5_FILE="$CMDS_DIR/refs/phases/phase-5-test.md"
|
|
176
|
+
if grep -q 'now 5 "awaiting local test (user)"' "$PHASE5_FILE"; then
|
|
177
|
+
pass "phase-5-test.md sets the waiting state via now 5"
|
|
178
|
+
else
|
|
179
|
+
fail "phase-5-test.md missing the now 5 waiting state"
|
|
180
|
+
fi
|
|
181
|
+
RESUME_FILE="$CMDS_DIR/resume.md"
|
|
182
|
+
if grep -q 'Rebuild the phase tiles' "$RESUME_FILE"; then
|
|
183
|
+
pass "resume.md rebuilds the phase tiles from state"
|
|
184
|
+
else
|
|
185
|
+
fail "resume.md missing the tile-rebuild step"
|
|
186
|
+
fi
|
|
187
|
+
|
|
126
188
|
# ──────────────────────────────────────────────────────────────────────────
|
|
127
189
|
echo ""
|
|
128
190
|
echo "══ tracker-contract smoke: $PASS passed, $FAIL failed ══"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-07-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-07-07T13:28:32.523Z",
|
|
4
|
+
"skillCount": 223,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -1031,7 +1031,7 @@
|
|
|
1031
1031
|
},
|
|
1032
1032
|
{
|
|
1033
1033
|
"name": "multi-agent",
|
|
1034
|
-
"description": "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (
|
|
1034
|
+
"description": "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md.",
|
|
1035
1035
|
"platform": null,
|
|
1036
1036
|
"group": "core",
|
|
1037
1037
|
"triggerKeywords": [],
|
|
@@ -1155,6 +1155,15 @@
|
|
|
1155
1155
|
"triggerPaths": [],
|
|
1156
1156
|
"relativePath": "shared/core/multi-agent-garbage-collect/SKILL.md"
|
|
1157
1157
|
},
|
|
1158
|
+
{
|
|
1159
|
+
"name": "multi-agent-generate",
|
|
1160
|
+
"description": "Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with auto-sizing sections, full preview + explicit approval before create.",
|
|
1161
|
+
"platform": null,
|
|
1162
|
+
"group": "core",
|
|
1163
|
+
"triggerKeywords": [],
|
|
1164
|
+
"triggerPaths": [],
|
|
1165
|
+
"relativePath": "shared/core/multi-agent-generate/SKILL.md"
|
|
1166
|
+
},
|
|
1158
1167
|
{
|
|
1159
1168
|
"name": "multi-agent-help",
|
|
1160
1169
|
"description": "Multi-agent pipeline usage guide - renders in EN or TR per prefs.global.outputLanguage (falls back to promptLanguage for backward compatibility).",
|
|
@@ -1274,7 +1283,7 @@
|
|
|
1274
1283
|
},
|
|
1275
1284
|
{
|
|
1276
1285
|
"name": "multi-agent-review",
|
|
1277
|
-
"description": "Run parallel review on the current branch's diff: 2 models on Claude Code (
|
|
1286
|
+
"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.",
|
|
1278
1287
|
"platform": null,
|
|
1279
1288
|
"group": "core",
|
|
1280
1289
|
"triggerKeywords": [],
|
|
@@ -309,7 +309,8 @@ Every user-facing phase title - TaskCreate cards, `phase-banner.sh` headers, a
|
|
|
309
309
|
All TaskCreate calls fire in strict phase-number order BEFORE any TaskUpdate is applied (Claude Code path; Copilot CLI does not have a TaskList widget so this rule is Claude-only). The native widget renders by creation order, not by phase-number metadata - out-of-order calls produce visually scrambled tile stacks (e.g. `1 ✓ · 2 ✓ · 4 ✓ · 0 ▶ · 3 ☐`) even when the underlying state file is correct. Pre-marking phases as completed/skipped before Phase 0 starts is FORBIDDEN: register the tile in order with default `pending` status, then flip via TaskUpdate when the phase actually short-circuits. Mode-specific phase sets:
|
|
310
310
|
|
|
311
311
|
- Full pipeline (`multi-agent`, `multi-agent-autopilot`, `multi-agent-local`, `multi-agent-local-autopilot`): 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
|
|
312
|
-
-
|
|
312
|
+
- `multi-agent-dev`: 0 → 3 → 5 → 6 → 7 (phases 1/2/4 are NOT TaskCreate'd at all)
|
|
313
|
+
- `multi-agent-dev-autopilot`, `multi-agent-dev-local`, `multi-agent-dev-local-autopilot`: 0 → 3 → 6 → 7 (phases 1/2/4/5 are NOT TaskCreate'd at all - the autopilot/local variants drop the interactive Phase 5 test gate)
|
|
313
314
|
|
|
314
315
|
Full contract: `refs/tracker-contract.md` section "TaskCreate ordering (strict)".
|
|
315
316
|
|
|
@@ -41,8 +41,9 @@ multi-agent-channels PROJ-12345 --dry-run # preview, no POST
|
|
|
41
41
|
3. **Menu (multi-select)** - channel + content, previous selections pre-ticked from `prefs.global.reportChannels` + `prefs.global.reportContent`. Greyed-out rules per context availability.
|
|
42
42
|
4. **Mode short-circuit** - `--channels X,Y` + `--content A,B` flags skip menu. Autopilot ALWAYS pauses at the menu (v5.7+ Phase 7 exception).
|
|
43
43
|
5. **Generator** - for each selected content source, produce a section body. Humanizer pass per channel separately.
|
|
44
|
-
6. **
|
|
45
|
-
7. **
|
|
44
|
+
6. **Body preview + approval gate** - interactive runs render every selected channel's final body and ask Approve & post / Edit (loop) / Skip channels / Cancel BEFORE any external write. Skipped only by autopilot and `--dry-run`. What is posted is byte-identical to the approved preview.
|
|
45
|
+
7. **Channel dispatch** - parallel adapter calls, never before the gate resolves: PR description (reviewer-preserving PUT on Bitbucket), Jira comment (wiki markup), Confluence page (storage format + parent page), Wiki (component adapter - Case A scope multi-select or Case B precondition menu).
|
|
46
|
+
8. **Summary** - per-adapter status line, persist selections to prefs.
|
|
46
47
|
|
|
47
48
|
## Multi-select menu
|
|
48
49
|
|
|
@@ -222,6 +223,7 @@ Target length: < 80 lines (fits one screen). Auto-diff capped at 5 lines per sec
|
|
|
222
223
|
- No markers - full replace each run, no `<!-- channels:start -->` bookmarks.
|
|
223
224
|
- Every body item references a file/symbol/line from diff or pipeline log. No generic sentences.
|
|
224
225
|
- Adapter failures are non-blocking - one channel failing does NOT abort others.
|
|
226
|
+
- Approval before post - interactive runs never write to an external channel without the step 6 preview + approval. Autopilot and `--dry-run` are the only bypasses.
|
|
225
227
|
|
|
226
228
|
## Error handling
|
|
227
229
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-generate
|
|
3
|
+
language: en
|
|
4
|
+
description: "Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with auto-sizing sections, full preview + explicit approval before create."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[\"<free-text description>\"] [figma-url] [swagger-url] - all optional, asked interactively when missing"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# multi-agent generate - Standards-Compliant Jira Issue Creator
|
|
10
|
+
|
|
11
|
+
**Input**: $ARGUMENTS
|
|
12
|
+
|
|
13
|
+
Creates exactly one Jira issue, and only after explicit approval. The issue type (Task / Bug / Story) is asked at the start of every run. No branches, no commits, no worktrees. The description comes from the type's standard template (baseline, not a mined heading set); sections auto-size - a conditional section renders only when its trigger is present, otherwise the heading is omitted.
|
|
14
|
+
|
|
15
|
+
> **Language**: issue content (summary + description) and user-facing questions follow `prefs.global.outputLanguage` - intentional exception to the "external payloads stay English" default (the issue is authored for the user's team). Code identifiers and URLs stay verbatim.
|
|
16
|
+
|
|
17
|
+
## Standard templates (A = always, C = conditional)
|
|
18
|
+
|
|
19
|
+
- **Task**: Detailed Description (A), Scope (A), Acceptance Criteria (A), Test Scenarios (A); API Contract/Swagger (C), Design Reference (C), Screenshots (C), Notes (C).
|
|
20
|
+
- **Bug**: Detailed Description (A), Steps to Reproduce (A), Expected Result (A), Actual Result (A), Environment (A); Screenshots/Logs (C), Regression/Test Scenario (C), API Contract (C), Design Reference (C), Notes (C).
|
|
21
|
+
- **Story**: User Story (A), Detailed Description (A), Scope (A), Acceptance Criteria (A), Test Scenarios (A); API Contract/Swagger (C), Design Reference (C), Screenshots (C), Dependencies/Notes (C).
|
|
22
|
+
|
|
23
|
+
A `C` section fires on: Design Reference → Figma URL; Screenshots → pasted image or fetched Figma render; API Contract → Swagger URL / contract / endpoint mention; Notes → real content. No empty placeholder headings; never invent content.
|
|
24
|
+
|
|
25
|
+
## Steps
|
|
26
|
+
|
|
27
|
+
1. **Account + token** - pick the Jira account (auto-select when single), then:
|
|
28
|
+
```bash
|
|
29
|
+
TOKEN=$(~/.copilot/lib/credential-store.sh get "$ACCOUNT_JIRA_TOKEN_KEY")
|
|
30
|
+
```
|
|
31
|
+
Missing/expired (401) → Token Save Flow; user skips → abort, nothing created.
|
|
32
|
+
2. **Project key** - `figmaConfig.jira.projectKey` → `prefs.global.defaultJiraKey` → fetch `GET /rest/api/2/project`, ask, cache the choice.
|
|
33
|
+
3. **Pick issue type** - ask (Task / Bug / Story), never inferred silently → `ISSUE_TYPE`. Drives the mining JQL, field discovery, and section skeleton.
|
|
34
|
+
4. **Parse input** - `figma.com` URL → `FIGMA_URL` (node-id `-` → `:`); OpenAPI/Swagger URL (`swagger`/`openapi`/`api-docs`/`.json`/`.yaml`) → `SWAGGER_URL`; pasted images → screenshots; log/stack-trace text stays with `FREE_TEXT`; the rest is `FREE_TEXT`. All empty → ask for a description. Figma/Swagger/screenshots are always optional.
|
|
35
|
+
5. **Convention mining + field discovery + sprint** (read-only GETs):
|
|
36
|
+
- Sample: `GET /rest/api/2/search?jql=project={KEY} AND issuetype={TYPE} ORDER BY created DESC&fields=summary,description,labels,components,priority,fixVersions,issuelinks&maxResults=30`. Extract summary prefix pattern (>= 40% threshold), top-5 labels/components, modal priority, epic usage rate, and **test-scenario style**: linked Test-family issues (Xray/Zephyr) → reference them; else a dominant test-scenario heading/checklist style (>= 40%) → reuse it; else inline a skeleton derived from Acceptance Criteria (user edits, never fabricated).
|
|
37
|
+
- `GET /rest/api/2/issue/createmeta?projectKeys={KEY}&issuetypeNames={TYPE}&expand=projects.issuetypes.fields` (404/empty → paged DC endpoint fallback). Required custom fields → step 7 questions with allowedValues options. Detect Sprint/Epic/Team fields generically via `schema.custom` ids.
|
|
38
|
+
- `GET /rest/agile/1.0/board?projectKeyOrId={KEY}` → (ask when multiple) → `GET /rest/agile/1.0/board/{id}/sprint?state=active`. No board/Agile 404 → sprint option silently omitted.
|
|
39
|
+
6. **External context** (only for provided sources, each failure-isolated, never blocks create):
|
|
40
|
+
- **Figma** (`FIGMA_URL` set) - 3-tier chain (MCP → REST figma_pat → user screenshot); standalone command, MCP allowed here.
|
|
41
|
+
- **Swagger** (`SWAGGER_URL` set or contract pasted) - fetch the spec, extract ONLY the referenced endpoints (paths/operationIds/tags named in `FREE_TEXT`, else the pointed-at group): method + path + one-line summary + key request/response fields. Never crawl the whole spec. Fetch failure → link-only or omit.
|
|
42
|
+
- **Screenshots** - staged for the step 8 attachment opt-in, referenced inline with `!file|thumbnail!`.
|
|
43
|
+
7. **Draft + clarifying questions** - compose summary (`{minedPrefix} {title}`, 255 trunc) + description from the type's **standard template** in Jira wiki markup (`h3.`), auto-sizing conditional sections, humanizer pass, in `outputLanguage`; body to a file for `jq -n --rawfile` (UTF-8 verbatim, `--data-binary @file`, no re-encode). Ask ONLY genuinely unknown fields: component, epic (when usage rate is high), priority (when norm ambiguous), labels, assignee, sprint vs backlog, required customs, and any always-present section still empty (Bug Steps/Environment, or a Task/Story with no derivable Scope/AC). Never invent content the user did not supply.
|
|
44
|
+
8. **Full preview + approval gate (never skipped)** - render the complete issue (all fields + full description + attachment plan, uploads default off). Ask: `Approve` / `Edit` (apply → re-render → re-ask, loop) / `Cancel` (nothing created). No flag or mode bypasses this gate.
|
|
45
|
+
9. **Create** - `POST /rest/api/2/issue` with `jq -n --rawfile` payload + `curl --data-binary @file`. 400 field errors → show verbatim, re-ask those fields, re-preview.
|
|
46
|
+
10. **Post-create** (each failure-isolated: warn + continue): sprint chosen → `POST /rest/agile/1.0/sprint/{id}/issue` `{"issues":["KEY"]}`; Figma → `POST /rest/api/2/issue/{KEY}/remotelink`; Swagger → `remotelink` with title "API contract"; screenshots opt-in → `POST /rest/api/2/issue/{KEY}/attachments` with `X-Atlassian-Token: no-check`.
|
|
47
|
+
11. **Report** - `Created {KEY}: https://{host}/browse/{KEY}` + which post-steps ran.
|
|
48
|
+
|
|
49
|
+
## Error paths
|
|
50
|
+
|
|
51
|
+
401 token → Save Flow or abort (nothing created); mining/createmeta 403 → standard-template defaults + reactive 400 handling; zero sampled issues → skip mining, AC-derived test-scenario skeleton, note in preview; no board/active sprint → backlog implied, say so; Figma/Swagger failure → degrade (link-only or omit), never block; create 5xx → one retry then abort keeping the draft file; post-create failure → warn + continue.
|
|
@@ -98,6 +98,7 @@ Utility Commands (dash form on Copilot, colon form on Claude Code):
|
|
|
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
100
|
/multi-agent:review Review current diff only
|
|
101
|
+
/multi-agent:generate ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + preview + approval)
|
|
101
102
|
/multi-agent:sync Sync ecosystem (Claude + Copilot + website + remote-control)
|
|
102
103
|
/multi-agent:setup Keychain tokens + Git identity + language onboarding
|
|
103
104
|
/multi-agent:language [en|tr] Show or set prompt language
|
|
@@ -233,6 +234,7 @@ Utility Komutları:
|
|
|
233
234
|
/multi-agent:purge Worktree + log'lar - tam reset (çift onay)
|
|
234
235
|
/multi-agent:channels Multi-channel rapor gönder (Jira/Confluence/Wiki/PR)
|
|
235
236
|
/multi-agent:review Sadece mevcut diff'i review et
|
|
237
|
+
/multi-agent:generate ["açıklama"] [figma-url] [swagger-url] Takım standartlarına uygun Jira Task/Bug/Story oluştur (tip sorar + önizleme + onay)
|
|
236
238
|
/multi-agent:sync Ekosistemi senkronize et
|
|
237
239
|
/multi-agent:setup Keychain token + Git kimliği + dil onboarding
|
|
238
240
|
/multi-agent:language [en|tr] Prompt dilini göster veya ayarla
|
|
@@ -33,7 +33,7 @@ Run all steps automatically:
|
|
|
33
33
|
Step 0: FIGMA_SYNC (opt-in) pipeline/scripts/sync-figma-source.sh
|
|
34
34
|
-- incremental pull from upstream if figmaSource.path is set
|
|
35
35
|
Step 1: DETECT Compare timestamps, find stale targets
|
|
36
|
-
Step 2: COPILOT Claude Code -> Copilot CLI (instructions +
|
|
36
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 37 sub-command skills)
|
|
37
37
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
|
|
38
38
|
Step 4: WEBSITE Version + phase/model counts -> {website-host} (i18n + projects.ts)
|
|
39
39
|
Step 5: REMOTE Pipeline references -> remote-control README
|
|
@@ -158,14 +158,14 @@ When invoked with the `release` argument:
|
|
|
158
158
|
|-------------|-------------|
|
|
159
159
|
| `~/.claude/commands/multi-agent/{cmd}.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
|
|
160
160
|
|
|
161
|
-
**
|
|
161
|
+
**36 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
162
162
|
|
|
163
163
|
```
|
|
164
164
|
analysis, analysis-resolve, autopilot, build-optimize, channels, delete, dev,
|
|
165
165
|
dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
|
|
166
|
-
help, issue, jira, kill, language, local,
|
|
167
|
-
prune-logs, purge, refactor, resume, review,
|
|
168
|
-
sync, test, update
|
|
166
|
+
generate, help, issue, jira, kill, language, local,
|
|
167
|
+
local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review,
|
|
168
|
+
scan, search, setup, stack, status, sync, test, update
|
|
169
169
|
```
|
|
170
170
|
|
|
171
171
|
**NOT synced**: `refs/*` - Lazy-load references, Claude Code specific
|
|
@@ -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
|
+
**223 skills** across 5 groups.
|
|
7
7
|
|
|
8
8
|
| Group | Name | Platform | Description |
|
|
9
9
|
|-------|------|----------|-------------|
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
| external | `mapkit-location` | - | Implement, review, or improve maps and location features in iOS/macOS apps using MapKit and CoreLocation. Use when working with Map views, a |
|
|
122
122
|
| external | `metrickit-diagnostics` | - | Collect and analyze on-device performance metrics and crash diagnostics using MetricKit. Use when setting up MXMetricManager, handling MXMet |
|
|
123
123
|
| external | `monorepo-architect` | - | Expert in monorepo architecture, build systems, and dependency management at scale. Masters Nx, Turborepo, Bazel, and Lerna for efficient mu |
|
|
124
|
-
| core | `multi-agent` | - | Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (
|
|
124
|
+
| core | `multi-agent` | - | Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable |
|
|
125
125
|
| core | `multi-agent-analysis` | - | Standalone feature-spec analysis (v3 template). Platform-agnostic concept layer with repo-driven convention extraction and per-platform Pass |
|
|
126
126
|
| core | `multi-agent-analysis-resolve` | - | Resolve the Section 20 Risks and Open Questions of an analysis v3 document one row at a time. Proposes up to 3 source-labeled answer candida |
|
|
127
127
|
| core | `multi-agent-autopilot` | - | Launch any task in autopilot mode: skips every confirmation, runs end-to-end autonomously. |
|
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
| core | `multi-agent-diff-explain` | - | Map Phase 4 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
|
|
136
136
|
| core | `multi-agent-finish` | - | Continue already-done LOCAL work through the pipeline tail: Review → Build+Test → Commit/PR → Report (technical analysis + Jira test-scenari |
|
|
137
137
|
| core | `multi-agent-garbage-collect` | - | Sweep leftover /tmp scratch (picker state, review diffs, channel payloads, analysis drafts) from past runs. Dry-run first; confirms before d |
|
|
138
|
+
| core | `multi-agent-generate` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
|
|
138
139
|
| core | `multi-agent-help` | - | Multi-agent pipeline usage guide - renders in EN or TR per prefs.global.outputLanguage (falls back to promptLanguage for backward compatib |
|
|
139
140
|
| core | `multi-agent-issue` | - | List unassigned GitHub issues, pick one, auto-assign, and launch the multi-agent pipeline. |
|
|
140
141
|
| core | `multi-agent-jira` | - | List open Jira issues, pick one, and launch the multi-agent pipeline. |
|
|
@@ -148,7 +149,7 @@
|
|
|
148
149
|
| core | `multi-agent-purge` | - | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. |
|
|
149
150
|
| core | `multi-agent-refactor` | - | Analyse the project, score it, draft an improvement plan, take approval, develop, then ask whether to sync. |
|
|
150
151
|
| core | `multi-agent-resume` | - | Resume a stopped or failed task from the phase where it left off. |
|
|
151
|
-
| core | `multi-agent-review` | - | Run parallel review on the current branch's diff: 2 models on Claude Code (
|
|
152
|
+
| 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 |
|
|
152
153
|
| core | `multi-agent-scan` | - | Skill security scan: walks local skill directories against a tiered pattern catalog. |
|
|
153
154
|
| 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. |
|
|
154
155
|
| core | `multi-agent-setup` | - | First-run setup wizard: keychain token discovery, Git Identity onboarding, and pipeline preparation. |
|