@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
@@ -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