@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.1

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