@mmerterden/multi-agent-pipeline 11.1.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 (342) hide show
  1. package/CHANGELOG.md +58 -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/_common.mjs +9 -1
  7. package/install/_dev-only-files.mjs +0 -6
  8. package/install/claude.mjs +45 -18
  9. package/install/copilot.mjs +16 -14
  10. package/install/templates/copilot-instructions.md +3 -3
  11. package/package.json +1 -1
  12. package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
  13. package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
  14. package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
  15. package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
  16. package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
  17. package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
  18. package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
  19. package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
  20. package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
  21. package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
  22. package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
  23. package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
  24. package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
  25. package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
  26. package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
  27. package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
  28. package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
  29. package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
  30. package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
  31. package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
  32. package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
  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-stack-plugins.mjs +1 -1
  66. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  67. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  68. package/pipeline/scripts/phase-banner.sh +2 -2
  69. package/pipeline/scripts/review-scope.mjs +94 -0
  70. package/pipeline/scripts/scan-agent-config.sh +2 -2
  71. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  72. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  73. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  74. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  75. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  76. package/pipeline/scripts/smoke-clarify.sh +1 -1
  77. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  78. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  79. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  80. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  81. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  82. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  83. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  84. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  85. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  86. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  87. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  88. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  89. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  90. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  91. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  92. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  93. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  94. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  95. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  96. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  97. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  98. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  99. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  100. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  101. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  102. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  103. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  104. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  105. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  106. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  107. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  108. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  109. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  110. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  111. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  112. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  113. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  114. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  115. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  116. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  117. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  118. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  119. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  120. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  121. package/pipeline/scripts/smoke-update-check.sh +1 -1
  122. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  123. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  124. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  125. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  126. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  127. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  128. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  129. package/pipeline/scripts/uninstall.mjs +2 -2
  130. package/pipeline/skills/.skill-manifest.json +40 -160
  131. package/pipeline/skills/.skills-index.json +21 -372
  132. package/pipeline/skills/shared/README.md +1 -1
  133. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  134. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  135. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  136. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  137. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  138. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  139. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  140. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  141. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  142. package/pipeline/skills/shared/external/backlog/BACKLOG.md +32 -0
  143. package/pipeline/skills/shared/external/backlog/SKILL.md +49 -0
  144. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  145. package/pipeline/skills/shared/external/skill-creator/SKILL.md +48 -0
  146. package/pipeline/skills/shared/external/skill-creator/audit.md +59 -0
  147. package/pipeline/skills/shared/external/skill-creator/checklist.md +32 -0
  148. package/pipeline/skills/shared/external/skill-creator/examples.md +65 -0
  149. package/pipeline/skills/shared/external/skill-creator/label-check.md +43 -0
  150. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +83 -0
  151. package/pipeline/skills/shared/external/skill-creator/template.md +67 -0
  152. package/pipeline/skills/skills-index.md +4 -43
  153. package/pipeline/commands/multi-agent/refactor.md +0 -188
  154. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  155. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  156. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  157. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  158. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  159. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  160. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  161. package/pipeline/skills/figma-android/README.md +0 -38
  162. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  163. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  164. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  165. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  166. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  167. package/pipeline/skills/figma-common/README.md +0 -64
  168. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  169. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  170. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  171. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  172. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  173. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  174. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  175. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  176. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  177. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  178. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  179. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  180. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  181. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  182. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  183. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  184. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  185. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  186. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  187. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  188. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  189. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  190. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  191. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  192. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  193. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  194. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  195. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  196. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  197. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  198. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  199. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  200. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  201. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  202. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  203. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  204. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  205. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  206. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  207. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  208. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  209. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  210. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  232. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  233. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  234. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  235. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  236. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  237. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  238. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  239. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  240. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  241. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  242. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  253. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  254. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  255. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  256. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  257. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  258. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  259. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  260. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  261. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  262. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  263. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  294. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  295. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  296. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  297. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  298. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  299. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  300. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  301. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  302. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  303. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  304. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  305. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  310. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  311. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  312. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  313. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  314. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  315. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  316. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  317. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  318. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  319. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  320. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  321. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  332. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  333. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  334. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  335. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  336. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  337. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  338. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  339. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  340. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  341. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  342. /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