@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.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 (331) hide show
  1. package/CHANGELOG.md +37 -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 +33 -15
  8. package/install/copilot.mjs +16 -14
  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/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
  33. package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
  34. package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
  35. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
  36. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
  37. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
  38. package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
  39. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
  40. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
  41. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
  42. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
  43. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
  44. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
  45. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
  46. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
  47. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
  48. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
  49. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
  50. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
  51. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
  52. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
  53. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
  54. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
  55. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
  56. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
  57. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
  58. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
  59. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
  60. package/pipeline/preferences-template.json +17 -1
  61. package/pipeline/rules/figma-pipeline.md +2 -2
  62. package/pipeline/schemas/prefs.schema.json +0 -34
  63. package/pipeline/scripts/README.md +1 -3
  64. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  65. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  66. package/pipeline/scripts/phase-banner.sh +2 -2
  67. package/pipeline/scripts/review-scope.mjs +94 -0
  68. package/pipeline/scripts/scan-agent-config.sh +2 -2
  69. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  70. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  71. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  72. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  73. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  74. package/pipeline/scripts/smoke-clarify.sh +1 -1
  75. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  76. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  77. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  78. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  79. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  80. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  81. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  82. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  83. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  84. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  85. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  86. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  87. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  88. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  89. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  90. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  91. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  92. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  93. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  94. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  95. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  96. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  97. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  98. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  99. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  100. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  101. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  102. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  103. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  104. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  105. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  106. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  107. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  108. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  109. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  110. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  111. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  112. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  113. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  114. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  115. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  116. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  117. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  118. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  119. package/pipeline/scripts/smoke-update-check.sh +1 -1
  120. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  121. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  122. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  123. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  124. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  125. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  126. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  127. package/pipeline/scripts/uninstall.mjs +2 -2
  128. package/pipeline/skills/.skill-manifest.json +40 -160
  129. package/pipeline/skills/.skills-index.json +3 -372
  130. package/pipeline/skills/shared/README.md +1 -1
  131. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  132. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  133. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  134. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  135. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  136. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  137. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  138. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  139. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  140. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  141. package/pipeline/skills/skills-index.md +2 -43
  142. package/pipeline/commands/multi-agent/refactor.md +0 -188
  143. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  144. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  145. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  146. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  147. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  148. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  149. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  150. package/pipeline/skills/figma-android/README.md +0 -38
  151. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  152. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  153. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  154. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  155. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  156. package/pipeline/skills/figma-common/README.md +0 -64
  157. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  158. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  159. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  160. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  161. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  162. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  163. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  164. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  165. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  166. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  167. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  168. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  169. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  170. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  171. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  172. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  173. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  174. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  175. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  176. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  177. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  178. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  179. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  180. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  181. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  182. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  183. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  184. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  185. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  186. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  187. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  188. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  189. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  190. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  191. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  192. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  193. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  194. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  195. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  196. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  197. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  198. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  199. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  200. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  201. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  202. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  203. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  204. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  205. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  206. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  207. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  208. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  209. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  210. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  232. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  233. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  234. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  235. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  236. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  237. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  238. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  239. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  240. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  241. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  242. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  253. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  254. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  255. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  256. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  257. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  258. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  259. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  260. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  261. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  262. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  263. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  294. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  295. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  296. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  297. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  298. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  299. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  300. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  301. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  302. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  303. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  304. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  305. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  310. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  311. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  312. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  313. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  314. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  315. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  316. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  317. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  318. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  319. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  320. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  321. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
@@ -1,260 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Remote MCP Fetch Script
4
- Calls Figma remote MCP tools at https://mcp.figma.com/mcp using OAuth token.
5
-
6
- Usage:
7
- python3 remote-mcp-fetch.py \
8
- --tool get_metadata \
9
- --file-key "ps4xrJzhn7WNbfkZs895Bi" \
10
- --node-id "5:17752" \
11
- [--mcp-token TOKEN] \
12
- [--output /path/to/output.json] \
13
- [--extra-args '{"key": "value"}']
14
-
15
- Tools: get_metadata, get_design_context, get_variable_defs,
16
- get_code_connect_map, get_screenshot
17
-
18
- --mcp-token: OAuth token. Falls back to macOS Keychain "FIGMA_MCP_TOKEN".
19
- --output: Write text content to file. Omit to print to stdout.
20
- --extra-args: Additional JSON arguments merged into tool call.
21
-
22
- Exit 0 = success, Exit 1 = failure (prints JSON error to stderr)
23
- """
24
-
25
- import argparse
26
- import http.client
27
- import json
28
- import os
29
- import subprocess
30
- import sys
31
-
32
-
33
- REMOTE_MCP_URL = "mcp.figma.com"
34
- REMOTE_MCP_PATH = "/mcp"
35
-
36
-
37
- def log(msg):
38
- print(f"[remote-mcp] {msg}", file=sys.stderr)
39
-
40
-
41
- def get_mcp_token(cli_token=None):
42
- """Resolve MCP OAuth token: CLI arg > Keychain FIGMA_MCP_TOKEN > extract from Claude Code credentials."""
43
- if cli_token:
44
- return cli_token
45
-
46
- # Try dedicated keychain entry
47
- try:
48
- token = subprocess.check_output(
49
- ["security", "find-generic-password", "-a", os.environ["USER"],
50
- "-s", "FIGMA_MCP_TOKEN", "-w"],
51
- stderr=subprocess.DEVNULL,
52
- ).decode().strip()
53
- if token:
54
- log("Token from Keychain: FIGMA_MCP_TOKEN")
55
- return token
56
- except (subprocess.CalledProcessError, KeyError):
57
- pass
58
-
59
- # Try extracting from Claude Code credentials
60
- try:
61
- import re
62
- raw = subprocess.check_output(
63
- ["security", "find-generic-password", "-s", "Claude Code-credentials",
64
- "-a", os.environ["USER"], "-w"],
65
- stderr=subprocess.DEVNULL,
66
- ).decode()
67
- match = re.search(
68
- r'"figma-remote\|[^"]+":\{[^}]*"accessToken":"([^"]+)"', raw
69
- )
70
- if match:
71
- token = match.group(1)
72
- log("Token extracted from Claude Code credentials (figma-remote)")
73
- return token
74
- except (subprocess.CalledProcessError, KeyError):
75
- pass
76
-
77
- return None
78
-
79
-
80
- def mcp_call(token, tool_name, arguments):
81
- """Call a remote MCP tool. Returns list of text content strings."""
82
- conn = http.client.HTTPSConnection(REMOTE_MCP_URL, timeout=120)
83
- headers = {
84
- "Content-Type": "application/json",
85
- "Accept": "application/json, text/event-stream",
86
- "Authorization": f"Bearer {token}",
87
- }
88
-
89
- # Init (stateless but required by protocol)
90
- init_body = json.dumps({
91
- "jsonrpc": "2.0",
92
- "method": "initialize",
93
- "params": {
94
- "capabilities": {},
95
- "clientInfo": {"name": "remote-mcp-fetch", "version": "1.0.0"},
96
- "protocolVersion": "2025-03-26",
97
- },
98
- "id": 1,
99
- })
100
- conn.request("POST", REMOTE_MCP_PATH, body=init_body, headers=headers)
101
- init_resp = conn.getresponse()
102
- if init_resp.status != 200:
103
- body = init_resp.read().decode()
104
- conn.close()
105
- raise RuntimeError(f"MCP init failed: HTTP {init_resp.status} - {body}")
106
- init_resp.read() # drain
107
- conn.close()
108
-
109
- # Tool call
110
- conn2 = http.client.HTTPSConnection(REMOTE_MCP_URL, timeout=120)
111
- call_body = json.dumps({
112
- "jsonrpc": "2.0",
113
- "method": "tools/call",
114
- "params": {"name": tool_name, "arguments": arguments},
115
- "id": 2,
116
- })
117
- conn2.request("POST", REMOTE_MCP_PATH, body=call_body, headers=headers)
118
- resp = conn2.getresponse()
119
- raw = resp.read().decode()
120
- conn2.close()
121
-
122
- if resp.status != 200:
123
- raise RuntimeError(f"MCP {tool_name}: HTTP {resp.status} - {raw[:300]}")
124
-
125
- # Parse SSE - extract JSON from "data: " lines
126
- # The JSON payload may span multiple physical lines (text content with \n),
127
- # so we extract everything after the first "data: " prefix until valid JSON.
128
- texts = []
129
- images = []
130
- data_start = raw.find("\ndata: ")
131
- if data_start == -1:
132
- data_start = raw.find("data: ") # might be at very start
133
- if data_start != -1:
134
- json_str = raw[raw.index("data: ", data_start) + 6:]
135
- # Trim any trailing SSE noise (event lines after the JSON)
136
- json_str = json_str.strip()
137
- try:
138
- j = json.loads(json_str)
139
- except json.JSONDecodeError:
140
- # Try to find the end of the JSON object
141
- depth = 0
142
- end = 0
143
- for i, ch in enumerate(json_str):
144
- if ch == "{":
145
- depth += 1
146
- elif ch == "}":
147
- depth -= 1
148
- if depth == 0:
149
- end = i + 1
150
- break
151
- if end > 0:
152
- try:
153
- j = json.loads(json_str[:end])
154
- except json.JSONDecodeError:
155
- j = None
156
- else:
157
- j = None
158
-
159
- if j:
160
- if "error" in j:
161
- raise RuntimeError(f"MCP {tool_name}: {j['error']}")
162
-
163
- content = (j.get("result") or {}).get("content", [])
164
- for item in content:
165
- if item.get("type") == "text":
166
- texts.append(item["text"])
167
- elif item.get("type") == "image":
168
- images.append({
169
- "mimeType": item.get("mimeType", "image/png"),
170
- "data": item.get("data", ""),
171
- })
172
-
173
- return texts, images
174
-
175
-
176
- def main():
177
- parser = argparse.ArgumentParser(description="Remote MCP Fetch")
178
- parser.add_argument("--tool", required=True,
179
- choices=["get_metadata", "get_design_context",
180
- "get_variable_defs", "get_code_connect_map",
181
- "get_screenshot"])
182
- parser.add_argument("--file-key", required=True)
183
- parser.add_argument("--node-id", required=True)
184
- parser.add_argument("--mcp-token", help="OAuth token (falls back to Keychain)")
185
- parser.add_argument("--output", help="Write text output to file")
186
- parser.add_argument("--output-image", help="Write screenshot image to file (PNG)")
187
- parser.add_argument("--extra-args", help="Additional JSON args merged into tool call")
188
- args = parser.parse_args()
189
-
190
- # Resolve token
191
- token = get_mcp_token(args.mcp_token)
192
- if not token:
193
- log("ERROR: No MCP OAuth token found.")
194
- log("Run /figma-setup to extract and store the token, or pass --mcp-token.")
195
- print(json.dumps({
196
- "error": "no_mcp_token",
197
- "message": "No MCP OAuth token. Run /figma-setup or pass --mcp-token.",
198
- }), file=sys.stderr)
199
- sys.exit(1)
200
-
201
- # Build arguments
202
- arguments = {
203
- "fileKey": args.file_key,
204
- "nodeId": args.node_id,
205
- "clientLanguages": "swift",
206
- "clientFrameworks": "swiftui",
207
- }
208
- # Disable Code Connect in design context - when Code Connect is enabled,
209
- # the returned snippets override the original Tailwind reference code we
210
- # need for layout/style extraction. We fetch Code Connect separately
211
- # via get_code_connect_map.
212
- if args.tool == "get_design_context":
213
- arguments["disableCodeConnect"] = True
214
- # Filter Code Connect by SwiftUI - without this, MCP returns all platforms
215
- # (e.g. Compose) and we get Android snippets instead of iOS ones.
216
- if args.tool == "get_code_connect_map":
217
- arguments["codeConnectLabel"] = "SwiftUI"
218
- if args.extra_args:
219
- try:
220
- extra = json.loads(args.extra_args)
221
- arguments.update(extra)
222
- except json.JSONDecodeError as e:
223
- log(f"ERROR: --extra-args invalid JSON: {e}")
224
- sys.exit(1)
225
-
226
- log(f"Calling {args.tool} for node {args.node_id} in file {args.file_key}")
227
-
228
- try:
229
- texts, images = mcp_call(token, args.tool, arguments)
230
- except RuntimeError as e:
231
- log(f"ERROR: {e}")
232
- print(json.dumps({"error": str(e)}), file=sys.stderr)
233
- sys.exit(1)
234
-
235
- # Handle screenshot (image output)
236
- if args.tool == "get_screenshot" and images:
237
- import base64
238
- img_data = base64.b64decode(images[0]["data"])
239
- if args.output_image:
240
- with open(args.output_image, "wb") as f:
241
- f.write(img_data)
242
- log(f"Screenshot saved: {args.output_image} ({len(img_data)} bytes)")
243
- else:
244
- log(f"Screenshot: {len(img_data)} bytes (use --output-image to save)")
245
-
246
- # Handle text output
247
- combined = "\n".join(texts)
248
- if args.output:
249
- from pathlib import Path
250
- Path(args.output).parent.mkdir(parents=True, exist_ok=True)
251
- Path(args.output).write_text(combined)
252
- log(f"Output saved: {args.output} ({len(combined)} chars)")
253
- else:
254
- print(combined)
255
-
256
- log("Done")
257
-
258
-
259
- if __name__ == "__main__":
260
- main()
@@ -1,260 +0,0 @@
1
- #!/usr/bin/env python3
2
- """resolve-author-logins.py - resolve the 26 distinct git-author names
3
- to real GitHub logins via the commits API.
4
-
5
- Reads temp/authors-registry.json (output of build-author-registry.py),
6
- finds every distinct git author name, and for each one:
7
-
8
- 1. Uses `git log --author='<name>' --format='%H' -n 1` inside the
9
- uicomponents repo to get one SHA authored by them.
10
- 2. Calls `gh api repos/{owner}/{name}/commits/{sha}` to fetch the
11
- commit. GitHub attaches `author.login` when the commit email is
12
- registered to a user account.
13
- 3. Writes the resolved mapping to temp/author-login-map.json.
14
-
15
- For names where GitHub returns no login (email not registered), the
16
- entry is still written with `login: null` so the reviewer can fill it
17
- in manually.
18
-
19
- Output: temp/author-login-map.json
20
- {
21
- "meta": { "generated_at": "...", "resolved": N, "unresolved": N },
22
- "mapping": {
23
- "OZAN BARIS GUNAYDIN - ...": {
24
- "login": "932986_tkgithub",
25
- "resolved_via_sha": "b07442be...",
26
- "lines_total": 1916,
27
- "components": 11
28
- },
29
- "M-ISPIRLI_tkgithub": {
30
- "login": "M-ISPIRLI_tkgithub",
31
- "resolved_via_sha": null,
32
- "resolution": "already_login_like",
33
- ...
34
- },
35
- ...
36
- }
37
- }
38
-
39
- Idempotent - re-running uses the existing map file as a cache and
40
- only queries API for names that don't have a login yet. Pass
41
- --refresh to re-resolve everything.
42
-
43
- Usage:
44
- python3 resolve-author-logins.py \\
45
- [--authors-file temp/authors-registry.json] \\
46
- [--uicomponents-repo ...] \\
47
- [--repo OWNER/REPO] \\
48
- [--output temp/author-login-map.json] \\
49
- [--refresh]
50
- """
51
-
52
- import argparse
53
- import json
54
- import re
55
- import subprocess
56
- import sys
57
- from datetime import datetime, timezone
58
- from pathlib import Path
59
- from typing import Optional
60
-
61
- DEFAULT_REPO = "{github.componentsRepo}"
62
-
63
- _GH_LOGIN_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9\-_]{0,38}$")
64
-
65
-
66
- def find_repo_root() -> Path:
67
- p = Path.cwd()
68
- while p != p.parent:
69
- if (p / ".git").exists():
70
- return p
71
- p = p.parent
72
- return Path.cwd()
73
-
74
-
75
- def looks_like_github_login(name: str) -> bool:
76
- return isinstance(name, str) and bool(_GH_LOGIN_RE.match(name))
77
-
78
-
79
- def find_commit_sha_for_author(
80
- author_name: str,
81
- uicomponents_repo: Path,
82
- ) -> Optional[str]:
83
- """Return one commit SHA authored by `author_name`, or None."""
84
- try:
85
- r = subprocess.run(
86
- [
87
- "git", "-C", str(uicomponents_repo),
88
- "log", f"--author={author_name}", "--format=%H", "-n", "1",
89
- ],
90
- capture_output=True,
91
- text=True,
92
- check=False,
93
- timeout=15,
94
- )
95
- except (subprocess.SubprocessError, FileNotFoundError):
96
- return None
97
- if r.returncode != 0:
98
- return None
99
- sha = r.stdout.strip().split("\n")[0]
100
- return sha or None
101
-
102
-
103
- def fetch_commit_author_login(sha: str, repo: str) -> Optional[str]:
104
- """Call gh api repos/{repo}/commits/{sha} and return author.login."""
105
- try:
106
- r = subprocess.run(
107
- ["gh", "api", f"repos/{repo}/commits/{sha}", "--jq", ".author.login // empty"],
108
- capture_output=True,
109
- text=True,
110
- check=False,
111
- timeout=20,
112
- )
113
- except (subprocess.SubprocessError, FileNotFoundError):
114
- return None
115
- if r.returncode != 0:
116
- return None
117
- login = r.stdout.strip()
118
- return login or None
119
-
120
-
121
- def resolve_all(
122
- authors_data: dict,
123
- uicomponents_repo: Path,
124
- repo: str,
125
- existing_map: dict,
126
- refresh: bool,
127
- ) -> dict:
128
- """Walk every author in authors_data, resolve each to a login.
129
-
130
- `authors_data` is the dict loaded from authors-registry.json.
131
- Returns a new mapping dict suitable for writing to
132
- author-login-map.json.
133
- """
134
- authors = authors_data.get("authors", {})
135
- mapping: dict = {}
136
-
137
- for name, info in authors.items():
138
- # Cached result?
139
- cached = existing_map.get(name) if not refresh else None
140
- if cached and cached.get("login"):
141
- mapping[name] = cached
142
- continue
143
-
144
- entry = {
145
- "login": None,
146
- "lines_total": info.get("lines_total", 0),
147
- "components": len(info.get("components", [])),
148
- "resolved_via_sha": None,
149
- "resolution": None,
150
- }
151
-
152
- # Already login-like? use verbatim
153
- if looks_like_github_login(name):
154
- entry["login"] = name
155
- entry["resolution"] = "already_login_like"
156
- mapping[name] = entry
157
- print(f" already-login: {name}", file=sys.stderr)
158
- continue
159
-
160
- # Find a commit, query gh api
161
- sha = find_commit_sha_for_author(name, uicomponents_repo)
162
- if not sha:
163
- entry["resolution"] = "no_commit_found"
164
- mapping[name] = entry
165
- print(f" no commit: {name}", file=sys.stderr)
166
- continue
167
-
168
- login = fetch_commit_author_login(sha, repo)
169
- entry["resolved_via_sha"] = sha
170
- if login:
171
- entry["login"] = login
172
- entry["resolution"] = "resolved_via_commit"
173
- print(f" resolved: {name} -> {login}", file=sys.stderr)
174
- else:
175
- entry["resolution"] = "gh_api_returned_null"
176
- print(f" unresolved: {name}", file=sys.stderr)
177
-
178
- mapping[name] = entry
179
-
180
- return mapping
181
-
182
-
183
- def main() -> int:
184
- parser = argparse.ArgumentParser(
185
- description="Resolve git author display names to GitHub logins",
186
- )
187
- parser.add_argument("--authors-file", help="Input: temp/authors-registry.json")
188
- parser.add_argument("--uicomponents-repo", help="uicomponents repo path")
189
- parser.add_argument("--repo", default=DEFAULT_REPO)
190
- parser.add_argument("--output", help="temp/author-login-map.json")
191
- parser.add_argument("--refresh", action="store_true", help="Ignore cache and re-resolve all")
192
- args = parser.parse_args()
193
-
194
- repo_root = find_repo_root()
195
- authors_file = Path(args.authors_file) if args.authors_file else repo_root / "temp" / "authors-registry.json"
196
- uicomponents_repo = (
197
- Path(args.uicomponents_repo)
198
- if args.uicomponents_repo
199
- else repo_root / "{repos.packagesContainer}" / "Packages" / "{project.slug}-components"
200
- )
201
- output = Path(args.output) if args.output else repo_root / "temp" / "author-login-map.json"
202
-
203
- if not authors_file.exists():
204
- print(f"ERROR: missing {authors_file}. Run build-author-registry.py first.", file=sys.stderr)
205
- return 1
206
- if not uicomponents_repo.exists():
207
- print(f"ERROR: uicomponents repo not found: {uicomponents_repo}", file=sys.stderr)
208
- return 1
209
-
210
- authors_data = json.loads(authors_file.read_text(encoding="utf-8"))
211
-
212
- existing_map: dict = {}
213
- if output.exists() and not args.refresh:
214
- try:
215
- prev = json.loads(output.read_text(encoding="utf-8"))
216
- existing_map = prev.get("mapping", {})
217
- except json.JSONDecodeError:
218
- existing_map = {}
219
-
220
- print(f"Resolving {len(authors_data.get('authors', {}))} distinct authors ...", file=sys.stderr)
221
- mapping = resolve_all(
222
- authors_data=authors_data,
223
- uicomponents_repo=uicomponents_repo,
224
- repo=args.repo,
225
- existing_map=existing_map,
226
- refresh=args.refresh,
227
- )
228
-
229
- resolved = sum(1 for v in mapping.values() if v.get("login"))
230
- unresolved = len(mapping) - resolved
231
-
232
- out_data = {
233
- "meta": {
234
- "generated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
235
- "total": len(mapping),
236
- "resolved": resolved,
237
- "unresolved": unresolved,
238
- },
239
- "mapping": mapping,
240
- }
241
- output.parent.mkdir(parents=True, exist_ok=True)
242
- output.write_text(json.dumps(out_data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
243
-
244
- summary = {
245
- "status": "ok",
246
- "output": str(output),
247
- "total": len(mapping),
248
- "resolved": resolved,
249
- "unresolved": unresolved,
250
- "unresolved_list": [
251
- {"name": n, "lines": v.get("lines_total", 0), "components": v.get("components", 0)}
252
- for n, v in mapping.items() if not v.get("login")
253
- ],
254
- }
255
- print(json.dumps(summary, indent=2, ensure_ascii=False))
256
- return 0
257
-
258
-
259
- if __name__ == "__main__":
260
- sys.exit(main())
@@ -1,86 +0,0 @@
1
- #!/bin/bash
2
- # run-uicomponents-tests.sh - Portable UIComponentsTests runner
3
- #
4
- # Runs tests via the UIComponents-Package scheme inside the SPM package directory.
5
- # This avoids the need to "show" the UIComponentsTests scheme in Xcode's Manage Schemes.
6
- #
7
- # Usage:
8
- # bash run-uicomponents-tests.sh [--filter <TestClassName>] [--simulator <name>]
9
- #
10
- # Examples:
11
- # bash run-uicomponents-tests.sh
12
- # bash run-uicomponents-tests.sh --filter AvatarPassengersSnapshotTests
13
- # bash run-uicomponents-tests.sh --filter LabelBadgeViewInspectorTests --simulator "iPhone 16 Pro"
14
-
15
- set -euo pipefail
16
-
17
- REPO_ROOT=$(git rev-parse --show-toplevel)
18
- PACKAGE_DIR="$REPO_ROOT/{repos.components.path}"
19
-
20
- # Parse arguments
21
- FILTER=""
22
- SIMULATOR=""
23
- while [[ $# -gt 0 ]]; do
24
- case $1 in
25
- --filter) FILTER="$2"; shift 2 ;;
26
- --simulator) SIMULATOR="$2"; shift 2 ;;
27
- *) echo "Unknown option: $1"; exit 1 ;;
28
- esac
29
- done
30
-
31
- # --- STEP 1: Verify package directory exists ---
32
- if [[ ! -d "$PACKAGE_DIR" ]]; then
33
- echo "ERROR: UIComponents package not found at: $PACKAGE_DIR"
34
- exit 2
35
- fi
36
-
37
- # --- STEP 2: Auto-detect simulator ---
38
- if [[ -z "$SIMULATOR" ]]; then
39
- SIMULATOR=$(xcrun simctl list devices available -j 2>/dev/null | python3 -c "
40
- import json, sys
41
- data = json.load(sys.stdin)
42
- for runtime in sorted(data.get('devices', {}).keys(), reverse=True):
43
- if 'iOS' not in runtime: continue
44
- for d in data['devices'][runtime]:
45
- if d.get('isAvailable') and 'iPhone' in d.get('name', ''):
46
- print(d['name']); sys.exit(0)
47
- " 2>/dev/null || echo "")
48
-
49
- if [[ -z "$SIMULATOR" ]]; then
50
- echo "ERROR: No available iPhone simulator found."
51
- echo "Install an iOS Simulator runtime via Xcode > Settings > Platforms."
52
- exit 3
53
- fi
54
- fi
55
-
56
- echo "=== UIComponentsTests Runner ==="
57
- echo "Repo: $REPO_ROOT"
58
- echo "Package: $PACKAGE_DIR"
59
- echo "Simulator: $SIMULATOR"
60
- echo "Filter: ${FILTER:-all tests}"
61
- echo ""
62
-
63
- # --- STEP 3: Run tests ---
64
- CMD=(xcodebuild test
65
- -scheme UIComponents-Package
66
- -destination "platform=iOS Simulator,name=$SIMULATOR"
67
- -skipMacroValidation
68
- -quiet
69
- )
70
-
71
- if [[ -n "$FILTER" ]]; then
72
- CMD+=(-only-testing:"UIComponentsTests/$FILTER")
73
- fi
74
-
75
- cd "$PACKAGE_DIR"
76
- "${CMD[@]}"
77
- EXIT_CODE=$?
78
-
79
- echo ""
80
- if [[ $EXIT_CODE -eq 0 ]]; then
81
- echo "=== TESTS PASSED ==="
82
- else
83
- echo "=== TESTS FAILED (exit $EXIT_CODE) ==="
84
- fi
85
-
86
- exit $EXIT_CODE