@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,191 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Generates Component Implementation Status pages for the GitHub Wiki.
4
-
5
- Source of truth: component-catalog.json (from FigmaRegistryUtility catalog).
6
-
7
- IMPORTANT: No [[wiki links]] - GitHub resolves each one server-side,
8
- causing timeout on pages with 100+ links. Use plain text + code backticks.
9
-
10
- Splits output into 3 pages to stay under GitHub's rendering limit:
11
- - ComponentImplementationStatus.md (summary + index)
12
- - ComponentImplementationStatus‐DSC.md (Design System Core details)
13
- - ComponentImplementationStatus‐MAC.md (Mobile App Components details)
14
-
15
- Usage:
16
- python3 confluence-component-status.py [--output path]
17
- """
18
-
19
- import argparse
20
- import json
21
- import os
22
- import sys
23
-
24
- COMMON_BASES = [".", "{repos.common.path}"]
25
-
26
- SKIP_PREFIXES = ("MacOS", "SearchCursor", "IconInfoCursor", "Scrollbar", "ButtonScrollbar",
27
- "phosphor-icons", "AppDownloadMobile")
28
-
29
- FILE_LABELS = {
30
- "Design System Core": "DSC",
31
- "Mobile App Components": "MAC",
32
- }
33
-
34
-
35
- def find_catalog():
36
- for base in COMMON_BASES:
37
- path = os.path.join(base, "Shared/Figma/Generated/component-catalog.json")
38
- if os.path.isfile(path):
39
- return path
40
- return None
41
-
42
-
43
- def status_of(comp):
44
- name = comp.get("name", "")
45
- for prefix in SKIP_PREFIXES:
46
- if name.startswith(prefix):
47
- return "skipped"
48
- if comp.get("status", "") == "implemented":
49
- return "implemented"
50
- return "ready"
51
-
52
-
53
- def ios_name(comp):
54
- cn = comp.get("componentName", {})
55
- if isinstance(cn, dict):
56
- return cn.get("ios") or comp.get("name", "")
57
- if isinstance(cn, str) and cn:
58
- return cn
59
- return comp.get("name", "")
60
-
61
-
62
- def generate_all(catalog_path, wiki_dir):
63
- with open(catalog_path) as f:
64
- catalog = json.load(f)
65
-
66
- target_files = [f for f in catalog.get("files", [])
67
- if f.get("fileLabel", "") in FILE_LABELS]
68
-
69
- # Global counts
70
- g_impl = g_ready = g_skip = 0
71
- file_summaries = []
72
-
73
- for fe in target_files:
74
- label = fe.get("fileLabel", "")
75
- short = FILE_LABELS.get(label, "")
76
- f_impl = f_ready = f_skip = 0
77
- page_rows = []
78
-
79
- detail_lines = [
80
- f"# {label} - Implementation Status",
81
- "",
82
- "[Back to summary](ComponentImplementationStatus)",
83
- "",
84
- ]
85
-
86
- for pg in fe.get("pages", []):
87
- comps = pg.get("components", [])
88
- if not comps:
89
- continue
90
-
91
- impl = [c for c in comps if status_of(c) == "implemented"]
92
- ready = [c for c in comps if status_of(c) == "ready"]
93
- skipped = [c for c in comps if status_of(c) == "skipped"]
94
- eff = len(comps) - len(skipped)
95
-
96
- if eff == 0:
97
- continue
98
-
99
- f_impl += len(impl)
100
- f_ready += len(ready)
101
- f_skip += len(skipped)
102
-
103
- page_name = pg.get("pageName", "")
104
- page_rows.append((page_name, len(impl), eff))
105
-
106
- # Detail page section
107
- if impl:
108
- detail_lines.append(f"### {page_name} ({len(impl)}/{eff})")
109
- detail_lines.append("")
110
- detail_lines.append("| Component | Swift |")
111
- detail_lines.append("|-----------|-------|")
112
- for c in sorted(impl, key=lambda x: x.get("name", "")):
113
- detail_lines.append(f"| {c['name']} | `{ios_name(c)}` |")
114
- if ready:
115
- detail_lines.append("")
116
- detail_lines.append(f"*+ {len(ready)} ready*")
117
- detail_lines.append("")
118
- else:
119
- detail_lines.append(f"**{page_name}** - 0/{eff} ({len(ready)} ready)")
120
- detail_lines.append("")
121
-
122
- f_eff = f_impl + f_ready
123
- g_impl += f_impl
124
- g_ready += f_ready
125
- g_skip += f_skip
126
- file_summaries.append((label, short, f_impl, f_eff, page_rows))
127
-
128
- # Write detail page
129
- detail_path = os.path.join(wiki_dir, f"ComponentImplementationStatus-{short}.md")
130
- with open(detail_path, "w") as f:
131
- f.write("\n".join(detail_lines))
132
- print(f" {detail_path} ({len(detail_lines)} lines)")
133
-
134
- # Summary page
135
- g_eff = g_impl + g_ready
136
- summary = [
137
- "# Component Implementation Status",
138
- "",
139
- f"**iOS: {g_impl}/{g_eff}** implemented | {g_ready} ready | {g_skip} skipped",
140
- "",
141
- "---",
142
- "",
143
- ]
144
-
145
- for label, short, f_impl, f_eff, page_rows in file_summaries:
146
- pct = int(f_impl / f_eff * 100) if f_eff else 0
147
- summary.append(f"## [{label}](ComponentImplementationStatus-{short}) - {f_impl}/{f_eff} ({pct}%)")
148
- summary.append("")
149
- summary.append("| Section | Progress |")
150
- summary.append("|---------|----------|")
151
- for page_name, p_impl, p_eff in page_rows:
152
- bar = "=" * min(p_impl, 20) if p_impl else ""
153
- summary.append(f"| {page_name} | **{p_impl}**/{p_eff} {bar} |")
154
- summary.append("")
155
-
156
- summary_path = os.path.join(wiki_dir, "ComponentImplementationStatus.md")
157
- with open(summary_path, "w") as f:
158
- f.write("\n".join(summary))
159
- print(f" {summary_path} ({len(summary)} lines)")
160
-
161
-
162
- def main():
163
- parser = argparse.ArgumentParser(description="Generate wiki component status pages")
164
- parser.add_argument("--output", help="Output directory (default: wiki submodule)")
165
- args = parser.parse_args()
166
-
167
- catalog_path = find_catalog()
168
- if not catalog_path:
169
- print("ERROR: component-catalog.json not found. Run: FigmaRegistryUtility catalog")
170
- sys.exit(1)
171
-
172
- if args.output:
173
- wiki_dir = args.output
174
- else:
175
- for candidate in [
176
- "{repos.wiki.path}",
177
- "../{project.slug}-wiki",
178
- ]:
179
- if os.path.isdir(candidate):
180
- wiki_dir = candidate
181
- break
182
- else:
183
- wiki_dir = "."
184
-
185
- print(f"Source: {catalog_path}")
186
- generate_all(catalog_path, wiki_dir)
187
- print("Done.")
188
-
189
-
190
- if __name__ == "__main__":
191
- main()
@@ -1,420 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Confluence Data Gather - Lightweight artifact builder for standalone Confluence upload.
4
-
5
- Reads component source files (FIGMA.md, Swift, registry JSON, snapshots) and
6
- optionally fetches screenshots from Figma REST API to produce the same artifact
7
- structure that phase-7a expects.
8
-
9
- Used by /figma-confluence skill when full pipeline artifacts (pass1/pass2/pass3)
10
- don't exist.
11
-
12
- Usage:
13
- python3 confluence-data-gather.py \
14
- --file-key "9ipBvrtsq9HlQ175B9k0wx" \
15
- --node-id "2073:17454" \
16
- --artifact-path "path/to/artifacts/" \
17
- --component-name "PackageBadge" \
18
- --component-location "path/to/Sources/.../PackageBadge"
19
-
20
- Exit 0 = success (prints JSON summary to stdout)
21
- Exit 1 = failure (prints JSON error to stdout)
22
- """
23
-
24
- import argparse
25
- import concurrent.futures
26
- import json
27
- import os
28
- import re
29
- import subprocess
30
- import sys
31
- from datetime import datetime
32
- from pathlib import Path
33
- from urllib.error import HTTPError, URLError
34
- from urllib.request import Request, urlopen
35
-
36
-
37
- # ─── Globals ─────────────────────────────────────────────────────────────────
38
- FIGMA_TOKEN = None
39
- FILE_KEY = None
40
- NODE_ID = None
41
- COMPONENT_NAME = None
42
- ARTIFACT_PATH = None
43
- COMPONENT_LOCATION = None
44
- REPO_ROOT = None
45
-
46
- def log(msg):
47
- print(f"[confluence-gather] {msg}", file=sys.stderr)
48
-
49
-
50
- def figma_get(endpoint):
51
- """GET from Figma REST API. Returns parsed JSON."""
52
- url = f"https://api.figma.com/v1/{endpoint}"
53
- req = Request(url, headers={"X-Figma-Token": FIGMA_TOKEN})
54
- with urlopen(req, timeout=30) as resp:
55
- return json.loads(resp.read().decode())
56
-
57
-
58
- def download_file(url, dest):
59
- """Download a URL to a local file path."""
60
- try:
61
- req = Request(url)
62
- with urlopen(req, timeout=60) as resp:
63
- Path(dest).parent.mkdir(parents=True, exist_ok=True)
64
- with open(dest, "wb") as f:
65
- f.write(resp.read())
66
- return True
67
- except (URLError, HTTPError) as exc:
68
- log(f"Download failed ({dest}): {exc}")
69
- return False
70
-
71
-
72
- def get_figma_token():
73
- """Resolve Figma REST API token from Keychain."""
74
- try:
75
- return subprocess.check_output(
76
- ["security", "find-generic-password", "-a", os.environ["USER"],
77
- "-s", "FIGMA_ACCESS_TOKEN", "-w"],
78
- stderr=subprocess.DEVNULL,
79
- ).decode().strip()
80
- except (subprocess.CalledProcessError, KeyError):
81
- return None
82
-
83
-
84
- # ─── Registry ────────────────────────────────────────────────────────────────
85
-
86
- def read_registry(node_id):
87
- """Read component registry JSON from mobile-common."""
88
- common_path = Path(REPO_ROOT) / "{repos.packagesContainer}" / "Packages" / "{project.slug}-common"
89
- # Find by node ID
90
- nid_file = node_id.replace(":", "-") + ".json"
91
- registry_path = common_path / "Shared" / "Figma" / "Components" / nid_file
92
- if registry_path.exists():
93
- with open(registry_path) as f:
94
- return json.load(f)
95
- return {}
96
-
97
-
98
- # ─── FIGMA.md Parser ─────────────────────────────────────────────────────────
99
-
100
- def parse_figma_md(figma_md_path):
101
- """Extract structured data from FIGMA.md."""
102
- with open(figma_md_path) as f:
103
- content = f.read()
104
-
105
- data = {
106
- "description": "",
107
- "parameters": [],
108
- "variant_mapping": [],
109
- "usage_examples": [],
110
- "notes": [],
111
- }
112
-
113
- # Description: first paragraph after the title
114
- desc_match = re.search(r'\*\*Figma:\*\*.*?\n\*\*.*?\n\n---\n\n## Parameters', content, re.DOTALL)
115
- # Try to get the component line
116
- comp_match = re.search(r'\*\*Component:\*\*\s*`([^`]+)`', content)
117
- if comp_match:
118
- data["init_signature"] = comp_match.group(1)
119
-
120
- # Parameters table
121
- param_section = re.search(r'## Parameters\n\n\|.*?\n\|[-| ]+\n((?:\|.*\n)*)', content)
122
- if param_section:
123
- for line in param_section.group(1).strip().split('\n'):
124
- cols = [c.strip().strip('`') for c in line.split('|')[1:-1]]
125
- if len(cols) >= 4:
126
- data["parameters"].append({
127
- "name": cols[0],
128
- "type": cols[1],
129
- "default": cols[2],
130
- "description": cols[3],
131
- })
132
-
133
- # Variant Mapping table
134
- variant_section = re.search(r'## Variant Mapping\n\n\|.*?\n\|[-| ]+\n((?:\|.*\n)*)', content)
135
- if variant_section:
136
- for line in variant_section.group(1).strip().split('\n'):
137
- cols = [c.strip().strip('`') for c in line.split('|')[1:-1]]
138
- if len(cols) >= 3:
139
- data["variant_mapping"].append({
140
- "property": cols[0],
141
- "value": cols[1],
142
- "code": cols[2],
143
- })
144
-
145
- # Usage examples
146
- usage_section = re.search(r'## Usage\n\n```swift\n(.*?)```', content, re.DOTALL)
147
- if usage_section:
148
- data["usage_examples"] = [usage_section.group(1).strip()]
149
-
150
- # Notes
151
- notes_section = re.search(r'## Notes\n\n((?:- .*\n)*)', content)
152
- if notes_section:
153
- data["notes"] = [n.strip('- \n') for n in notes_section.group(1).strip().split('\n') if n.strip()]
154
-
155
- return data
156
-
157
-
158
- # ─── Artifact Builders ───────────────────────────────────────────────────────
159
-
160
- def build_component_summary(registry, figma_md_data):
161
- """Build component_summary.json from registry + FIGMA.md."""
162
- variant_count = len([v for v in figma_md_data["variant_mapping"]
163
- if v["property"] == figma_md_data["variant_mapping"][0]["property"]])
164
- return {
165
- "componentName": COMPONENT_NAME,
166
- "nodeId": NODE_ID,
167
- "fileKey": FILE_KEY,
168
- "nodeType": "COMPONENT_SET",
169
- "variantCount": variant_count,
170
- "properties": [
171
- {"name": p["name"], "type": p["type"]}
172
- for p in figma_md_data["parameters"]
173
- ],
174
- "hasExistingCodeConnect": Path(COMPONENT_LOCATION).joinpath(
175
- f"{COMPONENT_NAME}.figma.swift").exists() if COMPONENT_LOCATION else False,
176
- }
177
-
178
-
179
- def build_utility_files(registry, artifact_path):
180
- """Build pass2/ utility JSON files from registry data."""
181
- pass2 = Path(artifact_path) / "pass2"
182
- pass2.mkdir(parents=True, exist_ok=True)
183
-
184
- # Testing identifiers
185
- identifiers = registry.get("testingIdentifiers", [])
186
- with open(pass2 / "utility_identifiers.json", "w") as f:
187
- json.dump({"testingIdentifiers": identifiers}, f, indent=2)
188
-
189
- # Localization keys
190
- loc_keys = registry.get("localizationKeys", [])
191
- with open(pass2 / "utility_localization.json", "w") as f:
192
- json.dump({"localizationKeys": loc_keys}, f, indent=2)
193
-
194
- # Accessibility keys
195
- a11y_keys = registry.get("accessibilityKeys", [])
196
- with open(pass2 / "utility_accessibility.json", "w") as f:
197
- json.dump({"accessibilityKeys": a11y_keys}, f, indent=2)
198
-
199
- # Analytics events
200
- analytics = registry.get("analyticsEvents", [])
201
- with open(pass2 / "utility_analytics.json", "w") as f:
202
- json.dump({"analyticsEvents": analytics}, f, indent=2)
203
-
204
- # Write _index.md
205
- with open(pass2 / "_index.md", "w") as f:
206
- f.write("# Pass 2 - Utility Artifacts (from registry)\n\n")
207
- f.write(f"- Testing identifiers: {len(identifiers)}\n")
208
- f.write(f"- Localization keys: {len(loc_keys)}\n")
209
- f.write(f"- Accessibility keys: {len(a11y_keys)}\n")
210
- f.write(f"- Analytics events: {len(analytics)}\n")
211
-
212
- return {
213
- "testing": len(identifiers),
214
- "localization": len(loc_keys),
215
- "accessibility": len(a11y_keys),
216
- "analytics": len(analytics),
217
- }
218
-
219
-
220
- def fetch_screenshots(artifact_path):
221
- """Fetch main + variant screenshots from Figma REST API."""
222
- pass1 = Path(artifact_path) / "pass1"
223
- pass1.mkdir(parents=True, exist_ok=True)
224
- screenshots_dir = pass1 / "screenshots"
225
- screenshots_dir.mkdir(exist_ok=True)
226
-
227
- screenshot_count = 0
228
-
229
- # Main screenshot
230
- log("Fetching main screenshot...")
231
- try:
232
- data = figma_get(f"images/{FILE_KEY}?ids={NODE_ID}&format=png&scale=2")
233
- url = (data.get("images") or {}).get(NODE_ID)
234
- if url and download_file(url, str(pass1 / "screenshot.png")):
235
- screenshot_count += 1
236
- log("Main screenshot saved")
237
- except Exception as e:
238
- log(f"Main screenshot failed: {e}")
239
-
240
- # Variant screenshots - get node children
241
- log("Fetching variant info...")
242
- try:
243
- node_data = figma_get(f"files/{FILE_KEY}/nodes?ids={NODE_ID}")
244
- node = (node_data.get("nodes") or {}).get(NODE_ID, {}).get("document", {})
245
- children = node.get("children", [])
246
-
247
- if children:
248
- # Batch fetch all variant images
249
- variant_ids = [c["id"] for c in children if c.get("type") == "COMPONENT"]
250
- if variant_ids:
251
- ids_param = ",".join(variant_ids)
252
- img_data = figma_get(f"images/{FILE_KEY}?ids={ids_param}&format=png&scale=2")
253
- images = img_data.get("images", {})
254
-
255
- variants_md_lines = ["# Variant Screenshots\n"]
256
-
257
- for child in children:
258
- if child.get("type") != "COMPONENT":
259
- continue
260
- cid = child["id"]
261
- cname = child.get("name", cid).replace(", ", "_").replace("=", "_").replace(" ", "_")
262
- img_url = images.get(cid)
263
- if img_url:
264
- dest = screenshots_dir / f"{cname}.png"
265
- if download_file(img_url, str(dest)):
266
- screenshot_count += 1
267
- variants_md_lines.append(f"- {child.get('name', cid)}: {cname}.png")
268
-
269
- with open(pass1 / "screenshots" / "variants.md", "w") as f:
270
- f.write("\n".join(variants_md_lines) + "\n")
271
-
272
- log(f"Downloaded {screenshot_count - 1} variant screenshots")
273
- except Exception as e:
274
- log(f"Variant screenshots failed: {e}")
275
-
276
- return screenshot_count
277
-
278
-
279
- def build_pass1_index(artifact_path, figma_md_data, screenshot_count):
280
- """Write pass1/_index.md."""
281
- pass1 = Path(artifact_path) / "pass1"
282
- with open(pass1 / "_index.md", "w") as f:
283
- f.write("# Pass 1 - Data (from confluence-data-gather)\n\n")
284
- f.write(f"- screenshot.png: {'present' if screenshot_count > 0 else 'missing'}\n")
285
- f.write(f"- variant screenshots: {max(0, screenshot_count - 1)}\n")
286
- f.write(f"- component_summary.json: present\n")
287
-
288
-
289
- def build_implementation_history(artifact_path, component_location):
290
- """Write minimal IMPLEMENTATION_HISTORY.md if missing."""
291
- hist_path = Path(artifact_path) / "IMPLEMENTATION_HISTORY.md"
292
- if hist_path.exists():
293
- return # Don't overwrite existing
294
- with open(hist_path, "w") as f:
295
- f.write(f"# Implementation History: {COMPONENT_NAME}\n\n")
296
- f.write(f"- Component: {COMPONENT_NAME}\n")
297
- f.write(f"- Node ID: {NODE_ID}\n")
298
- f.write(f"- File Key: {FILE_KEY}\n")
299
- f.write(f"- Source Location: {component_location}\n")
300
- f.write(f"- Artifact Location: {artifact_path}\n")
301
- f.write(f"- Generated: {datetime.now().isoformat()}\n")
302
- f.write(f"- Source: confluence-data-gather.py (standalone)\n")
303
-
304
-
305
- # ─── Main ────────────────────────────────────────────────────────────────────
306
-
307
- def main():
308
- global FIGMA_TOKEN, FILE_KEY, NODE_ID, COMPONENT_NAME, ARTIFACT_PATH, COMPONENT_LOCATION, REPO_ROOT
309
-
310
- parser = argparse.ArgumentParser(description="Confluence Data Gather")
311
- parser.add_argument("--file-key", required=True)
312
- parser.add_argument("--node-id", required=True)
313
- parser.add_argument("--artifact-path", required=True)
314
- parser.add_argument("--component-name", required=True)
315
- parser.add_argument("--component-location", required=True)
316
- parser.add_argument("--figma-token", default=None)
317
- parser.add_argument("--skip-screenshots", action="store_true",
318
- help="Skip Figma API calls (use when screenshots already exist)")
319
- args = parser.parse_args()
320
-
321
- FILE_KEY = args.file_key
322
- NODE_ID = args.node_id
323
- ARTIFACT_PATH = args.artifact_path
324
- COMPONENT_NAME = args.component_name
325
- COMPONENT_LOCATION = args.component_location
326
-
327
- # Resolve repo root
328
- try:
329
- REPO_ROOT = subprocess.check_output(
330
- ["git", "rev-parse", "--show-toplevel"],
331
- stderr=subprocess.DEVNULL
332
- ).decode().strip()
333
- except subprocess.CalledProcessError:
334
- REPO_ROOT = os.getcwd()
335
-
336
- # Resolve Figma token
337
- FIGMA_TOKEN = args.figma_token or get_figma_token()
338
- has_token = FIGMA_TOKEN is not None
339
-
340
- log(f"Confluence Data Gather: {COMPONENT_NAME} node={NODE_ID} file={FILE_KEY}")
341
- log(f"Figma token: {'available' if has_token else 'MISSING (screenshots will be skipped)'}")
342
-
343
- # ── Read sources ──
344
- registry = read_registry(NODE_ID)
345
- if not registry:
346
- log("WARNING: No registry JSON found - utility data will be empty")
347
-
348
- figma_md_path = Path(COMPONENT_LOCATION) / "FIGMA.md"
349
- if not figma_md_path.exists():
350
- # Try relative to repo root
351
- figma_md_path = Path(REPO_ROOT) / COMPONENT_LOCATION / "FIGMA.md"
352
-
353
- if not figma_md_path.exists():
354
- print(json.dumps({
355
- "status": "HALT",
356
- "reason": f"FIGMA.md not found at {figma_md_path}",
357
- }))
358
- sys.exit(1)
359
-
360
- figma_md_data = parse_figma_md(str(figma_md_path))
361
- log(f"FIGMA.md parsed: {len(figma_md_data['parameters'])} params, {len(figma_md_data['variant_mapping'])} variants")
362
-
363
- # ── Build artifacts ──
364
- artifact_abs = Path(REPO_ROOT) / ARTIFACT_PATH if not Path(ARTIFACT_PATH).is_absolute() else Path(ARTIFACT_PATH)
365
- artifact_abs.mkdir(parents=True, exist_ok=True)
366
-
367
- # pass1: screenshots
368
- screenshot_count = 0
369
- if has_token and not args.skip_screenshots:
370
- screenshot_count = fetch_screenshots(str(artifact_abs))
371
- else:
372
- log("Skipping screenshot fetch")
373
- # Check if screenshots already exist
374
- pass1 = artifact_abs / "pass1"
375
- if (pass1 / "screenshot.png").exists():
376
- screenshot_count = 1
377
- screenshots_dir = pass1 / "screenshots"
378
- if screenshots_dir.exists():
379
- screenshot_count += len(list(screenshots_dir.glob("*.png")))
380
-
381
- # pass1: summary + index
382
- pass1 = artifact_abs / "pass1"
383
- pass1.mkdir(parents=True, exist_ok=True)
384
- summary = build_component_summary(registry, figma_md_data)
385
- with open(pass1 / "component_summary.json", "w") as f:
386
- json.dump(summary, f, indent=2)
387
- build_pass1_index(str(artifact_abs), figma_md_data, screenshot_count)
388
-
389
- # pass2: utility files from registry
390
- utility_counts = build_utility_files(registry, str(artifact_abs))
391
-
392
- # IMPLEMENTATION_HISTORY.md
393
- build_implementation_history(str(artifact_abs), COMPONENT_LOCATION)
394
-
395
- # ── Output ──
396
- result = {
397
- "status": "COMPLETE",
398
- "phase": "confluence-data-gather",
399
- "screenshots": screenshot_count,
400
- "utilities": utility_counts,
401
- "artifacts": [
402
- "pass1/screenshot.png",
403
- "pass1/screenshots/",
404
- "pass1/component_summary.json",
405
- "pass1/_index.md",
406
- "pass2/utility_identifiers.json",
407
- "pass2/utility_localization.json",
408
- "pass2/utility_accessibility.json",
409
- "pass2/utility_analytics.json",
410
- "pass2/_index.md",
411
- "IMPLEMENTATION_HISTORY.md",
412
- ],
413
- }
414
-
415
- print(json.dumps(result, indent=2))
416
- log(f"COMPLETE: {screenshot_count} screenshots, {sum(utility_counts.values())} utility entries")
417
-
418
-
419
- if __name__ == "__main__":
420
- main()
@@ -1,9 +0,0 @@
1
- {
2
- "_comment": "Example confluence-page-ids registry. Copy to confluence-page-ids.json (gitignored) or to your project-local path and fill in real page IDs. Schema: flat map of 'Category/Subcategory' -> Confluence page ID string.",
3
- "_root": "{ROOT_PAGE_ID}",
4
- "Design System Core": "{PAGE_ID}",
5
- "Design System Core/Button": "{PAGE_ID}",
6
- "Mobile App Components": "{PAGE_ID}",
7
- "Mobile App Components/Cards": "{PAGE_ID}",
8
- "Visual Assets": "{PAGE_ID}"
9
- }