@mmerterden/multi-agent-pipeline 10.8.0 → 10.12.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 (49) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/README.md +3 -1
  3. package/docs/engineering.md +76 -0
  4. package/docs/features.md +40 -36
  5. package/package.json +1 -1
  6. package/pipeline/commands/multi-agent/channels.md +42 -6
  7. package/pipeline/commands/multi-agent/finish.md +15 -6
  8. package/pipeline/commands/multi-agent/generate-bug.md +33 -0
  9. package/pipeline/commands/multi-agent/generate-task.md +33 -0
  10. package/pipeline/commands/multi-agent/help.md +12 -0
  11. package/pipeline/commands/multi-agent/manual-test.md +9 -2
  12. package/pipeline/commands/multi-agent/refs/channels/pr.md +1 -1
  13. package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +7 -6
  14. package/pipeline/commands/multi-agent/refs/generate-issue.md +197 -0
  15. package/pipeline/commands/multi-agent/refs/keychain.md +12 -0
  16. package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +40 -2
  17. package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +12 -0
  18. package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +4 -23
  19. package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +6 -1
  20. package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +5 -1
  21. package/pipeline/commands/multi-agent/refs/progress-contract.md +1 -0
  22. package/pipeline/commands/multi-agent/refs/tracker-contract.md +56 -13
  23. package/pipeline/commands/multi-agent/resume.md +6 -2
  24. package/pipeline/commands/multi-agent/sync.md +5 -5
  25. package/pipeline/commands/multi-agent.md +4 -0
  26. package/pipeline/lib/figma-mcp-refresh.sh +79 -0
  27. package/pipeline/preferences-template.json +2 -1
  28. package/pipeline/schemas/prefs.schema.json +35 -0
  29. package/pipeline/schemas/token-budget.json +7 -7
  30. package/pipeline/scripts/README.md +1 -0
  31. package/pipeline/scripts/fixtures/install-layout.tsv +6 -6
  32. package/pipeline/scripts/phase-tracker.sh +134 -22
  33. package/pipeline/scripts/smoke-channels-approval-gate.sh +60 -0
  34. package/pipeline/scripts/smoke-generate-issue.sh +114 -0
  35. package/pipeline/scripts/smoke-phase-tracker.sh +69 -0
  36. package/pipeline/scripts/smoke-progress-contract.sh +9 -0
  37. package/pipeline/scripts/smoke-tasklist-ordering.sh +1 -0
  38. package/pipeline/scripts/smoke-token-preflight.sh +82 -0
  39. package/pipeline/scripts/smoke-tracker-contract.sh +62 -0
  40. package/pipeline/scripts/smoke-update-check.sh +122 -0
  41. package/pipeline/scripts/update-check.sh +82 -0
  42. package/pipeline/skills/.skills-index.json +22 -4
  43. package/pipeline/skills/shared/core/multi-agent/SKILL.md +2 -1
  44. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +4 -2
  45. package/pipeline/skills/shared/core/multi-agent-generate-bug/SKILL.md +39 -0
  46. package/pipeline/skills/shared/core/multi-agent-generate-task/SKILL.md +39 -0
  47. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +4 -0
  48. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +5 -5
  49. package/pipeline/skills/skills-index.md +5 -3
@@ -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 ══"
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env bash
2
+ # smoke-update-check.sh
3
+ #
4
+ # Verifies the Phase 0 Step 0.6 advisory update-check contract:
5
+ # 1. update-check.sh exists, parses (bash -n), and honors the advisory contract
6
+ # offline: exit 0 + empty stdout when the registry is unreachable
7
+ # 2. Cached path: fresh cache short-circuits without a network call
8
+ # 3. Newer latest -> "<local>|<latest>"; same or older latest -> silent
9
+ # 4. prefs.schema.json exposes updateCheck.{enabled,ttlHours,autoUpdate}
10
+ # with the documented defaults (enabled=true, autoUpdate=false)
11
+ # 5. phase-0-init.md documents Step 0.6 with the autopilot log-only rule
12
+ #
13
+ # Exit 0 = all pass, 1 = any failure.
14
+
15
+ set -euo pipefail
16
+
17
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
+ SCRIPT="$ROOT/pipeline/scripts/update-check.sh"
19
+ PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
20
+ PHASE0_DOC="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-0-init.md"
21
+
22
+ pass=0
23
+ fail=0
24
+ failures=()
25
+ record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
26
+ record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
27
+
28
+ printf '→ smoke-update-check: Phase 0 Step 0.6 advisory contract\n'
29
+
30
+ tmpdir=$(mktemp -d)
31
+ trap 'rm -rf "$tmpdir"' EXIT
32
+ CACHE="$tmpdir/update-check-cache"
33
+
34
+ # 1. Script parses
35
+ if bash -n "$SCRIPT" 2>/dev/null; then
36
+ record_pass "update-check.sh parses (bash -n)"
37
+ else
38
+ record_fail "update-check.sh has syntax errors"
39
+ fi
40
+
41
+ now=$(date +%s)
42
+
43
+ # 2. Fresh cache with newer latest -> reports, no network needed
44
+ printf '%s|99.0.0\n' "$now" > "$CACHE"
45
+ out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
46
+ if [ "$rc" -eq 0 ] && [ "$out" = "10.0.0|99.0.0" ]; then
47
+ record_pass "newer cached latest -> '<local>|<latest>' (exit 0)"
48
+ else
49
+ record_fail "newer cached latest should print '10.0.0|99.0.0' (got '$out', rc=$rc)"
50
+ fi
51
+
52
+ # 3. Same version -> silent
53
+ printf '%s|10.0.0\n' "$now" > "$CACHE"
54
+ out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
55
+ if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
56
+ record_pass "same version -> silent"
57
+ else
58
+ record_fail "same version should be silent (got '$out', rc=$rc)"
59
+ fi
60
+
61
+ # 3b. Local ahead of registry (dev machine) -> silent
62
+ printf '%s|10.0.0\n' "$now" > "$CACHE"
63
+ out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.1.0 2>/dev/null); rc=$?
64
+ if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
65
+ record_pass "local ahead of registry -> silent (no downgrade prompt)"
66
+ else
67
+ record_fail "local-ahead should be silent (got '$out', rc=$rc)"
68
+ fi
69
+
70
+ # 3c. Offline + stale cache -> silent exit 0 (advisory: never blocks)
71
+ printf '0|10.0.0\n' > "$CACHE"
72
+ out=$(UPDATE_CHECK_CACHE="$CACHE" http_proxy="http://127.0.0.1:1" https_proxy="http://127.0.0.1:1" \
73
+ bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
74
+ if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
75
+ record_pass "offline + stale cache -> silent exit 0"
76
+ else
77
+ record_fail "offline should be a silent no-op (got '$out', rc=$rc)"
78
+ fi
79
+
80
+ # 4. Prefs schema knobs + defaults
81
+ for prop in enabled ttlHours autoUpdate; do
82
+ if jq -e ".properties.global.properties.updateCheck.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
83
+ record_pass "prefs schema exposes updateCheck.${prop}"
84
+ else
85
+ record_fail "prefs schema missing updateCheck.${prop}"
86
+ fi
87
+ done
88
+ if jq -e '.properties.global.properties.updateCheck.properties.enabled.default == true' "$PREFS_SCHEMA" >/dev/null 2>&1; then
89
+ record_pass "updateCheck.enabled defaults to true (notify-only, bounded cost)"
90
+ else
91
+ record_fail "updateCheck.enabled must default to true"
92
+ fi
93
+ if jq -e '.properties.global.properties.updateCheck.properties.autoUpdate | has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
94
+ record_pass "updateCheck.autoUpdate defaults to false (no silent self-modify)"
95
+ else
96
+ record_fail "updateCheck.autoUpdate must default to false"
97
+ fi
98
+
99
+ # 5. Phase 0 doc wiring
100
+ if grep -qF "Step 0.6 - Update check" "$PHASE0_DOC"; then
101
+ record_pass "phase-0-init.md documents Step 0.6"
102
+ else
103
+ record_fail "phase-0-init.md missing Step 0.6"
104
+ fi
105
+ if grep -qF "update-check.sh" "$PHASE0_DOC"; then
106
+ record_pass "phase-0-init.md invokes update-check.sh"
107
+ else
108
+ record_fail "phase-0-init.md must invoke update-check.sh"
109
+ fi
110
+ if grep -qF "log-only" "$PHASE0_DOC" && grep -qF "never ask (zero-interaction contract)" "$PHASE0_DOC"; then
111
+ record_pass "phase-0-init.md states the autopilot log-only rule"
112
+ else
113
+ record_fail "phase-0-init.md must state autopilot never asks (log-only)"
114
+ fi
115
+
116
+ printf '\n══ update-check smoke: %d passed, %d failed ══\n' "$pass" "$fail"
117
+ if [ "$fail" -gt 0 ]; then
118
+ printf '\nFailures:\n'
119
+ for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
120
+ exit 1
121
+ fi
122
+ exit 0
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bash
2
+ # update-check.sh - cached advisory version check (Phase 0 Step 0.6)
3
+ #
4
+ # Compares the locally installed pipeline version against the npm registry's
5
+ # dist-tags.latest. Cached with a TTL so at most one network call per TTL
6
+ # window; the call is bounded by a short timeout and every failure path is
7
+ # silent - this script NEVER blocks or fails the pipeline.
8
+ #
9
+ # stdout: "<local>|<latest>" when a newer version exists, nothing otherwise.
10
+ # Exit code: always 0 (advisory contract).
11
+ #
12
+ # Usage:
13
+ # bash pipeline/scripts/update-check.sh # auto-detect local version
14
+ # bash pipeline/scripts/update-check.sh --local 10.8.0 # explicit local version
15
+ # bash pipeline/scripts/update-check.sh --ttl-hours 24 # cache window (default 24)
16
+ # bash pipeline/scripts/update-check.sh --force # ignore cache
17
+ #
18
+ # Cache file: ~/.claude/logs/multi-agent/.update-check ("epoch|latest").
19
+ # Registry read is a plain curl - never `npm view` (a user-level .npmrc scope
20
+ # mapping can silently reroute npm to a different registry; curl cannot lie).
21
+
22
+ set -euo pipefail
23
+
24
+ PKG="@mmerterden/multi-agent-pipeline"
25
+ REGISTRY_URL="https://registry.npmjs.org/${PKG/\//%2F}"
26
+ CACHE_FILE="${UPDATE_CHECK_CACHE:-$HOME/.claude/logs/multi-agent/.update-check}"
27
+ TTL_HOURS=24
28
+ LOCAL_VERSION=""
29
+ FORCE=0
30
+
31
+ while [ $# -gt 0 ]; do
32
+ case "$1" in
33
+ --local) LOCAL_VERSION="${2:-}"; shift 2 ;;
34
+ --ttl-hours) TTL_HOURS="${2:-24}"; shift 2 ;;
35
+ --force) FORCE=1; shift ;;
36
+ *) shift ;;
37
+ esac
38
+ done
39
+
40
+ # Local version: explicit arg, else read from the pipeline repo clone.
41
+ if [ -z "$LOCAL_VERSION" ]; then
42
+ for candidate in "$HOME/multi-agent-pipeline" "$HOME/dev/multi-agent-pipeline" "$HOME/projects/multi-agent-pipeline"; do
43
+ if [ -f "$candidate/package.json" ]; then
44
+ LOCAL_VERSION=$(node -p "require('$candidate/package.json').version" 2>/dev/null || true)
45
+ [ -n "$LOCAL_VERSION" ] && break
46
+ fi
47
+ done
48
+ fi
49
+ [ -z "$LOCAL_VERSION" ] && exit 0 # cannot determine local version -> silent no-op
50
+
51
+ now=$(date +%s)
52
+ latest=""
53
+
54
+ # Fresh cache?
55
+ if [ "$FORCE" -eq 0 ] && [ -f "$CACHE_FILE" ]; then
56
+ cached_epoch=$(cut -d'|' -f1 "$CACHE_FILE" 2>/dev/null || echo 0)
57
+ cached_latest=$(cut -d'|' -f2 "$CACHE_FILE" 2>/dev/null || echo "")
58
+ case "$cached_epoch" in (*[!0-9]*|"") cached_epoch=0 ;; esac
59
+ if [ $((now - cached_epoch)) -lt $((TTL_HOURS * 3600)) ] && [ -n "$cached_latest" ]; then
60
+ latest="$cached_latest"
61
+ fi
62
+ fi
63
+
64
+ # Stale or missing cache -> one bounded registry call (silent on any failure).
65
+ if [ -z "$latest" ]; then
66
+ latest=$(curl -sm 3 "$REGISTRY_URL" 2>/dev/null \
67
+ | { command -v jq >/dev/null 2>&1 && jq -r '."dist-tags".latest // empty' \
68
+ || sed -n 's/.*"latest":"\([^"]*\)".*/\1/p'; } | head -1) || true
69
+ [ -z "$latest" ] && exit 0
70
+ mkdir -p "$(dirname "$CACHE_FILE")" 2>/dev/null || exit 0
71
+ printf '%s|%s\n' "$now" "$latest" > "$CACHE_FILE" 2>/dev/null || true
72
+ fi
73
+
74
+ [ "$latest" = "$LOCAL_VERSION" ] && exit 0
75
+
76
+ # Update available only when latest sorts strictly ABOVE local (a dev machine
77
+ # running ahead of the registry must not see an "update" prompt).
78
+ highest=$(printf '%s\n%s\n' "$LOCAL_VERSION" "$latest" | sort -t. -k1,1n -k2,2n -k3,3n | tail -1)
79
+ if [ "$highest" = "$latest" ]; then
80
+ printf '%s|%s\n' "$LOCAL_VERSION" "$latest"
81
+ fi
82
+ exit 0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-02T18:42:58.207Z",
4
- "skillCount": 222,
3
+ "generatedAt": "2026-07-06T11:38:47.307Z",
4
+ "skillCount": 224,
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 (Opus + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md.",
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,24 @@
1155
1155
  "triggerPaths": [],
1156
1156
  "relativePath": "shared/core/multi-agent-garbage-collect/SKILL.md"
1157
1157
  },
1158
+ {
1159
+ "name": "multi-agent-generate-bug",
1160
+ "description": "Create a standards-compliant Jira Bug: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create.",
1161
+ "platform": null,
1162
+ "group": "core",
1163
+ "triggerKeywords": [],
1164
+ "triggerPaths": [],
1165
+ "relativePath": "shared/core/multi-agent-generate-bug/SKILL.md"
1166
+ },
1167
+ {
1168
+ "name": "multi-agent-generate-task",
1169
+ "description": "Create a standards-compliant Jira Task: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create.",
1170
+ "platform": null,
1171
+ "group": "core",
1172
+ "triggerKeywords": [],
1173
+ "triggerPaths": [],
1174
+ "relativePath": "shared/core/multi-agent-generate-task/SKILL.md"
1175
+ },
1158
1176
  {
1159
1177
  "name": "multi-agent-help",
1160
1178
  "description": "Multi-agent pipeline usage guide - renders in EN or TR per prefs.global.outputLanguage (falls back to promptLanguage for backward compatibility).",
@@ -1274,7 +1292,7 @@
1274
1292
  },
1275
1293
  {
1276
1294
  "name": "multi-agent-review",
1277
- "description": "Run parallel review on the current branch's diff: 2 models on Claude Code (Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Review-only slice of the pipeline.",
1295
+ "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
1296
  "platform": null,
1279
1297
  "group": "core",
1280
1298
  "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
- - `--dev` modes (`multi-agent-dev`, `multi-agent-dev-autopilot`, `multi-agent-dev-local`, `multi-agent-dev-local-autopilot`): 0 → 3 → 5 → 6 → 7 (phases 1/2/4 are NOT TaskCreate'd at all)
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. **Channel dispatch** - parallel adapter calls: 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).
45
- 7. **Summary** - per-adapter status line, persist selections to prefs.
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,39 @@
1
+ ---
2
+ name: multi-agent-generate-bug
3
+ language: en
4
+ description: "Create a standards-compliant Jira Bug: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create."
5
+ user-invocable: true
6
+ argument-hint: "[\"<free-text description>\"] [figma-url] - both optional; pasted logs/screens in the text land in Steps to Reproduce / Environment"
7
+ ---
8
+
9
+ # multi-agent generate-bug - Standards-Compliant Jira Bug Creator
10
+
11
+ **Input**: $ARGUMENTS
12
+
13
+ Creates exactly one Jira **Bug**, and only after explicit approval. No branches, no commits, no worktrees. Profile: `ISSUE_TYPE=Bug`; default description sections: Steps to Reproduce, Expected Result, Actual Result, Environment, Design Reference (only when a Figma URL is given), Notes.
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
+ ## Steps
18
+
19
+ 1. **Account + token** - pick the Jira account (auto-select when single), then:
20
+ ```bash
21
+ TOKEN=$(~/.copilot/lib/credential-store.sh get "$ACCOUNT_JIRA_TOKEN_KEY")
22
+ ```
23
+ Missing/expired (401) → Token Save Flow; user skips → abort, nothing created.
24
+ 2. **Project key** - `figmaConfig.jira.projectKey` → `prefs.global.defaultJiraKey` → fetch `GET /rest/api/2/project`, ask, cache the choice.
25
+ 3. **Parse input** - `figma.com` URL in `$ARGUMENTS` → `FIGMA_URL` (node-id `-` → `:`); the rest is `FREE_TEXT`. Logs, stack traces, and device/OS mentions map into Steps to Reproduce / Environment. Both empty → ask for a description. Figma URL is always optional.
26
+ 4. **Convention mining + field discovery + sprint** (read-only GETs):
27
+ - Sample: `GET /rest/api/2/search?jql=project={KEY} AND issuetype=Bug ORDER BY created DESC&fields=summary,description,labels,components,priority,fixVersions&maxResults=30`. Extract summary prefix pattern (>= 40% threshold), dominant description heading set (>= 50% overrides the profile sections), top-5 labels/components, modal priority, epic usage rate.
28
+ - `GET /rest/api/2/issue/createmeta?projectKeys={KEY}&issuetypeNames=Bug&expand=projects.issuetypes.fields` (404/empty → paged DC endpoint fallback). Required custom fields → step 6 questions with allowedValues options. Detect Sprint/Epic/Team fields generically via `schema.custom` ids.
29
+ - `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.
30
+ 5. **Figma context** (only when `FIGMA_URL` set) - 3-tier chain (MCP → REST figma_pat → user screenshot); standalone command, MCP allowed here. Figma failures never block issue creation.
31
+ 6. **Draft + clarifying questions** - compose summary (`{minedPrefix} {title}`, 255 trunc) + description (mined heading set or profile sections, Jira wiki markup `h3.`, 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, missing Steps to Reproduce / Environment. Never invent repro steps or environments the user did not supply.
32
+ 7. **Full preview + approval gate (never skipped)** - render the complete issue (all fields + full description + attachment plan, screenshot default off). Ask: `Approve` / `Edit` (apply → re-render → re-ask, loop) / `Cancel` (nothing created). No flag or mode bypasses this gate.
33
+ 8. **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.
34
+ 9. **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`; screenshot opt-in → `POST /rest/api/2/issue/{KEY}/attachments` with `X-Atlassian-Token: no-check`.
35
+ 10. **Report** - `Created {KEY}: https://{host}/browse/{KEY}` + which post-steps ran.
36
+
37
+ ## Error paths
38
+
39
+ 401 token → Save Flow or abort (nothing created); mining/createmeta 403 → profile defaults + reactive 400 handling; zero sampled issues → skip mining, note in preview; no board/active sprint → backlog implied, say so; create 5xx → one retry then abort keeping the draft file; post-create failure → warn + continue.
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: multi-agent-generate-task
3
+ language: en
4
+ description: "Create a standards-compliant Jira Task: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create."
5
+ user-invocable: true
6
+ argument-hint: "[\"<free-text description>\"] [figma-url] - both optional, asked interactively when missing"
7
+ ---
8
+
9
+ # multi-agent generate-task - Standards-Compliant Jira Task Creator
10
+
11
+ **Input**: $ARGUMENTS
12
+
13
+ Creates exactly one Jira **Task**, and only after explicit approval. No branches, no commits, no worktrees. Profile: `ISSUE_TYPE=Task`; default description sections: Goal, Scope, Acceptance Criteria, Design Reference (only when a Figma URL is given), Notes.
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
+ ## Steps
18
+
19
+ 1. **Account + token** - pick the Jira account (auto-select when single), then:
20
+ ```bash
21
+ TOKEN=$(~/.copilot/lib/credential-store.sh get "$ACCOUNT_JIRA_TOKEN_KEY")
22
+ ```
23
+ Missing/expired (401) → Token Save Flow; user skips → abort, nothing created.
24
+ 2. **Project key** - `figmaConfig.jira.projectKey` → `prefs.global.defaultJiraKey` → fetch `GET /rest/api/2/project`, ask, cache the choice.
25
+ 3. **Parse input** - `figma.com` URL in `$ARGUMENTS` → `FIGMA_URL` (node-id `-` → `:`); the rest is `FREE_TEXT`. Both empty → ask for a description. Figma URL is always optional.
26
+ 4. **Convention mining + field discovery + sprint** (read-only GETs):
27
+ - Sample: `GET /rest/api/2/search?jql=project={KEY} AND issuetype=Task ORDER BY created DESC&fields=summary,description,labels,components,priority,fixVersions&maxResults=30`. Extract summary prefix pattern (>= 40% threshold), dominant description heading set (>= 50% overrides the profile sections), top-5 labels/components, modal priority, epic usage rate.
28
+ - `GET /rest/api/2/issue/createmeta?projectKeys={KEY}&issuetypeNames=Task&expand=projects.issuetypes.fields` (404/empty → paged DC endpoint fallback). Required custom fields → step 6 questions with allowedValues options. Detect Sprint/Epic/Team fields generically via `schema.custom` ids.
29
+ - `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.
30
+ 5. **Figma context** (only when `FIGMA_URL` set) - 3-tier chain (MCP → REST figma_pat → user screenshot); standalone command, MCP allowed here. Figma failures never block issue creation.
31
+ 6. **Draft + clarifying questions** - compose summary (`{minedPrefix} {title}`, 255 trunc) + description (mined heading set or profile sections, Jira wiki markup `h3.`, 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. Never invent content the user did not supply.
32
+ 7. **Full preview + approval gate (never skipped)** - render the complete issue (all fields + full description + attachment plan, screenshot default off). Ask: `Approve` / `Edit` (apply → re-render → re-ask, loop) / `Cancel` (nothing created). No flag or mode bypasses this gate.
33
+ 8. **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.
34
+ 9. **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`; screenshot opt-in → `POST /rest/api/2/issue/{KEY}/attachments` with `X-Atlassian-Token: no-check`.
35
+ 10. **Report** - `Created {KEY}: https://{host}/browse/{KEY}` + which post-steps ran.
36
+
37
+ ## Error paths
38
+
39
+ 401 token → Save Flow or abort (nothing created); mining/createmeta 403 → profile defaults + reactive 400 handling; zero sampled issues → skip mining, note in preview; no board/active sprint → backlog implied, say so; create 5xx → one retry then abort keeping the draft file; post-create failure → warn + continue.
@@ -98,6 +98,8 @@ 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-task ["desc"] [figma-url] Create a Jira Task matching team conventions (preview + approval)
102
+ /multi-agent:generate-bug ["desc"] [figma-url] Create a Jira Bug matching team conventions (preview + approval)
101
103
  /multi-agent:sync Sync ecosystem (Claude + Copilot + website + remote-control)
102
104
  /multi-agent:setup Keychain tokens + Git identity + language onboarding
103
105
  /multi-agent:language [en|tr] Show or set prompt language
@@ -233,6 +235,8 @@ Utility Komutları:
233
235
  /multi-agent:purge Worktree + log'lar - tam reset (çift onay)
234
236
  /multi-agent:channels Multi-channel rapor gönder (Jira/Confluence/Wiki/PR)
235
237
  /multi-agent:review Sadece mevcut diff'i review et
238
+ /multi-agent:generate-task ["açıklama"] [figma-url] Takım standartlarına uygun Jira Task oluştur (önizleme + onay)
239
+ /multi-agent:generate-bug ["açıklama"] [figma-url] Takım standartlarına uygun Jira Bug oluştur (önizleme + onay)
236
240
  /multi-agent:sync Ekosistemi senkronize et
237
241
  /multi-agent:setup Keychain token + Git kimliği + dil onboarding
238
242
  /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 + 35 sub-command skills)
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
- **35 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
161
+ **37 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, local-autopilot, log, manual-test,
167
- prune-logs, purge, refactor, resume, review, scan, search, setup, stack, status,
168
- sync, test, update
166
+ generate-bug, generate-task, 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
- **222 skills** across 5 groups.
6
+ **224 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 (Opus + |
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,8 @@
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-bug` | - | Create a standards-compliant Jira Bug: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create. |
139
+ | core | `multi-agent-generate-task` | - | Create a standards-compliant Jira Task: mines project conventions, drafts in outputLanguage, full preview + explicit approval before create. |
138
140
  | 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
141
  | core | `multi-agent-issue` | - | List unassigned GitHub issues, pick one, auto-assign, and launch the multi-agent pipeline. |
140
142
  | core | `multi-agent-jira` | - | List open Jira issues, pick one, and launch the multi-agent pipeline. |
@@ -148,7 +150,7 @@
148
150
  | core | `multi-agent-purge` | - | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. |
149
151
  | core | `multi-agent-refactor` | - | Analyse the project, score it, draft an improvement plan, take approval, develop, then ask whether to sync. |
150
152
  | 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 (Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). Re |
153
+ | 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
154
  | core | `multi-agent-scan` | - | Skill security scan: walks local skill directories against a tiered pattern catalog. |
153
155
  | 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
156
  | core | `multi-agent-setup` | - | First-run setup wizard: keychain token discovery, Git Identity onboarding, and pipeline preparation. |