@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.1

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 (335) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +2 -2
  3. package/docs/FIGMA_PIPELINE.md +12 -25
  4. package/docs/architecture.md +3 -5
  5. package/docs/features.md +8 -8
  6. package/install/_dev-only-files.mjs +0 -6
  7. package/install/claude.mjs +39 -17
  8. package/install/copilot.mjs +22 -16
  9. package/install/templates/copilot-instructions.md +3 -3
  10. package/package.json +1 -1
  11. package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
  12. package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
  13. package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
  14. package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
  15. package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
  16. package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
  17. package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
  18. package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
  19. package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
  20. package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
  21. package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
  22. package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
  23. package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
  24. package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
  25. package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
  26. package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
  27. package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
  28. package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
  29. package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
  30. package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
  31. package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
  32. package/pipeline/lib/credential-store.sh +8 -4
  33. package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
  34. package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
  35. package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
  36. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
  37. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
  38. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
  39. package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
  40. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
  41. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
  42. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
  43. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
  44. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
  45. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
  46. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
  47. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
  48. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
  49. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
  50. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
  51. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
  52. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
  53. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
  54. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
  55. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
  56. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
  57. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
  58. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
  59. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
  60. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
  61. package/pipeline/preferences-template.json +17 -1
  62. package/pipeline/rules/figma-pipeline.md +2 -2
  63. package/pipeline/schemas/prefs.schema.json +0 -34
  64. package/pipeline/scripts/README.md +1 -3
  65. package/pipeline/scripts/build-skills-index.mjs +3 -6
  66. package/pipeline/scripts/eval-mine-corpus.mjs +187 -0
  67. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  68. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  69. package/pipeline/scripts/lint-skills.mjs +26 -1
  70. package/pipeline/scripts/phase-banner.sh +2 -2
  71. package/pipeline/scripts/review-scope.mjs +94 -0
  72. package/pipeline/scripts/scan-agent-config.sh +2 -2
  73. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  74. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  75. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  76. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  77. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  78. package/pipeline/scripts/smoke-clarify.sh +1 -1
  79. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  80. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  81. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  82. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  83. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  84. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  85. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  86. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  87. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  88. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  89. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  90. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  91. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  92. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  93. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  94. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  95. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  96. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  97. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  98. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  99. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  100. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  101. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  102. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  103. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  104. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  105. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  106. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  107. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  108. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  109. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  110. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  111. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  112. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  113. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  114. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  115. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  116. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  117. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  118. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  119. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  120. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  121. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  122. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  123. package/pipeline/scripts/smoke-update-check.sh +1 -1
  124. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  125. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  126. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  127. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  128. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  129. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  130. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  131. package/pipeline/scripts/uninstall.mjs +17 -6
  132. package/pipeline/skills/.skill-manifest.json +40 -160
  133. package/pipeline/skills/.skills-index.json +3 -373
  134. package/pipeline/skills/shared/README.md +1 -1
  135. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  136. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  137. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  138. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  139. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  140. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  141. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  142. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  143. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  144. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  145. package/pipeline/skills/skills-index.md +3 -44
  146. package/pipeline/commands/multi-agent/refactor.md +0 -188
  147. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  148. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  149. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  150. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  151. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  152. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  153. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  154. package/pipeline/skills/figma-android/README.md +0 -38
  155. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  156. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  157. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  158. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  159. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  160. package/pipeline/skills/figma-common/README.md +0 -64
  161. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  162. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  163. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  164. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  165. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  166. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  167. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  168. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  169. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  170. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  171. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  172. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  173. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  174. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  175. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  176. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  177. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  178. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  179. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  180. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  181. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  182. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  183. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  184. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  185. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  186. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  187. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  188. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  189. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  190. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  191. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  192. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  193. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  194. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  195. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  196. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  197. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  198. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  199. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  200. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  201. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  202. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  203. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  204. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  205. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  206. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  207. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  208. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  209. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  210. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  232. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  233. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  234. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  235. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  236. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  237. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  238. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  239. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  240. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  241. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  242. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  253. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  254. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  255. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  256. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  257. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  258. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  259. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  260. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  261. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  262. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  263. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  294. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  295. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  296. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  297. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  298. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  299. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  300. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  301. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  302. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  303. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  304. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  305. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  310. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  311. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  312. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  313. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  314. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  315. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  316. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  317. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  318. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  319. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  320. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  321. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  332. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  333. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  334. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  335. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **TLDR** - Component tasks can auto-generate wiki docs + Figma screenshots. The Wiki adapter is invoked from `/multi-agent:channels` (Phase 7 delegates, or user invokes post-hoc). Four layouts supported (`submodule`, `in-repo`, `github-wiki`, `separate-repo`) - adapter picked from `figmaConfig.wiki.mode`. Non-blocking: failures log a warning and channels continues to other adapters. The Wiki adapter supports scope multi-select (Case A) and a precondition-failure menu (Case B) - see below.
4
4
 
5
- This doc is referenced from `commands/multi-agent/channels.md` (Wiki adapter) and indirectly from `refs/phases/phase-7-report.md` (which delegates all external delivery to channels). Keeping it separate keeps both files under their token budgets and gives the contract a stable location for Claude-side + Copilot-side implementations.
5
+ This doc is referenced from `commands/multi-agent/channels/SKILL.md` (Wiki adapter) and indirectly from `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` (which delegates all external delivery to channels). Keeping it separate keeps both files under their token budgets and gives the contract a stable location for Claude-side + Copilot-side implementations.
6
6
 
7
7
  ## Applicability
8
8
 
@@ -77,9 +77,9 @@ Save the answer to `prefs.global.wikiDefault` for next run. Migration script (`m
77
77
 
78
78
  ## Dispatch
79
79
 
80
- 1. Resolve wiki mode from `figmaConfig.wiki.mode` - one of `submodule`, `in-repo`, `github-wiki`, `separate-repo`. Each has a dedicated adapter inside the `figma-component-wiki` skill; see `pipeline/skills/figma-ios/figma-component-wiki/SKILL.md` for per-mode path layout and push semantics.
80
+ 1. Resolve wiki mode from `figmaConfig.wiki.mode` - one of `submodule`, `in-repo`, `github-wiki`, `separate-repo`. Each has a dedicated adapter inside the `figma-component-wiki` skill; see the `ai-ios-engineering-toolkit:figma-component-wiki` plugin skill for per-mode path layout and push semantics.
81
81
  2. Emit progress line: `→ writing wiki {componentName} (mode: {mode})`.
82
- 3. Dispatch to `pipeline/skills/figma-ios/figma-component-wiki` (iOS) or `pipeline/skills/figma-android/figma-component-wiki` (Android), passing `{componentName, componentPath, figmaConfig, agentState}`.
82
+ 3. Dispatch to the plugin skill `ai-ios-engineering-toolkit:figma-component-wiki` (iOS) or `ai-android-engineering-toolkit:figma-component-wiki` (Android), passing `{componentName, componentPath, figmaConfig}`.
83
83
  4. Skill returns `{ writtenPaths[], committedSha?, pushedRemote? }`. Write `writtenPaths` to Phase 7 summary's "Files written" section and push metadata (if any) to "External publishes".
84
84
  5. On adapter failure - log the adapter + mode + error, continue Phase 7. Wiki is a non-blocking augmentation; the Jira comment in Step 3 already carries the component summary, so the developer is never left in the dark if wiki misfires.
85
85
 
@@ -107,6 +107,6 @@ Claude Code and Copilot CLI MUST:
107
107
  - Render byte-identical Case A / Case B menus (spacing, brackets, numbering).
108
108
  - Respect `prefs.global.wikiScope` array. Legacy `wikiDefault` boolean is migrated on first v5.7 load.
109
109
  - Treat adapter failures as non-blocking with the same log shape.
110
- - Pause the Case A / Case B menu in autopilot - per Phase 7 autopilot exception (`refs/phases/modes.md`). 30-min timeout ends session cleanly; resume re-opens menu.
110
+ - Pause the Case A / Case B menu in autopilot - per Phase 7 autopilot exception (`$HOME/.claude/multi-agent-refs/phases/modes.md`). 30-min timeout ends session cleanly; resume re-opens menu.
111
111
 
112
112
  `smoke-wiki-integration.sh` asserts every contract item documented above.
@@ -71,7 +71,8 @@
71
71
  "warnPct": 80,
72
72
  "onExceed": "warn",
73
73
  "pricingModel": "opus"
74
- }
74
+ },
75
+ "derivedSkillSources": []
75
76
  },
76
77
  "projects": {},
77
78
  "_figmaConfigTemplate": {
@@ -153,5 +154,20 @@
153
154
  "complex": "opus",
154
155
  "overrides": {}
155
156
  }
157
+ },
158
+ "_derivedSkillSourcesTemplate": {
159
+ "_comment": "Optional. Populate global.derivedSkillSources[] to let /multi-agent:refactor check whether skills you derived from an upstream marketplace plugin have been updated. Kept in your LOCAL prefs only (never synced), so it may reference private sources. Copy an entry like the one below.",
160
+ "_example": {
161
+ "label": "Component toolkit skills",
162
+ "localPath": "plugins/<my-plugin>/skills/workflow",
163
+ "upstreamMarketplace": "<installed-marketplace-name>",
164
+ "upstreamPlugin": "<upstream-plugin-name>",
165
+ "upstreamSkills": [
166
+ "<skill-a>",
167
+ "<skill-b>"
168
+ ],
169
+ "derivedFromVersion": "0.0.0",
170
+ "upstreamRepoUrl": "https://github.com/<org>/<repo>"
171
+ }
156
172
  }
157
173
  }
@@ -1,6 +1,6 @@
1
1
  ## Figma -> Component Generation
2
2
 
3
- Skill set under `pipeline/skills/figma-ios/` (iOS), `pipeline/skills/figma-android/` (Android), and `pipeline/skills/figma-common/` (shared). Activated when the task contains a Figma URL and target files are `.swift` (iOS) or `.kt` (Android).
3
+ Skill set lives in the marketplace plugins - `ai-ios-engineering-toolkit` (iOS/SwiftUI) and `ai-android-engineering-toolkit` (Android/Compose). Activated when the task contains a Figma URL and target files are `.swift` (iOS) or `.kt` (Android).
4
4
 
5
5
  ### MUST: Figma access - 3-tier fallback chain (BLOCKING, pipeline-wide)
6
6
 
@@ -190,7 +190,7 @@ Phase 3.3: figma-iteration-commit → Batch iteration commit (if iterating)
190
190
  | Wiki | enabled/disabled | `wiki.enabled` |
191
191
  | Figma API | MCP / REST fallback | `figma.mcpEnabled` |
192
192
 
193
- Provider interfaces are defined inline in the platform skill sets - see `pipeline/skills/figma-common/`, `pipeline/skills/figma-ios/`, and `pipeline/skills/figma-android/`.
193
+ Provider interfaces are defined inline in the plugin skill sets - see the `ai-ios-engineering-toolkit` and `ai-android-engineering-toolkit` marketplace plugins.
194
194
 
195
195
  ### Optional Features (graceful skip when disabled)
196
196
 
@@ -613,40 +613,6 @@
613
613
  "default": true,
614
614
  "description": "When the Wiki channel produces component wiki content AND a Jira issue is linked (`state.jiraId` set), also post a humanizer-passed summary of the wiki content as a Jira comment so QA + PMs see the component docs inline. Independent of `reportChannels.jira` (which controls whether the main Jira comment runs). Set `false` to suppress only the wiki-summary comment."
615
615
  },
616
- "figmaSource": {
617
- "type": [
618
- "object",
619
- "null"
620
- ],
621
- "additionalProperties": false,
622
- "description": "Upstream figma-to-component source for incremental sync (WS-9). Set manually by users who maintain a separate source project and want `/multi-agent:sync` to keep `pipeline/skills/figma-ios/` in step. Null = no sync, import was one-shot.",
623
- "properties": {
624
- "path": {
625
- "type": "string",
626
- "description": "Absolute path to the source project root (expects `.instructions/figma/` and `.claude/skills/` subtrees)."
627
- },
628
- "branch": {
629
- "type": "string",
630
- "default": "develop",
631
- "description": "Source branch to pull from."
632
- },
633
- "lastSyncedAt": {
634
- "type": [
635
- "string",
636
- "null"
637
- ],
638
- "format": "date-time",
639
- "description": "ISO timestamp of the most recent successful sync."
640
- },
641
- "lastCommit": {
642
- "type": [
643
- "string",
644
- "null"
645
- ],
646
- "description": "Source commit SHA captured at the most recent successful sync. Used as the floor for incremental diff."
647
- }
648
- }
649
- },
650
616
  "promptLanguage": {
651
617
  "type": "string",
652
618
  "enum": [
@@ -15,7 +15,7 @@ Validate contracts. Each emits `══ <name> smoke: N passed, M failed ══`
15
15
  - `smoke-figma-cross-cli-inventory.sh` - figma skill cross-CLI source-tree parity (39 assertions)
16
16
 
17
17
  ### Figma pipeline (see `pipeline/scripts/README-figma-smokes.md` for the full index)
18
- - `smoke-figma-android-parity.sh`, `smoke-figma-config-schema.sh`, `smoke-figma-dispatch.sh`, `smoke-figma-skill-import.sh`, `smoke-figma-sync.sh`
18
+ - `smoke-figma-config-schema.sh`, `smoke-figma-dispatch.sh`
19
19
 
20
20
  ### Phase contracts
21
21
  - `smoke-phase-0-multi-repo.sh` - Phase 0 multi-repo mode fetch + worktree atomicity
@@ -78,8 +78,6 @@ Shell scripts invoked during pipeline execution.
78
78
  - `search-logs.sh` - backs `/multi-agent:search`
79
79
  - `scan-skills.sh` - backs `/multi-agent:scan`
80
80
  - `benchmark-phase-0.sh` - Phase 0 perf harness
81
- - `sync-figma-source.sh` - WS-9 source sync (figma)
82
- - `import-figma-skills.sh` - developer-only import harness (not run at runtime)
83
81
  - `github-ssh-setup.sh` - first-run SSH key setup helper
84
82
  - `sync-parity-check.sh` - manual parity verification helper
85
83
 
@@ -13,8 +13,7 @@
13
13
  // name - frontmatter `name:` (fallback: directory name)
14
14
  // description - frontmatter `description:` (first 300 chars)
15
15
  // platform - frontmatter `platform:` if set (ios / android / generic)
16
- // group - derived from path: core / figma-ios / figma-android /
17
- // figma-common / external
16
+ // group - derived from path: core / external
18
17
  // triggerKeywords - frontmatter `trigger-keywords:` (comma-separated
19
18
  // values lowercased) - authors can add these to tighten
20
19
  // match score. Missing → empty list.
@@ -66,9 +65,6 @@ function parseFrontmatter(raw) {
66
65
  function groupFromPath(rel) {
67
66
  if (rel.startsWith("shared/core/")) return "core";
68
67
  if (rel.startsWith("shared/external/")) return "external";
69
- if (rel.startsWith("figma-ios/")) return "figma-ios";
70
- if (rel.startsWith("figma-android/")) return "figma-android";
71
- if (rel.startsWith("figma-common/")) return "figma-common";
72
68
  return "other";
73
69
  }
74
70
 
@@ -107,7 +103,8 @@ entries.sort((a, b) => a.name.localeCompare(b.name));
107
103
 
108
104
  const json = {
109
105
  schemaVersion: "1.0.0",
110
- generatedAt: new Date().toISOString(),
106
+ // No generatedAt timestamp: the index is a committed build artifact and must
107
+ // be idempotent, so regenerating on an unchanged skill set produces no diff.
111
108
  skillCount: entries.length,
112
109
  entries,
113
110
  };
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env node
2
+ // eval-mine-corpus.mjs - grow the triage eval set from real production runs.
3
+ //
4
+ // The pipeline already records every Phase 4 triage decision to
5
+ // `~/.claude/logs/multi-agent/triage-corpus.jsonl` (one line per finding:
6
+ // severity/file/line/issue/fix/reviewer + the classification the run gave it,
7
+ // plus an optional human `reason`/`reviewer`). Hand-authoring eval fixtures is
8
+ // the bottleneck; this closes the loop by turning those real decisions into
9
+ // CANDIDATE regression fixtures in the exact shape `eval-triage.mjs` consumes.
10
+ //
11
+ // It is review-gated on purpose: candidates land in
12
+ // `pipeline/eval/triage-candidates/<task_id>/` (which eval-triage does NOT
13
+ // walk), each validated against the triage schema. A maintainer reviews them,
14
+ // fills scope/diffSummary, and moves the good ones into
15
+ // `pipeline/eval/triage/<NN>-<name>/` to adopt them.
16
+ //
17
+ // Highest-signal cases (a human left a `reason` or `reviewer`) are emitted
18
+ // first and marked, since those encode a deliberate triage judgement.
19
+ //
20
+ // Usage:
21
+ // node pipeline/scripts/eval-mine-corpus.mjs # default corpus path
22
+ // node pipeline/scripts/eval-mine-corpus.mjs --corpus <path>
23
+ // node pipeline/scripts/eval-mine-corpus.mjs --limit 20 # cap candidates
24
+ // node pipeline/scripts/eval-mine-corpus.mjs --dry-run # report, write nothing
25
+ //
26
+ // Exit codes: 0 ok (including "nothing to mine"), 2 usage/setup error.
27
+
28
+ import { readdirSync, readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
29
+ import { dirname, join, resolve } from "node:path";
30
+ import { fileURLToPath } from "node:url";
31
+ import { homedir } from "node:os";
32
+ import { spawnSync } from "node:child_process";
33
+
34
+ const here = dirname(fileURLToPath(import.meta.url));
35
+ const root = resolve(here, "..", "..");
36
+ const evalTriageDir = join(root, "pipeline", "eval", "triage");
37
+ const candidatesDir = join(root, "pipeline", "eval", "triage-candidates");
38
+ const validator = join(root, "pipeline", "scripts", "validate-triage.mjs");
39
+
40
+ const args = process.argv.slice(2);
41
+ const opts = { corpus: null, limit: Infinity, dryRun: false };
42
+ for (let i = 0; i < args.length; i++) {
43
+ if (args[i] === "--corpus") opts.corpus = args[++i];
44
+ else if (args[i] === "--limit") opts.limit = Number(args[++i]) || Infinity;
45
+ else if (args[i] === "--dry-run") opts.dryRun = true;
46
+ else if (args[i] === "-h" || args[i] === "--help") {
47
+ console.log("Usage: eval-mine-corpus.mjs [--corpus <path>] [--limit N] [--dry-run]");
48
+ process.exit(0);
49
+ }
50
+ }
51
+
52
+ const corpusPath =
53
+ opts.corpus || join(homedir(), ".claude", "logs", "multi-agent", "triage-corpus.jsonl");
54
+
55
+ if (!existsSync(corpusPath)) {
56
+ console.log(`eval-mine-corpus: no corpus at ${corpusPath} - nothing to mine.`);
57
+ process.exit(0);
58
+ }
59
+
60
+ // Parse the JSONL corpus, skipping blank/malformed lines (never crash on data).
61
+ const rows = [];
62
+ for (const line of readFileSync(corpusPath, "utf-8").split("\n")) {
63
+ const s = line.trim();
64
+ if (!s) continue;
65
+ try {
66
+ const r = JSON.parse(s);
67
+ if (r && r.task_id && r.issue && r.classification) rows.push(r);
68
+ } catch {
69
+ /* skip malformed line */
70
+ }
71
+ }
72
+
73
+ if (rows.length === 0) {
74
+ console.log("eval-mine-corpus: corpus has no usable rows - nothing to mine.");
75
+ process.exit(0);
76
+ }
77
+
78
+ // task_ids that already have an adopted fixture: skip so we only propose new cases.
79
+ const adopted = new Set();
80
+ if (existsSync(evalTriageDir)) {
81
+ for (const name of readdirSync(evalTriageDir)) {
82
+ const inputPath = join(evalTriageDir, name, "input.json");
83
+ if (existsSync(inputPath)) {
84
+ try {
85
+ const meta = JSON.parse(readFileSync(join(evalTriageDir, name, "meta.json"), "utf-8"));
86
+ if (meta.task_id) adopted.add(meta.task_id);
87
+ } catch {
88
+ /* no meta.json -> can't dedup by task_id, that's fine */
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ // Group corpus rows by task_id.
95
+ const byTask = new Map();
96
+ for (const r of rows) {
97
+ if (!byTask.has(r.task_id)) byTask.set(r.task_id, []);
98
+ byTask.get(r.task_id).push(r);
99
+ }
100
+
101
+ const toFinding = (r) => ({
102
+ severity: r.severity,
103
+ file: r.file,
104
+ // Triage contract requires an integer line >= 0; corpus may carry null for a
105
+ // file-level finding, so coerce to 0 (the schema's file-level sentinel).
106
+ line: Number.isInteger(r.line) ? r.line : 0,
107
+ issue: r.issue,
108
+ fix: r.fix ?? null,
109
+ reviewer: r.reviewer ?? null,
110
+ });
111
+
112
+ // Build a candidate per task. Highest-signal first (has a human reason/reviewer).
113
+ const candidates = [];
114
+ for (const [taskId, findings] of byTask) {
115
+ if (adopted.has(taskId)) continue;
116
+ const rawFindings = findings.map(toFinding);
117
+ const accepted = [];
118
+ const deferred = [];
119
+ const rejected = [];
120
+ for (const r of findings) {
121
+ if (r.classification === "accepted") accepted.push(toFinding(r));
122
+ else if (r.classification === "deferred")
123
+ deferred.push({ finding: toFinding(r), reason: r.reason || "TODO: reason (from corpus)" });
124
+ else if (r.classification === "rejected")
125
+ rejected.push({ finding: toFinding(r), reason: r.reason || "TODO: reason (from corpus)" });
126
+ }
127
+ const hasHumanSignal = findings.some((r) => r.reason || r.reviewer);
128
+ const title = findings.find((f) => f.task_title)?.task_title || taskId;
129
+ candidates.push({
130
+ taskId,
131
+ hasHumanSignal,
132
+ input: {
133
+ rawFindings,
134
+ // Corpus does not record scope/diff; a maintainer fills these before adopting.
135
+ scope: `TODO: scope for ${title}`,
136
+ diffSummary: "TODO: diff summary",
137
+ },
138
+ expected: {
139
+ accepted,
140
+ deferred,
141
+ rejected,
142
+ // Blockers loop back to dev, so a run with an accepted blocker is not approved.
143
+ approved: accepted.every((f) => f.severity !== "blocking"),
144
+ },
145
+ });
146
+ }
147
+
148
+ candidates.sort((a, b) => Number(b.hasHumanSignal) - Number(a.hasHumanSignal));
149
+ const selected = candidates.slice(0, opts.limit);
150
+
151
+ if (selected.length === 0) {
152
+ console.log("eval-mine-corpus: no new task_ids to propose (all already adopted).");
153
+ process.exit(0);
154
+ }
155
+
156
+ let written = 0;
157
+ let invalid = 0;
158
+ for (const c of selected) {
159
+ const safe = c.taskId.replace(/[^A-Za-z0-9._-]/g, "_");
160
+ const dir = join(candidatesDir, safe);
161
+ const tag = c.hasHumanSignal ? " [human-signal]" : "";
162
+ if (opts.dryRun) {
163
+ console.log(` would emit candidate: ${safe} (${c.input.rawFindings.length} findings)${tag}`);
164
+ continue;
165
+ }
166
+ mkdirSync(dir, { recursive: true });
167
+ writeFileSync(join(dir, "input.json"), JSON.stringify(c.input, null, 2) + "\n");
168
+ writeFileSync(join(dir, "expected.json"), JSON.stringify(c.expected, null, 2) + "\n");
169
+ writeFileSync(
170
+ join(dir, "meta.json"),
171
+ JSON.stringify({ task_id: c.taskId, source: "eval-mine-corpus", hasHumanSignal: c.hasHumanSignal }, null, 2) + "\n",
172
+ );
173
+ // Validate the emitted expected.json against the triage contract; flag if bad.
174
+ const res = spawnSync("node", [validator, join(dir, "expected.json")], { encoding: "utf-8" });
175
+ const ok = res.status === 0;
176
+ if (!ok) invalid++;
177
+ console.log(` emitted: triage-candidates/${safe}${tag} ${ok ? "(schema OK)" : "(SCHEMA FAIL - review)"}`);
178
+ written++;
179
+ }
180
+
181
+ if (!opts.dryRun) {
182
+ console.log("");
183
+ console.log(`eval-mine-corpus: ${written} candidate(s) written to pipeline/eval/triage-candidates/`);
184
+ if (invalid > 0) console.log(` ${invalid} failed schema validation - fix before adopting.`);
185
+ console.log(" Review each, fill scope/diffSummary, then move good ones into");
186
+ console.log(" pipeline/eval/triage/<NN>-<name>/ to add them to the eval suite.");
187
+ }
@@ -1,16 +1,17 @@
1
1
  .claude/CLAUDE.md 1
2
2
  .claude/agents 8
3
- .claude/commands 92
3
+ .claude/commands 42
4
4
  .claude/lib 24
5
5
  .claude/multi-agent-preferences.json 1
6
+ .claude/multi-agent-refs 50
6
7
  .claude/rules 12
7
8
  .claude/schemas 23
8
- .claude/scripts 180
9
+ .claude/scripts 178
9
10
  .claude/settings.json 1
10
- .claude/skills 572
11
+ .claude/skills 428
11
12
  .copilot/agents 8
12
13
  .copilot/copilot-instructions.md 1
13
14
  .copilot/lib 24
14
15
  .copilot/schemas 23
15
- .copilot/scripts 180
16
- .copilot/skills 609
16
+ .copilot/scripts 178
17
+ .copilot/skills 465
@@ -97,7 +97,7 @@ const skipNote = skippedIds.length > 0
97
97
  ? `${modeLabel} mode does NOT TaskCreate phases ${skippedIds.join("/")} - those are not part of the ${modeLabel} phase set (\`${spec.phases.join(" ")}\`). Only register tiles for the active set.`
98
98
  : `${modeLabel} mode TaskCreates all 8 phases (no phase is skipped).`;
99
99
 
100
- const orderingNote = `**All TaskCreate calls fire in strict phase-number order BEFORE any TaskUpdate is applied.** For ${modeLabel} that means: ${phaseSequence}. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks. Full ordering contract in \`refs/tracker-contract.md\` section "TaskCreate ordering (strict)".`;
100
+ const orderingNote = `**All TaskCreate calls fire in strict phase-number order BEFORE any TaskUpdate is applied.** For ${modeLabel} that means: ${phaseSequence}. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks. Full ordering contract in \`$HOME/.claude/multi-agent-refs/tracker-contract.md\` section "TaskCreate ordering (strict)".`;
101
101
 
102
102
  const localCaveat = spec.local
103
103
  ? `\n> **Local mode:** no worktree is created, work happens on the current branch. Phase 0 Init still calls \`init\` - the \`--local\` flag is stored in tracker-state.json, and \`:resume\` restores the correct CWD.\n`
@@ -109,7 +109,7 @@ const banner = spec.autopilot
109
109
 
110
110
  const out = `## Required: Phase Tracker Contract
111
111
 
112
- **The phase tracker is mandatory** - the agent cannot skip it. Full spec: [\`refs/tracker-contract.md\`](./refs/tracker-contract.md).
112
+ **The phase tracker is mandatory** - the agent cannot skip it. Full spec: [\`$HOME/.claude/multi-agent-refs/tracker-contract.md\`]($HOME/.claude/multi-agent-refs/tracker-contract.md).
113
113
  ${banner}${localCaveat}
114
114
  Two channels run in parallel at every phase boundary:
115
115
 
@@ -135,7 +135,7 @@ bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out>
135
135
 
136
136
  In Claude Code the agent MUST also drive the native TaskList widget so the user sees a sticky phase tile stack - this is the only progress signal Claude Code surfaces. Skipping these calls is the #1 source of "I don't see any phases" complaints.
137
137
 
138
- **TaskCreate ordering (strict)**: All TaskCreate calls fire in strict phase-number order BEFORE any TaskUpdate is applied. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks (e.g. \`1 ✓ · 2 ✓ · 4 ✓ · 0 ▶ · 3 ☐\`) even when the underlying state is correct. Pre-marking phases as completed/skipped before Phase 0 starts is FORBIDDEN - register the tile in order, then flip status via TaskUpdate when the phase actually short-circuits. Full contract in \`refs/tracker-contract.md\` section "TaskCreate ordering (strict)".
138
+ **TaskCreate ordering (strict)**: All TaskCreate calls fire in strict phase-number order BEFORE any TaskUpdate is applied. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks (e.g. \`1 ✓ · 2 ✓ · 4 ✓ · 0 ▶ · 3 ☐\`) even when the underlying state is correct. Pre-marking phases as completed/skipped before Phase 0 starts is FORBIDDEN - register the tile in order, then flip status via TaskUpdate when the phase actually short-circuits. Full contract in \`$HOME/.claude/multi-agent-refs/tracker-contract.md\` section "TaskCreate ordering (strict)".
139
139
 
140
140
  \`\`\`text
141
141
  # Phase 0 startup - register one tile per phase (0..N), capture the taskId, persist it:
@@ -21,7 +21,11 @@ import { dirname, join } from "node:path";
21
21
  import { fileURLToPath } from "node:url";
22
22
 
23
23
  const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
24
- const files = execSync("find pipeline -name SKILL.md", { cwd: repoRoot, encoding: "utf-8" })
24
+ // Scope to pipeline/skills only. Slash commands under pipeline/commands also use
25
+ // the <name>/SKILL.md layout now, but they are command definitions
26
+ // (description + allowed-tools, name derived from the dir), NOT skills, so the
27
+ // skill frontmatter contract (required `name:`) does not apply to them.
28
+ const files = execSync("find pipeline/skills -name SKILL.md", { cwd: repoRoot, encoding: "utf-8" })
25
29
  .trim()
26
30
  .split("\n")
27
31
  .filter(Boolean)
@@ -29,6 +33,10 @@ const files = execSync("find pipeline -name SKILL.md", { cwd: repoRoot, encoding
29
33
 
30
34
  const errors = [];
31
35
  const fail = (file, msg) => errors.push(`${file}: ${msg}`);
36
+ // Non-fatal quality signals (a terse description routes poorly). Warnings never
37
+ // fail the gate; they surface skills whose frontmatter could trigger better.
38
+ const warnings = [];
39
+ const warn = (file, msg) => warnings.push(`${file}: ${msg}`);
32
40
 
33
41
  for (const file of files) {
34
42
  const raw = readFileSync(join(repoRoot, file), "utf-8");
@@ -61,6 +69,18 @@ for (const file of files) {
61
69
  fail(file, "description is empty");
62
70
  } else if (fields.description.length > 1024) {
63
71
  fail(file, `description exceeds 1024 chars (${fields.description.length})`);
72
+ } else {
73
+ // Routing quality: a description of a few words rarely says what the skill
74
+ // does AND when to use it, so the model cannot decide to trigger it.
75
+ // Skip YAML block scalars (`description: |` / `>`): this line-based parser
76
+ // only sees the indicator, not the real multi-line text, so a word count
77
+ // would be a false positive.
78
+ const desc = fields.description;
79
+ const isBlockScalar = /^[|>][+-]?\d*$/.test(desc);
80
+ const words = desc.split(/\s+/).filter(Boolean).length;
81
+ if (!isBlockScalar && words < 6) {
82
+ warn(file, `description is terse (${words} words) - say what it does AND when to use it`);
83
+ }
64
84
  }
65
85
 
66
86
  if ("user-invocable" in fields && !["true", "false"].includes(fields["user-invocable"])) {
@@ -72,6 +92,11 @@ for (const file of files) {
72
92
  }
73
93
  }
74
94
 
95
+ if (warnings.length > 0) {
96
+ console.warn(`lint-skills: ${warnings.length} warning(s) (non-fatal):`);
97
+ for (const w of warnings) console.warn(" " + w);
98
+ }
99
+
75
100
  if (errors.length > 0) {
76
101
  console.error(`lint-skills: ${errors.length} error(s) across ${files.length} SKILL.md files`);
77
102
  for (const e of errors) console.error(" " + e);
@@ -21,7 +21,7 @@
21
21
  # Localization:
22
22
  # PHASE_LANG=en (default) | tr - when set to tr, canonical labels resolve to
23
23
  # Turkish. The `auto` sentinel in place of [name] triggers a table lookup.
24
- # Canonical label set mirrors pipeline/commands/multi-agent/refs/phases.md.
24
+ # Canonical label set mirrors pipeline/multi-agent-refs/phases.md.
25
25
  #
26
26
  # Output is colored when stdout is a TTY (TERM != dumb). Plain otherwise so
27
27
  # logs and CI artifacts stay readable. Always written to stdout - log
@@ -32,7 +32,7 @@ set -uo pipefail
32
32
  PHASE_LANG="${PHASE_LANG:-en}"
33
33
 
34
34
  # Canonical phase label table. Keep synced with
35
- # pipeline/commands/multi-agent/refs/phases.md and the table in
35
+ # pipeline/multi-agent-refs/phases.md and the table in
36
36
  # pipeline/skills/shared/multi-agent/SKILL.md.
37
37
  phase_label() {
38
38
  local phase="$1" lang="${2:-en}"
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file review-scope.mjs - v11.3.0
4
+ *
5
+ * Diff-complexity gate for Phase 4 Stage 2. On trivial diffs, every reviewer
6
+ * model agrees and the 2nd/3rd model + triage cost is paid for nothing (a
7
+ * recurring practitioner complaint about multi-model review). This decides how
8
+ * many reviewers to dispatch from the deterministic diff-risk report - no LLM.
9
+ *
10
+ * Pure function of the diff-risk JSON (read on stdin or --file). A diff is
11
+ * "trivial" (→ single reviewer) only when ALL hold:
12
+ * - total churn (loc_added + loc_removed) <= --loc-floor (default 20)
13
+ * - totals.max_score < --risk-floor (default 3.0)
14
+ * - NO file carries a high-stakes signal: security_path, migration,
15
+ * public_api, no_test_change, test_lines_removed
16
+ * Otherwise → full (the CLI-aware set: 2 on Claude Code, 3 on Copilot CLI).
17
+ *
18
+ * Conservative by design: any doubt → full review. Skipping reviewers trades
19
+ * coverage for cost, so the bar for "trivial" is deliberately high.
20
+ *
21
+ * Usage:
22
+ * node diff-risk-score.mjs --base B --head H | node review-scope.mjs
23
+ * node test-review-scope: node review-scope.mjs --file risk.json --loc-floor 20 --risk-floor 3.0
24
+ *
25
+ * Output (stdout, JSON): { scope: "single"|"full", reason, churn, maxScore, blockers }
26
+ * Exit 0 always. Invalid/empty input → fail SAFE to "full" (never under-review).
27
+ */
28
+ import { readFileSync } from "node:fs";
29
+
30
+ const args = process.argv.slice(2);
31
+ const num = (flag, dflt) => {
32
+ const i = args.indexOf(flag);
33
+ return i !== -1 && args[i + 1] != null ? Number(args[i + 1]) : dflt;
34
+ };
35
+ const LOC_FLOOR = num("--loc-floor", 20);
36
+ const RISK_FLOOR = num("--risk-floor", 3.0);
37
+ const fileFlag = args.indexOf("--file");
38
+
39
+ const HIGH_STAKES = new Set([
40
+ "security_path",
41
+ "migration",
42
+ "public_api",
43
+ "no_test_change",
44
+ "test_lines_removed",
45
+ ]);
46
+
47
+ function readInput() {
48
+ try {
49
+ return fileFlag !== -1 && args[fileFlag + 1]
50
+ ? readFileSync(args[fileFlag + 1], "utf8")
51
+ : readFileSync(0, "utf8");
52
+ } catch {
53
+ return "";
54
+ }
55
+ }
56
+
57
+ function emit(o) {
58
+ process.stdout.write(JSON.stringify(o));
59
+ }
60
+
61
+ function main() {
62
+ let report;
63
+ try {
64
+ report = JSON.parse(readInput());
65
+ } catch {
66
+ emit({ scope: "full", reason: "no-risk-data-fail-safe", churn: null, maxScore: null, blockers: [] });
67
+ return;
68
+ }
69
+
70
+ const t = report?.totals || {};
71
+ const churn = (t.loc_added ?? 0) + (t.loc_removed ?? 0);
72
+ const maxScore = t.max_score ?? 0;
73
+ const files = Array.isArray(report?.files) ? report.files : [];
74
+
75
+ const blockers = [];
76
+ for (const f of files) {
77
+ for (const s of f.signals || []) {
78
+ if (HIGH_STAKES.has(s.name)) blockers.push({ file: f.file, signal: s.name });
79
+ }
80
+ }
81
+
82
+ const trivial = churn <= LOC_FLOOR && maxScore < RISK_FLOOR && blockers.length === 0;
83
+ const reason = trivial
84
+ ? `trivial: churn ${churn}<=${LOC_FLOOR}, maxScore ${maxScore}<${RISK_FLOOR}, no high-stakes signals`
85
+ : blockers.length
86
+ ? `high-stakes signal(s): ${[...new Set(blockers.map((b) => b.signal))].join(", ")}`
87
+ : churn > LOC_FLOOR
88
+ ? `churn ${churn} > ${LOC_FLOOR}`
89
+ : `maxScore ${maxScore} >= ${RISK_FLOOR}`;
90
+
91
+ emit({ scope: trivial ? "single" : "full", reason, churn, maxScore, blockers });
92
+ }
93
+
94
+ main();
@@ -31,8 +31,8 @@ add "$ROOT/install/templates/claude-hooks.json"
31
31
  add "$ROOT/install/templates/copilot-instructions.md"
32
32
  add "$ROOT/pipeline/preferences-template.json"
33
33
  for f in "$ROOT"/pipeline/agents/*.md; do add "$f"; done
34
- for f in "$ROOT"/pipeline/skills/figma-common/figma-setup/scripts/*.py \
35
- "$ROOT"/pipeline/skills/figma-ios/figma-to-component/scripts/*.py; do add "$f"; done
34
+ # (figma component skills + their scripts now live in the ai-*-engineering-toolkit
35
+ # marketplace plugin, not in this repo, so there is nothing figma to scan here.)
36
36
  add "$ROOT/pipeline/scripts/agent-guard.sh"
37
37
  add "$ROOT/pipeline/scripts/pre-commit-check.sh"
38
38
 
@@ -20,7 +20,7 @@ RENDERER="$ROOT/pipeline/scripts/render-agent-log-cost.sh"
20
20
  TRACKER="$ROOT/pipeline/scripts/phase-tracker.sh"
21
21
  LOG_METRIC="$ROOT/pipeline/scripts/log-metric.sh"
22
22
  TABLE="$ROOT/pipeline/scripts/cost-table.json"
23
- LOG_FORMAT_DOC="$ROOT/pipeline/commands/multi-agent/refs/phases/log-format.md"
23
+ LOG_FORMAT_DOC="$ROOT/pipeline/multi-agent-refs/phases/log-format.md"
24
24
 
25
25
  pass=0
26
26
  fail=0
@@ -15,8 +15,8 @@ set -euo pipefail
15
15
  ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
16
16
  AGENTS_DIR="$ROOT/pipeline/agents"
17
17
  ORCH_SKILL="$ROOT/pipeline/skills/shared/core/multi-agent/SKILL.md"
18
- ORCH_CMD="$ROOT/pipeline/commands/multi-agent.md"
19
- PHASE4="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-4-review.md"
18
+ ORCH_CMD="$ROOT/pipeline/commands/multi-agent/SKILL.md"
19
+ PHASE4="$ROOT/pipeline/multi-agent-refs/phases/phase-4-review.md"
20
20
 
21
21
  pass=0
22
22
  fail=0
@@ -66,9 +66,9 @@ fi
66
66
 
67
67
  # --- 4b: orchestrator command file references ---
68
68
  if grep -q 'preferredModel' "$ORCH_CMD"; then
69
- record_pass "commands/multi-agent.md references preferredModel"
69
+ record_pass "commands/multi-agent/SKILL.md references preferredModel"
70
70
  else
71
- record_fail "commands/multi-agent.md missing preferredModel reference"
71
+ record_fail "commands/multi-agent/SKILL.md missing preferredModel reference"
72
72
  fi
73
73
 
74
74
  # --- 5: Phase 4 review doc references override ---
@@ -8,8 +8,8 @@
8
8
  set -uo pipefail
9
9
 
10
10
  ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
11
- DOC="$ROOT/pipeline/commands/multi-agent/refs/features/autopilot-circuit-breaker.md"
12
- MODES="$ROOT/pipeline/commands/multi-agent/refs/phases/modes.md"
11
+ DOC="$ROOT/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md"
12
+ MODES="$ROOT/pipeline/multi-agent-refs/phases/modes.md"
13
13
 
14
14
  PASS=0; FAIL=0
15
15
  pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
@@ -13,8 +13,8 @@ set -euo pipefail
13
13
 
14
14
  HERE="$(cd "$(dirname "$0")" && pwd)"
15
15
  ROOT="$(cd "$HERE/../.." && pwd)"
16
- CHANNELS="$ROOT/pipeline/commands/multi-agent/channels.md"
17
- PHASE7="$ROOT/pipeline/commands/multi-agent/refs/phases/phase-7-report.md"
16
+ CHANNELS="$ROOT/pipeline/commands/multi-agent/channels/SKILL.md"
17
+ PHASE7="$ROOT/pipeline/multi-agent-refs/phases/phase-7-report.md"
18
18
 
19
19
  PASS=0
20
20
  FAIL=0