@mmerterden/multi-agent-pipeline 11.1.0 → 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +2 -2
  3. package/docs/FIGMA_PIPELINE.md +12 -25
  4. package/docs/architecture.md +3 -5
  5. package/docs/features.md +8 -8
  6. package/install/_common.mjs +9 -1
  7. package/install/_dev-only-files.mjs +0 -6
  8. package/install/claude.mjs +45 -18
  9. package/install/copilot.mjs +16 -14
  10. package/install/templates/copilot-instructions.md +3 -3
  11. package/package.json +1 -1
  12. package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
  13. package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
  14. package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
  15. package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
  16. package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
  17. package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
  18. package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
  19. package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
  20. package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
  21. package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
  22. package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
  23. package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
  24. package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
  25. package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
  26. package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
  27. package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
  28. package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
  29. package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
  30. package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
  31. package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
  32. package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
  33. package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
  34. package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
  35. package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
  36. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
  37. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
  38. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
  39. package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
  40. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
  41. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
  42. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
  43. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
  44. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
  45. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
  46. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
  47. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
  48. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
  49. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
  50. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
  51. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
  52. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
  53. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
  54. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
  55. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
  56. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
  57. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
  58. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
  59. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
  60. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
  61. package/pipeline/preferences-template.json +17 -1
  62. package/pipeline/rules/figma-pipeline.md +2 -2
  63. package/pipeline/schemas/prefs.schema.json +0 -34
  64. package/pipeline/scripts/README.md +1 -3
  65. package/pipeline/scripts/build-stack-plugins.mjs +1 -1
  66. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  67. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  68. package/pipeline/scripts/phase-banner.sh +2 -2
  69. package/pipeline/scripts/review-scope.mjs +94 -0
  70. package/pipeline/scripts/scan-agent-config.sh +2 -2
  71. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  72. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  73. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  74. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  75. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  76. package/pipeline/scripts/smoke-clarify.sh +1 -1
  77. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  78. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  79. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  80. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  81. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  82. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  83. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  84. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  85. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  86. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  87. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  88. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  89. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  90. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  91. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  92. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  93. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  94. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  95. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  96. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  97. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  98. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  99. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  100. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  101. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  102. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  103. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  104. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  105. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  106. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  107. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  108. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  109. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  110. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  111. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  112. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  113. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  114. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  115. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  116. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  117. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  118. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  119. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  120. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  121. package/pipeline/scripts/smoke-update-check.sh +1 -1
  122. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  123. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  124. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  125. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  126. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  127. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  128. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  129. package/pipeline/scripts/uninstall.mjs +2 -2
  130. package/pipeline/skills/.skill-manifest.json +40 -160
  131. package/pipeline/skills/.skills-index.json +21 -372
  132. package/pipeline/skills/shared/README.md +1 -1
  133. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  134. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  135. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  136. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  137. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  138. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  139. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  140. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  141. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  142. package/pipeline/skills/shared/external/backlog/BACKLOG.md +32 -0
  143. package/pipeline/skills/shared/external/backlog/SKILL.md +49 -0
  144. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  145. package/pipeline/skills/shared/external/skill-creator/SKILL.md +48 -0
  146. package/pipeline/skills/shared/external/skill-creator/audit.md +59 -0
  147. package/pipeline/skills/shared/external/skill-creator/checklist.md +32 -0
  148. package/pipeline/skills/shared/external/skill-creator/examples.md +65 -0
  149. package/pipeline/skills/shared/external/skill-creator/label-check.md +43 -0
  150. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +83 -0
  151. package/pipeline/skills/shared/external/skill-creator/template.md +67 -0
  152. package/pipeline/skills/skills-index.md +4 -43
  153. package/pipeline/commands/multi-agent/refactor.md +0 -188
  154. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  155. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  156. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  157. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  158. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  159. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  160. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  161. package/pipeline/skills/figma-android/README.md +0 -38
  162. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  163. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  164. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  165. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  166. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  167. package/pipeline/skills/figma-common/README.md +0 -64
  168. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  169. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  170. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  171. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  172. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  173. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  174. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  175. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  176. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  177. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  178. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  179. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  180. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  181. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  182. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  183. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  184. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  185. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  186. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  187. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  188. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  189. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  190. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  191. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  192. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  193. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  194. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  195. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  196. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  197. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  198. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  199. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  200. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  201. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  202. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  203. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  204. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  205. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  206. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  207. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  208. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  209. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  210. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  232. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  233. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  234. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  235. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  236. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  237. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  238. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  239. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  240. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  241. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  242. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  253. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  254. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  255. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  256. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  257. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  258. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  259. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  260. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  261. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  262. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  263. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  294. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  295. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  296. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  297. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  298. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  299. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  300. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  301. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  302. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  303. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  304. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  305. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  310. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  311. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  312. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  313. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  314. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  315. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  316. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  317. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  318. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  319. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  320. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  321. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  332. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  333. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  334. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  335. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  336. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  337. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  338. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  339. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  340. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  341. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  342. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
@@ -1,750 +0,0 @@
1
- ---
2
- name: figma-issue
3
- description: Creates and manages GitHub Issues for Figma component implementations.
4
- ---
5
-
6
- # /figma-issue - GitHub Issue Manager for Figma Components
7
-
8
- ## Purpose
9
-
10
- Creates and manages GitHub Issues for Figma component implementations. Resolves component metadata from the registry, creates structured issues using the issue template format, adds them to the **Figma Components** Projects V2 board with custom fields, and provides sub-commands for ongoing issue management.
11
-
12
- ## Commands
13
-
14
- | Command | Description |
15
- |---------|-------------|
16
- | `/figma-issue open <url>[,<url>] [--team <team>]` | Create GitHub issue |
17
- | `/figma-issue assign <#N>` | Assign issue to current user (GitHub + Jira if linked) |
18
- | `/figma-issue bind-jira <#N> <{jira.projectKey}-XXXXX>` | Link an existing Jira task (both directions) |
19
- | `/figma-issue phase <#N> <phase>` | Update phase on project board |
20
- | `/figma-issue block <#N> by <#M>` | Mark issue #N as blocked by #M |
21
- | `/figma-issue unblock <#N>` | Remove blocked status |
22
- | `/figma-issue close <#N>` | Close the issue |
23
- | `/figma-issue status [#N]` | Show issue status or list all open |
24
-
25
- ---
26
-
27
- ## Constants
28
-
29
- ```
30
- REPO_ROOT = git repo root (auto-detect)
31
- REGISTRY_UTIL = ${REPO_ROOT}/{repos.common.path}/.build/debug/FigmaRegistryUtility
32
- GH_REPO = {github.componentsRepo}
33
- GH_ORG = {github.org}
34
- PROJECT_ID = {github.projectV2Id}
35
- JIRA_BASE_URL = {jira.baseUrl}
36
- JIRA_PROJECT = {jira.projectKey}
37
- JIRA_LABELS = ["redesign_ios_ui_component", "MobRedesign"]
38
- JIRA_ISSUE_TYPE = Task
39
- ```
40
-
41
- ### Jira Authentication
42
-
43
- Jira token is stored in macOS Keychain under service name `JIRA_TOKEN`:
44
-
45
- ```bash
46
- JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
47
- ```
48
-
49
- If not found, prompt the user to add it:
50
- ```bash
51
- "$HOME/.claude/lib/credential-store.sh" set \1 \"\2\"
52
- ```
53
-
54
- ### Project Field IDs
55
-
56
- ```
57
- STATUS_FIELD = {github.projectV2Fields.status}
58
- Todo = 25f3e7a3
59
- In Develop = bc6c45f7
60
- In Review = bdb0d8ef
61
- Bugfix = e46fa72d
62
- Done = 6275b69e
63
- Blocked = 95949fd8
64
- Stale = 457a1e74
65
-
66
- PHASE_FIELD = {github.projectV2Fields.phase}
67
- Implementation = 0577dcda
68
- Testing = 106b64ce
69
- Code Connect = 5384b1e1
70
- Documentation = 7307fb8f
71
-
72
- FIGMA_PAGE_FIELD = {github.projectV2Fields.figmaPage}
73
- Home Screen = 72d24832
74
- Booker = a143357e
75
- Check-in = 5c204dd7
76
- Modals = 72983b95
77
- Cards = e8dedeee
78
- Buttons = f57b9f30
79
- Navigation Bar = 54bfd163
80
- Other = 62a5ecbe
81
-
82
- JIRA_FIELD = {github.projectV2Fields.jira}
83
- ```
84
-
85
- ### Figma Page Mapping
86
-
87
- Map the registry `pageName` to the project board's Figma Page option. Use substring matching:
88
-
89
- | pageName contains | Option ID |
90
- |---|---|
91
- | `Home` | `72d24832` |
92
- | `Booker` | `a143357e` |
93
- | `Check-in`, `Boarding Pass` | `5c204dd7` |
94
- | `Modal` | `72983b95` |
95
- | `Card` | `e8dedeee` |
96
- | `Button` | `f57b9f30` |
97
- | `Navigation` | `54bfd163` |
98
- | *(everything else)* | `62a5ecbe` (Other) |
99
-
100
- ---
101
-
102
- ## Command: `open <url>[,<url>,...]`
103
-
104
- ### STEP 0 - Parse Input
105
-
106
- 1. Extract all Figma URLs from `$ARGUMENTS` (comma-separated or space-separated).
107
- 2. For each URL, extract `node-id` query parameter. Keep as-is (e.g., `2251-15872`).
108
- 3. Deduplicate by `node-id` - if the same node-id appears multiple times, process it only once.
109
- 4. Print: "Found N unique Figma component(s) to process."
110
-
111
- **For each component, run STEPs 1-6 sequentially.** The specs prompt (STEP 2.5) is asked once per component.
112
-
113
- ### STEP 1 - Registry Lookup
114
-
115
- ```bash
116
- cd ${REPO_ROOT}/{repos.common.path}
117
- .build/debug/FigmaRegistryUtility lookup --node-id <NODE_ID>
118
- ```
119
-
120
- Collect from JSON output:
121
- - `name` → Registry name (e.g., `Modals/Title`)
122
- - `suggestedComponentName` → PascalCase name (e.g., `ModalsTitle`)
123
- - `pageName` → Figma page name (e.g., `❖ Modals`)
124
- - `suggestedArtifactPath` → Artifact path
125
- - `suggestedComponentLocation` → Component location
126
-
127
- If lookup fails, mark as **unregistered**.
128
-
129
- ### STEP 1.5 - Dependency Detection
130
-
131
- Uses the **exact same algorithm** as `confluence-component-status-upload.py` → `readiness()`:
132
- 1. Build unified `name → nodeId` lookup from catalog + registry + graph
133
- 2. Resolve sub-component names to nodeIds
134
- 3. Check each resolved nodeId for `codeConnect.ios` and `skip`
135
- 4. Unresolved names (nodeId = None) are NOT blockers (same as `all_comps.get(sub_nid)` returning None)
136
-
137
- ```bash
138
- COMMON_PATH="${REPO_ROOT}/{repos.common.path}"
139
- FIGMA_DIR="${COMMON_PATH}/Shared/Figma"
140
- ```
141
-
142
- #### 1.5a. Compute readiness (single Python script)
143
-
144
- Run the following as a single Python block. It replicates `build_component_index()` + `readiness()` from `confluence-component-status-upload.py`:
145
-
146
- ```bash
147
- cd ${REPO_ROOT}
148
- python3 -c "
149
- import json, os, glob
150
-
151
- FIGMA_DIR = '${FIGMA_DIR}'
152
- NODE_ID = '<NODE_ID>'
153
-
154
- # --- 1. Load all Components/*.json into dict keyed by nodeId ---
155
- components = {}
156
- comp_dir = os.path.join(FIGMA_DIR, 'Components')
157
- for f in glob.glob(os.path.join(comp_dir, '*.json')):
158
- with open(f) as fh:
159
- reg = json.load(fh)
160
- nid = reg.get('nodeId', os.path.basename(f)[:-5].replace('-', ':'))
161
- components[nid] = reg
162
-
163
- # --- 2. Build name → nodeId lookup (same as confluence-component-status-upload.py lines 143-164) ---
164
- name_to_nid = {}
165
- for nid, c in components.items():
166
- cn = c.get('componentName', {})
167
- ios_name = cn.get('ios', '') if isinstance(cn, dict) else cn or ''
168
- if ios_name:
169
- name_to_nid[ios_name] = nid
170
- # Strip Image. prefix for graph name matching: Image.caretRight → caretRight → CaretRight
171
- if '.' in ios_name:
172
- suffix = ios_name.split('.', 1)[1]
173
- if suffix not in name_to_nid:
174
- name_to_nid[suffix] = nid
175
- upper = suffix[0:1].upper() + suffix[1:]
176
- if upper not in name_to_nid:
177
- name_to_nid[upper] = nid
178
-
179
- # Also add catalog names from component-catalog.json if available
180
- cat_path = os.path.join(FIGMA_DIR, 'Generated', 'component-catalog.json')
181
- if os.path.isfile(cat_path):
182
- with open(cat_path) as f:
183
- catalog = json.load(f)
184
- for file_entry in catalog.get('files', []):
185
- for page in file_entry.get('pages', []):
186
- for comp in page.get('components', []):
187
- cn = comp.get('name', '')
188
- fn = comp.get('figmaName', '')
189
- cnid = comp.get('nodeId', '')
190
- if cn: name_to_nid[cn] = cnid
191
- if fn and fn not in name_to_nid: name_to_nid[fn] = cnid
192
-
193
- # --- 3. Load graph, get sub-components for this node ---
194
- graph_path = os.path.join(FIGMA_DIR, 'sub-component-graph.json')
195
- with open(graph_path) as f:
196
- graph = json.load(f).get('graph', {})
197
- entry = graph.get(NODE_ID, {})
198
- sub_names = entry.get('subComponents', [])
199
-
200
- if not sub_names:
201
- print(json.dumps({'status': 'no_deps', 'subComponents': []}))
202
- else:
203
- # --- 4. Resolve names → nodeIds, then compute readiness per sub-component ---
204
- results = []
205
- for sname in sub_names:
206
- sub_nid = name_to_nid.get(sname)
207
- if not sub_nid:
208
- # Unresolved - not in any registry/catalog (same as all_comps.get() → None → not a blocker)
209
- results.append({'name': sname, 'nodeId': None, 'status': 'unresolved'})
210
- continue
211
- sc = components.get(sub_nid)
212
- if not sc:
213
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'unresolved'})
214
- continue
215
- if sc.get('skip', False):
216
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'skipped'})
217
- continue
218
-
219
- # NEW: status.ios.implemented is the canonical source of truth after
220
- # the architecture-update migration. Fall back to legacy signals for
221
- # components that haven't been backfilled yet.
222
- ios_status = sc.get('status', {}).get('ios', {})
223
- impl_value = ios_status.get('implemented', {}).get('value', False)
224
-
225
- if impl_value:
226
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
227
- continue
228
-
229
- # Legacy fallback 1: top-level codeConnect.ios (pre-architecture-update)
230
- if sc.get('codeConnect', {}).get('ios', False):
231
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
232
- continue
233
-
234
- # Legacy fallback 2: does a Swift file with this component name exist?
235
- # Catches components implemented in code but never backfilled. Delete
236
- # this fallback after backfill-status.py has been run and the legacy
237
- # codeConnect field is no longer the primary source.
238
- comp_name = (sc.get('componentName') or {}).get('ios')
239
- sources_dir = os.environ.get('UICOMPONENTS_SOURCES', '')
240
- if comp_name and sources_dir and os.path.isdir(sources_dir):
241
- pattern = os.path.join(sources_dir, '**', comp_name + '.swift')
242
- if glob.glob(pattern, recursive=True):
243
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'implemented'})
244
- continue
245
-
246
- results.append({'name': sname, 'nodeId': sub_nid, 'status': 'not_implemented'})
247
- print(json.dumps({'status': 'checked', 'subComponents': results}))
248
- "
249
- ```
250
-
251
- Parse the JSON output. Only `not_implemented` entries are blockers - `implemented`, `skipped`, and `unresolved` (not in any registry) are NOT blockers.
252
-
253
- **Readiness precedence (architecture-update):**
254
- 1. `status.ios.implemented.value` (new canonical field, set by `phase4-finalize.py`)
255
- 2. Legacy `codeConnect.ios` (pre-architecture-update components)
256
- 3. Swift-file-exists check (final fallback for un-backfilled components;
257
- requires `UICOMPONENTS_SOURCES` env var or falls through as not_implemented)
258
-
259
- Delete fallbacks 2 and 3 after `backfill-status.py` has been run and all
260
- active components have been re-run through the pipeline at least once.
261
-
262
- #### 1.5b. Find existing issues for blockers
263
-
264
- For each `not_implemented` sub-component:
265
-
266
- ```bash
267
- gh issue list --repo ${GH_REPO} --state open --label component \
268
- --search "<SubComponentName>" --json number,title --jq '.[0]'
269
- ```
270
-
271
- Collect: `BLOCKING_DEPS` = list of `{name, nodeId, issueNumber (or null)}` - only `not_implemented` entries.
272
-
273
- #### 1.5c. Report
274
-
275
- ```
276
- Dependencies (from sub-component-graph.json):
277
- - <SubName> → ✅ implemented
278
- - <SubName> → ⏭️ skipped
279
- - <SubName> → unresolved (not in registry)
280
- - <SubName> → #N (not implemented)
281
- - <SubName> → ❌ not implemented, no issue
282
-
283
- This issue will be auto-blocked after creation.
284
- ```
285
-
286
- If zero `not_implemented` → **no blockers**, do NOT auto-block.
287
-
288
- Store `BLOCKING_DEPS` for use in STEP 3.5.
289
-
290
- ### STEP 2 - Duplicate Check
291
-
292
- ```bash
293
- gh issue list --repo ${GH_REPO} --state open --search "node-id=<NODE_ID>" --json number,title,url
294
- ```
295
-
296
- If a match is found, print warning and stop:
297
- "Issue already exists: #N - <title> (<url>)"
298
-
299
- ### STEP 2.5 - Specs & Acceptance Criteria
300
-
301
- Present the component info and **STOP. Do not proceed to STEP 3.** Wait for the user's next message.
302
-
303
- **Print exactly this and nothing else:**
304
-
305
- ```
306
- -------------------------------------------
307
- Component: <SuggestedComponentName>
308
- Registry: <RegistryName>
309
- Page: <PageName>
310
- Figma: <FIGMA_URL>
311
- -------------------------------------------
312
-
313
- Write your acceptance criteria and specs below.
314
- You can include:
315
- - Acceptance criteria (checkbox list)
316
- - Design specs (variants, states, animations)
317
- - Dependencies (nested components, tokens)
318
- - Edge cases or constraints
319
-
320
- Type "skip" to create without specs.
321
- ```
322
-
323
- **STOP HERE. The user's next message is the specs content.**
324
-
325
- When the user responds:
326
- - If the response is `skip` (case-insensitive): set `SPECS = ""`, proceed to STEP 3.
327
- - Otherwise: the user's message is the specs input. You MAY read referenced files to gather context and understand the user's intent better - this helps write clearer specs. Then rewrite the user's input into clean, actionable acceptance criteria (checkbox list) that another AI can easily follow when it fetches this issue for implementation. Do NOT implement anything - this skill only creates issues, not code. Then proceed to team selection / STEP 3.
328
-
329
- If `SPECS` is not empty, include it in the issue body under `### Acceptance Criteria` (see STEP 3 body template).
330
-
331
- ### STEP 3 - Create GitHub Issue
332
-
333
- **Title:**
334
- ```
335
- feat: <TEAM_SHORT> Implement <SuggestedComponentName>
336
- ```
337
-
338
- Where `<TEAM_SHORT>` is mapped from the team label:
339
-
340
- | Label | Short |
341
- |---|---|
342
- | `team:core` | `core` |
343
- | `team:shopping-and-payment` | `shopping` |
344
- | `team:add-services` | `add-services` |
345
- | `team:miles-and-smiles` | `miles` |
346
- | `team:post-ops-irrops` | `post-ops` |
347
-
348
- If unregistered: `feat: <TEAM_SHORT> Implement component (node-id: <NODE_ID>)`
349
-
350
- **Body** - must match the issue template field headers exactly:
351
-
352
- ```markdown
353
- ### Figma URL
354
-
355
- <FIGMA_URL>
356
-
357
- ### Node ID
358
-
359
- <NODE_ID>
360
-
361
- ### Registry Name
362
-
363
- <REGISTRY_NAME>
364
-
365
- ### Component Name (PascalCase)
366
-
367
- <SUGGESTED_COMPONENT_NAME>
368
-
369
- ### Figma Page
370
-
371
- <PAGE_NAME>
372
-
373
- ### Jira Issue
374
-
375
- _No response_
376
-
377
- ### Progress
378
-
379
- | Flag | State |
380
- |---|---|
381
- | Implementation | ⚪ |
382
- | Testing | ⚪ |
383
- | Code Connect | ⚪ |
384
- | Wiki | ⚪ |
385
-
386
- <!--
387
- State legend:
388
- 🟢 green - flag is set and validated against the current implementation version
389
- 🟡 yellow - flag was validated against an older impl version (or Figma moved ahead, for implemented)
390
- ⚪ gray - flag is not set
391
-
392
- The Progress table is rewritten automatically by update-issue-from-registry.py
393
- on every phase finalize. Do not hand-edit this section; edits will be
394
- overwritten on the next pipeline run.
395
- -->
396
-
397
-
398
- ### Acceptance Criteria
399
-
400
- <SPECS or "_No response_" if empty>
401
-
402
- ### Pull Requests
403
-
404
- - **common:**
405
- - **uicomponents:**
406
-
407
- ### Notes
408
-
409
- _No response_
410
- ```
411
-
412
- ### Team Label Mapping
413
-
414
- If `--team` was provided, map to a label:
415
-
416
- | Argument (case-insensitive) | Label |
417
- |---|---|
418
- | `core` | `team:core` |
419
- | `post-ops-irrops`, `post-ops`, `irrops` | `team:post-ops-irrops` |
420
- | `add-services`, `additional-services` | `team:add-services` |
421
- | `miles-and-smiles`, `miles`, `m&s` | `team:miles-and-smiles` |
422
- | `shopping-and-payment`, `shopping`, `payment` | `team:shopping-and-payment` |
423
-
424
- If `--team` was NOT provided, ask the user which team before creating the issue. Print and STOP:
425
-
426
- ```
427
- Which team?
428
- 1. Core
429
- 2. Post-Ops & Irrops
430
- 3. Additional Services
431
- 4. Miles & Smiles
432
- 5. Shopping & Payment
433
- ```
434
-
435
- Wait for the user's response (number or name), then map to the label.
436
-
437
- ```bash
438
- gh issue create \
439
- --repo ${GH_REPO} \
440
- --title "<TITLE>" \
441
- --label "component" \
442
- --label "redesign" \
443
- --label "<TEAM_LABEL>" \
444
- --body "<BODY>"
445
- ```
446
-
447
- **No `phase:*` label on creation.** The per-flag labels
448
- (`impl:green`, `impl:yellow`, `test:green`, etc.) are applied
449
- automatically by `update-issue-from-registry.py` once a phase finalize
450
- script has populated `status` in the registry. On creation the issue
451
- has zero flag labels (all gray) - that's the correct initial state for
452
- a component nobody has implemented yet.
453
-
454
- Legacy `phase:*` labels are stripped from existing issues on any sync;
455
- new issues never get them.
456
-
457
- Capture the issue number and URL from the output.
458
-
459
- ### STEP 3.5 - Auto-Block (if dependencies detected)
460
-
461
- If `BLOCKING_DEPS` from STEP 1.5 has any `not_implemented` sub-components:
462
-
463
- 1. Add `blocked` label:
464
- ```bash
465
- gh issue edit <N> --repo ${GH_REPO} --add-label "blocked"
466
- ```
467
-
468
- 2. Comment with blocking info:
469
- ```bash
470
- gh issue comment <N> --repo ${GH_REPO} --body "**Auto-blocked** - unimplemented sub-components (from sub-component-graph.json):
471
- - <SubName> → #M
472
- - <SubName> → no issue
473
-
474
- Will be auto-unblocked when all dependencies are implemented."
475
- ```
476
-
477
- The issue will be auto-unblocked by `/figma-iteration-commit` STEP 5 when blocking components get implemented.
478
-
479
- ### STEP 4 - Add to Project Board
480
-
481
- #### 4a. Add issue to project
482
-
483
- ```bash
484
- # Get issue node ID
485
- ISSUE_NODE_ID=$(gh api graphql -f query='{ repository(owner: "{github.org}", name: "{project.slug}-components") { issue(number: <ISSUE_NUMBER>) { id } } }' --jq '.data.repository.issue.id')
486
-
487
- # Add to project
488
- ITEM_ID=$(gh api graphql -f query='mutation { addProjectV2ItemById(input: { projectId: "{github.projectV2Id}", contentId: "'"$ISSUE_NODE_ID"'" }) { item { id } } }' --jq '.data.addProjectV2ItemById.item.id')
489
- ```
490
-
491
- #### 4b. Set Status = Todo
492
-
493
- ```bash
494
- gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.status}", value: { singleSelectOptionId: "25f3e7a3" } }) { projectV2Item { id } } }'
495
- ```
496
-
497
- #### 4c. Set Phase = Implementation
498
-
499
- ```bash
500
- gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.phase}", value: { singleSelectOptionId: "0577dcda" } }) { projectV2Item { id } } }'
501
- ```
502
-
503
- #### 4d. Set Figma Page
504
-
505
- Map `pageName` using the Figma Page Mapping table, then:
506
-
507
- ```bash
508
- gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.figmaPage}", value: { singleSelectOptionId: "<MAPPED_PAGE_OPTION_ID>" } }) { projectV2Item { id } } }'
509
- ```
510
-
511
- ### STEP 5 - Summary
512
-
513
- Print:
514
-
515
- ```markdown
516
- Issue created:
517
-
518
- | Field | Value |
519
- |-------|-------|
520
- | Issue | [#N](url) |
521
- | Component | <SuggestedComponentName> |
522
- | Registry | <RegistryName> |
523
- | Page | <PageName> |
524
- | Phase | Implementation |
525
- | Status | Todo |
526
- | Assignee | unassigned |
527
- ```
528
-
529
- ---
530
-
531
- ## Command: `assign <#N>`
532
-
533
- Assign the issue to the current GitHub user. If a Jira task is linked, also assign it.
534
-
535
- ### STEP 1 - Assign GitHub Issue
536
-
537
- ```bash
538
- gh issue edit <N> --repo ${GH_REPO} --add-assignee @me
539
- ```
540
-
541
- ### STEP 2 - Assign Jira (if linked)
542
-
543
- Read the issue body and check the `### Jira Issue` section for a linked key.
544
-
545
- If a Jira key is found (not `_No response_`):
546
-
547
- ```bash
548
- JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
549
- USERNAME=$(curl -s "${JIRA_BASE_URL}/rest/api/2/myself" \
550
- -H "Authorization: Bearer ${JIRA_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['name'])")
551
-
552
- curl -s -X PUT "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>/assignee" \
553
- -H "Authorization: Bearer ${JIRA_TOKEN}" \
554
- -H "Content-Type: application/json" \
555
- -d "{\"name\": \"${USERNAME}\"}"
556
- ```
557
-
558
- If Jira token not found or VPN unreachable, skip with warning.
559
-
560
- Print: "Issue #N assigned to you." (+ "Jira <KEY> assigned." if applicable)
561
-
562
- ---
563
-
564
- ## Command: `bind-jira <#N> <{jira.projectKey}-XXXXX>`
565
-
566
- Link an existing Jira task to the GitHub issue (both directions).
567
-
568
- ### STEP 1 - Update GitHub Issue Body
569
-
570
- 1. Read current issue body:
571
- ```bash
572
- BODY=$(gh issue view <N> --repo ${GH_REPO} --json body --jq '.body')
573
- ```
574
-
575
- 2. Replace the Jira section:
576
- - Find `### Jira Issue` section
577
- - Replace the line after it (`_No response_` or existing key) with:
578
- ```
579
- [<JIRA_KEY>]({jira.baseUrl}/browse/<JIRA_KEY>)
580
- ```
581
-
582
- 3. Update:
583
- ```bash
584
- gh issue edit <N> --repo ${GH_REPO} --body "<UPDATED_BODY>"
585
- ```
586
-
587
- ### STEP 2 - Update Project Board Jira Field
588
-
589
- ```bash
590
- # Get item ID from project
591
- ITEM_ID=$(gh api graphql -f query='{ node(id: "{github.projectV2Id}") { ... on ProjectV2 { items(first: 100) { nodes { id content { ... on Issue { number } } } } } } }' --jq '.data.node.items.nodes[] | select(.content.number == <N>) | .id')
592
-
593
- # Set Jira field
594
- gh api graphql -f query='mutation { updateProjectV2ItemFieldValue(input: { projectId: "{github.projectV2Id}", itemId: "'"$ITEM_ID"'", fieldId: "{github.projectV2Fields.jira}", value: { text: "<JIRA_KEY>" } }) { projectV2Item { id } } }'
595
- ```
596
-
597
- ### STEP 3 - Update Jira Description with GitHub Link
598
-
599
- ```bash
600
- JIRA_TOKEN=$("$HOME/.claude/lib/credential-store.sh" get \1 2>/dev/null)
601
-
602
- # Get current Jira description
603
- JIRA_DESC=$(curl -s "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>?fields=description" \
604
- -H "Authorization: Bearer ${JIRA_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['fields'].get('description','') or '')")
605
-
606
- # Append GitHub issue link if not already present
607
- GITHUB_URL=$(gh issue view <N> --repo ${GH_REPO} --json url --jq '.url')
608
-
609
- curl -s -X PUT "${JIRA_BASE_URL}/rest/api/2/issue/<JIRA_KEY>" \
610
- -H "Authorization: Bearer ${JIRA_TOKEN}" \
611
- -H "Content-Type: application/json" \
612
- -d "{\"fields\": {\"description\": \"${JIRA_DESC}\n\nh3. GitHub Issue\n${GITHUB_URL}\"}}"
613
- ```
614
-
615
- If Jira token is not found, skip this step with a warning.
616
-
617
- Print: "Issue #N linked to [JIRA_KEY]({jira.baseUrl}/browse/JIRA_KEY)"
618
-
619
- ---
620
-
621
- ## Command: `phase <#N> <phase>` - **DEPRECATED**
622
-
623
- This command is deprecated as of the architecture-update. Phase state
624
- is now tracked per-flag in the component registry
625
- (`status.ios.{implemented,tested,codeConnect,wiki}`), not as a single
626
- enum. The `phase:*` labels are no longer used - they're replaced by
627
- per-flag `impl:green`/`impl:yellow`/`test:green`/etc. labels, which are
628
- applied automatically by `update-issue-from-registry.py` after every
629
- phase finalize script writes the registry.
630
-
631
- If you run this command:
632
-
633
- ```
634
- /figma-issue phase 42 testing
635
- ```
636
-
637
- Print this message and stop (do NOT touch the issue):
638
-
639
- ```
640
- /figma-issue phase is deprecated. Phase state is now computed from the
641
- component registry (Shared/Figma/Components/{nodeId}.json → status.ios).
642
-
643
- To update an issue's labels and Progress table from the current
644
- registry state, run:
645
-
646
- python3 .instructions/figma/figma-to-swiftui/scripts/update-issue-from-registry.py \
647
- --node-id <NODE_ID>
648
-
649
- To bulk-sync all backfilled issues:
650
-
651
- python3 .instructions/figma/figma-to-swiftui/scripts/bulk-sync-issues.py
652
- ```
653
-
654
- Do not update the Projects V2 Phase field from this command anymore.
655
- If you need to change Projects V2 field state, do it manually via
656
- `gh api graphql` or the GitHub UI.
657
-
658
- ---
659
-
660
- ## Command: `block <#N> by <#M>`
661
-
662
- Mark issue #N as blocked by issue #M.
663
-
664
- ### Steps
665
-
666
- 1. Add `blocked` label to issue #N:
667
- ```bash
668
- gh issue edit <N> --repo ${GH_REPO} --add-label "blocked"
669
- ```
670
-
671
- 2. Add a comment to issue #N:
672
- ```bash
673
- gh issue comment <N> --repo ${GH_REPO} --body "Blocked by #<M>"
674
- ```
675
-
676
- 3. Set Status = "Todo" on project board (blocked issues shouldn't be "In Progress").
677
-
678
- Print: "Issue #N is now blocked by #M."
679
-
680
- ---
681
-
682
- ## Command: `unblock <#N>`
683
-
684
- Remove blocked status from issue #N.
685
-
686
- ### Steps
687
-
688
- 1. Remove `blocked` label:
689
- ```bash
690
- gh issue edit <N> --repo ${GH_REPO} --remove-label "blocked"
691
- ```
692
-
693
- 2. Add a comment:
694
- ```bash
695
- gh issue comment <N> --repo ${GH_REPO} --body "Unblocked."
696
- ```
697
-
698
- Print: "Issue #N unblocked."
699
-
700
- ---
701
-
702
- ## Command: `close <#N>`
703
-
704
- 1. Check all progress checkboxes in the issue body.
705
- 2. Set Status = Done on project board.
706
- 3. Close the issue:
707
- ```bash
708
- gh issue close <N> --repo ${GH_REPO}
709
- ```
710
-
711
- Print: "Issue #N closed."
712
-
713
- ---
714
-
715
- ## Command: `status [#N]`
716
-
717
- ### With issue number - show single issue
718
-
719
- ```bash
720
- gh issue view <N> --repo ${GH_REPO} --json number,title,state,assignees,labels,body
721
- ```
722
-
723
- Also fetch project fields:
724
- ```bash
725
- gh api graphql -f query='{ node(id: "{github.projectV2Id}") { ... on ProjectV2 { items(first: 100) { nodes { id fieldValues(first: 10) { nodes { ... on ProjectV2ItemFieldSingleSelectValue { field { ... on ProjectV2SingleSelectField { name } } name } ... on ProjectV2ItemFieldTextValue { field { ... on ProjectV2Field { name } } text } } } content { ... on Issue { number } } } } } } }' --jq '.data.node.items.nodes[] | select(.content.number == <N>)'
726
- ```
727
-
728
- Print a formatted summary with issue details + board fields.
729
-
730
- ### Without issue number - list all open
731
-
732
- ```bash
733
- gh issue list --repo ${GH_REPO} --state open --label component --json number,title,assignees --jq '.[] | "| #\(.number) | \(.title) | \(.assignees | map(.login) | join(", ")) |"'
734
- ```
735
-
736
- Print as a table.
737
-
738
- ---
739
-
740
- ## Error Handling
741
-
742
- - **FigmaRegistryUtility not built**: Run `cd ${REPO_ROOT}/{repos.common.path} && swift build --product FigmaRegistryUtility`.
743
- - **Issue not found**: Print error and stop.
744
- - **Invalid phase**: Print valid options: `implementation`, `testing`, `code-connect`, `documentation`.
745
- - **Duplicate issue**: Print existing issue link and stop - do not create.
746
- - **GraphQL errors**: Print the error message from the API response.
747
- - **Jira token not found**: Prompt user to add to keychain: `"$HOME/.claude/lib/credential-store.sh" set \1 \"\2\"`.
748
- - **Jira API error (401/403)**: Token expired or invalid - prompt user to update keychain.
749
- - **Jira API error (404)**: Wrong issue key - print error and continue.
750
- - **Jira VPN not reachable**: Print warning, skip Jira steps, continue with GitHub-only operations.