@mmerterden/multi-agent-pipeline 11.2.0 → 11.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +2 -2
  3. package/docs/FIGMA_PIPELINE.md +12 -25
  4. package/docs/architecture.md +3 -5
  5. package/docs/features.md +8 -8
  6. package/install/_dev-only-files.mjs +0 -6
  7. package/install/claude.mjs +39 -17
  8. package/install/copilot.mjs +22 -16
  9. package/install/templates/copilot-instructions.md +3 -3
  10. package/package.json +1 -1
  11. package/pipeline/commands/{multi-agent.md → multi-agent/SKILL.md} +39 -39
  12. package/pipeline/commands/multi-agent/{analysis.md → analysis/SKILL.md} +18 -18
  13. package/pipeline/commands/multi-agent/{analysis-resolve.md → analysis-resolve/SKILL.md} +4 -4
  14. package/pipeline/commands/multi-agent/{autopilot.md → autopilot/SKILL.md} +4 -4
  15. package/pipeline/commands/multi-agent/{build-optimize.md → build-optimize/SKILL.md} +1 -1
  16. package/pipeline/commands/multi-agent/{channels.md → channels/SKILL.md} +12 -12
  17. package/pipeline/commands/multi-agent/{dev.md → dev/SKILL.md} +4 -4
  18. package/pipeline/commands/multi-agent/{dev-autopilot.md → dev-autopilot/SKILL.md} +4 -4
  19. package/pipeline/commands/multi-agent/{dev-local.md → dev-local/SKILL.md} +5 -5
  20. package/pipeline/commands/multi-agent/{dev-local-autopilot.md → dev-local-autopilot/SKILL.md} +4 -4
  21. package/pipeline/commands/multi-agent/{finish.md → finish/SKILL.md} +6 -6
  22. package/pipeline/commands/multi-agent/{generate.md → generate/SKILL.md} +3 -3
  23. package/pipeline/commands/multi-agent/{help.md → help/SKILL.md} +4 -4
  24. package/pipeline/commands/multi-agent/{local.md → local/SKILL.md} +5 -5
  25. package/pipeline/commands/multi-agent/{local-autopilot.md → local-autopilot/SKILL.md} +5 -5
  26. package/pipeline/commands/multi-agent/{manual-test.md → manual-test/SKILL.md} +1 -1
  27. package/pipeline/commands/multi-agent/refactor/SKILL.md +257 -0
  28. package/pipeline/commands/multi-agent/{resume.md → resume/SKILL.md} +1 -1
  29. package/pipeline/commands/multi-agent/{review.md → review/SKILL.md} +5 -5
  30. package/pipeline/commands/multi-agent/{setup.md → setup/SKILL.md} +1 -1
  31. package/pipeline/commands/multi-agent/{sync.md → sync/SKILL.md} +20 -58
  32. package/pipeline/lib/credential-store.sh +8 -4
  33. package/pipeline/{commands/multi-agent → multi-agent-refs}/_account-picker.md +2 -2
  34. package/pipeline/{commands/multi-agent → multi-agent-refs}/_dev-context.md +2 -2
  35. package/pipeline/{commands/multi-agent → multi-agent-refs}/_repo-picker.md +2 -2
  36. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/android-guide.md +1 -1
  37. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/jira.md +1 -1
  38. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/wiki.md +7 -7
  39. package/pipeline/multi-agent-refs/component-dispatch.md +92 -0
  40. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/cross-cli-contract.md +10 -77
  41. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/verify-by-test.md +1 -1
  42. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/generate-issue.md +2 -2
  43. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/issue-jira-triad.md +1 -1
  44. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/keychain.md +1 -1
  45. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/log-format.md +1 -1
  46. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/modes.md +2 -2
  47. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/operations.md +1 -1
  48. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-0-init.md +10 -10
  49. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-1-analysis.md +6 -6
  50. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-2-planning.md +3 -3
  51. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-3-dev.md +10 -10
  52. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-4-review.md +8 -8
  53. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-5-test.md +3 -3
  54. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-6-commit.md +4 -4
  55. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases/phase-7-report.md +6 -6
  56. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/phases.md +12 -12
  57. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/progress-contract.md +4 -4
  58. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/swiftui-guide.md +1 -1
  59. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/tracker-contract.md +3 -3
  60. package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/wiki-capture.md +4 -4
  61. package/pipeline/preferences-template.json +17 -1
  62. package/pipeline/rules/figma-pipeline.md +2 -2
  63. package/pipeline/schemas/prefs.schema.json +0 -34
  64. package/pipeline/scripts/README.md +1 -3
  65. package/pipeline/scripts/build-skills-index.mjs +3 -6
  66. package/pipeline/scripts/eval-mine-corpus.mjs +187 -0
  67. package/pipeline/scripts/fixtures/install-layout.tsv +6 -5
  68. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  69. package/pipeline/scripts/lint-skills.mjs +26 -1
  70. package/pipeline/scripts/phase-banner.sh +2 -2
  71. package/pipeline/scripts/review-scope.mjs +94 -0
  72. package/pipeline/scripts/scan-agent-config.sh +2 -2
  73. package/pipeline/scripts/smoke-agent-log-cost.sh +1 -1
  74. package/pipeline/scripts/smoke-agent-model-routing.sh +4 -4
  75. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +2 -2
  76. package/pipeline/scripts/smoke-channels-approval-gate.sh +2 -2
  77. package/pipeline/scripts/smoke-channels-flow.sh +5 -5
  78. package/pipeline/scripts/smoke-clarify.sh +1 -1
  79. package/pipeline/scripts/smoke-commands-skills-parity.sh +3 -3
  80. package/pipeline/scripts/smoke-community-gates.sh +1 -1
  81. package/pipeline/scripts/smoke-compliance-skills.sh +2 -2
  82. package/pipeline/scripts/smoke-cost-summary.sh +1 -1
  83. package/pipeline/scripts/smoke-cross-cli-behavior.sh +17 -43
  84. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +1 -1
  85. package/pipeline/scripts/smoke-dev-critic.sh +1 -1
  86. package/pipeline/scripts/smoke-diff-explain.sh +1 -1
  87. package/pipeline/scripts/smoke-diff-risk.sh +1 -1
  88. package/pipeline/scripts/smoke-evidence-gate.sh +1 -1
  89. package/pipeline/scripts/smoke-figma-dispatch.sh +46 -57
  90. package/pipeline/scripts/smoke-gate-hooks.sh +1 -1
  91. package/pipeline/scripts/smoke-generate-issue.sh +8 -8
  92. package/pipeline/scripts/smoke-handoff-contract.sh +3 -3
  93. package/pipeline/scripts/smoke-identity-isolation.sh +2 -2
  94. package/pipeline/scripts/smoke-intent-guard.sh +1 -1
  95. package/pipeline/scripts/smoke-issue-comment-template.sh +2 -2
  96. package/pipeline/scripts/smoke-issue-jira-triad.sh +4 -4
  97. package/pipeline/scripts/smoke-language-axis.sh +6 -6
  98. package/pipeline/scripts/smoke-learnings-ledger.sh +3 -3
  99. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +16 -16
  100. package/pipeline/scripts/smoke-model-fallback.sh +3 -3
  101. package/pipeline/scripts/smoke-multi-repo-integration.sh +2 -2
  102. package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
  103. package/pipeline/scripts/smoke-no-token-prompt.sh +5 -5
  104. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
  105. package/pipeline/scripts/smoke-phase-6-multi.sh +1 -1
  106. package/pipeline/scripts/smoke-phase4-gates.sh +45 -0
  107. package/pipeline/scripts/smoke-plan-approval-gate.sh +5 -5
  108. package/pipeline/scripts/smoke-plan-todos.sh +3 -3
  109. package/pipeline/scripts/smoke-pr-review-actions.sh +3 -3
  110. package/pipeline/scripts/smoke-prefs-language.sh +1 -1
  111. package/pipeline/scripts/smoke-progress-contract.sh +2 -2
  112. package/pipeline/scripts/smoke-push-retry.sh +1 -1
  113. package/pipeline/scripts/smoke-repo-map.sh +2 -2
  114. package/pipeline/scripts/smoke-shadow-git.sh +1 -1
  115. package/pipeline/scripts/smoke-skill-authoring.sh +4 -9
  116. package/pipeline/scripts/smoke-tasklist-ordering.sh +10 -10
  117. package/pipeline/scripts/smoke-test-gap.sh +1 -1
  118. package/pipeline/scripts/smoke-token-budget.sh +1 -1
  119. package/pipeline/scripts/smoke-token-preflight.sh +2 -2
  120. package/pipeline/scripts/smoke-tracker-contract.sh +13 -13
  121. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +5 -5
  122. package/pipeline/scripts/smoke-triage-memory.sh +2 -2
  123. package/pipeline/scripts/smoke-update-check.sh +1 -1
  124. package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
  125. package/pipeline/scripts/smoke-validator-gates.sh +1 -1
  126. package/pipeline/scripts/smoke-verify-by-test.sh +3 -3
  127. package/pipeline/scripts/smoke-wiki-integration.sh +9 -33
  128. package/pipeline/scripts/smoke-work-summary.sh +1 -1
  129. package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
  130. package/pipeline/scripts/test-integrity-gate.mjs +83 -0
  131. package/pipeline/scripts/uninstall.mjs +17 -6
  132. package/pipeline/skills/.skill-manifest.json +40 -160
  133. package/pipeline/skills/.skills-index.json +3 -373
  134. package/pipeline/skills/shared/README.md +1 -1
  135. package/pipeline/skills/shared/core/multi-agent/SKILL.md +1 -1
  136. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +2 -2
  137. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +3 -3
  138. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  139. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +1 -1
  140. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  141. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  142. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +116 -51
  143. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -30
  144. package/pipeline/skills/shared/external/compose-components/SKILL.md +14 -14
  145. package/pipeline/skills/skills-index.md +3 -44
  146. package/pipeline/commands/multi-agent/refactor.md +0 -188
  147. package/pipeline/commands/multi-agent/refs/component-dispatch.md +0 -92
  148. package/pipeline/scripts/smoke-existing-discovery-gate.sh +0 -71
  149. package/pipeline/scripts/smoke-figma-android-parity.sh +0 -148
  150. package/pipeline/scripts/smoke-figma-credential-store.sh +0 -105
  151. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +0 -177
  152. package/pipeline/scripts/smoke-figma-sync.sh +0 -149
  153. package/pipeline/scripts/smoke-sync-delegation.sh +0 -74
  154. package/pipeline/skills/figma-android/README.md +0 -38
  155. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +0 -62
  156. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +0 -158
  157. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +0 -120
  158. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +0 -35
  159. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +0 -124
  160. package/pipeline/skills/figma-common/README.md +0 -64
  161. package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +0 -152
  162. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +0 -282
  163. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +0 -503
  164. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +0 -288
  165. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +0 -362
  166. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +0 -206
  167. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +0 -337
  168. package/pipeline/skills/figma-common/figma-commit/SKILL.md +0 -216
  169. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +0 -223
  170. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +0 -251
  171. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +0 -78
  172. package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +0 -61
  173. package/pipeline/skills/figma-common/figma-fix/SKILL.md +0 -321
  174. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +0 -542
  175. package/pipeline/skills/figma-common/figma-issue/SKILL.md +0 -750
  176. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +0 -208
  177. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +0 -1020
  178. package/pipeline/skills/figma-common/figma-mend/SKILL.md +0 -331
  179. package/pipeline/skills/figma-common/figma-navigation/SKILL.md +0 -156
  180. package/pipeline/skills/figma-common/figma-overlays/SKILL.md +0 -142
  181. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +0 -398
  182. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +0 -104
  183. package/pipeline/skills/figma-common/figma-review/SKILL.md +0 -400
  184. package/pipeline/skills/figma-common/figma-setup/SKILL.md +0 -514
  185. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +0 -592
  186. package/pipeline/skills/figma-common/figma-skip/SKILL.md +0 -129
  187. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +0 -105
  188. package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +0 -116
  189. package/pipeline/skills/figma-common/figma-utility/SKILL.md +0 -274
  190. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +0 -808
  191. package/pipeline/skills/figma-common/figma-validate/SKILL.md +0 -633
  192. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +0 -716
  193. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +0 -238
  194. package/pipeline/skills/figma-common/performance-start/SKILL.md +0 -430
  195. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +0 -706
  196. package/pipeline/skills/figma-common/performance-tour/SKILL.md +0 -423
  197. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +0 -67
  198. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +0 -178
  199. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +0 -184
  200. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +0 -219
  201. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +0 -274
  202. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +0 -416
  203. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +0 -57
  204. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +0 -307
  205. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +0 -119
  206. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +0 -174
  207. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +0 -333
  208. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +0 -368
  209. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +0 -393
  210. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +0 -617
  211. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +0 -352
  212. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +0 -337
  213. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +0 -206
  214. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +0 -235
  215. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +0 -214
  216. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +0 -902
  217. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +0 -156
  218. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +0 -175
  219. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +0 -176
  220. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +0 -333
  221. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +0 -412
  222. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +0 -336
  223. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +0 -705
  224. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +0 -332
  225. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +0 -380
  226. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +0 -262
  227. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +0 -482
  228. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +0 -274
  229. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +0 -636
  230. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +0 -142
  231. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +0 -547
  232. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +0 -39
  233. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +0 -659
  234. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +0 -580
  235. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +0 -51
  236. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +0 -183
  237. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +0 -64
  238. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +0 -531
  239. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +0 -89
  240. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +0 -155
  241. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +0 -196
  242. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +0 -57
  243. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +0 -89
  244. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +0 -227
  245. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +0 -157
  246. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +0 -90
  247. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +0 -116
  248. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +0 -153
  249. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +0 -130
  250. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +0 -218
  251. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +0 -188
  252. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +0 -93
  253. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +0 -98
  254. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +0 -261
  255. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +0 -147
  256. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +0 -182
  257. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +0 -185
  258. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +0 -609
  259. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +0 -332
  260. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +0 -261
  261. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +0 -184
  262. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +0 -188
  263. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +0 -768
  264. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +0 -191
  265. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +0 -420
  266. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +0 -9
  267. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +0 -336
  268. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +0 -391
  269. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +0 -292
  270. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +0 -1
  271. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +0 -93
  272. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +0 -299
  273. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +0 -343
  274. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +0 -206
  275. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +0 -149
  276. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +0 -281
  277. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +0 -332
  278. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +0 -176
  279. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +0 -98
  280. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +0 -298
  281. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +0 -195
  282. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +0 -1298
  283. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +0 -228
  284. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +0 -1089
  285. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +0 -141
  286. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +0 -106
  287. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +0 -162
  288. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +0 -105
  289. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +0 -179
  290. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +0 -260
  291. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +0 -260
  292. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +0 -86
  293. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +0 -321
  294. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +0 -1470
  295. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +0 -176
  296. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +0 -147
  297. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +0 -629
  298. /package/pipeline/commands/multi-agent/{delete.md → delete/SKILL.md} +0 -0
  299. /package/pipeline/commands/multi-agent/{diff-explain.md → diff-explain/SKILL.md} +0 -0
  300. /package/pipeline/commands/multi-agent/{garbage-collect.md → garbage-collect/SKILL.md} +0 -0
  301. /package/pipeline/commands/multi-agent/{issue.md → issue/SKILL.md} +0 -0
  302. /package/pipeline/commands/multi-agent/{jira.md → jira/SKILL.md} +0 -0
  303. /package/pipeline/commands/multi-agent/{kill.md → kill/SKILL.md} +0 -0
  304. /package/pipeline/commands/multi-agent/{language.md → language/SKILL.md} +0 -0
  305. /package/pipeline/commands/multi-agent/{log.md → log/SKILL.md} +0 -0
  306. /package/pipeline/commands/multi-agent/{prune-logs.md → prune-logs/SKILL.md} +0 -0
  307. /package/pipeline/commands/multi-agent/{purge.md → purge/SKILL.md} +0 -0
  308. /package/pipeline/commands/multi-agent/{scan.md → scan/SKILL.md} +0 -0
  309. /package/pipeline/commands/multi-agent/{search.md → search/SKILL.md} +0 -0
  310. /package/pipeline/commands/multi-agent/{stack.md → stack/SKILL.md} +0 -0
  311. /package/pipeline/commands/multi-agent/{status.md → status/SKILL.md} +0 -0
  312. /package/pipeline/commands/multi-agent/{test.md → test/SKILL.md} +0 -0
  313. /package/pipeline/commands/multi-agent/{update.md → update/SKILL.md} +0 -0
  314. /package/pipeline/{commands/multi-agent → multi-agent-refs}/_input-parser.md +0 -0
  315. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/analysis-template.md +0 -0
  316. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/audit-guide.md +0 -0
  317. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/backend-guide.md +0 -0
  318. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/confluence.md +0 -0
  319. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/issue-comment.md +0 -0
  320. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr-review-actions.md +0 -0
  321. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/channels/pr.md +0 -0
  322. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/conventions-defaults.md +0 -0
  323. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/autopilot-circuit-breaker.md +0 -0
  324. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/dev-critic.md +0 -0
  325. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/external-context-injection.md +0 -0
  326. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/model-fallback.md +0 -0
  327. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/plan-todos.md +0 -0
  328. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/prior-fix-detection.md +0 -0
  329. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/repo-map.md +0 -0
  330. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/features/shadow-git.md +0 -0
  331. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/frontend-guide.md +0 -0
  332. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/knowledge.md +0 -0
  333. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/multi-repo-integration-build.md +0 -0
  334. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/picker-contract.md +0 -0
  335. /package/pipeline/{commands/multi-agent/refs → multi-agent-refs}/rules.md +0 -0
@@ -1,149 +0,0 @@
1
- """HTTP path tests for figma-update.py.
2
-
3
- Mocks http.client.HTTPSConnection so we can exercise fetch_file_last_modified
4
- and load_figma_token end-to-end without touching the real Figma API.
5
-
6
- Run: python3 -m unittest test_figma_update_http.py
7
- """
8
-
9
- import importlib.util
10
- import json
11
- import os
12
- import sys
13
- import unittest
14
- from pathlib import Path
15
- from unittest.mock import MagicMock, patch
16
-
17
- SCRIPTS_DIR = Path(__file__).parent.parent
18
- spec = importlib.util.spec_from_file_location(
19
- "figma_update", SCRIPTS_DIR / "figma-update.py"
20
- )
21
- figma_update = importlib.util.module_from_spec(spec)
22
- sys.modules["figma_update"] = figma_update
23
- spec.loader.exec_module(figma_update)
24
-
25
-
26
- def _make_mock_response(status: int, body: str) -> MagicMock:
27
- resp = MagicMock()
28
- resp.status = status
29
- resp.read.return_value = body.encode("utf-8")
30
- return resp
31
-
32
-
33
- def _make_mock_conn(response) -> MagicMock:
34
- conn = MagicMock()
35
- conn.getresponse.return_value = response
36
- return conn
37
-
38
-
39
- class FetchFileLastModifiedTests(unittest.TestCase):
40
- def test_happy_path_returns_last_modified(self):
41
- body = json.dumps({"lastModified": "2026-04-11T02:14:00Z", "name": "X"})
42
- resp = _make_mock_response(200, body)
43
- conn = _make_mock_conn(resp)
44
-
45
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn):
46
- result = figma_update.fetch_file_last_modified("FILEKEY", "TOKEN")
47
-
48
- self.assertEqual(result, "2026-04-11T02:14:00Z")
49
-
50
- def test_uses_correct_url_and_headers(self):
51
- body = json.dumps({"lastModified": "2026-04-11T02:14:00Z"})
52
- resp = _make_mock_response(200, body)
53
- conn = _make_mock_conn(resp)
54
-
55
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn) as mock_https:
56
- figma_update.fetch_file_last_modified("ABC123", "TOKEN_XYZ")
57
-
58
- # Correct host + timeout
59
- mock_https.assert_called_once_with(figma_update.FIGMA_API_HOST, timeout=30)
60
-
61
- # Correct URL path and auth header
62
- conn.request.assert_called_once()
63
- args, kwargs = conn.request.call_args
64
- method, path = args[0], args[1]
65
- headers = kwargs.get("headers", {})
66
- self.assertEqual(method, "GET")
67
- self.assertIn("/v1/files/ABC123", path)
68
- self.assertIn("depth=1", path)
69
- self.assertEqual(headers["X-Figma-Token"], "TOKEN_XYZ")
70
-
71
- def test_non_200_raises_runtime_error(self):
72
- resp = _make_mock_response(403, '{"err":"Forbidden"}')
73
- conn = _make_mock_conn(resp)
74
-
75
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn):
76
- with self.assertRaises(RuntimeError) as ctx:
77
- figma_update.fetch_file_last_modified("FILEKEY", "BADTOKEN")
78
-
79
- self.assertIn("403", str(ctx.exception))
80
-
81
- def test_missing_last_modified_field_raises(self):
82
- body = json.dumps({"name": "file with no lastModified"})
83
- resp = _make_mock_response(200, body)
84
- conn = _make_mock_conn(resp)
85
-
86
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn):
87
- with self.assertRaises(RuntimeError) as ctx:
88
- figma_update.fetch_file_last_modified("FILEKEY", "TOKEN")
89
-
90
- self.assertIn("lastModified", str(ctx.exception))
91
-
92
- def test_connection_closed_on_success(self):
93
- body = json.dumps({"lastModified": "2026-04-11T02:14:00Z"})
94
- resp = _make_mock_response(200, body)
95
- conn = _make_mock_conn(resp)
96
-
97
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn):
98
- figma_update.fetch_file_last_modified("FILEKEY", "TOKEN")
99
-
100
- conn.close.assert_called_once()
101
-
102
- def test_connection_closed_on_error(self):
103
- resp = _make_mock_response(500, '{"err":"boom"}')
104
- conn = _make_mock_conn(resp)
105
-
106
- with patch.object(figma_update.http.client, "HTTPSConnection", return_value=conn):
107
- with self.assertRaises(RuntimeError):
108
- figma_update.fetch_file_last_modified("FILEKEY", "TOKEN")
109
-
110
- conn.close.assert_called_once()
111
-
112
-
113
- class LoadFigmaTokenTests(unittest.TestCase):
114
- def test_prefers_env_var(self):
115
- with patch.dict(os.environ, {"FIGMA_ACCESS_TOKEN": "env-token"}, clear=False):
116
- token = figma_update.load_figma_token()
117
- self.assertEqual(token, "env-token")
118
-
119
- def test_falls_back_to_keychain(self):
120
- # Remove env var, mock subprocess.run
121
- env = {k: v for k, v in os.environ.items() if k != "FIGMA_ACCESS_TOKEN"}
122
- fake_result = MagicMock()
123
- fake_result.returncode = 0
124
- fake_result.stdout = "keychain-token\n"
125
- with patch.dict(os.environ, env, clear=True):
126
- with patch.object(figma_update.subprocess, "run", return_value=fake_result):
127
- token = figma_update.load_figma_token()
128
- self.assertEqual(token, "keychain-token")
129
-
130
- def test_returns_none_when_nothing_available(self):
131
- env = {k: v for k, v in os.environ.items() if k != "FIGMA_ACCESS_TOKEN"}
132
- fake_result = MagicMock()
133
- fake_result.returncode = 1
134
- fake_result.stdout = ""
135
- with patch.dict(os.environ, env, clear=True):
136
- with patch.object(figma_update.subprocess, "run", return_value=fake_result):
137
- token = figma_update.load_figma_token()
138
- self.assertIsNone(token)
139
-
140
- def test_keychain_exception_returns_none(self):
141
- env = {k: v for k, v in os.environ.items() if k != "FIGMA_ACCESS_TOKEN"}
142
- with patch.dict(os.environ, env, clear=True):
143
- with patch.object(figma_update.subprocess, "run", side_effect=FileNotFoundError("no security")):
144
- token = figma_update.load_figma_token()
145
- self.assertIsNone(token)
146
-
147
-
148
- if __name__ == "__main__":
149
- unittest.main(verbosity=2)
@@ -1,281 +0,0 @@
1
- """Integration tests for phase{4,5,6,7}-finalize.py CLI wrappers.
2
-
3
- Invokes the scripts via subprocess against a tempdir registry + fake
4
- Swift source file. Asserts the written JSON end-state for each
5
- scenario including the full Phase 4 → 5 → 6 → 7 happy path, the
6
- byte-identical no-op, and the yellow cascade on content change.
7
-
8
- Run: python3 -m unittest test_phase_clis.py
9
- """
10
-
11
- import json
12
- import subprocess
13
- import sys
14
- import tempfile
15
- import unittest
16
- from pathlib import Path
17
-
18
- SCRIPTS_DIR = Path(__file__).parent.parent
19
- PHASE4 = SCRIPTS_DIR / "phase4-finalize.py"
20
- PHASE5 = SCRIPTS_DIR / "phase5-finalize.py"
21
- PHASE6 = SCRIPTS_DIR / "phase6-finalize.py"
22
- PHASE7 = SCRIPTS_DIR / "phase7-finalize.py"
23
-
24
-
25
- def _run(script: Path, *args: str) -> subprocess.CompletedProcess:
26
- return subprocess.run(
27
- ["python3", str(script), *args],
28
- capture_output=True,
29
- text=True,
30
- check=False,
31
- )
32
-
33
-
34
- class Phase4CliTests(unittest.TestCase):
35
- def setUp(self):
36
- self.tmp = tempfile.TemporaryDirectory()
37
- self.root = Path(self.tmp.name)
38
- self.registry = self.root / "reg"
39
- self.registry.mkdir()
40
- self.swift = self.root / "Button.swift"
41
- self.swift.write_text("struct Button {}\n")
42
- self.node_id = "5:17752"
43
- self.registry_file = self.registry / "5-17752.json"
44
-
45
- def tearDown(self):
46
- self.tmp.cleanup()
47
-
48
- def test_first_run_creates_and_sets_version_1(self):
49
- r = _run(
50
- PHASE4,
51
- "--node-id", self.node_id,
52
- "--component-name", "Button",
53
- "--source-file", str(self.swift),
54
- "--registry-dir", str(self.registry),
55
- )
56
- self.assertEqual(r.returncode, 0, msg=r.stderr)
57
- data = json.loads(self.registry_file.read_text())
58
- impl = data["status"]["ios"]["implemented"]
59
- self.assertTrue(impl["value"])
60
- self.assertEqual(impl["version"], 1)
61
- self.assertIsNotNone(impl["hash"])
62
- self.assertIn("sha256:", impl["hash"])
63
-
64
- def test_byte_identical_rerun_is_noop(self):
65
- _run(
66
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
67
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
68
- )
69
- first = json.loads(self.registry_file.read_text())["status"]["ios"]["implemented"]
70
-
71
- _run(
72
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
73
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
74
- )
75
- second = json.loads(self.registry_file.read_text())["status"]["ios"]["implemented"]
76
-
77
- self.assertEqual(second["version"], 1)
78
- self.assertEqual(second["hash"], first["hash"])
79
- self.assertEqual(second["at"], first["at"])
80
-
81
- def test_content_change_bumps_version(self):
82
- _run(
83
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
84
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
85
- )
86
- self.swift.write_text("struct Button { let x: Int }\n")
87
- _run(
88
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
89
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
90
- )
91
- data = json.loads(self.registry_file.read_text())
92
- self.assertEqual(data["status"]["ios"]["implemented"]["version"], 2)
93
-
94
- def test_missing_source_file_errors(self):
95
- r = _run(
96
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
97
- "--source-file", "/nope/missing.swift", "--registry-dir", str(self.registry),
98
- )
99
- self.assertEqual(r.returncode, 1)
100
- self.assertIn("--source-file", r.stderr)
101
-
102
- def test_missing_registry_dir_errors(self):
103
- r = _run(
104
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
105
- "--source-file", str(self.swift), "--registry-dir", "/nope",
106
- )
107
- self.assertEqual(r.returncode, 1)
108
-
109
- def test_android_platform(self):
110
- _run(
111
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
112
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
113
- "--platform", "android",
114
- )
115
- data = json.loads(self.registry_file.read_text())
116
- self.assertTrue(data["status"]["android"]["implemented"]["value"])
117
- self.assertFalse(data["status"]["ios"]["implemented"]["value"])
118
-
119
-
120
- class Phase5CliTests(unittest.TestCase):
121
- def setUp(self):
122
- self.tmp = tempfile.TemporaryDirectory()
123
- self.root = Path(self.tmp.name)
124
- self.registry = self.root / "reg"
125
- self.registry.mkdir()
126
- self.swift = self.root / "Button.swift"
127
- self.swift.write_text("struct Button {}\n")
128
- self.node_id = "5:17752"
129
- self.registry_file = self.registry / "5-17752.json"
130
-
131
- def tearDown(self):
132
- self.tmp.cleanup()
133
-
134
- def test_tested_recorded_against_current_impl_version(self):
135
- _run(
136
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
137
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
138
- )
139
- r = _run(PHASE5, "--node-id", self.node_id, "--registry-dir", str(self.registry))
140
- self.assertEqual(r.returncode, 0, msg=r.stderr)
141
- data = json.loads(self.registry_file.read_text())
142
- self.assertTrue(data["status"]["ios"]["tested"]["value"])
143
- self.assertEqual(data["status"]["ios"]["tested"]["against"], 1)
144
-
145
-
146
- class Phase6CliTests(unittest.TestCase):
147
- def setUp(self):
148
- self.tmp = tempfile.TemporaryDirectory()
149
- self.root = Path(self.tmp.name)
150
- self.registry = self.root / "reg"
151
- self.registry.mkdir()
152
- self.node_id = "99:88"
153
- self.registry_file = self.registry / "99-88.json"
154
-
155
- def tearDown(self):
156
- self.tmp.cleanup()
157
-
158
- def test_phase6_creates_legacy_shell_for_fresh_node(self):
159
- r = _run(
160
- PHASE6,
161
- "--node-id", self.node_id,
162
- "--file-key", "ABC123",
163
- "--component-name", "StandaloneIcon",
164
- "--registry-dir", str(self.registry),
165
- )
166
- self.assertEqual(r.returncode, 0, msg=r.stderr)
167
- data = json.loads(self.registry_file.read_text())
168
- # Legacy shell fields
169
- self.assertIn("fileKey", data)
170
- self.assertEqual(data["fileKey"], "ABC123")
171
- self.assertIn("componentName", data)
172
- self.assertEqual(data["componentName"]["ios"], "StandaloneIcon")
173
- # Status block created via set_flag
174
- self.assertTrue(data["status"]["ios"]["codeConnect"]["value"])
175
- # Legacy mirror also kept
176
- self.assertTrue(data["codeConnect"]["ios"])
177
-
178
- def test_phase6_action_created_vs_updated(self):
179
- # First run → created
180
- r1 = _run(
181
- PHASE6, "--node-id", self.node_id, "--file-key", "ABC",
182
- "--component-name", "X", "--registry-dir", str(self.registry),
183
- )
184
- out1 = json.loads(r1.stdout)
185
- self.assertEqual(out1["action"], "created")
186
-
187
- # Second run → updated
188
- r2 = _run(
189
- PHASE6, "--node-id", self.node_id, "--file-key", "ABC",
190
- "--component-name", "X", "--registry-dir", str(self.registry),
191
- )
192
- out2 = json.loads(r2.stdout)
193
- self.assertEqual(out2["action"], "updated")
194
-
195
-
196
- class FullPipelineChainTests(unittest.TestCase):
197
- def setUp(self):
198
- self.tmp = tempfile.TemporaryDirectory()
199
- self.root = Path(self.tmp.name)
200
- self.registry = self.root / "reg"
201
- self.registry.mkdir()
202
- self.swift = self.root / "Button.swift"
203
- self.swift.write_text("struct Button {}\n")
204
- self.node_id = "5:17752"
205
- self.registry_file = self.registry / "5-17752.json"
206
-
207
- def tearDown(self):
208
- self.tmp.cleanup()
209
-
210
- def _data(self):
211
- return json.loads(self.registry_file.read_text())
212
-
213
- def test_phase_4_5_6_7_chain_all_green(self):
214
- _run(
215
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
216
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
217
- )
218
- _run(PHASE5, "--node-id", self.node_id, "--registry-dir", str(self.registry))
219
- _run(
220
- PHASE6, "--node-id", self.node_id, "--file-key", "K",
221
- "--component-name", "Button", "--registry-dir", str(self.registry),
222
- )
223
- _run(PHASE7, "--node-id", self.node_id, "--registry-dir", str(self.registry))
224
-
225
- d = self._data()
226
- s = d["status"]["ios"]
227
- self.assertEqual(s["implemented"]["version"], 1)
228
- self.assertEqual(s["tested"]["against"], 1)
229
- self.assertEqual(s["codeConnect"]["against"], 1)
230
- self.assertEqual(s["wiki"]["against"], 1)
231
- self.assertTrue(d["codeConnect"]["ios"]) # legacy mirror
232
-
233
- def test_yellow_cascade_after_phase4_rerun(self):
234
- _run(
235
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
236
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
237
- )
238
- _run(PHASE5, "--node-id", self.node_id, "--registry-dir", str(self.registry))
239
- _run(
240
- PHASE6, "--node-id", self.node_id, "--file-key", "K",
241
- "--component-name", "Button", "--registry-dir", str(self.registry),
242
- )
243
- _run(PHASE7, "--node-id", self.node_id, "--registry-dir", str(self.registry))
244
-
245
- # Content change → impl version bumps, downstream goes yellow
246
- self.swift.write_text("struct Button { let x: Int }\n")
247
- _run(
248
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
249
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
250
- )
251
-
252
- d = self._data()
253
- s = d["status"]["ios"]
254
- self.assertEqual(s["implemented"]["version"], 2)
255
- # tested/codeConnect/wiki still have against=1
256
- self.assertEqual(s["tested"]["against"], 1)
257
- self.assertEqual(s["codeConnect"]["against"], 1)
258
- self.assertEqual(s["wiki"]["against"], 1)
259
-
260
- def test_rerun_phase_clears_yellow(self):
261
- _run(
262
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
263
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
264
- )
265
- _run(PHASE5, "--node-id", self.node_id, "--registry-dir", str(self.registry))
266
-
267
- # Bump impl
268
- self.swift.write_text("struct Button { let x: Int }\n")
269
- _run(
270
- PHASE4, "--node-id", self.node_id, "--component-name", "Button",
271
- "--source-file", str(self.swift), "--registry-dir", str(self.registry),
272
- )
273
- # impl=2, tested.against=1 → yellow
274
-
275
- # Re-run phase 5
276
- _run(PHASE5, "--node-id", self.node_id, "--registry-dir", str(self.registry))
277
- self.assertEqual(self._data()["status"]["ios"]["tested"]["against"], 2)
278
-
279
-
280
- if __name__ == "__main__":
281
- unittest.main(verbosity=2)