@mmerterden/multi-agent-pipeline 14.2.2 → 15.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.
Files changed (122) hide show
  1. package/CHANGELOG.md +76 -6
  2. package/README.md +15 -8
  3. package/README.tr.md +15 -8
  4. package/docs/FIGMA_PIPELINE.md +3 -3
  5. package/docs/adr/0006-skills-core-external-split.md +1 -1
  6. package/docs/adr/0009-claude-stack-skills-plugin-only.md +31 -0
  7. package/docs/adr/README.md +1 -0
  8. package/docs/architecture.md +7 -7
  9. package/docs/ecosystem.md +28 -28
  10. package/docs/features.md +5 -5
  11. package/index.js +2 -0
  12. package/install/_codex-agents.mjs +11 -2
  13. package/install/_common.mjs +65 -1
  14. package/install/_dev-only-files.mjs +0 -1
  15. package/install/_platform-filter.mjs +73 -7
  16. package/install/_plugin-skills.mjs +19 -8
  17. package/install/claude.mjs +144 -59
  18. package/install/codex.mjs +28 -3
  19. package/install/copilot.mjs +36 -11
  20. package/install/index.mjs +6 -2
  21. package/install/templates/codex-instructions.md +1 -1
  22. package/install/templates/copilot-instructions.md +3 -3
  23. package/package.json +1 -2
  24. package/pipeline/commands/multi-agent/SKILL.md +2 -0
  25. package/pipeline/commands/multi-agent/analysis/SKILL.md +3 -3
  26. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -2
  27. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +9 -9
  28. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  29. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +186 -0
  30. package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
  31. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
  32. package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
  33. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
  34. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
  35. package/pipeline/commands/multi-agent/help/SKILL.md +19 -4
  36. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +2 -2
  37. package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
  38. package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +81 -0
  39. package/pipeline/commands/multi-agent/resume/SKILL.md +1 -1
  40. package/pipeline/commands/multi-agent/{ship → resume-local}/SKILL.md +8 -8
  41. package/pipeline/commands/multi-agent/setup/SKILL.md +5 -5
  42. package/pipeline/commands/multi-agent/stack/SKILL.md +55 -43
  43. package/pipeline/commands/multi-agent/store-ready/SKILL.md +3 -3
  44. package/pipeline/commands/multi-agent/sync/SKILL.md +18 -11
  45. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +1 -1
  46. package/pipeline/commands/multi-agent/uninstall/SKILL.md +2 -0
  47. package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
  48. package/pipeline/lib/issue-fetcher.sh +1 -1
  49. package/pipeline/lib/parse-complaints.sh +306 -0
  50. package/pipeline/multi-agent-refs/channels/wiki.md +3 -3
  51. package/pipeline/multi-agent-refs/complaint-analysis-template.md +99 -0
  52. package/pipeline/multi-agent-refs/component-dispatch.md +6 -6
  53. package/pipeline/multi-agent-refs/cross-cli-contract.md +16 -16
  54. package/pipeline/multi-agent-refs/features/external-context-injection.md +1 -1
  55. package/pipeline/multi-agent-refs/features/stack-skill-routing.md +5 -5
  56. package/pipeline/multi-agent-refs/generate-issue.md +1 -1
  57. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  58. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
  59. package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +7 -7
  60. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
  61. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +3 -3
  62. package/pipeline/multi-agent-refs/phases/phase-4-review.md +12 -12
  63. package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -1
  64. package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
  65. package/pipeline/multi-agent-refs/wiki-capture.md +2 -2
  66. package/pipeline/preferences-template.json +13 -5
  67. package/pipeline/rules/figma-pipeline.md +2 -2
  68. package/pipeline/schemas/agent-state.schema.json +1 -1
  69. package/pipeline/schemas/complaint-analysis-spec.schema.json +216 -0
  70. package/pipeline/schemas/migrations/prefs-2.5.0-to-2.6.0.mjs +46 -0
  71. package/pipeline/schemas/prefs.schema.json +276 -66
  72. package/pipeline/schemas/token-budget.json +2 -2
  73. package/pipeline/scripts/_stack-routing.mjs +79 -0
  74. package/pipeline/scripts/audit-log-rotate.sh +4 -1
  75. package/pipeline/scripts/build-skills-index.mjs +11 -0
  76. package/pipeline/scripts/build-stack-plugins.mjs +28 -60
  77. package/pipeline/scripts/check-derived-drift.mjs +52 -28
  78. package/pipeline/scripts/gc-worktrees.sh +4 -1
  79. package/pipeline/scripts/gen-skills-index.mjs +1 -1
  80. package/pipeline/scripts/match-skills.mjs +8 -2
  81. package/pipeline/scripts/migrate-prefs.mjs +28 -20
  82. package/pipeline/scripts/phase-tracker.sh +13 -5
  83. package/pipeline/scripts/phase0-exit-gate.mjs +3 -2
  84. package/pipeline/scripts/run-aggregator.mjs +7 -2
  85. package/pipeline/scripts/scan-agent-config.sh +1 -1
  86. package/pipeline/scripts/skill-conformance.mjs +165 -30
  87. package/pipeline/scripts/smoke-cross-cli-behavior.sh +1 -1
  88. package/pipeline/scripts/test-gap-rules/android.json +25 -0
  89. package/pipeline/scripts/test-gap-rules/ios.json +34 -0
  90. package/pipeline/scripts/test-gap-rules/node.json +29 -0
  91. package/pipeline/scripts/test-gap-rules/python.json +25 -0
  92. package/pipeline/scripts/uninstall.mjs +158 -11
  93. package/pipeline/scripts/validate-complaint-doc.mjs +229 -0
  94. package/pipeline/scripts/validate-reviewer.mjs +9 -3
  95. package/pipeline/skills/.skill-manifest.json +156 -108
  96. package/pipeline/skills/.skills-index.json +449 -12
  97. package/pipeline/skills/shared/README.md +14 -10
  98. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  99. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  100. package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +49 -0
  101. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
  102. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  103. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
  104. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
  105. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -2
  106. package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +83 -0
  107. package/pipeline/skills/shared/core/{multi-agent-ship → multi-agent-resume-local}/SKILL.md +6 -6
  108. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +79 -22
  109. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +1 -1
  110. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -8
  111. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +1 -1
  112. package/pipeline/skills/shared/external/ios-coding-standard/modules/_TEMPLATE.yml +2 -2
  113. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +368 -33
  114. package/pipeline/skills/shared/external/ios-coding-standard/references/swiftlint.draft.yml +1 -2
  115. package/pipeline/skills/shared/external/ios-coding-standard/scripts/check_structure.py +765 -0
  116. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +75 -0
  117. package/pipeline/skills/shared/external/ios-module-structure/modules/_TEMPLATE.yml +131 -0
  118. package/pipeline/skills/shared/external/ios-module-structure/references/rules.yml +559 -0
  119. package/pipeline/skills/shared/external/ios-module-structure/scripts/check_structure.py +765 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +53 -10
  121. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +4 -3
  122. package/pipeline/skills/skills-index.md +7 -4
@@ -0,0 +1,306 @@
1
+ #!/bin/bash
2
+ #
3
+ # parse-complaints.sh
4
+ # Normalize a batch of customer complaints into the uniform JSON list the
5
+ # /multi-agent:complaint-analysis command consumes. Accepts a file export
6
+ # (csv / xlsx / txt / json) or pasted free text on stdin, extracts any
7
+ # transaction / conversation ids embedded in the text, and redacts common
8
+ # PII shapes before anything leaves this script. The raw input is never
9
+ # copied into pipeline state - only the redacted view is.
10
+ #
11
+ # Input forms (exactly one source is required):
12
+ # ./parse-complaints.sh --file <path> [--format csv|xlsx|txt|json|auto]
13
+ # ./parse-complaints.sh --stdin [--format text]
14
+ #
15
+ # Options:
16
+ # --no-redact keep complaint text verbatim (debugging only; the skill
17
+ # never passes this flag)
18
+ #
19
+ # Column mapping (file formats, case-insensitive header match):
20
+ # trxId <- trxId | trx | transaction id / transaction_id / transactionId
21
+ # convId <- convId | conversationId | x-conversationId
22
+ # date <- date | created | createdAt | timestamp
23
+ # platformHint <- platform | channel | os | device
24
+ # text <- comment | complaint | text | description | message, else the
25
+ # longest text column
26
+ #
27
+ # Free-text mode splits on blank lines (or numbered bullets when the paste is
28
+ # one block) and pre-fills ids per block using the same label set as
29
+ # context-link-extractor.sh GRAYLOG_RE (x-conversationId | conversationId |
30
+ # convId | trxId | trx | transaction id).
31
+ #
32
+ # Redaction (default ON, applied after id extraction so ids survive):
33
+ # email -> [REDACTED:email]
34
+ # 13-19 digit card-like runs -> [REDACTED:card]
35
+ # 11 digit national-id-like numbers -> [REDACTED:national-id]
36
+ # 9+ digit phone-like runs -> [REDACTED:phone]
37
+ # 6-char PNR-like tokens (A-Z0-9 mix)-> [REDACTED:pnr]
38
+ #
39
+ # Output (stdout, single JSON object):
40
+ # {
41
+ # "parsedAt": "<ISO8601>",
42
+ # "source": "<path>"|"stdin",
43
+ # "format": "csv|xlsx|txt|json|text",
44
+ # "complaints": [
45
+ # { "id": "C-01", "text": "...", "trxId": "..."|null,
46
+ # "convId": "..."|null, "date": "..."|null,
47
+ # "platformHint": "..."|null }
48
+ # ],
49
+ # "redacted": <bool>, "degraded": <bool>, "degradeReason": "..."|null
50
+ # }
51
+ #
52
+ # Exit codes:
53
+ # 0 success
54
+ # 4 bad usage (no source, unknown flag, unreadable file)
55
+ # 5 format degrade (xlsx requested but openpyxl is not installed; the
56
+ # degraded JSON on stdout tells the user to export as CSV and re-run)
57
+
58
+ set -euo pipefail
59
+
60
+ FILE=""
61
+ USE_STDIN="false"
62
+ FORMAT="auto"
63
+ REDACT="true"
64
+
65
+ while [ $# -gt 0 ]; do
66
+ case "$1" in
67
+ --file) FILE="$2"; shift 2 ;;
68
+ --stdin) USE_STDIN="true"; shift ;;
69
+ --format) FORMAT="$2"; shift 2 ;;
70
+ --no-redact) REDACT="false"; shift ;;
71
+ -h|--help)
72
+ echo "usage: $0 --file <path> [--format csv|xlsx|txt|json|auto] [--no-redact] | --stdin [--format text]" >&2
73
+ exit 4 ;;
74
+ *)
75
+ echo "ERR: unexpected arg $1" >&2; exit 4 ;;
76
+ esac
77
+ done
78
+
79
+ if [ -z "$FILE" ] && [ "$USE_STDIN" != "true" ]; then
80
+ echo "ERR: no source (pass --file <path> or --stdin)" >&2
81
+ exit 4
82
+ fi
83
+ if [ -n "$FILE" ] && [ "$USE_STDIN" = "true" ]; then
84
+ echo "ERR: pass either --file or --stdin, not both" >&2
85
+ exit 4
86
+ fi
87
+ if [ -n "$FILE" ] && [ ! -r "$FILE" ]; then
88
+ echo "ERR: file not readable: $FILE" >&2
89
+ exit 4
90
+ fi
91
+
92
+ if [ "$FORMAT" = "auto" ]; then
93
+ if [ "$USE_STDIN" = "true" ]; then
94
+ FORMAT="text"
95
+ else
96
+ case "$FILE" in
97
+ *.csv) FORMAT="csv" ;;
98
+ *.xlsx) FORMAT="xlsx" ;;
99
+ *.json) FORMAT="json" ;;
100
+ *.txt|*.md) FORMAT="txt" ;;
101
+ *)
102
+ echo "ERR: cannot infer format from extension; pass --format" >&2
103
+ exit 4 ;;
104
+ esac
105
+ fi
106
+ fi
107
+
108
+ case "$FORMAT" in
109
+ csv|xlsx|txt|json|text) : ;;
110
+ *) echo "ERR: unknown format $FORMAT" >&2; exit 4 ;;
111
+ esac
112
+
113
+ STDIN_PAYLOAD=""
114
+ if [ "$USE_STDIN" = "true" ]; then
115
+ STDIN_PAYLOAD=$(cat)
116
+ fi
117
+
118
+ PC_FILE="$FILE" PC_FORMAT="$FORMAT" PC_REDACT="$REDACT" PC_STDIN="$STDIN_PAYLOAD" \
119
+ python3 - <<'PY'
120
+ import csv, datetime, io, json, os, re, sys
121
+
122
+ fmt = os.environ["PC_FORMAT"]
123
+ path = os.environ.get("PC_FILE") or ""
124
+ redact_on = os.environ.get("PC_REDACT") == "true"
125
+
126
+ # Same label set as context-link-extractor.sh GRAYLOG_RE.
127
+ ID_LABEL = re.compile(
128
+ r"(?P<label>x-conversationId|conversationId|convId|trxId|trx|transaction[ _-]?id)"
129
+ r"\s*[:=#]?\s*(?P<value>[A-Za-z0-9][A-Za-z0-9._-]{5,63})",
130
+ re.IGNORECASE,
131
+ )
132
+
133
+ def extract_ids(text):
134
+ trx, conv = None, None
135
+ for m in ID_LABEL.finditer(text or ""):
136
+ label = m.group("label").lower()
137
+ value = m.group("value")
138
+ if "conv" in label:
139
+ conv = conv or value
140
+ else:
141
+ trx = trx or value
142
+ return trx, conv
143
+
144
+ # Order matters: card (13-19 digits, separators allowed) before national-id
145
+ # (exactly 11) before phone (9+); a 16-digit card must not survive as a
146
+ # "phone". PNR-like runs last so redacted placeholders are not re-matched.
147
+ REDACTIONS = [
148
+ (re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"), "[REDACTED:email]"),
149
+ (re.compile(r"\b\d(?:[ -]?\d){12,18}\b"), "[REDACTED:card]"),
150
+ (re.compile(r"\b\d{11}\b"), "[REDACTED:national-id]"),
151
+ (re.compile(r"(?<![\w.-])\+?\d(?:[ ()-]?\d){8,14}\b"), "[REDACTED:phone]"),
152
+ (re.compile(r"\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6}\b"), "[REDACTED:pnr]"),
153
+ ]
154
+
155
+ def redact(text):
156
+ if not redact_on:
157
+ return text
158
+ for rx, repl in REDACTIONS:
159
+ text = rx.sub(repl, text)
160
+ return text
161
+
162
+ TEXT_KEYS = ("comment", "complaint", "text", "description", "message", "yorum", "sikayet")
163
+ TRX_KEYS = re.compile(r"^(trxid|trx|transaction[ _-]?id)$", re.IGNORECASE)
164
+ CONV_KEYS = re.compile(r"^(convid|conversationid|x-conversationid)$", re.IGNORECASE)
165
+ DATE_KEYS = re.compile(r"^(date|created|createdat|timestamp)$", re.IGNORECASE)
166
+ PLATFORM_KEYS = re.compile(r"^(platform|channel|os|device)$", re.IGNORECASE)
167
+
168
+ def row_to_complaint(row):
169
+ text_val, trx, conv, date, platform = None, None, None, None, None
170
+ longest = ""
171
+ for key, raw in row.items():
172
+ if key is None or raw is None:
173
+ continue
174
+ val = str(raw).strip()
175
+ if not val:
176
+ continue
177
+ k = str(key).strip()
178
+ if TRX_KEYS.match(k):
179
+ trx = val
180
+ elif CONV_KEYS.match(k):
181
+ conv = val
182
+ elif DATE_KEYS.match(k):
183
+ date = val
184
+ elif PLATFORM_KEYS.match(k):
185
+ platform = val
186
+ elif k.lower() in TEXT_KEYS:
187
+ text_val = val
188
+ elif len(val) > len(longest):
189
+ longest = val
190
+ text = text_val or longest
191
+ if not text:
192
+ return None
193
+ found_trx, found_conv = extract_ids(text)
194
+ return {
195
+ "text": text,
196
+ "trxId": trx or found_trx,
197
+ "convId": conv or found_conv,
198
+ "date": date,
199
+ "platformHint": platform,
200
+ }
201
+
202
+ def blocks_from_text(payload):
203
+ payload = payload.strip()
204
+ if not payload:
205
+ return []
206
+ blocks = [b.strip() for b in re.split(r"\n\s*\n", payload) if b.strip()]
207
+ if len(blocks) == 1 and re.search(r"^\s*(?:\d+[.)]|-)\s+", payload, re.MULTILINE):
208
+ blocks = [
209
+ b.strip()
210
+ for b in re.split(r"^\s*(?:\d+[.)]|-)\s+", payload, flags=re.MULTILINE)
211
+ if b.strip()
212
+ ]
213
+ return blocks
214
+
215
+ degraded = False
216
+ degrade_reason = None
217
+ raw_complaints = []
218
+
219
+ if fmt == "text":
220
+ for block in blocks_from_text(os.environ.get("PC_STDIN") or ""):
221
+ trx, conv = extract_ids(block)
222
+ raw_complaints.append(
223
+ {"text": block, "trxId": trx, "convId": conv, "date": None, "platformHint": None}
224
+ )
225
+ elif fmt == "txt":
226
+ with open(path, encoding="utf-8-sig", errors="replace") as f:
227
+ payload = f.read()
228
+ for block in blocks_from_text(payload):
229
+ trx, conv = extract_ids(block)
230
+ raw_complaints.append(
231
+ {"text": block, "trxId": trx, "convId": conv, "date": None, "platformHint": None}
232
+ )
233
+ elif fmt == "csv":
234
+ with open(path, encoding="utf-8-sig", errors="replace", newline="") as f:
235
+ sample = f.read(4096)
236
+ f.seek(0)
237
+ try:
238
+ dialect = csv.Sniffer().sniff(sample, delimiters=",;\t")
239
+ except csv.Error:
240
+ dialect = csv.excel
241
+ for row in csv.DictReader(f, dialect=dialect):
242
+ c = row_to_complaint(row)
243
+ if c:
244
+ raw_complaints.append(c)
245
+ elif fmt == "json":
246
+ with open(path, encoding="utf-8-sig") as f:
247
+ data = json.load(f)
248
+ if isinstance(data, dict):
249
+ data = data.get("complaints") or data.get("items") or []
250
+ if not isinstance(data, list):
251
+ data = []
252
+ for row in data:
253
+ if isinstance(row, str):
254
+ trx, conv = extract_ids(row)
255
+ raw_complaints.append(
256
+ {"text": row.strip(), "trxId": trx, "convId": conv, "date": None, "platformHint": None}
257
+ )
258
+ elif isinstance(row, dict):
259
+ c = row_to_complaint(row)
260
+ if c:
261
+ raw_complaints.append(c)
262
+ elif fmt == "xlsx":
263
+ try:
264
+ import openpyxl
265
+ except ImportError:
266
+ degraded = True
267
+ degrade_reason = "openpyxl not installed; export the sheet as CSV and re-run with --format csv"
268
+ if not degraded:
269
+ wb = openpyxl.load_workbook(path, read_only=True, data_only=True)
270
+ ws = wb.active
271
+ rows = ws.iter_rows(values_only=True)
272
+ header = next(rows, None)
273
+ if header:
274
+ keys = [str(h).strip() if h is not None else "" for h in header]
275
+ for values in rows:
276
+ row = {k: v for k, v in zip(keys, values) if k}
277
+ c = row_to_complaint(row)
278
+ if c:
279
+ raw_complaints.append(c)
280
+ wb.close()
281
+
282
+ complaints = []
283
+ for i, c in enumerate(raw_complaints, start=1):
284
+ complaints.append(
285
+ {
286
+ "id": "C-%02d" % i,
287
+ "text": redact(c["text"]),
288
+ "trxId": c["trxId"],
289
+ "convId": c["convId"],
290
+ "date": c["date"],
291
+ "platformHint": (c["platformHint"] or None) and str(c["platformHint"]).strip().lower(),
292
+ }
293
+ )
294
+
295
+ result = {
296
+ "parsedAt": datetime.datetime.utcnow().isoformat() + "Z",
297
+ "source": path or "stdin",
298
+ "format": fmt,
299
+ "complaints": complaints,
300
+ "redacted": redact_on,
301
+ "degraded": degraded,
302
+ "degradeReason": degrade_reason,
303
+ }
304
+ print(json.dumps(result, ensure_ascii=False))
305
+ sys.exit(5 if degraded else 0)
306
+ PY
@@ -34,9 +34,9 @@ The selected scope routes to a platform skill:
34
34
 
35
35
  | Platform | Skill | Notes |
36
36
  |---|---|---|
37
- | iOS / SwiftUI | `ai-ios-engineering-toolkit:figma-component-wiki` | Reads `Configuration` + `+Modifiers` from the source, captures Figma screenshots via MCP / REST, runs Snapshot tests for iOS dark/light/RTL. |
38
- | Android / Compose | `ai-android-engineering-toolkit:figma-component-wiki` | Reads Compose composables + previews, runs Paparazzi screenshots if available, otherwise generates from layout inspector. |
39
- | Generic | `ai-ios-engineering-toolkit:figma-component-wiki` (fallback) | Used when `state.platform` is unknown (fallback path - typically a flag). |
37
+ | iOS / SwiftUI | `ai-ios-toolkit:figma-component-wiki` | Reads `Configuration` + `+Modifiers` from the source, captures Figma screenshots via MCP / REST, runs Snapshot tests for iOS dark/light/RTL. |
38
+ | Android / Compose | `ai-android-toolkit:figma-component-wiki` | Reads Compose composables + previews, runs Paparazzi screenshots if available, otherwise generates from layout inspector. |
39
+ | Generic | `ai-ios-toolkit:figma-component-wiki` (fallback) | Used when `state.platform` is unknown (fallback path - typically a flag). |
40
40
 
41
41
  Full per-skill contract: `$HOME/.claude/multi-agent-refs/wiki-capture.md`.
42
42
 
@@ -0,0 +1,99 @@
1
+ # Complaint-Analysis Report Template
2
+
3
+ Master layout for the report `/multi-agent:complaint-analysis` renders at Phase 4 and dispatches at Phase 5. Single-language body: every heading and prose block is written in `outputLanguage` (`tr` or `en`); the TR / EN heading pairs below show both forms, render ONE. Verdict tokens, Graylog excerpts, and field names in routing entries stay English (SKILL Locked 9). The deterministic gate over an emitted instance is `scripts/validate-complaint-doc.mjs` - keep this file and that validator in sync.
4
+
5
+ Numbering is fixed 1..8. Section 4 (routing) is rendered only when at least one `core` verdict exists; numbering still re-flows sequentially when it is omitted (same omission style as the analysis template).
6
+
7
+ ## YAML front-matter (required keys)
8
+
9
+ ```yaml
10
+ ---
11
+ run_name: complaints-20260810
12
+ generated_at: <UTC ISO8601>
13
+ language: tr | en
14
+ complaint_count: <N>
15
+ repos: "<name>:<layer>, <name>:<layer>, ..."
16
+ verdict_counts: "client=<X> bff=<Y> core=<Z> insufficient=<W>"
17
+ graylog_degraded: true | false
18
+ ---
19
+ ```
20
+
21
+ `run_name`, `generated_at`, `language`, `complaint_count`, `graylog_degraded` are validator-required; `repos` and `verdict_counts` are part of the template contract but advisory to the gate.
22
+
23
+ ## 1. Özet / Summary
24
+
25
+ 2-4 sentences: how many complaints, where they came from (source types only - never file contents), the verdict distribution, and whether Graylog was degraded for any of them. Follow with the count table:
26
+
27
+ ```
28
+ | Verdict | Count |
29
+ |---|---|
30
+ | client | X |
31
+ | bff | Y |
32
+ | core | Z |
33
+ | insufficient-evidence | W |
34
+ ```
35
+
36
+ Then the coverage table - every selected repo appears, including the ones that came back clean, so "only the client layer needed a fix" is visible at a glance:
37
+
38
+ ```
39
+ | Repo | Layer | Evidence hits | Verdicts attributed |
40
+ |---|---|---|---|
41
+ | <owner>/my-ios-app | ios | 3 | C-01 |
42
+ | <owner>/my-mobile-bff | mobile-bff | 0 | - (incelendi, temiz / checked, clean) |
43
+ ```
44
+
45
+ ## 2. Triage Tablosu / Triage Table
46
+
47
+ One row per complaint. Verdict tokens are the English enum: `client:ios`, `client:android`, `client:web`, `bff:mobile-bff`, `bff:web-bff`, `core`, `insufficient-evidence`. The validator requires every row carrying a `C-NN` id to contain one of these tokens.
48
+
49
+ ```
50
+ | Id | Özet (redakte) | trx/conv | Verdict | Confidence | Routing |
51
+ |---|---|---|---|---|---|
52
+ | C-01 | <redacted excerpt <= 80 chars> | trx-9f3a | client:ios | high | - |
53
+ | C-02 | ... | conv-77aa | core | medium | payment-core |
54
+ ```
55
+
56
+ `Routing` column: the suspected core service for `core` rows, `-` otherwise.
57
+
58
+ ## 3. Şikayet Detayları / Complaint Details
59
+
60
+ One `### C-NN` subsection per complaint:
61
+
62
+ - **Şikayet / Complaint**: the redacted text (full, not the excerpt).
63
+ - **Graylog**: status line (`ok: N messages` / `degraded: <reason>` / `skipped: user choice`), then up to 3 evidence lines, English, shape `timestamp source level message-excerpt`. Redact any PII the log itself carries before quoting.
64
+ - **Repo kanıtı / Repo evidence**: `file:line - signal (matchKind)` rows from the correlation phase; `-` when none.
65
+ - **Elenen katmanlar / Ruled out**: one line listing the repos/layers that were grepped for this complaint's signals and returned nothing (e.g. `mobile-bff, web-bff: sinyal yok`). This is what justifies a single-layer verdict.
66
+ - **Verdict + gerekçe / rationale**: the verdict token, confidence, and 1-3 sentences citing the evidence above (SKILL Locked 10: client/bff needs 1 Graylog + 1 repo citation; core needs the Graylog line naming the upstream).
67
+ - **Geliştirme planı / Fix plan** (client/bff only, SKILL Locked 13; validator-required for every client/bff verdict): 2-5 numbered steps grounded in the existing architecture - each step references a cited `file:line` or component, reuse-first, tests included. Never rendered for core / insufficient-evidence.
68
+ - **Dev prompt** (client/bff only): one fenced English block ready to paste into `/multi-agent:dev` or a Jira description - complaint summary, root cause, cited files, fix plan steps, acceptance check, and the `[C-NN]` id.
69
+
70
+ ## 4. Core Yönlendirme Önerileri / Core Routing Recommendations
71
+
72
+ Rendered only when `core` verdicts exist. One `### C-NN` subsection per core verdict (the validator checks each core id appears here):
73
+
74
+ ```
75
+ suspectedService: <Graylog source>
76
+ endpoint: <path or ->
77
+ errorCode: <code or ->
78
+ evidenceExcerpt: <short redacted EN excerpt>
79
+ suggestedQueue: <prefs.projects[*].routing.coreTeamLabel or ->
80
+ confidence: high | medium | low
81
+ ```
82
+
83
+ No fix analysis, no code speculation about the core service (SKILL Locked 5). This block is what gets forwarded to the core team.
84
+
85
+ ## 5. Açık Sorular / Open Questions
86
+
87
+ One bullet per `insufficient-evidence` verdict (what is missing: id, reproducible log, repo signal) plus any ambiguity worth a human decision (e.g. client-vs-bff attribution at low confidence).
88
+
89
+ ## 6. Metodoloji / Methodology
90
+
91
+ Fixed short block: source types ingested, redaction applied (`parse-complaints.sh`), Graylog query window/limit actually used, repos + layers grepped, and a **degraded services** list (`graylog: <reason>` when any fetch degraded - a degraded payload is never silently dropped).
92
+
93
+ ## 7. Referanslar / References
94
+
95
+ Input source names only - file basename + row count, Jira issue keys, Confluence page titles/URLs. Never inline the input contents. Then the repo list with layers.
96
+
97
+ ## 8. (Footer)
98
+
99
+ One line: `Generated by /multi-agent:complaint-analysis - report only, no branches or commits.` (localized).
@@ -1,6 +1,6 @@
1
1
  # Component Dispatch (Phase 3 short-circuit)
2
2
 
3
- > **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-engineering-toolkit` **marketplace plugin's** component skill (`create-component`, falling back to `create-ui-component`) via the Skill tool. Implementation lives in the plugin; multi-agent's job is classification, dispatch, and state report. The pipeline no longer bundles its own `figma-to-component` orchestrator - component skills live in one place, the plugin marketplace.
3
+ > **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-toolkit` **marketplace plugin's** component skill (`create-component`, falling back to `create-ui-component`) via the Skill tool. Implementation lives in the plugin; multi-agent's job is classification, dispatch, and state report. The pipeline no longer bundles its own `figma-to-component` orchestrator - component skills live in one place, the plugin marketplace.
4
4
 
5
5
  This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-3-dev.md`. Keeping it separate lets `phase-3-dev.md` remain tight (it's already the largest phase doc) and gives the orchestrator-report contract a stable URL for both Claude-side and Copilot-side implementations.
6
6
 
@@ -37,8 +37,8 @@ run produced entities and a mapper but left the screen half-wired.
37
37
 
38
38
  | `state.componentScope` | Meaning | iOS skill | Android skill |
39
39
  |---|---|---|---|
40
- | `screen` (default when the frame is a full screen, or the task names a screen) | Full clean-architecture vertical: Entity → Repository → Mapper → UseCase → LocalizedText → AnalyticsTracking → CoordinatorEvent → ViewModel → Scene → Preview, then verify | `ai-ios-engineering-toolkit:create-screen` | `ai-android-engineering-toolkit:create-screen` |
41
- | `component` | One reusable UI component (Configuration / View / +Modifiers / Code Connect) | `ai-ios-engineering-toolkit:create-component` (fallback `create-ui-component`) | `ai-android-engineering-toolkit:create-component` (fallback `create-ui-component`) |
40
+ | `screen` (default when the frame is a full screen, or the task names a screen) | Full clean-architecture vertical: Entity → Repository → Mapper → UseCase → LocalizedText → AnalyticsTracking → CoordinatorEvent → ViewModel → Scene → Preview, then verify | `ai-ios-toolkit:create-screen` | `ai-android-toolkit:create-screen` |
41
+ | `component` | One reusable UI component (Configuration / View / +Modifiers / Code Connect) | `ai-ios-toolkit:create-component` (fallback `create-ui-component`) | `ai-android-toolkit:create-component` (fallback `create-ui-component`) |
42
42
  | `evolve` | Change an existing component | `evolve-component` (fallback `evolve-ui-component`) | same |
43
43
 
44
44
  ```
@@ -52,7 +52,7 @@ a single atom is `component`. When it cannot be decided, ask - do not default
52
52
  omits the wiring.
53
53
 
54
54
  **Pre-implementation validation is not optional on iOS.** Before the create skill
55
- runs, dispatch `ai-ios-engineering-toolkit:figma-validate` for the frame. It checks
55
+ runs, dispatch `ai-ios-toolkit:figma-validate` for the frame. It checks
56
56
  registry presence, Code Connect strategy, **design token compliance**, dependency
57
57
  readiness, atomic scope and already-implemented status in about ten seconds. Those
58
58
  are precisely the checks whose absence produced guessed spacing and an unpublished
@@ -60,7 +60,7 @@ Code Connect binding. A `figma-validate` failure halts the dispatch.
60
60
 
61
61
  **Dual-name resolution.** The public (`multi-agent-plugins`) and a corporate/private marketplace named the same skill differently - `create-component` vs `create-ui-component`. Dispatch tries `create-component` first; if it is not available in the current repo, tries `create-ui-component`. (Same dual-name rule applies when `taskType` maps to evolve → `evolve-component`/`evolve-ui-component`, or fix → `fix-bug`.)
62
62
 
63
- If **neither** resolves, the platform's `ai-<platform>-engineering-toolkit` plugin is not enabled in this repo. **Halt with a user-visible error**: "component task requires the ai-<platform>-engineering-toolkit plugin enabled in this repo (`.claude/settings.local.json`)." Do not silently fall back to TDD - a component task ran through the bugfix path would produce wrong artefacts.
63
+ If **neither** resolves, the platform's `ai-<platform>-toolkit` plugin is not enabled in this repo. **Halt with a user-visible error**: "component task requires the ai-<platform>-toolkit plugin enabled in this repo (`.claude/settings.local.json`)." Do not silently fall back to TDD - a component task ran through the bugfix path would produce wrong artefacts.
64
64
 
65
65
  ## Dispatch call
66
66
 
@@ -119,7 +119,7 @@ Phase 4 runs in `--dev` as it does in the full pipeline, and its reviewer count
119
119
 
120
120
  Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md` section 1.1):
121
121
 
122
- - **Claude Code**: dispatches to the enabled `ai-<platform>-engineering-toolkit` marketplace plugin via the Skill tool (this doc).
122
+ - **Claude Code**: dispatches to the enabled `ai-<platform>-toolkit` marketplace plugin via the Skill tool (this doc).
123
123
  - **Copilot CLI**: has no plugin loader; it continues to use its standalone `~/.copilot/skills/figma-*` skill copies (frozen fallback). Copilot's resolution + progress lines follow those local skills.
124
124
 
125
125
  What still MUST match across CLIs: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and `--dev` elision semantics. Figma-skill *inventory* parity is no longer enforced. `smoke-cross-cli-behavior.sh` asserts only the classification + state-shape axis for components.
@@ -6,14 +6,14 @@
6
6
 
7
7
  ---
8
8
 
9
- ## 1. Command Inventory (49 commands)
9
+ ## 1. Command Inventory (51 commands)
10
10
 
11
11
  ```
12
- analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, design-check, dev,
12
+ analysis, analysis-resolve, autopilot, build-optimize, channels, complaint-analysis, create-jira, design-check, dev,
13
13
  dev-autopilot, dev-local, dev-local-autopilot, diff-explain, forget, garbage-collect,
14
14
  help, ios-coding-standard, issue, jira, kill, language, local,
15
- local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review, review-issue, review-jira,
16
- routines, save, scan, search, setup, ship, stack, status, store-ready, sync, test, test-accessibility,
15
+ local-autopilot, log, manual-test, prune-logs, prune-prompts, purge, refactor, resume, review, review-issue, review-jira,
16
+ routines, save, scan, search, setup, resume-local, stack, status, store-ready, sync, test, test-accessibility,
17
17
  test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation, uninstall, update
18
18
  ```
19
19
 
@@ -23,8 +23,8 @@ Categories:
23
23
  - **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `create-jira`
24
24
  - **Full 8-phase modes**: `autopilot`, `local`, `local-autopilot`
25
25
  - **Fast modes** (Init -> Dev(Opus) -> Review -> Commit -> Report): `dev`, `dev-autopilot`, `dev-local`, `dev-local-autopilot`
26
- - **Tail modes** (run the pipeline tail over already-done local work): `ship`
27
- - **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `prune-logs`
26
+ - **Tail modes** (run the pipeline tail over already-done local work): `resume-local`
27
+ - **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `complaint-analysis`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `prune-logs`, `prune-prompts`
28
28
  - **Local audits** (worktree only to build; no commit, push, PR or channels): `design-check`, `testflight-validation`, `ios-coding-standard`. `testflight-validation` additionally never invokes `altool --upload-app` - a validation run must not be able to ship a build by accident.
29
29
  - **Meta-ops**: `setup`, `sync`, `update`, `help`, `refactor`, `test`, `stack`, `manual-test`, `language`
30
30
  - **Routines** (user-defined routine registry; the routines they create are local-only and never synced): `save`, `routines`, `forget`
@@ -33,7 +33,7 @@ Categories:
33
33
 
34
34
  ### 1.1 Figma / component work (plugin-based on Claude Code; NOT parity-enforced)
35
35
 
36
- Component work is **no longer a bundled pipeline skill set**. Claude Code dispatches `taskType === "component"` to the enabled `ai-<platform>-engineering-toolkit` **marketplace plugin** (`create-component`, fallback `create-ui-component`) via the Skill tool - full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`. The pipeline no longer ships `pipeline/skills/figma-ios|figma-android|figma-common`; the pipeline-unique component skills (iterate loops, performance harness, validate/review, commit, adapters, wiki) were absorbed into the `ai-ios-engineering-toolkit` plugin so component skills live in one place.
36
+ Component work is **no longer a bundled pipeline skill set**. Claude Code dispatches `taskType === "component"` to the enabled `ai-<platform>-toolkit` **marketplace plugin** (`create-component`, fallback `create-ui-component`) via the Skill tool - full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`. The pipeline no longer ships `pipeline/skills/figma-ios|figma-android|figma-common`; the pipeline-unique component skills (iterate loops, performance harness, validate/review, commit, adapters, wiki) were absorbed into the `ai-ios-toolkit` plugin so component skills live in one place.
37
37
 
38
38
  **How each host receives the plugin's skills.** Only Claude Code loads the marketplace
39
39
  plugin natively. The other two are served by the installer, so all three end up with the
@@ -79,11 +79,11 @@ Two parallel shared/core skills under `pipeline/skills/shared/core/` wrap extern
79
79
  | `apple-archive-compliance` | `pipeline/skills/shared/core/apple-archive-compliance/` | `ios_app_store_audit` MCP tool (in `@mmerterden/dev-toolkit-mcp` ≥ v2.9.0) | 18 (Apple ITMS + App Store Review Guidelines) |
80
80
  | `google-play-compliance` | `pipeline/skills/shared/core/google-play-compliance/` | bundletool + aapt2 + apksigner | 21 (4 categories: Technical / Security / Privacy / Hygiene) |
81
81
 
82
- Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary), Phase 4 Security Auditor (`pipeline/agents/security-auditor.md`), `/multi-agent:review` + SKILL.md counterpart, `/multi-agent:channels` PR-body auto-augmentation. Contract enforced by `smoke-compliance-skills.sh` (46 assertions).
82
+ Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary), Phase 4 Security Auditor (`pipeline/agents/security-auditor.md`), `/multi-agent:review` + SKILL.md counterpart, `/multi-agent:channels` PR-body auto-augmentation. Contract enforced by `smoke-compliance-skills.sh`.
83
83
 
84
84
  ### 1.3 Figma-skill routing from multi-agent (superseded)
85
85
 
86
- Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI uses its local `~/.copilot/skills/figma-*` copies. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
86
+ Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI receives the enabled plugin's authored skills through `install/copilot.mjs` (section 1.1), not a standalone `figma-*` tree - the installer prunes those. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
87
87
 
88
88
  ---
89
89
 
@@ -164,10 +164,10 @@ skills took the block from 11 skills / 4,710 bytes to 83 skills / 22,111 bytes
164
164
  only **75 of the 142** surfaced, **and an unrelated user-scope skill was evicted**.
165
165
  Removing the plugin brought it back.
166
166
 
167
- So shipping the 49 sub-commands as peer skills on Codex would silently lose
167
+ So shipping every sub-command as a peer skill on Codex would silently lose
168
168
  pipeline commands next to any stack toolkit, with no error anywhere. The pipeline
169
- therefore contributes **exactly one** skill on Codex (`multi-agent`) and keeps the
170
- 49 sub-command specs as reference files that cost nothing until read.
169
+ therefore contributes **exactly one** skill on Codex (`multi-agent`) and keeps every
170
+ sub-command spec as a reference file that costs nothing until read.
171
171
 
172
172
  **Do not "fix" this by adding per-command skills on Codex.** The layout is
173
173
  capability-derived, and `smoke-install-layout.sh` fails if the Codex skills tree
@@ -176,7 +176,7 @@ gains a second pipeline entry.
176
176
  ### Parity axis differs per host
177
177
 
178
178
  Claude Code and Copilot CLI are compared on their **skill directory sets**. Codex is
179
- compared on its **ref set**: the 49 command specs must all exist under
179
+ compared on its **ref set**: every command spec must exist under
180
180
  `~/.codex/multi-agent-refs/commands/<cmd>/SKILL.md`, and
181
181
  `smoke-codex-install.sh` asserts the count against the source tree. Comparing Codex
182
182
  on skill directories would demand exactly the layout that breaks it.
@@ -312,9 +312,9 @@ For clipboard ops, callers still gate with `if command -v pbpaste >/dev/null; th
312
312
 
313
313
  This contract is validated by:
314
314
 
315
- - `smoke-cross-cli-behavior.sh` - asserts all 38 commands behave identically, pulls from Section 2 (placeholder vocab), Section 5 (argument parsing), Section 6 (output formats); also regression-locks the 6-persona agent deployment
316
- - `smoke-commands-skills-parity.sh` (50 assertions) - enforces colon-form command ↔ dash-form skill directory parity
317
- - `smoke-compliance-skills.sh` (45 assertions) - enforces store-compliance skill catalog + 4 consumer wiring
315
+ - `smoke-cross-cli-behavior.sh` - asserts every command behaves identically, pulls from Section 2 (placeholder vocab), Section 5 (argument parsing), Section 6 (output formats); also regression-locks the 8-persona agent deployment
316
+ - `smoke-commands-skills-parity.sh` (two assertions per command) - enforces colon-form command ↔ dash-form skill directory parity
317
+ - `smoke-compliance-skills.sh` - enforces store-compliance skill catalog + 4 consumer wiring
318
318
  - `smoke-personal-data.sh` - extended in 0.5.5 to treat deprecated placeholders (`{github-username}`, `{your-website}`, `{website-repo}`) as leaks; adds `mmerterden` to public-handle blocklist for generic docs
319
319
  - `pre-push-check.sh` - runs the cross-CLI + personal-data smoke tests before any push that touches `pipeline/skills/shared/core/` commands
320
320
  - `sync.md` (Section 2 REPO step) - genericization lookup table MUST match Section 2 of this contract
@@ -22,7 +22,7 @@ One fetcher per type. Each fetcher emits a normalized JSON view that the analysi
22
22
  |---|---|---|
23
23
  | `crashlytics` | `~/.claude/lib/fetch-crashlytics.sh <url>` (already invoked in Phase 0 Step 1b.1 for the legacy `state.crashContext` field; Phase 1 reads that field directly) | `state.crashContext` |
24
24
  | `fortify` | `~/.claude/lib/fetch-fortify.sh <url>` (already invoked in Phase 0 Step 1b.2 for the legacy `state.fortifyFinding` field; Phase 1 reads that field, Phase 4 reads the full payload for the security gate) | `state.fortifyFinding` |
25
- | `graylog` | `~/.claude/lib/fetch-graylog.sh --trx <id>` / `--conv <id>` (already invoked in Phase 0 Step 1b.3 for the `state.graylogContext` field; Phase 1 reads that field directly). Diagnostic logs, **advisory only** - no Phase 4 gate, no generated task | `state.graylogContext` |
25
+ | `graylog` | `~/.claude/lib/fetch-graylog.sh --trx <id>` / `--conv <id>` (already invoked in Phase 0 Step 1b.3 for the `state.graylogContext` field; Phase 1 reads that field directly). Diagnostic logs, **advisory only** - no Phase 4 gate, no generated task. Exception: `/multi-agent:complaint-analysis` consumes Graylog as its **primary evidence** by design (its Locked 1); the advisory-only rule scopes to the dev pipeline | `state.graylogContext` |
26
26
  | `swagger` | `~/.claude/lib/fetch-swagger.sh <url>` → endpoints[], request/response examples | `state.fetchedContext.swagger[]` |
27
27
  | `confluence` | `~/.claude/lib/fetch-confluence.sh <url>` → page body, code blocks, extracted API contracts | `state.fetchedContext.confluence[]` |
28
28
  | `figma` | no standalone fetcher - resolve via the Figma 3-tier chain (Tier 1 MCP tools, Tier 2 `~/.claude/lib/figma-screenshot.sh` + REST) when the task is a component; otherwise advisory only | `state.fetchedContext.figma[]` |
@@ -8,7 +8,7 @@ Phase 3 dispatched to the toolkit plugin for exactly one case, `taskType === "co
8
8
 
9
9
  That is the dev-side half of the gap `features/skill-conformance.md` closes on the review side. Review now asks "was this built to the rules it was supposed to follow"; without this step, the answer for a non-component task was "there were no declared rules, because nobody chose any".
10
10
 
11
- The fix is not a routing table in the pipeline. Each `ai-<platform>-engineering-toolkit` already ships one: an `index` skill whose description says *"Load this first when unsure which skill applies"*, holding a 30-plus row intent-to-skill map maintained alongside the skills it points at. A second copy in this repo would drift the moment the plugin shipped a new skill, and the pipeline's copy would be the stale one.
11
+ The fix is not a routing table in the pipeline. Each `ai-<platform>-toolkit` already ships one: an `index` skill whose description says *"Load this first when unsure which skill applies"*, holding a 30-plus row intent-to-skill map maintained alongside the skills it points at. A second copy in this repo would drift the moment the plugin shipped a new skill, and the pipeline's copy would be the stale one.
12
12
 
13
13
  So the pipeline's job is to **ask**, not to know.
14
14
 
@@ -22,8 +22,8 @@ Platform comes from the same mapping component dispatch uses, so the two cannot
22
22
 
23
23
  | `state.platform` / detected stack | Toolkit |
24
24
  |---|---|
25
- | ios, swift | `ai-ios-engineering-toolkit` |
26
- | android, kotlin | `ai-android-engineering-toolkit` |
25
+ | ios, swift | `ai-ios-toolkit` |
26
+ | android, kotlin | `ai-android-toolkit` |
27
27
  | anything else | no toolkit - step is a recorded no-op |
28
28
 
29
29
  The toolkit is enabled per repo (`.claude/settings.local.json` / `~/.claude/settings.json` `enabledPlugins`). **Not enabled is not an error here**, unlike component dispatch: a backend or web repo legitimately has no toolkit, and halting would make the pipeline unusable outside mobile. Record the no-op and continue.
@@ -45,9 +45,9 @@ Emit one progress line per loaded skill per `progress-contract.md`, so the user
45
45
  Append one `state.telemetry.skillCalls[]` entry per skill actually loaded:
46
46
 
47
47
  ```json
48
- {"skill": "ai-ios-engineering-toolkit:reference/architecture", "phase": 3,
48
+ {"skill": "ai-ios-toolkit:reference/architecture", "phase": 3,
49
49
  "targetFiles": ["Domains/Checkin/Sources/CheckinScene.swift"],
50
- "routedBy": "ai-ios-engineering-toolkit:index@0.13.0", "timestamp": "<ISO-8601>"}
50
+ "routedBy": "ai-ios-toolkit:index@0.13.0", "timestamp": "<ISO-8601>"}
51
51
  ```
52
52
 
53
53
  `routedBy` names the index and version that chose it. That is the difference between "the model happened to read a skill" and "the toolkit said this skill governs this task".
@@ -167,7 +167,7 @@ Write summary + description in `outputLanguage` from the type's **standard templ
167
167
  - **Always-present** sections are filled from `FREE_TEXT` (+ mining for Test Scenarios style). If an always-present section has no user content and cannot be derived, it stays an explicit open question for step 8 - it is not fabricated.
168
168
  - **Conditional** sections render only when their trigger fired (see the Standard templates table): Design Reference when `FIGMA_URL` set (`[Figma|{FIGMA_URL}]` + frame name + node id); API Contract when 6b produced a body; Screenshots when images were staged; Notes/Dependencies only with real content. Otherwise the heading is omitted entirely.
169
169
  - Bug: logs / stack traces / device+OS mentions from `FREE_TEXT` map into Environment and Screenshots / Logs; anything underivable becomes a step-8 question.
170
- - Run the humanizer skill on the description body.
170
+ - Run the `ai-common-toolkit:humanizer` skill on the description body.
171
171
  - Write the final body to `/tmp/generate-issue-$$.txt` (UTF-8, real newlines) for the `--rawfile` POST.
172
172
 
173
173
  ### [8/12] Clarifying questions (only genuinely unknown fields)
@@ -123,7 +123,7 @@ into a task breakdown. For analysis-driven screen work, /multi-agent or
123
123
 
124
124
  Autopilot picks 1 and logs the warning rather than asking.
125
125
 
126
- **The branch already carries the work.** When the change was developed outside the pipeline, or by hand, the `--dev` family is the wrong entry point: it will try to develop again. `/multi-agent:ship` puts the existing diff through the same review, adds a build+test success gate, opens the PR, and posts the Jira technical-analysis + test-scenario comment - without re-developing. Offer it when the working tree or branch is already ahead of the base with the task's changes.
126
+ **The branch already carries the work.** When the change was developed outside the pipeline, or by hand, the `--dev` family is the wrong entry point: it will try to develop again. `/multi-agent:resume-local` puts the existing diff through the same review, adds a build+test success gate, opens the PR, and posts the Jira technical-analysis + test-scenario comment - without re-developing. Offer it when the working tree or branch is already ahead of the base with the task's changes.
127
127
 
128
128
  ---
129
129
 
@@ -519,7 +519,7 @@ Persist: `"taskType": "component" | "bugfix" | "feature" | "refactor" | "chore"`
519
519
 
520
520
  | Phase | Behavior change |
521
521
  | ------- | -------------------------------------------------------------------------------------------------------- |
522
- | Phase 3 | `component` → dispatch to the enabled `ai-<platform>-engineering-toolkit` plugin's `create-component` skill (fallback `create-ui-component`); else standard TDD |
522
+ | Phase 3 | `component` → dispatch to the enabled `ai-<platform>-toolkit` plugin's `create-component` skill (fallback `create-ui-component`); else standard TDD |
523
523
  | Phase 4 | `bugfix` → test coverage; `component` → accessibility+tokens; `refactor` → behavior preservation |
524
524
  | Phase 6 | `bugfix`/`hotfix` → `fix(...)` prefix; `feature`/`component` → `feat(...)`; `refactor` → `refactor(...)` |
525
525
  | Phase 7 | `component` → includes SubPhase breakdown |