@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +2 -2
  3. package/docs/FIGMA_PIPELINE.md +12 -25
  4. package/docs/architecture.md +3 -5
  5. package/docs/features.md +8 -8
  6. package/install/_dev-only-files.mjs +0 -6
  7. package/install/claude.mjs +33 -15
  8. package/install/copilot.mjs +16 -14
  9. package/install/templates/copilot-instructions.md +3 -3
  10. package/package.json +1 -1
  11. package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
  12. package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
  13. package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
  14. package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
  15. package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
  16. package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
  17. package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
  18. package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
  19. package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
  20. package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
  21. package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
  22. package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
  23. package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
  24. package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
  25. package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
  26. package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
  27. package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
  28. package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
  29. package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
  30. package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
  31. package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
  32. package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
  33. package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
  34. package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
  35. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
  36. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
  37. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
  38. package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
  39. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
  40. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
  41. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
  42. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
  43. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
  44. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
  45. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
  46. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
  47. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
  48. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
  49. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
  50. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
  51. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
  52. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
  53. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
  54. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
  55. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
  56. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
  57. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
  58. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
  59. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
  60. package/pipeline/preferences-template.json +17 -1
  61. package/pipeline/rules/figma-pipeline.md +2 -2
  62. package/pipeline/schemas/prefs.schema.json +0 -34
  63. package/pipeline/scripts/README.md +1 -3
  64. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  65. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  66. package/pipeline/scripts/phase-banner.sh +2 -2
  67. package/pipeline/scripts/review-scope.mjs +94 -0
  68. package/pipeline/scripts/scan-agent-config.sh +2 -2
  69. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  70. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  71. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  72. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  73. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  74. package/pipeline/scripts/smoke-clarify.sh +1 -1
  75. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  76. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  77. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  78. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  79. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  80. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  81. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  82. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  83. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  84. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  85. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  86. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  87. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  88. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  89. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  90. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  91. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  92. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  93. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  94. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  95. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  96. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  97. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  98. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  99. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  100. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  101. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  102. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  103. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  104. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  105. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  106. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  107. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  108. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  109. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  110. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  111. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  112. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  113. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  114. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  115. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  116. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  117. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  118. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  119. package/pipeline/scripts/smoke-update-check.sh +1 -1
  120. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  121. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  122. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  123. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  124. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  125. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  126. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  127. package/pipeline/scripts/uninstall.mjs +2 -2
  128. package/pipeline/skills/.skill-manifest.json +40 -160
  129. package/pipeline/skills/.skills-index.json +3 -372
  130. package/pipeline/skills/shared/README.md +1 -1
  131. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  132. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  133. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  134. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  135. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  136. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  137. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  138. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  139. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  140. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  141. package/pipeline/skills/skills-index.md +2 -43
  142. package/pipeline/commands/multi-agent/refactor.md +0 -188
  143. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  144. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  145. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  146. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  147. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  148. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  149. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  150. package/pipeline/skills/figma-android/README.md +0 -38
  151. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  152. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  153. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  154. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  155. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  156. package/pipeline/skills/figma-common/README.md +0 -64
  157. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  158. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  159. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  160. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  161. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  162. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  163. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  164. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  165. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  166. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  167. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  168. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  169. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  170. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  171. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  172. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  173. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  174. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  175. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  176. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  177. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  178. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  179. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  180. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  181. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  182. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  183. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  184. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  185. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  186. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  187. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  188. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  189. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  190. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  191. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  192. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  193. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  194. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  195. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  196. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  197. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  198. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  199. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  200. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  201. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  202. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  203. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  204. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  205. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  206. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  207. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  208. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  209. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  210. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  232. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  233. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  234. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  235. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  236. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  237. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  238. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  239. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  240. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  241. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  242. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  253. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  254. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  255. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  256. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  257. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  258. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  259. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  260. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  261. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  262. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  263. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  294. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  295. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  296. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  297. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  298. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  299. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  300. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  301. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  302. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  303. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  304. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  305. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  310. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  311. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  312. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  313. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  314. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  315. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  316. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  317. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  318. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  319. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  320. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  321. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
@@ -1,398 +0,0 @@
1
- ---
2
- name: figma-price-integration
3
- description: "Price pattern integration for Figma-to-SwiftUI components. Guides PriceRepresentable protocol adoption when a component displays price data."
4
- user-invocable: true
5
- allowed-tools: Read, Glob, Grep
6
- status: wip-v5
7
- sourced-from: upstream/figma-price-integration
8
- ---
9
-
10
- # /figma-price-integration - Price Pattern Integration
11
-
12
- ## Purpose
13
-
14
- This skill is consumed by other skills (Phase 3D pattern detection, Phase 4A configuration, Phase 4B view implementation) when a **price pattern** is detected in a Figma component. It defines how to model price data using the `PriceRepresentable` protocol instead of raw strings or ad-hoc models.
15
-
16
- It is also **user-invocable** for vibe-coding / ad-hoc work: whenever you are wiring up a component that displays price data outside the full figma-to-swiftui pipeline, run `/figma-price-integration` to apply the same rules.
17
-
18
- ---
19
-
20
- ## Strict Rules (non-negotiable)
21
-
22
- 1. **Any price data MUST go through `PriceRepresentable`.** No raw `String` prices, no ad-hoc `(amount, currency)` tuples, no custom price structs that skip the protocol. This applies to:
23
- - A standalone `Price` view / component instance.
24
- - An `AttributedString` / `CurrencyTextRenderer` inline price inside surrounding text.
25
- - Any nested `Price` sub-component detected in Figma.
26
- If you see either of those two cases → PriceRepresentable, always.
27
- 2. **Price belongs in Configuration, not View - if a Configuration exists.** When the component has a Configuration struct, the nested `Price: PriceRepresentable` type MUST be declared inside Configuration and the `price` property MUST live on Configuration. Only components with NO Configuration may nest `Price` inside the View.
28
- 3. **The View never owns price data.** It reads `configuration.price` and renders. No raw amount/currency properties on the View when a Configuration exists.
29
- 4. **Nested `Price` mirrors the design exactly.** The nested `Price` type declares ONLY the protocol properties the component actually uses - do not include fields the design doesn't render, and do not drop fields the design does render. The struct's shape is dictated by the design, not by developer convenience or a shared/generic price model.
30
-
31
- ---
32
-
33
- ## When to Invoke This Skill
34
-
35
- Invoke when ANY of these are detected:
36
-
37
- 1. **Phase 3D - Layer Text Classification (section 1.5.1):** A currency code + numeric amount pair (e.g., "TRY" + "10.000")
38
- 2. **Phase 3D - Sub-Component Integration (section 2.2):** A nested `Price` component instance
39
- 3. **Phase 4A - Configuration:** A property group contains price-related fields (amount, currency, originalAmount, etc.)
40
- 4. **Phase 4B - View:** The view renders price data using `Price`, `CurrencyTextRenderer`, or similar
41
-
42
- ---
43
-
44
- ## Architecture
45
-
46
- ```
47
- Backend DTO
48
- |
49
- v
50
- ComponentName.Price : PriceRepresentable (component-specific, only needed fields)
51
- |
52
- v .toConfiguration() [protocol extension, shared]
53
- PriceConfiguration [internal to Price view]
54
- |
55
- v
56
- Price view renders
57
- ```
58
-
59
- ### Key Files
60
-
61
- | File | Location | Purpose |
62
- |------|----------|---------|
63
- | `PriceRepresentable.swift` | `DesignSystemCore/Price/Price/` | Protocol + `PriceSign` enum + `toConfiguration()` |
64
- | `PriceUIModel.swift` | `DesignSystemCore/Price/Price/` | Full conformance with all properties |
65
- | `PriceConfiguration.swift` | `DesignSystemCore/Price/Price/` | Internal formatted representation (not the public API) |
66
- | `CurrencyTextRenderer.swift` | `DesignSystemCore/Price/Price/` | AttributedString rendering for inline price text |
67
-
68
- ---
69
-
70
- ## The Protocol
71
-
72
- ```swift
73
- public protocol PriceRepresentable: Sendable, Equatable {
74
- var amount: Double { get } // required
75
- var currency: String { get } // required
76
- var originalAmount: Double? { get } // default: nil
77
- var saleBadgeText: String? { get } // default: nil
78
- var milesValue: Int? { get } // default: nil
79
- var sign: PriceSign? { get } // default: nil
80
- var milesDisplay: PriceConfiguration.MilesDisplay { get } // default: .slash
81
- var showPrimaryMil: Bool { get } // default: false
82
- var hideCurrency: Bool { get } // default: false
83
- var showLeadingText: Bool { get } // default: true
84
- }
85
- ```
86
-
87
- All properties except `amount` and `currency` have protocol-level defaults. Conformers only declare the properties they actually use.
88
-
89
- ### PriceSign
90
-
91
- ```swift
92
- public enum PriceSign: String, Sendable, Equatable {
93
- case positive // green, + prefix (refund, earning, credit)
94
- case negative // red, - prefix (charge, fee, deduction)
95
- }
96
- // nil = standard black text, no prefix
97
- ```
98
-
99
- ---
100
-
101
- ## How to Create a Component-Specific Model
102
-
103
- **Rule: Each component defines its own nested `.Price` type conforming to `PriceRepresentable`.** The nested type exposes ONLY the properties that component accepts - no silent discard of unused props.
104
-
105
- ### Step 1: Determine Which Properties the Component Needs
106
-
107
- From the Figma design, identify which price features are used:
108
-
109
- | Feature | Property | Include If... |
110
- |---------|----------|---------------|
111
- | Current price | `amount: Double`, `currency: String` | Always (required) |
112
- | Discount/original price | `originalAmount: Double?` | Strikethrough price visible |
113
- | Sale badge | `saleBadgeText: String?` | Badge like "%30" visible |
114
- | Miles section | `milesValue: Int?` | "/ 2000 Mil" visible |
115
- | Green/red sign | `sign: PriceSign?` | + or - prefix, colored text |
116
- | Miles display mode | `milesDisplay` | Multiple miles sections |
117
- | Miles-only pricing | `showPrimaryMil: Bool`, `hideCurrency: Bool` | Amount IS miles, no currency |
118
- | Leading label | `showLeadingText: Bool` | "Toplam Tutar" label toggleable |
119
-
120
- ### Step 2: Define the Nested Type
121
-
122
- **If the component has a Configuration struct (default case):** Nest inside Configuration. The `price` property lives on Configuration, never on the View. This is strict - see Rule 2.
123
-
124
- ```swift
125
- public struct SomeCardConfiguration: Sendable {
126
- // Nested price model - only amount + currency needed
127
- public struct Price: PriceRepresentable {
128
- public let amount: Double
129
- public let currency: String
130
-
131
- public init(amount: Double, currency: String) {
132
- self.amount = amount
133
- self.currency = currency
134
- }
135
- }
136
-
137
- public let title: String
138
- public let price: Price? // nil = no price section
139
- // ...
140
- }
141
- ```
142
-
143
- **If the component has NO Configuration (fallback only):** Nest inside the View. Use this ONLY when the component is a simple SIMPLE-tier view without a Configuration struct.
144
-
145
- ```swift
146
- public struct SomeBadge: View {
147
- public struct Price: PriceRepresentable {
148
- public let amount: Double
149
- public let currency: String
150
-
151
- public init(amount: Double, currency: String) {
152
- self.amount = amount
153
- self.currency = currency
154
- }
155
- }
156
-
157
- private let price: Price
158
- // ...
159
- }
160
- ```
161
-
162
- ### Step 3: Use in the View
163
-
164
- **Option A - Full Price view (standalone price display):**
165
-
166
- ```swift
167
- Price(price) // init(_ price: some PriceRepresentable)
168
- .size(.medium) // visual modifiers chain after
169
- .line(.single)
170
- ```
171
-
172
- **Option B - Inline price in attributed text (price + surrounding text):**
173
-
174
- Use when price appears within a text sentence (e.g., "TRY 10.000 dan başlayan fiyatlarla").
175
- The price is NOT a standalone view - it's a styled segment inside an `AttributedString`.
176
-
177
- ```swift
178
- // 1. Template from localization: "%@ dan başlayan fiyatlarla"
179
- var template = AttributedString(localized: .Component.startingFromPrice)
180
- template.font = .bodyRegular
181
- template.foregroundColor = .Text.textGrey
182
-
183
- // 2. Price as AttributedString via PriceRepresentable convenience
184
- let priceAttr = price.attributedString(style: CurrencyTextStyle(
185
- currencyFont: .smallRegular,
186
- amountFont: .smallBold,
187
- color: .Text.textPrimary
188
- ))
189
-
190
- // 3. Compose with AttributedString.format() from UIExtensions
191
- Text(template.format(priceAttr))
192
- ```
193
-
194
- **This pattern must be explicitly identified during Phase 3D analysis (section 1.5.1b).**
195
- Check the Figma layer structure - if the price and surrounding text are in the same text layer
196
- with different font styles, it's inline attributed text, NOT a standalone Price view + separate Text.
197
-
198
- **Option C - CurrencyTextRenderer (standalone inline price without surrounding text):**
199
-
200
- ```swift
201
- let config = price.toConfiguration()
202
- let attributed = CurrencyTextRenderer.attributedString(
203
- amount: config.amount,
204
- decimalPart: config.decimalPart,
205
- currencyCode: config.currencyCode,
206
- currencyPlacement: config.currencyPlacement,
207
- style: CurrencyTextStyle(
208
- currencyFont: .smallRegular,
209
- amountFont: .smallBold,
210
- color: .Text.textPrimary
211
- )
212
- )
213
- Text(attributed)
214
- ```
215
-
216
- **Option D - Direct formatted amount (custom rendering):**
217
-
218
- ```swift
219
- let config = price.toConfiguration()
220
- // Use config.amount, config.decimalPart, config.currencyCode etc.
221
- // for custom layout that doesn't fit the Price view pattern
222
- ```
223
-
224
- ---
225
-
226
- ## Configuration vs Style Separation
227
-
228
- **In the PriceRepresentable model (semantic/data):**
229
- - `sign` - backend says refund/charge
230
- - `milesDisplay` - business rule
231
- - `showPrimaryMil` - miles-only pricing
232
- - `hideCurrency` - miles-only mode
233
- - `showLeadingText` - contextual label
234
-
235
- **NOT in the model (visual, set via view modifiers):**
236
- - `size` - parent component decides
237
- - `alignment` - layout concern
238
- - `line` (single/double) - layout concern
239
-
240
- **Auto-resolved (not in model):**
241
- - `currencyPlacement` - derived from `CurrencyFormatProvider` per currency code
242
-
243
- ---
244
-
245
- ## Integration with Phase 3D
246
-
247
- When Phase 3D's Layer Text Classification (section 1.5.1) detects a price pattern:
248
-
249
- ### Replace section 1.5.1 Output
250
-
251
- Instead of:
252
- ```
253
- - amount: Double (LAYER_TEXT, IMPLEMENT)
254
- - currencyCode: String (LAYER_TEXT, IMPLEMENT)
255
- ```
256
-
257
- Output:
258
- ```
259
- - price: ComponentName.Price (PRICE_PATTERN, IMPLEMENT)
260
- → PriceRepresentable conformance with: amount, currency
261
- → Additional properties if detected: originalAmount, saleBadgeText, milesValue, sign
262
- ```
263
-
264
- ### Architecture Output (04b_component_architecture.md)
265
-
266
- In the Sub-Components section:
267
- ```markdown
268
- ## Sub-Components
269
-
270
- | Element | Scope | Integration |
271
- |---------|-------|-------------|
272
- | Price | {Optional/Required} | `PriceRepresentable` - nested `Price` struct with {list fields} |
273
- ```
274
-
275
- In the Final API Design:
276
- ```swift
277
- // Nested PriceRepresentable model
278
- public struct Price: PriceRepresentable {
279
- public let amount: Double
280
- public let currency: String
281
- // ... only the fields this component needs
282
- }
283
-
284
- // In init or configuration
285
- public let price: Price // required
286
- // OR
287
- public let price: Price? // optional (nil = no price section)
288
- ```
289
-
290
- ---
291
-
292
- ## Integration with Phase 4A
293
-
294
- When writing the Configuration struct for a COMPLEX component that contains price data:
295
-
296
- 1. Define the nested `Price: PriceRepresentable` struct inside the Configuration
297
- 2. Only include the properties identified in Phase 3D analysis
298
- 3. The price property is `Price?` if the price section is boolean-gated, `Price` if always present
299
- 4. Do NOT flatten price fields into the Configuration - keep them grouped in the nested type
300
-
301
- ```swift
302
- @GenerateChainModifiers
303
- public struct SomeComponentConfiguration: Sendable {
304
-
305
- public struct Price: PriceRepresentable {
306
- public let amount: Double
307
- public let currency: String
308
- public let originalAmount: Double?
309
-
310
- public init(amount: Double, currency: String, originalAmount: Double? = nil) {
311
- self.amount = amount
312
- self.currency = currency
313
- self.originalAmount = originalAmount
314
- }
315
- }
316
-
317
- public let title: String
318
- public let price: Price?
319
-
320
- public init(title: String = "", price: Price? = nil) {
321
- self.title = title
322
- self.price = price
323
- }
324
- }
325
- ```
326
-
327
- ---
328
-
329
- ## Integration with Phase 4B
330
-
331
- When implementing the View that renders price data:
332
-
333
- ### Using the Price View
334
-
335
- ```swift
336
- if let price = configuration.price {
337
- Price(price)
338
- .size(.medium) // component decides size
339
- .line(.single) // component decides layout
340
- .showLeadingText(false) // override if needed
341
- }
342
- ```
343
-
344
- ### Using CurrencyTextRenderer (for inline price in text)
345
-
346
- ```swift
347
- if let price = configuration.price {
348
- let config = price.toConfiguration()
349
- Text(CurrencyTextRenderer.attributedString(
350
- amount: config.amount,
351
- decimalPart: config.decimalPart,
352
- currencyCode: config.currencyCode,
353
- currencyPlacement: config.currencyPlacement,
354
- style: CurrencyTextStyle(
355
- currencyFont: currencyFont,
356
- amountFont: amountFont,
357
- color: priceColor
358
- )
359
- ))
360
- }
361
- ```
362
-
363
- ---
364
-
365
- ## When NOT to Use PriceRepresentable
366
-
367
- - **Static price labels** with no real data binding (e.g., placeholder text in a design mockup)
368
- - **Non-currency numeric amounts** (counts, percentages, scores) - these are plain `Int`/`Double`/`String`
369
- - **Price data that is purely a display string** from the backend with no formatting needed - use `String` directly
370
-
371
- ---
372
-
373
- ## Full PriceUIModel
374
-
375
- For the core `Price` view used standalone (not inside a compound component), use `PriceUIModel` directly:
376
-
377
- ```swift
378
- Price(PriceUIModel(amount: 12810.99, currency: "TRY",
379
- originalAmount: 14920.00, saleBadgeText: "%30"))
380
- .size(.large)
381
- .state(.positive)
382
- ```
383
-
384
- `PriceUIModel` carries ALL properties. Component-specific nested types carry only what they need.
385
-
386
- ---
387
-
388
- ## Real-World Scenarios
389
-
390
- | Scenario | Model |
391
- |----------|-------|
392
- | Flight search result | `(amount: 12810.99, currency: "TRY")` |
393
- | Discounted flight | `(amount: 12810.99, currency: "TRY", originalAmount: 14920.00, saleBadgeText: "%30")` |
394
- | Refund confirmation | `(amount: 5000.00, currency: "TRY", sign: .positive)` |
395
- | Extra baggage charge | `(amount: 200.00, currency: "USD", sign: .negative)` |
396
- | Miles-only pricing | `(amount: 45000, currency: "TRY", showPrimaryMil: true, hideCurrency: true)` |
397
- | Money + miles | `(amount: 12810.99, currency: "TRY", milesValue: 2000, milesDisplay: .slash)` |
398
- | Price badge (lean) | `(amount: 42000, currency: "TRY")` - only 2 fields |
@@ -1,104 +0,0 @@
1
- ---
2
- name: figma-remote-mcp-auth
3
- description: Runs Figma Remote MCP OAuth flow to obtain and store a token in macOS Keychain. Requires OAuth client credentials.
4
- user-invocable: true
5
- argument-hint: <client-id> <client-secret>
6
- allowed-tools: Bash, Read, AskUserQuestion
7
- status: wip-v5
8
- sourced-from: upstream/figma-remote-mcp-auth
9
- ---
10
-
11
- # /figma-remote-mcp-auth - Figma Remote MCP OAuth Token
12
-
13
- Runs the Figma MCP OAuth flow via browser, exchanges the authorization code for an access token, verifies it, and saves it to macOS Keychain as `FIGMA_MCP_TOKEN`.
14
-
15
- ---
16
-
17
- ## Parse Input
18
-
19
- The skill expects two positional arguments: `<client-id>` and `<client-secret>`.
20
-
21
- | Input | Action |
22
- |-------|--------|
23
- | `<client-id> <client-secret>` | Run OAuth flow with provided credentials |
24
- | (no args) | Attempt auto-extraction from Claude Code credentials |
25
- | `--show-clients` | Show registered OAuth clients from Claude Code credentials |
26
-
27
- ---
28
-
29
- ## Step 1: Resolve Credentials
30
-
31
- ### If both arguments provided:
32
- Use them directly as `CLIENT_ID` and `CLIENT_SECRET`.
33
-
34
- ### If no arguments provided:
35
- Try auto-extraction from Claude Code credentials:
36
-
37
- ```bash
38
- python3 .instructions/figma/figma-setup/scripts/fetch-mcp-token.py --show-clients 2>&1
39
- ```
40
-
41
- - If clients found → use the first Figma client's `clientId` and `clientSecret`
42
- - If no clients found → HALT:
43
-
44
- > No OAuth client credentials provided and none found in Claude Code credentials.
45
- >
46
- > **Usage:** `/figma-remote-mcp-auth <client-id> <client-secret>`
47
- >
48
- > **To find credentials:**
49
- > 1. Ask a colleague who has Figma Remote MCP configured in Claude Code
50
- > 2. They can run: `/figma-remote-mcp-auth --show-clients`
51
- > 3. Share the `clientId` and `clientSecret` values
52
-
53
- ---
54
-
55
- ## Step 2: Run OAuth Flow
56
-
57
- ```bash
58
- python3 .instructions/figma/figma-setup/scripts/fetch-mcp-token.py --oauth --client-id "$CLIENT_ID" --client-secret "$CLIENT_SECRET" --save-keychain --verify
59
- ```
60
-
61
- This will:
62
- 1. Start a local callback server on port 8923
63
- 2. Open the browser for Figma consent
64
- 3. Wait for the user to authorize (120s timeout)
65
- 4. Exchange the authorization code for an access token (PKCE)
66
- 5. Verify the token against `https://mcp.figma.com/mcp`
67
- 6. Save the token to macOS Keychain as `FIGMA_MCP_TOKEN`
68
-
69
- **IMPORTANT:** Do NOT echo or display the token in chat. The script handles all output to stderr (logging) and stdout (token). Capture stdout but do not print it.
70
-
71
- ---
72
-
73
- ## Step 3: Verify Result
74
-
75
- Check script exit code:
76
- - `0` → Success
77
- - `1` → OAuth flow failed (timeout, user denied, no credentials)
78
- - `2` → Token verification failed (invalid token)
79
- - `3` → Keychain save failed
80
-
81
- ### On success:
82
- ```
83
- FIGMA_MCP_TOKEN stored in macOS Keychain.
84
-
85
- The token is now available for:
86
- - Figma-to-SwiftUI scripts (phase1-gather.py, remote-mcp-fetch.py)
87
- - /figma-setup CHECK 3b (will detect existing token)
88
- - Any tool that reads FIGMA_MCP_TOKEN from Keychain
89
- ```
90
-
91
- ### On failure:
92
- Display the stderr output from the script and suggest:
93
- - Check that Figma Desktop is not blocking the OAuth consent
94
- - Try a different port: add `--port 9147` if port 8923 is in use
95
- - Ensure the client credentials are valid
96
-
97
- ---
98
-
99
- ## Notes
100
-
101
- - **Token expiry**: Tokens expire when Figma revokes them or Claude Code refreshes its session. Re-run this skill to get a new token.
102
- - **Token portability**: The token is tied to the Figma account that consents in the browser, not to the machine. It works across devices.
103
- - **Security**: Client credentials are NOT stored by this skill. They must be provided each time or auto-extracted from Claude Code.
104
- - **Colleague onboarding**: Share the `clientId` and `clientSecret` with colleagues so they can run this skill independently.