@mmerterden/multi-agent-pipeline 8.6.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 (817) hide show
  1. package/CHANGELOG.md +2623 -0
  2. package/LICENSE +21 -0
  3. package/README.md +852 -0
  4. package/docs/FIGMA_PIPELINE.md +138 -0
  5. package/docs/GENERICITY-REVIEW.md +277 -0
  6. package/docs/STABILITY-FIX-PLAN.md +168 -0
  7. package/docs/adr/0001-three-model-triage.md +81 -0
  8. package/docs/adr/0002-instruction-driven-flag.md +62 -0
  9. package/docs/adr/0003-unified-shared-skills.md +55 -0
  10. package/docs/adr/0004-zero-dependency-philosophy.md +60 -0
  11. package/docs/adr/0005-lazy-phase-docs.md +68 -0
  12. package/docs/adr/0006-skills-core-external-split.md +52 -0
  13. package/docs/adr/0007-multi-tool-adapter-framework.md +110 -0
  14. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +98 -0
  15. package/docs/adr/README.md +33 -0
  16. package/docs/architecture.md +181 -0
  17. package/docs/best-practices.md +93 -0
  18. package/docs/features.md +274 -0
  19. package/docs/performance.md +116 -0
  20. package/docs/recovery-guide.md +479 -0
  21. package/index.js +76 -0
  22. package/install/_adapters.mjs +69 -0
  23. package/install/_common.mjs +150 -0
  24. package/install/_copilot-instructions.mjs +32 -0
  25. package/install/_dev-only-files.mjs +23 -0
  26. package/install/_platform-filter.mjs +132 -0
  27. package/install/_telemetry.mjs +79 -0
  28. package/install/claude.mjs +332 -0
  29. package/install/copilot.mjs +254 -0
  30. package/install/index.mjs +179 -0
  31. package/install/templates/copilot-instructions.md +319 -0
  32. package/install.js +24 -0
  33. package/package.json +78 -0
  34. package/pipeline/adapters/_base.mjs +288 -0
  35. package/pipeline/adapters/copilot-chat.mjs +158 -0
  36. package/pipeline/adapters/cursor.mjs +187 -0
  37. package/pipeline/agents/android-architect.md +42 -0
  38. package/pipeline/agents/backend-architect.md +43 -0
  39. package/pipeline/agents/code-reviewer.md +57 -0
  40. package/pipeline/agents/dev-critic.md +148 -0
  41. package/pipeline/agents/explorer.md +34 -0
  42. package/pipeline/agents/ios-architect.md +41 -0
  43. package/pipeline/agents/security-auditor.md +98 -0
  44. package/pipeline/agents/task-clarifier.md +113 -0
  45. package/pipeline/claude-md-template.md +55 -0
  46. package/pipeline/commands/archive-guard.md +45 -0
  47. package/pipeline/commands/deploy.md +54 -0
  48. package/pipeline/commands/figma-to-swiftui.md +295 -0
  49. package/pipeline/commands/multi-agent/_account-picker.md +90 -0
  50. package/pipeline/commands/multi-agent/_dev-context.md +111 -0
  51. package/pipeline/commands/multi-agent/_input-parser.md +43 -0
  52. package/pipeline/commands/multi-agent/_repo-picker.md +76 -0
  53. package/pipeline/commands/multi-agent/autopilot.md +116 -0
  54. package/pipeline/commands/multi-agent/channels.md +465 -0
  55. package/pipeline/commands/multi-agent/delete.md +66 -0
  56. package/pipeline/commands/multi-agent/dev-autopilot.md +120 -0
  57. package/pipeline/commands/multi-agent/dev-local-autopilot.md +110 -0
  58. package/pipeline/commands/multi-agent/dev-local.md +105 -0
  59. package/pipeline/commands/multi-agent/dev.md +246 -0
  60. package/pipeline/commands/multi-agent/diff-explain.md +68 -0
  61. package/pipeline/commands/multi-agent/help.md +422 -0
  62. package/pipeline/commands/multi-agent/issue.md +79 -0
  63. package/pipeline/commands/multi-agent/jira.md +132 -0
  64. package/pipeline/commands/multi-agent/kill.md +38 -0
  65. package/pipeline/commands/multi-agent/language.md +94 -0
  66. package/pipeline/commands/multi-agent/local-autopilot.md +139 -0
  67. package/pipeline/commands/multi-agent/local.md +117 -0
  68. package/pipeline/commands/multi-agent/log.md +25 -0
  69. package/pipeline/commands/multi-agent/manual-test.md +43 -0
  70. package/pipeline/commands/multi-agent/purge.md +39 -0
  71. package/pipeline/commands/multi-agent/refactor.md +188 -0
  72. package/pipeline/commands/multi-agent/refs/android-guide.md +250 -0
  73. package/pipeline/commands/multi-agent/refs/audit-guide.md +240 -0
  74. package/pipeline/commands/multi-agent/refs/backend-guide.md +135 -0
  75. package/pipeline/commands/multi-agent/refs/channels/confluence.md +153 -0
  76. package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +141 -0
  77. package/pipeline/commands/multi-agent/refs/channels/jira.md +127 -0
  78. package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +135 -0
  79. package/pipeline/commands/multi-agent/refs/channels/pr.md +139 -0
  80. package/pipeline/commands/multi-agent/refs/channels/wiki.md +66 -0
  81. package/pipeline/commands/multi-agent/refs/component-dispatch.md +92 -0
  82. package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +326 -0
  83. package/pipeline/commands/multi-agent/refs/frontend-guide.md +136 -0
  84. package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +104 -0
  85. package/pipeline/commands/multi-agent/refs/keychain.md +80 -0
  86. package/pipeline/commands/multi-agent/refs/knowledge.md +112 -0
  87. package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +207 -0
  88. package/pipeline/commands/multi-agent/refs/phases/log-format.md +89 -0
  89. package/pipeline/commands/multi-agent/refs/phases/modes.md +156 -0
  90. package/pipeline/commands/multi-agent/refs/phases/operations.md +91 -0
  91. package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +481 -0
  92. package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +264 -0
  93. package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +278 -0
  94. package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +364 -0
  95. package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +378 -0
  96. package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +129 -0
  97. package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +339 -0
  98. package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +361 -0
  99. package/pipeline/commands/multi-agent/refs/phases.md +187 -0
  100. package/pipeline/commands/multi-agent/refs/progress-contract.md +155 -0
  101. package/pipeline/commands/multi-agent/refs/rules.md +189 -0
  102. package/pipeline/commands/multi-agent/refs/swiftui-guide.md +254 -0
  103. package/pipeline/commands/multi-agent/refs/tracker-contract.md +256 -0
  104. package/pipeline/commands/multi-agent/refs/wiki-capture.md +109 -0
  105. package/pipeline/commands/multi-agent/resume.md +28 -0
  106. package/pipeline/commands/multi-agent/review.md +228 -0
  107. package/pipeline/commands/multi-agent/scan.md +74 -0
  108. package/pipeline/commands/multi-agent/search.md +97 -0
  109. package/pipeline/commands/multi-agent/setup.md +767 -0
  110. package/pipeline/commands/multi-agent/stack.md +48 -0
  111. package/pipeline/commands/multi-agent/status.md +38 -0
  112. package/pipeline/commands/multi-agent/sync.md +319 -0
  113. package/pipeline/commands/multi-agent/test.md +39 -0
  114. package/pipeline/commands/multi-agent/update.md +88 -0
  115. package/pipeline/commands/multi-agent.md +293 -0
  116. package/pipeline/commands/security-review.md +6 -0
  117. package/pipeline/commands/sim-test.md +256 -0
  118. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +25 -0
  119. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +30 -0
  120. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +20 -0
  121. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +15 -0
  122. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +14 -0
  123. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +12 -0
  124. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +29 -0
  125. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +43 -0
  126. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +35 -0
  127. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +35 -0
  128. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +14 -0
  129. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +12 -0
  130. package/pipeline/eval/golden-tasks/README.md +65 -0
  131. package/pipeline/eval/triage/01-empty-findings/expected.json +6 -0
  132. package/pipeline/eval/triage/01-empty-findings/input.json +5 -0
  133. package/pipeline/eval/triage/01-empty-findings/notes.md +7 -0
  134. package/pipeline/eval/triage/02-real-blocker/expected.json +15 -0
  135. package/pipeline/eval/triage/02-real-blocker/input.json +14 -0
  136. package/pipeline/eval/triage/02-real-blocker/notes.md +7 -0
  137. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +18 -0
  138. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +14 -0
  139. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +10 -0
  140. package/pipeline/eval/triage/04-false-positive-reject/expected.json +18 -0
  141. package/pipeline/eval/triage/04-false-positive-reject/input.json +14 -0
  142. package/pipeline/eval/triage/04-false-positive-reject/notes.md +10 -0
  143. package/pipeline/eval/triage/05-mixed-classification/expected.json +43 -0
  144. package/pipeline/eval/triage/05-mixed-classification/input.json +38 -0
  145. package/pipeline/eval/triage/05-mixed-classification/notes.md +17 -0
  146. package/pipeline/eval/triage/06-severity-mismatch/expected.json +15 -0
  147. package/pipeline/eval/triage/06-severity-mismatch/input.json +14 -0
  148. package/pipeline/eval/triage/06-severity-mismatch/notes.md +9 -0
  149. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +27 -0
  150. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +22 -0
  151. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +9 -0
  152. package/pipeline/eval/triage/08-style-misclassified/expected.json +18 -0
  153. package/pipeline/eval/triage/08-style-misclassified/input.json +14 -0
  154. package/pipeline/eval/triage/08-style-misclassified/notes.md +9 -0
  155. package/pipeline/eval/triage/09-cascading-finding/expected.json +23 -0
  156. package/pipeline/eval/triage/09-cascading-finding/input.json +22 -0
  157. package/pipeline/eval/triage/09-cascading-finding/notes.md +9 -0
  158. package/pipeline/eval/triage/10-deferred-crossref/expected.json +18 -0
  159. package/pipeline/eval/triage/10-deferred-crossref/input.json +14 -0
  160. package/pipeline/eval/triage/10-deferred-crossref/notes.md +9 -0
  161. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +27 -0
  162. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +22 -0
  163. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +14 -0
  164. package/pipeline/eval/triage/README.md +54 -0
  165. package/pipeline/lib/account-resolver.sh +204 -0
  166. package/pipeline/lib/channels-multi-repo.sh +218 -0
  167. package/pipeline/lib/context-link-extractor.sh +192 -0
  168. package/pipeline/lib/credential-store-resolver.sh +57 -0
  169. package/pipeline/lib/credential-store.sh +226 -0
  170. package/pipeline/lib/fetch-confluence.sh +358 -0
  171. package/pipeline/lib/fetch-crashlytics.sh +314 -0
  172. package/pipeline/lib/fetch-fortify.sh +321 -0
  173. package/pipeline/lib/fetch-swagger.sh +270 -0
  174. package/pipeline/lib/issue-fetcher.sh +333 -0
  175. package/pipeline/lib/multi-repo-pipeline.sh +252 -0
  176. package/pipeline/lib/plan-todos.sh +284 -0
  177. package/pipeline/lib/post-pr-review.sh +374 -0
  178. package/pipeline/lib/repo-cache.sh +231 -0
  179. package/pipeline/lib/review-watch.sh +244 -0
  180. package/pipeline/lib/shadow-git.sh +222 -0
  181. package/pipeline/lib/submodule-detector.sh +177 -0
  182. package/pipeline/lib/vercel-deploy.sh +170 -0
  183. package/pipeline/preferences-template.json +132 -0
  184. package/pipeline/rules/app-store-guidelines.md +59 -0
  185. package/pipeline/rules/code-review.md +27 -0
  186. package/pipeline/rules/code-style.md +37 -0
  187. package/pipeline/rules/debugging.md +24 -0
  188. package/pipeline/rules/figma-pipeline.md +190 -0
  189. package/pipeline/rules/git-conventions.md +29 -0
  190. package/pipeline/rules/kotlin-android.md +92 -0
  191. package/pipeline/rules/performance.md +23 -0
  192. package/pipeline/rules/security.md +39 -0
  193. package/pipeline/rules/swiftui-qa.md +32 -0
  194. package/pipeline/rules/tdd.md +25 -0
  195. package/pipeline/rules/testing.md +37 -0
  196. package/pipeline/schemas/agent-state.schema.json +273 -0
  197. package/pipeline/schemas/analysis-output.schema.json +59 -0
  198. package/pipeline/schemas/clarify-output.schema.json +74 -0
  199. package/pipeline/schemas/dev-critic-output.schema.json +104 -0
  200. package/pipeline/schemas/diff-risk.schema.json +78 -0
  201. package/pipeline/schemas/figma-project-config.schema.json +372 -0
  202. package/pipeline/schemas/migrations/README.md +73 -0
  203. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +112 -0
  204. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +75 -0
  205. package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +64 -0
  206. package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +36 -0
  207. package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +34 -0
  208. package/pipeline/schemas/plan-todos.schema.json +62 -0
  209. package/pipeline/schemas/planning-output.schema.json +57 -0
  210. package/pipeline/schemas/prefs.schema.json +1137 -0
  211. package/pipeline/schemas/reviewer-output.schema.json +55 -0
  212. package/pipeline/schemas/test-gap.schema.json +64 -0
  213. package/pipeline/schemas/token-budget.json +17 -0
  214. package/pipeline/schemas/triage-corpus.schema.json +31 -0
  215. package/pipeline/schemas/triage-output.schema.json +115 -0
  216. package/pipeline/scripts/.last-figma-sync-plan.json +23 -0
  217. package/pipeline/scripts/README-figma-smokes.md +34 -0
  218. package/pipeline/scripts/README.md +104 -0
  219. package/pipeline/scripts/aggregate-metrics.mjs +310 -0
  220. package/pipeline/scripts/audit-log-rotate.sh +61 -0
  221. package/pipeline/scripts/audit-log.sh +69 -0
  222. package/pipeline/scripts/benchmark-phase-0.sh +128 -0
  223. package/pipeline/scripts/build-skills-index.mjs +139 -0
  224. package/pipeline/scripts/classify-plan-safety.mjs +177 -0
  225. package/pipeline/scripts/cost-table.json +27 -0
  226. package/pipeline/scripts/diff-explain.mjs +276 -0
  227. package/pipeline/scripts/diff-risk-score.mjs +328 -0
  228. package/pipeline/scripts/eval-golden-tasks-live.mjs +294 -0
  229. package/pipeline/scripts/eval-golden-tasks.mjs +223 -0
  230. package/pipeline/scripts/eval-triage.mjs +171 -0
  231. package/pipeline/scripts/figma-placeholder-map.json +191 -0
  232. package/pipeline/scripts/fixtures/diff-risk-android.diff +40 -0
  233. package/pipeline/scripts/fixtures/diff-risk-ios.diff +48 -0
  234. package/pipeline/scripts/fixtures/install-layout.tsv +16 -0
  235. package/pipeline/scripts/fixtures/test-gap-node.diff +30 -0
  236. package/pipeline/scripts/fixtures/test-gap-python.diff +32 -0
  237. package/pipeline/scripts/gen-mode-dispatch.mjs +170 -0
  238. package/pipeline/scripts/gen-skills-index.mjs +90 -0
  239. package/pipeline/scripts/github-ssh-setup.sh +103 -0
  240. package/pipeline/scripts/import-figma-skills.sh +253 -0
  241. package/pipeline/scripts/keychain-save.sh +74 -0
  242. package/pipeline/scripts/keychain.py +294 -0
  243. package/pipeline/scripts/log-metric.sh +98 -0
  244. package/pipeline/scripts/match-skills.mjs +167 -0
  245. package/pipeline/scripts/memory-load.sh +46 -0
  246. package/pipeline/scripts/memory-save.sh +76 -0
  247. package/pipeline/scripts/migrate-prefs.mjs +390 -0
  248. package/pipeline/scripts/migrate-state.mjs +215 -0
  249. package/pipeline/scripts/output-quality-check.sh +125 -0
  250. package/pipeline/scripts/phase-banner.sh +158 -0
  251. package/pipeline/scripts/phase-tracker.sh +548 -0
  252. package/pipeline/scripts/pre-commit-check.sh +69 -0
  253. package/pipeline/scripts/pre-push-check.sh +77 -0
  254. package/pipeline/scripts/render-agent-log-cost.sh +149 -0
  255. package/pipeline/scripts/render-cost-summary.sh +137 -0
  256. package/pipeline/scripts/render-work-summary.sh +195 -0
  257. package/pipeline/scripts/repo-map.mjs +367 -0
  258. package/pipeline/scripts/run-aggregator.mjs +298 -0
  259. package/pipeline/scripts/scan-skills.sh +332 -0
  260. package/pipeline/scripts/search-logs.sh +291 -0
  261. package/pipeline/scripts/sign-skills.sh +67 -0
  262. package/pipeline/scripts/smoke-adapters.sh +207 -0
  263. package/pipeline/scripts/smoke-add-detail.sh +137 -0
  264. package/pipeline/scripts/smoke-agent-log-cost.sh +183 -0
  265. package/pipeline/scripts/smoke-agent-model-routing.sh +87 -0
  266. package/pipeline/scripts/smoke-bitbucket-contract.sh +223 -0
  267. package/pipeline/scripts/smoke-channels-flow.sh +130 -0
  268. package/pipeline/scripts/smoke-ci-workflows.sh +88 -0
  269. package/pipeline/scripts/smoke-clarify.sh +148 -0
  270. package/pipeline/scripts/smoke-commands-skills-parity.sh +87 -0
  271. package/pipeline/scripts/smoke-compliance-skills.sh +119 -0
  272. package/pipeline/scripts/smoke-cost-summary.sh +139 -0
  273. package/pipeline/scripts/smoke-cross-cli-behavior.sh +198 -0
  274. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +128 -0
  275. package/pipeline/scripts/smoke-delete-flow.sh +151 -0
  276. package/pipeline/scripts/smoke-dev-critic.sh +144 -0
  277. package/pipeline/scripts/smoke-diff-explain.sh +128 -0
  278. package/pipeline/scripts/smoke-diff-risk.sh +161 -0
  279. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +160 -0
  280. package/pipeline/scripts/smoke-eval-live.sh +136 -0
  281. package/pipeline/scripts/smoke-existing-discovery-gate.sh +71 -0
  282. package/pipeline/scripts/smoke-figma-android-parity.sh +148 -0
  283. package/pipeline/scripts/smoke-figma-config-schema.sh +144 -0
  284. package/pipeline/scripts/smoke-figma-credential-store.sh +105 -0
  285. package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +177 -0
  286. package/pipeline/scripts/smoke-figma-dispatch.sh +123 -0
  287. package/pipeline/scripts/smoke-figma-skill-import.sh +174 -0
  288. package/pipeline/scripts/smoke-figma-sync.sh +149 -0
  289. package/pipeline/scripts/smoke-identity-isolation.sh +70 -0
  290. package/pipeline/scripts/smoke-install-layout.sh +241 -0
  291. package/pipeline/scripts/smoke-install-leak-gate.sh +125 -0
  292. package/pipeline/scripts/smoke-issue-comment-template.sh +86 -0
  293. package/pipeline/scripts/smoke-issue-jira-triad.sh +120 -0
  294. package/pipeline/scripts/smoke-keychain.sh +158 -0
  295. package/pipeline/scripts/smoke-language-axis.sh +109 -0
  296. package/pipeline/scripts/smoke-lib-scripts.sh +395 -0
  297. package/pipeline/scripts/smoke-migrate-state.sh +102 -0
  298. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +158 -0
  299. package/pipeline/scripts/smoke-multi-repo-integration.sh +116 -0
  300. package/pipeline/scripts/smoke-multi-repo-worktree.sh +61 -0
  301. package/pipeline/scripts/smoke-no-token-prompt.sh +69 -0
  302. package/pipeline/scripts/smoke-pat-audit.sh +107 -0
  303. package/pipeline/scripts/smoke-per-repo-memory.sh +156 -0
  304. package/pipeline/scripts/smoke-personal-data.sh +82 -0
  305. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +170 -0
  306. package/pipeline/scripts/smoke-phase-6-multi.sh +79 -0
  307. package/pipeline/scripts/smoke-phase-banner.sh +101 -0
  308. package/pipeline/scripts/smoke-phase-tracker.sh +255 -0
  309. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +241 -0
  310. package/pipeline/scripts/smoke-phase4-triage.sh +142 -0
  311. package/pipeline/scripts/smoke-plan-approval-gate.sh +71 -0
  312. package/pipeline/scripts/smoke-plan-safety.sh +139 -0
  313. package/pipeline/scripts/smoke-plan-todos.sh +193 -0
  314. package/pipeline/scripts/smoke-pr-review-actions.sh +152 -0
  315. package/pipeline/scripts/smoke-pre-commit.sh +138 -0
  316. package/pipeline/scripts/smoke-pref-migration.sh +224 -0
  317. package/pipeline/scripts/smoke-prefs-language.sh +134 -0
  318. package/pipeline/scripts/smoke-progress-contract.sh +118 -0
  319. package/pipeline/scripts/smoke-push-retry.sh +75 -0
  320. package/pipeline/scripts/smoke-readme-counts.sh +120 -0
  321. package/pipeline/scripts/smoke-repo-map.sh +300 -0
  322. package/pipeline/scripts/smoke-review-watch.sh +134 -0
  323. package/pipeline/scripts/smoke-run-aggregator.sh +216 -0
  324. package/pipeline/scripts/smoke-schema-validation.sh +173 -0
  325. package/pipeline/scripts/smoke-search.sh +187 -0
  326. package/pipeline/scripts/smoke-shadow-git.sh +175 -0
  327. package/pipeline/scripts/smoke-skill-authoring.sh +142 -0
  328. package/pipeline/scripts/smoke-skill-language.sh +83 -0
  329. package/pipeline/scripts/smoke-skill-manifest.sh +138 -0
  330. package/pipeline/scripts/smoke-skill-scan.sh +198 -0
  331. package/pipeline/scripts/smoke-stack-swap.sh +132 -0
  332. package/pipeline/scripts/smoke-subagent-validators.sh +105 -0
  333. package/pipeline/scripts/smoke-sync-delegation.sh +74 -0
  334. package/pipeline/scripts/smoke-sync-parity.sh +92 -0
  335. package/pipeline/scripts/smoke-tasklist-ordering.sh +111 -0
  336. package/pipeline/scripts/smoke-telemetry.sh +147 -0
  337. package/pipeline/scripts/smoke-test-gap.sh +183 -0
  338. package/pipeline/scripts/smoke-token-budget.sh +67 -0
  339. package/pipeline/scripts/smoke-tracker-contract.sh +129 -0
  340. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +65 -0
  341. package/pipeline/scripts/smoke-triage-memory.sh +174 -0
  342. package/pipeline/scripts/smoke-url-enrichment.sh +70 -0
  343. package/pipeline/scripts/smoke-validator-contradiction.sh +67 -0
  344. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +129 -0
  345. package/pipeline/scripts/smoke-wiki-integration.sh +146 -0
  346. package/pipeline/scripts/smoke-work-summary.sh +163 -0
  347. package/pipeline/scripts/smoke-worktree-path-convention.sh +86 -0
  348. package/pipeline/scripts/smoke-write-state.sh +115 -0
  349. package/pipeline/scripts/stack-swap.sh +182 -0
  350. package/pipeline/scripts/sync-figma-source.sh +228 -0
  351. package/pipeline/scripts/sync-parity-check.sh +135 -0
  352. package/pipeline/scripts/test-gap-rules/android.json +25 -0
  353. package/pipeline/scripts/test-gap-rules/ios.json +29 -0
  354. package/pipeline/scripts/test-gap-rules/node.json +17 -0
  355. package/pipeline/scripts/test-gap-rules/python.json +19 -0
  356. package/pipeline/scripts/test-gap-scan.mjs +343 -0
  357. package/pipeline/scripts/token-budget-report.mjs +145 -0
  358. package/pipeline/scripts/triage-memory.mjs +258 -0
  359. package/pipeline/scripts/ui-tree-dumper.swift +122 -0
  360. package/pipeline/scripts/uninstall.mjs +331 -0
  361. package/pipeline/scripts/update-issue-progress.sh +146 -0
  362. package/pipeline/scripts/validate-analysis.mjs +132 -0
  363. package/pipeline/scripts/validate-diff-risk.mjs +117 -0
  364. package/pipeline/scripts/validate-planning.mjs +180 -0
  365. package/pipeline/scripts/validate-reviewer.mjs +131 -0
  366. package/pipeline/scripts/validate-schemas.mjs +88 -0
  367. package/pipeline/scripts/validate-test-gap.mjs +90 -0
  368. package/pipeline/scripts/validate-triage.mjs +175 -0
  369. package/pipeline/scripts/verify-skills.sh +126 -0
  370. package/pipeline/scripts/write-state.mjs +175 -0
  371. package/pipeline/skills/.skill-manifest.json +779 -0
  372. package/pipeline/skills/.skills-index.json +1771 -0
  373. package/pipeline/skills/figma-android/README.md +36 -0
  374. package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +62 -0
  375. package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +158 -0
  376. package/pipeline/skills/figma-android/figma-component-test/SKILL.md +120 -0
  377. package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +35 -0
  378. package/pipeline/skills/figma-android/figma-to-component/SKILL.md +124 -0
  379. package/pipeline/skills/figma-common/README.md +57 -0
  380. package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +277 -0
  381. package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +498 -0
  382. package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +283 -0
  383. package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +362 -0
  384. package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +206 -0
  385. package/pipeline/skills/figma-common/figma-commit/REVIEW.md +337 -0
  386. package/pipeline/skills/figma-common/figma-commit/SKILL.md +211 -0
  387. package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +218 -0
  388. package/pipeline/skills/figma-common/figma-component-start/SKILL.md +246 -0
  389. package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +73 -0
  390. package/pipeline/skills/figma-common/figma-fix/SKILL.md +316 -0
  391. package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +542 -0
  392. package/pipeline/skills/figma-common/figma-issue/SKILL.md +745 -0
  393. package/pipeline/skills/figma-common/figma-iterate/SKILL.md +203 -0
  394. package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +1015 -0
  395. package/pipeline/skills/figma-common/figma-mend/SKILL.md +331 -0
  396. package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +398 -0
  397. package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +104 -0
  398. package/pipeline/skills/figma-common/figma-review/SKILL.md +395 -0
  399. package/pipeline/skills/figma-common/figma-setup/SKILL.md +514 -0
  400. package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +592 -0
  401. package/pipeline/skills/figma-common/figma-skip/SKILL.md +129 -0
  402. package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +104 -0
  403. package/pipeline/skills/figma-common/figma-utility/SKILL.md +274 -0
  404. package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +808 -0
  405. package/pipeline/skills/figma-common/figma-validate/SKILL.md +633 -0
  406. package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +711 -0
  407. package/pipeline/skills/figma-common/performance-review-next/SKILL.md +233 -0
  408. package/pipeline/skills/figma-common/performance-start/SKILL.md +425 -0
  409. package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +706 -0
  410. package/pipeline/skills/figma-common/performance-tour/SKILL.md +418 -0
  411. package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +67 -0
  412. package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +178 -0
  413. package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +184 -0
  414. package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +219 -0
  415. package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +274 -0
  416. package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +401 -0
  417. package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +57 -0
  418. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +307 -0
  419. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +119 -0
  420. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +174 -0
  421. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +333 -0
  422. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +368 -0
  423. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +393 -0
  424. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +617 -0
  425. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +352 -0
  426. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +337 -0
  427. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +206 -0
  428. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +235 -0
  429. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +214 -0
  430. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +871 -0
  431. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +156 -0
  432. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +175 -0
  433. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +176 -0
  434. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +333 -0
  435. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +412 -0
  436. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +336 -0
  437. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +695 -0
  438. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +332 -0
  439. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +380 -0
  440. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +262 -0
  441. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +482 -0
  442. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +274 -0
  443. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +636 -0
  444. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +142 -0
  445. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +547 -0
  446. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +39 -0
  447. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +659 -0
  448. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +580 -0
  449. package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +51 -0
  450. package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +129 -0
  451. package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +64 -0
  452. package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +531 -0
  453. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +89 -0
  454. package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +155 -0
  455. package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +196 -0
  456. package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +57 -0
  457. package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +89 -0
  458. package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +227 -0
  459. package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +157 -0
  460. package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +90 -0
  461. package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +116 -0
  462. package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +153 -0
  463. package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +130 -0
  464. package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +218 -0
  465. package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +188 -0
  466. package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +93 -0
  467. package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +98 -0
  468. package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +261 -0
  469. package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +147 -0
  470. package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +182 -0
  471. package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +185 -0
  472. package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +609 -0
  473. package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +332 -0
  474. package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +261 -0
  475. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +184 -0
  476. package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +188 -0
  477. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +768 -0
  478. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +191 -0
  479. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +420 -0
  480. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +94 -0
  481. package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +336 -0
  482. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +391 -0
  483. package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +292 -0
  484. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +1 -0
  485. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +93 -0
  486. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +299 -0
  487. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +343 -0
  488. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +206 -0
  489. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +149 -0
  490. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +281 -0
  491. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +332 -0
  492. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +176 -0
  493. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +98 -0
  494. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +298 -0
  495. package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +195 -0
  496. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +1298 -0
  497. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +228 -0
  498. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +1089 -0
  499. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +141 -0
  500. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +106 -0
  501. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +162 -0
  502. package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +105 -0
  503. package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +179 -0
  504. package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +260 -0
  505. package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +260 -0
  506. package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +86 -0
  507. package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +321 -0
  508. package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +1470 -0
  509. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +176 -0
  510. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +147 -0
  511. package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +629 -0
  512. package/pipeline/skills/shared/README.md +212 -0
  513. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +315 -0
  514. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +348 -0
  515. package/pipeline/skills/shared/core/multi-agent/SKILL.md +944 -0
  516. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +51 -0
  517. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +300 -0
  518. package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +63 -0
  519. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +64 -0
  520. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +56 -0
  521. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +36 -0
  522. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +42 -0
  523. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +66 -0
  524. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +292 -0
  525. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +35 -0
  526. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +38 -0
  527. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +41 -0
  528. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +87 -0
  529. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +37 -0
  530. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +53 -0
  531. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +28 -0
  532. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +47 -0
  533. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +42 -0
  534. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +191 -0
  535. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +31 -0
  536. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +61 -0
  537. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +61 -0
  538. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +62 -0
  539. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +309 -0
  540. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +55 -0
  541. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +41 -0
  542. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +184 -0
  543. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +44 -0
  544. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +34 -0
  545. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +45 -0
  546. package/pipeline/skills/shared/external/agentflow/SKILL.md +199 -0
  547. package/pipeline/skills/shared/external/alarmkit/SKILL.md +438 -0
  548. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +584 -0
  549. package/pipeline/skills/shared/external/android-architecture/SKILL.md +407 -0
  550. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +153 -0
  551. package/pipeline/skills/shared/external/android-performance/SKILL.md +736 -0
  552. package/pipeline/skills/shared/external/android-security/SKILL.md +577 -0
  553. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +66 -0
  554. package/pipeline/skills/shared/external/api-patterns/SKILL.md +85 -0
  555. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +910 -0
  556. package/pipeline/skills/shared/external/app-clips/SKILL.md +436 -0
  557. package/pipeline/skills/shared/external/app-intents/SKILL.md +489 -0
  558. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +1076 -0
  559. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +75 -0
  560. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +409 -0
  561. package/pipeline/skills/shared/external/app-store-review/SKILL.md +411 -0
  562. package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +259 -0
  563. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +90 -0
  564. package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +152 -0
  565. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +118 -0
  566. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +500 -0
  567. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +425 -0
  568. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +344 -0
  569. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +508 -0
  570. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +285 -0
  571. package/pipeline/skills/shared/external/architecture/SKILL.md +60 -0
  572. package/pipeline/skills/shared/external/authentication/SKILL.md +496 -0
  573. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +211 -0
  574. package/pipeline/skills/shared/external/background-processing/SKILL.md +499 -0
  575. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +390 -0
  576. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +461 -0
  577. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +425 -0
  578. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +462 -0
  579. package/pipeline/skills/shared/external/clean-code/SKILL.md +94 -0
  580. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +116 -0
  581. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +492 -0
  582. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +461 -0
  583. package/pipeline/skills/shared/external/compose-components/SKILL.md +441 -0
  584. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +436 -0
  585. package/pipeline/skills/shared/external/compose-testing/SKILL.md +527 -0
  586. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +425 -0
  587. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +409 -0
  588. package/pipeline/skills/shared/external/context-compression/SKILL.md +266 -0
  589. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +491 -0
  590. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +435 -0
  591. package/pipeline/skills/shared/external/core-motion/SKILL.md +388 -0
  592. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +405 -0
  593. package/pipeline/skills/shared/external/core-nfc/SKILL.md +495 -0
  594. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +420 -0
  595. package/pipeline/skills/shared/external/coreml/SKILL.md +458 -0
  596. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +765 -0
  597. package/pipeline/skills/shared/external/css-modern/SKILL.md +467 -0
  598. package/pipeline/skills/shared/external/database-patterns/SKILL.md +335 -0
  599. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +422 -0
  600. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +387 -0
  601. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +298 -0
  602. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +37 -0
  603. package/pipeline/skills/shared/external/device-integrity/SKILL.md +477 -0
  604. package/pipeline/skills/shared/external/docker-expert/SKILL.md +413 -0
  605. package/pipeline/skills/shared/external/energykit/SKILL.md +460 -0
  606. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +541 -0
  607. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +483 -0
  608. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +326 -0
  609. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +190 -0
  610. package/pipeline/skills/shared/external/firebase/SKILL.md +61 -0
  611. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +348 -0
  612. package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +552 -0
  613. package/pipeline/skills/shared/external/healthkit/SKILL.md +498 -0
  614. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +602 -0
  615. package/pipeline/skills/shared/external/help-skills/SKILL.md +166 -0
  616. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +81 -0
  617. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +95 -0
  618. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +82 -0
  619. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +101 -0
  620. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +94 -0
  621. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +110 -0
  622. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +99 -0
  623. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +81 -0
  624. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +125 -0
  625. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +496 -0
  626. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +455 -0
  627. package/pipeline/skills/shared/external/html-semantic/SKILL.md +301 -0
  628. package/pipeline/skills/shared/external/humanizer/SKILL.md +118 -0
  629. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +301 -0
  630. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +140 -0
  631. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +59 -0
  632. package/pipeline/skills/shared/external/ios-developer/SKILL.md +217 -0
  633. package/pipeline/skills/shared/external/ios-localization/SKILL.md +418 -0
  634. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +627 -0
  635. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +462 -0
  636. package/pipeline/skills/shared/external/ios-networking/SKILL.md +441 -0
  637. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +862 -0
  638. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -0
  639. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +563 -0
  640. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +1116 -0
  641. package/pipeline/skills/shared/external/ios-security/SKILL.md +496 -0
  642. package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +174 -0
  643. package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +297 -0
  644. package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +354 -0
  645. package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +117 -0
  646. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +101 -0
  647. package/pipeline/skills/shared/external/live-activities/SKILL.md +500 -0
  648. package/pipeline/skills/shared/external/live-activities/references/live-activity-patterns.md +868 -0
  649. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +109 -0
  650. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +110 -0
  651. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +485 -0
  652. package/pipeline/skills/shared/external/mapkit-location/references/corelocation-patterns.md +730 -0
  653. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +748 -0
  654. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +479 -0
  655. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +64 -0
  656. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +395 -0
  657. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +363 -0
  658. package/pipeline/skills/shared/external/natural-language/SKILL.md +412 -0
  659. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +311 -0
  660. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +418 -0
  661. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +38 -0
  662. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +235 -0
  663. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +398 -0
  664. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +254 -0
  665. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +387 -0
  666. package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +376 -0
  667. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
  668. package/pipeline/skills/shared/external/permissionkit/SKILL.md +446 -0
  669. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +435 -0
  670. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +501 -0
  671. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +701 -0
  672. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +774 -0
  673. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +869 -0
  674. package/pipeline/skills/shared/external/photos-camera-media/references/photospicker-patterns.md +597 -0
  675. package/pipeline/skills/shared/external/play-store-review/SKILL.md +350 -0
  676. package/pipeline/skills/shared/external/push-notifications/SKILL.md +501 -0
  677. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +677 -0
  678. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +745 -0
  679. package/pipeline/skills/shared/external/python-patterns/SKILL.md +383 -0
  680. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +290 -0
  681. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +479 -0
  682. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +480 -0
  683. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +386 -0
  684. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +506 -0
  685. package/pipeline/skills/shared/external/room-database/SKILL.md +564 -0
  686. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +483 -0
  687. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +544 -0
  688. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +485 -0
  689. package/pipeline/skills/shared/external/storekit/SKILL.md +478 -0
  690. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +58 -0
  691. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +755 -0
  692. package/pipeline/skills/shared/external/swift-charts/SKILL.md +487 -0
  693. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +895 -0
  694. package/pipeline/skills/shared/external/swift-codable/SKILL.md +467 -0
  695. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +408 -0
  696. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +80 -0
  697. package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
  698. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +187 -0
  699. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +341 -0
  700. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +113 -0
  701. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +124 -0
  702. package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +155 -0
  703. package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +67 -0
  704. package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +52 -0
  705. package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +100 -0
  706. package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +107 -0
  707. package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +70 -0
  708. package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +47 -0
  709. package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +129 -0
  710. package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +224 -0
  711. package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +101 -0
  712. package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +218 -0
  713. package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +61 -0
  714. package/pipeline/skills/shared/external/swift-language/SKILL.md +498 -0
  715. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +505 -0
  716. package/pipeline/skills/shared/external/swift-testing/SKILL.md +462 -0
  717. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +504 -0
  718. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +97 -0
  719. package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +252 -0
  720. package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +52 -0
  721. package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +34 -0
  722. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +318 -0
  723. package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +254 -0
  724. package/pipeline/skills/shared/external/swiftdata/SKILL.md +334 -0
  725. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +504 -0
  726. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +975 -0
  727. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +675 -0
  728. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +102 -0
  729. package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +104 -0
  730. package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +10 -0
  731. package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +20 -0
  732. package/pipeline/skills/shared/external/swiftdata-pro/references/indexing.md +27 -0
  733. package/pipeline/skills/shared/external/swiftdata-pro/references/predicates.md +73 -0
  734. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +503 -0
  735. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +821 -0
  736. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +553 -0
  737. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +102 -0
  738. package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
  739. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +403 -0
  740. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +284 -0
  741. package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +326 -0
  742. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +135 -0
  743. package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +602 -0
  744. package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +203 -0
  745. package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +464 -0
  746. package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +266 -0
  747. package/pipeline/skills/shared/external/swiftui-expert-skill/references/liquid-glass.md +416 -0
  748. package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +394 -0
  749. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +318 -0
  750. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +357 -0
  751. package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +303 -0
  752. package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +403 -0
  753. package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +293 -0
  754. package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
  755. package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +417 -0
  756. package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +389 -0
  757. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +450 -0
  758. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +425 -0
  759. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +336 -0
  760. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +97 -0
  761. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +69 -0
  762. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +99 -0
  763. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +147 -0
  764. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +98 -0
  765. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +262 -0
  766. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +207 -0
  767. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +177 -0
  768. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +169 -0
  769. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +178 -0
  770. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +371 -0
  771. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +486 -0
  772. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +1097 -0
  773. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +780 -0
  774. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +696 -0
  775. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +487 -0
  776. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
  777. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
  778. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
  779. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
  780. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +114 -0
  781. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +108 -0
  782. package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +13 -0
  783. package/pipeline/skills/shared/external/swiftui-pro/references/api.md +39 -0
  784. package/pipeline/skills/shared/external/swiftui-pro/references/data.md +43 -0
  785. package/pipeline/skills/shared/external/swiftui-pro/references/design.md +31 -0
  786. package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +9 -0
  787. package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +14 -0
  788. package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +46 -0
  789. package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +56 -0
  790. package/pipeline/skills/shared/external/swiftui-pro/references/views.md +35 -0
  791. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +103 -0
  792. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +428 -0
  793. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +534 -0
  794. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +948 -0
  795. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +210 -0
  796. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +273 -0
  797. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +151 -0
  798. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +95 -0
  799. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +51 -0
  800. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +111 -0
  801. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +309 -0
  802. package/pipeline/skills/shared/external/testing-backend/SKILL.md +393 -0
  803. package/pipeline/skills/shared/external/tipkit/SKILL.md +494 -0
  804. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +782 -0
  805. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +336 -0
  806. package/pipeline/skills/shared/external/vision-framework/SKILL.md +475 -0
  807. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +736 -0
  808. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +738 -0
  809. package/pipeline/skills/shared/external/vue-composition/SKILL.md +371 -0
  810. package/pipeline/skills/shared/external/weatherkit/SKILL.md +410 -0
  811. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +567 -0
  812. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +373 -0
  813. package/pipeline/skills/shared/external/web-performance/SKILL.md +345 -0
  814. package/pipeline/skills/shared/external/web-testing/SKILL.md +385 -0
  815. package/pipeline/skills/shared/external/widgetkit/SKILL.md +497 -0
  816. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +871 -0
  817. package/pipeline/skills/skills-index.md +205 -0
@@ -0,0 +1,1015 @@
1
+ # /figma-iteration-commit — Validate & Commit to iteration/develop + PR to develop
2
+
3
+ ## Guardrails
4
+
5
+ > **NEVER create branches on the main repo (REPO_ROOT).** Do not create `iteration/develop` or any other branch on the main repo. Do not commit to the main repo. This skill only commits to submodules (common, uicomponents, wiki). Main repo submodule refs are updated separately — not by this skill.
6
+
7
+ > **NEVER use `json.dumps()` default formatting on JSON files.** When editing JSON files (e.g., `ui-testing-identifiers.json`), preserve the existing file format. Do not reformat, re-indent, or change separators. The canonical format for `ui-testing-identifiers.json` is `" : "` (space-colon-space), not `": "`. If you must write JSON programmatically, post-process the output to match the existing format.
8
+
9
+ > **NEVER manually edit `ui-testing-identifiers.json`.** Format corruption on this file is most likely caused by conflict resolution. When a rebase conflict occurs on this file:
10
+ > 1. Check what keys we added — look at `Shared/Figma/Components/{nodeId}.json` (has the key list) or `git show HEAD:Shared/UITestingIdentifiers/ui-testing-identifiers.json`
11
+ > 2. Take the remote version: `git checkout --ours Shared/UITestingIdentifiers/ui-testing-identifiers.json` (during rebase, `--ours` = upstream/remote)
12
+ > 3. Re-add our keys via `/common-utility` (`utility-add-key`) — this writes in the correct `" : "` format
13
+ > 4. `git add Shared/UITestingIdentifiers/ui-testing-identifiers.json` + `git rebase --continue`
14
+ >
15
+ > Never resolve JSON conflicts by hand-editing or `json.dumps()` — it reformats the entire file.
16
+
17
+ > **ALWAYS validate `ui-testing-identifiers.json` key count after every rebase — even when there were no conflicts.** The implement agent regenerates this file from `identifier-keys.json` only, which means an auto-merge can silently drop keys that exist on `iteration/develop` but not in the local metadata. After every rebase (or cherry-pick), before staging and continuing, run:
18
+ >
19
+ > ```bash
20
+ > REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
21
+ > LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
22
+ > if [ "$LOCAL_KEY_COUNT" -lt "$REMOTE_KEY_COUNT" ]; then
23
+ > echo "⚠️ INTEGRITY VIOLATION: ui-testing-identifiers.json lost $((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT)) keys vs origin/iteration/develop"
24
+ > echo " Remote: ${REMOTE_KEY_COUNT} keys, Local: ${LOCAL_KEY_COUNT} keys"
25
+ > echo " Restoring from origin/iteration/develop and re-adding component keys..."
26
+ > git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
27
+ > > Shared/UITestingIdentifiers/ui-testing-identifiers.json
28
+ > # Re-add our component's keys (they are in identifier-keys.json — tool will merge them in)
29
+ > .build/debug/UITestingIdentifierTool generate \
30
+ > --config Shared/UITestingIdentifiers/Config/identifier-config.json
31
+ > git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
32
+ > git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
33
+ > fi
34
+ > ```
35
+ >
36
+ > This guard runs even when `ui-testing-identifiers.json` was NOT in the conflict list. Silent key loss from auto-merge is the most common failure mode.
37
+
38
+ > **ALWAYS validate Generated Swift key files after every rebase — even when there were no conflicts.** The codegen tool (`UnifiedCodeGenerationTool`) regenerates `LocalizationStringKeys.swift` and `LocalizedAccessibilityStringKeys.swift` from config JSONs that reference `Sources/Suggested/*.json` files. An auto-merge (or accepting either side during conflict resolution) can silently drop enum blocks if the suggested-key files from another developer's component are not present locally. After every rebase (or cherry-pick), before rebuilding, run:
39
+ >
40
+ > ```bash
41
+ > LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
42
+ > A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
43
+ > for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
44
+ > REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
45
+ > LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
46
+ > MISSING=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
47
+ > if [ -n "$MISSING" ]; then
48
+ > echo "⚠️ INTEGRITY VIOLATION: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
49
+ > echo "$MISSING"
50
+ > echo " Restoring remote version (rebuild will re-add our component's keys)..."
51
+ > git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
52
+ > git add "${GEN_FILE}"
53
+ > fi
54
+ > done
55
+ > ```
56
+ >
57
+ > This guard runs even when the Generated files were NOT in the conflict list. Silent enum loss from auto-merge or "accept either side" resolution is a known failure mode — the rebuild script's codegen step (3.5) will re-add our component's keys on top of the restored remote file.
58
+
59
+ > **ALWAYS validate `Sources/Suggested/*.json` file count after every rebase, cherry-pick, AND before every commit — even when there were no conflicts.** The implement agent only creates source JSONs for the current component. A rebase, cherry-pick, or `git add -A` can silently drop source JSON files belonging to OTHER components (e.g., a tool run deletes files, or a workspace reset loses them). These per-key source files are the ground truth for localization and accessibility code generation — losing them means generated code silently loses keys for other components. After every rebase (or cherry-pick), AND before every `git add -A` in the commit step, run:
60
+ >
61
+ > ```bash
62
+ > for SUGGESTED_DIR in \
63
+ > "Shared/Localization/LocalizationStrings/Sources/Suggested" \
64
+ > "Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
65
+ >
66
+ > REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
67
+ > LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
68
+ > MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
69
+ >
70
+ > if [ -n "$MISSING_FILES" ]; then
71
+ > MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
72
+ > echo "⚠️ INTEGRITY VIOLATION: ${SUGGESTED_DIR} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
73
+ > echo "$MISSING_FILES" | head -20
74
+ > echo " Restoring missing files from origin/iteration/develop..."
75
+ > while IFS= read -r FILE; do
76
+ > git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
77
+ > git add "${SUGGESTED_DIR}/${FILE}"
78
+ > done <<< "$MISSING_FILES"
79
+ > echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s) in ${SUGGESTED_DIR##*/}."
80
+ > fi
81
+ > done
82
+ > ```
83
+ >
84
+ > This guard catches the most dangerous form of silent data loss: source JSON files from OTHER components being deleted by the current component's pipeline. Unlike generated files (which can be rebuilt), source JSONs contain the original translations and cannot be re-derived.
85
+
86
+ > **NEVER call `common-rebuild-derived-artifacts.sh` blindly after conflict resolution when `ui-testing-identifiers.json` may have been touched.** The rebuild script calls `UITestingIdentifierTool generate --swift-only` which only writes the Swift file — but the JSON may already be corrupt from a bad auto-merge. Always run the key-count integrity check BEFORE the rebuild script, and fix the JSON FIRST if the count decreased.
87
+
88
+ ## Conflict File Classification (common submodule)
89
+
90
+ When a cherry-pick or rebase conflict occurs in the common submodule, classify each conflicted file and resolve automatically by pattern:
91
+
92
+ | File Pattern | Strategy | Reason |
93
+ |-------------|----------|--------|
94
+ | `iOS/Sources/*/Generated/*` | Accept either side | Will regenerate |
95
+ | `Shared/Figma/Generated/*` | Accept either side | Gitignored, will regenerate |
96
+ | `iOS/Sources/LocalizationAssets/Resources/*.xcstrings` | Accept either side | Will regenerate |
97
+ | `iOS/Sources/AccessibilityAssets/Resources/*.xcstrings` | Accept either side | Will regenerate |
98
+ | `Shared/Localization/*/Metadata/*` | Accept either side | Gitignored, will regenerate |
99
+ | `Shared/UITestingIdentifiers/Metadata/*` | Accept either side | Gitignored, will regenerate |
100
+ | `Sources/Suggested/*.json` | Our version wins | Per-key files, we created them |
101
+ | `Shared/Figma/Components/*.json` | Our version wins | We created/modified it |
102
+ | `Shared/UITestingIdentifiers/ui-testing-identifiers.json` | Take remote + re-add keys via tool | See Guardrails — never hand-edit |
103
+ | `Shared/UIAssets/Colors/*.json` | Take remote + manually insert new entries | Match existing format exactly |
104
+
105
+ **After resolving all conflicts, ALWAYS rebuild derived artifacts:**
106
+
107
+ ```bash
108
+ bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
109
+ ```
110
+
111
+ This regenerates all merged data, metadata, keys indexes, UI assets, token registries, and Figma catalogs.
112
+
113
+ ---
114
+
115
+ ## Purpose
116
+
117
+ Validates a component implementation, commits directly to `iteration/develop` in submodules, and handles issue housekeeping (comment, phase update, auto-unblock dependents).
118
+
119
+ ## Parameters
120
+
121
+ | Parameter | Required | Default | Description |
122
+ |-----------|----------|---------|-------------|
123
+ | `<ComponentName>` | Yes | — | PascalCase component name |
124
+ | `--gh` | No | — | GitHub issue number (auto-detected if on a tracked issue) |
125
+
126
+ ```
127
+ /figma-iteration-commit ModalsTitle
128
+ /figma-iteration-commit ModalsTitle --gh 107
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Constants
134
+
135
+ ```
136
+ REPO_ROOT = git repo root (auto-detect)
137
+ GH_REPO = {github.componentsRepo}
138
+ MAIN_REPO = ${REPO_ROOT}
139
+ COMMON = ${REPO_ROOT}/{repos.common.path}
140
+ UICOMPONENTS = ${REPO_ROOT}/{repos.components.path}
141
+ WIKI = ${REPO_ROOT}/{repos.wiki.path}
142
+ DEFAULT_JIRA = {jira.projectKey}-124692
143
+ ```
144
+
145
+ ---
146
+
147
+ ## STEP 0 — Resolve
148
+
149
+ 1. Parse `ComponentName`. Convert to kebab-case.
150
+ 2. If `--gh` provided, read the issue to get Jira key. Otherwise search for the issue:
151
+ ```bash
152
+ gh issue list --repo ${GH_REPO} --state open --label component --search "{ComponentName}" --json number,body --jq '.[0]'
153
+ ```
154
+ 3. Extract Jira key from issue body (or use `DEFAULT_JIRA`).
155
+ 4. Ensure submodules are on `iteration/develop`. For each submodule (common, uicomponents):
156
+
157
+ **If already on `iteration/develop`** → continue.
158
+
159
+ **If on a feature branch with commits** → rebase onto `iteration/develop` with backup:
160
+
161
+ ```
162
+ a. Record the feature branch name and HEAD SHA
163
+ b. Create a backup branch: backup/{feature-branch-name}
164
+ c. Fetch latest iteration/develop from origin
165
+ d. Checkout iteration/develop
166
+ e. Cherry-pick (or rebase) the feature branch commits onto iteration/develop
167
+ f. Run build (STEP 1a) to verify nothing broke after rebase
168
+ g. If build succeeds:
169
+ - Delete the local feature branch
170
+ - Delete the remote feature branch (origin)
171
+ - Delete the local backup branch
172
+ h. If build fails:
173
+ - Reset iteration/develop to its previous state
174
+ - Restore the feature branch from the backup
175
+ - HALT: "Rebase broke the build. Feature branch preserved at {branch-name}."
176
+ - Do NOT delete the backup — leave it for manual resolution
177
+ ```
178
+
179
+ ```bash
180
+ cd ${SUBMODULE}
181
+ FEATURE_BRANCH=$(git branch --show-current)
182
+
183
+ if [ "${FEATURE_BRANCH}" != "iteration/develop" ]; then
184
+ FEATURE_SHA=$(git rev-parse HEAD)
185
+ ITER_BASE=$(git merge-base ${FEATURE_BRANCH} origin/iteration/develop)
186
+
187
+ # Backup
188
+ git branch backup/${FEATURE_BRANCH}
189
+
190
+ # Collect feature commits (from where it diverged from iteration/develop)
191
+ COMMITS=$(git log --oneline ${ITER_BASE}..${FEATURE_BRANCH} --reverse --format="%H")
192
+
193
+ # Switch to iteration/develop
194
+ git fetch origin iteration/develop
195
+ git checkout iteration/develop
196
+ git reset --hard origin/iteration/develop
197
+
198
+ # Cherry-pick feature commits
199
+ for COMMIT in ${COMMITS}; do
200
+ git cherry-pick ${COMMIT} || {
201
+ # CONFLICT HANDLING — do NOT abort or delete any changes
202
+ echo "⚠️ Cherry-pick conflict at ${COMMIT}."
203
+ echo "Conflicting files:"
204
+ CONFLICTED_FILES=$(git diff --name-only --diff-filter=U)
205
+ echo "${CONFLICTED_FILES}"
206
+
207
+ # Auto-resolve by file classification (see "Conflict File Classification" section)
208
+ AUTO_RESOLVED=()
209
+ MANUAL_NEEDED=()
210
+
211
+ for FILE in ${CONFLICTED_FILES}; do
212
+ case "${FILE}" in
213
+ iOS/Sources/*/Generated/*|Shared/Figma/Generated/*|iOS/Sources/LocalizationAssets/Resources/*.xcstrings|iOS/Sources/AccessibilityAssets/Resources/*.xcstrings|Shared/Localization/*/Metadata/*|Shared/UITestingIdentifiers/Metadata/*)
214
+ # Accept remote (will regenerate)
215
+ git checkout --ours "${FILE}" && git add "${FILE}"
216
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will regenerate)")
217
+ ;;
218
+ Sources/Suggested/*.json|Shared/Figma/Components/*.json)
219
+ # Our version wins (we created these)
220
+ git checkout --theirs "${FILE}" && git add "${FILE}"
221
+ AUTO_RESOLVED+=("${FILE} → kept ours (we created it)")
222
+ ;;
223
+ Shared/UITestingIdentifiers/ui-testing-identifiers.json)
224
+ # Take remote + re-add keys via tool (see Guardrails)
225
+ git checkout --ours "${FILE}" && git add "${FILE}"
226
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will re-add keys via tool after)")
227
+ ;;
228
+ Shared/UIAssets/Colors/*.json)
229
+ # Take remote + manually insert new entries
230
+ git checkout --ours "${FILE}" && git add "${FILE}"
231
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will insert new entries after)")
232
+ ;;
233
+ *)
234
+ MANUAL_NEEDED+=("${FILE}")
235
+ ;;
236
+ esac
237
+ done
238
+
239
+ if [ ${#AUTO_RESOLVED[@]} -gt 0 ]; then
240
+ echo "\n✅ Auto-resolved files:"
241
+ for ENTRY in "${AUTO_RESOLVED[@]}"; do echo " - ${ENTRY}"; done
242
+ fi
243
+
244
+ # If ui-testing-identifiers.json was conflicted, re-add our keys via /common-utility
245
+ if echo "${CONFLICTED_FILES}" | grep -q 'ui-testing-identifiers.json'; then
246
+ echo "\n📋 Re-adding our keys to ui-testing-identifiers.json via /common-utility (utility-add-key)..."
247
+ # Agent: use /common-utility utility-add-key for each key from Shared/Figma/Components/{nodeId}.json
248
+ fi
249
+
250
+ # If all files were auto-resolved, rebuild and continue
251
+ if [ ${#MANUAL_NEEDED[@]} -eq 0 ]; then
252
+ echo "\n✅ All conflicts auto-resolved."
253
+
254
+ # ── ui-testing-identifiers.json integrity guard (ALWAYS run before rebuild) ──
255
+ # The implement agent regenerates this file from identifier-keys.json only.
256
+ # An auto-merge can silently drop keys that exist on iteration/develop but not locally.
257
+ REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
258
+ LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
259
+ if [ "${LOCAL_KEY_COUNT}" -lt "${REMOTE_KEY_COUNT}" ]; then
260
+ MISSING=$((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT))
261
+ echo "⚠️ INTEGRITY FIX: ui-testing-identifiers.json lost ${MISSING} keys vs origin/iteration/develop. Restoring..."
262
+ git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
263
+ > Shared/UITestingIdentifiers/ui-testing-identifiers.json
264
+ .build/debug/UITestingIdentifierTool generate \
265
+ --config Shared/UITestingIdentifiers/Config/identifier-config.json
266
+ git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
267
+ git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
268
+ echo "✅ Restored ${REMOTE_KEY_COUNT} remote keys + re-added component keys."
269
+ fi
270
+ # ─────────────────────────────────────────────────────────────────────────────
271
+
272
+ # ── Generated Swift keys integrity guard (ALWAYS run before rebuild) ──
273
+ # The codegen tool regenerates from config JSONs + Sources/Suggested/*.json.
274
+ # An auto-merge can silently drop enum blocks from other developers' components.
275
+ LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
276
+ A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
277
+ for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
278
+ REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
279
+ LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
280
+ MISSING_ENUMS=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
281
+ if [ -n "$MISSING_ENUMS" ]; then
282
+ echo "⚠️ INTEGRITY FIX: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
283
+ echo "$MISSING_ENUMS"
284
+ echo " Restoring remote version (rebuild will re-add our component's keys)..."
285
+ git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
286
+ git add "${GEN_FILE}"
287
+ fi
288
+ done
289
+ # ─────────────────────────────────────────────────────────────────────────────
290
+
291
+
292
+ # ── Sources/Suggested/*.json integrity guard (ALWAYS run before rebuild) ──
293
+ # The implement agent only creates source JSONs for the current component.
294
+ # A cherry-pick or git add -A can silently drop source JSONs from other components.
295
+ for SUGGESTED_DIR in \
296
+ "Shared/Localization/LocalizationStrings/Sources/Suggested" \
297
+ "Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
298
+
299
+ REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
300
+ LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
301
+ MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
302
+
303
+ if [ -n "$MISSING_FILES" ]; then
304
+ MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
305
+ echo "⚠️ INTEGRITY FIX: ${SUGGESTED_DIR##*/} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
306
+ echo "$MISSING_FILES" | head -20
307
+ echo " Restoring missing files from origin/iteration/develop..."
308
+ while IFS= read -r FILE; do
309
+ git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
310
+ git add "${SUGGESTED_DIR}/${FILE}"
311
+ done <<< "$MISSING_FILES"
312
+ echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s)."
313
+ fi
314
+ done
315
+ # ─────────────────────────────────────────────────────────────────────────────
316
+
317
+ echo "Rebuilding derived artifacts..."
318
+ bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
319
+ git add -A
320
+ git cherry-pick --continue
321
+ else
322
+ # Show remaining conflicts that need manual resolution
323
+ echo "\n⚠️ Files needing manual resolution:"
324
+ for FILE in "${MANUAL_NEEDED[@]}"; do
325
+ echo "\n--- Conflict in: ${FILE} ---"
326
+ grep -n '<<<<<<<\|=======\|>>>>>>>' "${FILE}" || true
327
+ done
328
+
329
+ echo "\n📋 Suggested resolution:"
330
+ echo " - Review the conflict markers above"
331
+ echo " - Both local (feature) and remote (iteration/develop) changes are preserved in the conflict markers"
332
+ echo " - Edit the conflicting files to keep the desired changes from both sides"
333
+ echo " - Then run: git add <resolved-files> && git cherry-pick --continue"
334
+ echo " - After resolving, rebuild: bash \"${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh\""
335
+ echo " - Backup branch is available at: backup/${FEATURE_BRANCH}"
336
+
337
+ # ASK the user whether to continue
338
+ # The agent MUST use the ask-questions tool here:
339
+ # Question: "Cherry-pick conflict detected. Auto-resolved N files, M need manual resolution.
340
+ # Would you like to: (a) resolve manually and continue, or (b) abort the commit?"
341
+ # If user chooses (b): git cherry-pick --abort && git checkout ${FEATURE_BRANCH} && exit 1
342
+ # If user chooses (a): wait for user to resolve, then rebuild derived artifacts, then git cherry-pick --continue
343
+ #
344
+ # IMPORTANT: Do NOT auto-abort. Do NOT delete the feature branch.
345
+ # Leave all changes intact and let the user decide.
346
+ fi
347
+ }
348
+ done
349
+
350
+ # Build validation after rebase (STEP 1a will run fully later, this is a quick gate)
351
+ # If build fails, restore from backup
352
+ # If build succeeds, clean up branches (after full STEP 1 passes and push succeeds in STEP 3b)
353
+ fi
354
+ ```
355
+
356
+ **Important:** Do NOT delete feature branches until STEP 3b push succeeds. Track them for cleanup:
357
+ ```
358
+ BRANCHES_TO_CLEANUP=("common:${FEATURE_BRANCH}" ...)
359
+ ```
360
+ After successful push in STEP 3b, delete each:
361
+ ```bash
362
+ git branch -D ${FEATURE_BRANCH}
363
+ git push origin --delete ${FEATURE_BRANCH}
364
+ git branch -D backup/${FEATURE_BRANCH}
365
+ ```
366
+
367
+ ---
368
+
369
+ ## STEP 1 — Validate
370
+
371
+ ### 1a. Build
372
+
373
+ ```bash
374
+ xcodebuild build -project "${REPO_ROOT}/{build.xcodeproj}" \
375
+ -scheme {build.scheme} -destination 'generic/platform=iOS' \
376
+ CODE_SIGNING_ALLOWED=NO -quiet
377
+ ```
378
+
379
+ If build fails → HALT. Fix before committing.
380
+
381
+ ### 1b. Tests
382
+
383
+ Run component tests:
384
+
385
+ ```bash
386
+ xcodebuild test -project "${REPO_ROOT}/{build.xcodeproj}" \
387
+ -scheme {build.scheme} -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
388
+ -only-testing:"UIComponentsTests/${ComponentName}ViewInspectorTests" \
389
+ -only-testing:"UIComponentsTests/${ComponentName}SnapshotTests" \
390
+ CODE_SIGNING_ALLOWED=NO -quiet
391
+ ```
392
+
393
+ If tests fail → HALT. Fix before committing.
394
+
395
+ ### 1c. Key Sync Validation
396
+
397
+ Verify localization, accessibility, and testing identifier keys are in sync:
398
+
399
+ ```bash
400
+ cd ${COMMON}
401
+ python3 .instructions/figma/figma-to-swiftui/scripts/validate-localization-sync.py \
402
+ --component "{ComponentName}"
403
+ ```
404
+
405
+ If out of sync → HALT. Regenerate with `update-*-dev` (NOT `generate-*-code` — see common-utility docs):
406
+ ```bash
407
+ swift package plugin --allow-writing-to-package-directory update-localizations-dev
408
+ swift package plugin --allow-writing-to-package-directory update-accessibility-dev
409
+ swift run UITestingIdentifierTool generate
410
+ ```
411
+
412
+ ### 1d. Code Review (lightweight)
413
+
414
+ Read `.instructions/figma/figma-commit/REVIEW.md` and run the full 13-point checklist.
415
+
416
+ - **Auto-fix** any fixable violations (magic numbers, missing identifiers, wrong patterns).
417
+ - If auto-fixes applied, re-run build (STEP 1a) to verify.
418
+ - If unfixable violations remain → print them, ask user whether to proceed or abort.
419
+
420
+ Print validation result:
421
+
422
+ ```
423
+ Validation: PASS / FAIL
424
+ Build: ✅
425
+ Tests: ✅ (N passed)
426
+ Key Sync: ✅
427
+ Review: ✅ / ⚠️ (N warnings)
428
+ ```
429
+
430
+ ---
431
+
432
+ ## STEP 2 — Detect Changes
433
+
434
+ ```bash
435
+ HAS_COMMON=$(cd "${COMMON}" && git status --porcelain | head -1)
436
+ HAS_UICOMPONENTS=$(cd "${UICOMPONENTS}" && git status --porcelain | head -1)
437
+ HAS_WIKI=$(cd "${WIKI}" && git status --porcelain | head -1)
438
+ ```
439
+
440
+ ---
441
+
442
+ ## STEP 3 — Commit Locally
443
+
444
+ Commit to local `iteration/develop` in submodules. Do NOT push yet — pushing happens in STEP 3b after validation confirms the build is clean.
445
+
446
+ ### 3a. Commit (local only)
447
+
448
+ **Common (if HAS_COMMON):**
449
+
450
+ > ⚠️ **Before `git add -A`**, run the Sources/Suggested integrity guard (see Guardrails). This prevents silently staging deletions of other components' source JSON files.
451
+
452
+ ```bash
453
+ cd ${COMMON}
454
+
455
+ # ── Pre-commit Sources/Suggested integrity guard ──
456
+ for SUGGESTED_DIR in \
457
+ "Shared/Localization/LocalizationStrings/Sources/Suggested" \
458
+ "Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
459
+
460
+ REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
461
+ LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
462
+ MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
463
+
464
+ if [ -n "$MISSING_FILES" ]; then
465
+ MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
466
+ echo "⚠️ PRE-COMMIT FIX: ${SUGGESTED_DIR##*/} missing ${MISSING_COUNT} source JSON file(s) vs origin. Restoring..."
467
+ while IFS= read -r FILE; do
468
+ git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
469
+ done <<< "$MISSING_FILES"
470
+ echo "✅ Restored ${MISSING_COUNT} file(s). They will be included in the commit."
471
+ fi
472
+ done
473
+ # ──────────────────────────────────────────────────
474
+
475
+ git add -A
476
+ git commit -m "feat(common): [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} tokens and keys
477
+
478
+ Refs: ${JIRA_ISSUE}"
479
+ ```
480
+
481
+ **UIComponents (if HAS_UICOMPONENTS):**
482
+
483
+ ```bash
484
+ cd ${UICOMPONENTS}
485
+ git add -A
486
+ git commit -m "feat(uicomponents): [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} component
487
+
488
+ Refs: ${JIRA_ISSUE}"
489
+ ```
490
+
491
+ **Wiki (if HAS_WIKI):**
492
+
493
+ ```bash
494
+ cd ${WIKI}
495
+ git add -A
496
+ git commit -m "docs: [${JIRA_ISSUE}] add ${COMPONENT_PASCAL} wiki documentation
497
+
498
+ Refs: ${JIRA_ISSUE}"
499
+ ```
500
+
501
+ ---
502
+
503
+ ### ⛔ 3a-gate — Pre-Push Approval (required HARD STOP)
504
+
505
+ > **Do NOT proceed to STEP 3b until the user explicitly approves.**
506
+ > Use the `ask-questions` tool here. A silent "yes" assumption is a pipeline violation.
507
+
508
+ **Print the following push summary for every submodule that has local commits:**
509
+
510
+ ```
511
+ ╔══════════════════════════════════════════════════════════════════╗
512
+ ║ PRE-PUSH SUMMARY — iteration/develop ║
513
+ ╠══════════════════════════════════════════════════════════════════╣
514
+ ║ common (if HAS_COMMON): ║
515
+ ║ Branch : iteration/develop ║
516
+ ║ Ahead : N commits ahead of origin/iteration/develop ║
517
+ ║ Commits: (list each SHA + title) ║
518
+ ║ Files : +X insertions, -Y deletions ║
519
+ ╠══════════════════════════════════════════════════════════════════╣
520
+ ║ uicomponents (if HAS_UICOMPONENTS): ║
521
+ ║ Branch : iteration/develop ║
522
+ ║ Ahead : N commits ahead of origin/iteration/develop ║
523
+ ║ Commits: (list each SHA + title) ║
524
+ ║ Files : +X insertions, -Y deletions ║
525
+ ╠══════════════════════════════════════════════════════════════════╣
526
+ ║ wiki (if HAS_WIKI): ║
527
+ ║ Branch : master ║
528
+ ║ Ahead : N commits ahead of origin/master ║
529
+ ║ Commits: (list each SHA + title) ║
530
+ ║ Files : +X insertions, -Y deletions ║
531
+ ╚══════════════════════════════════════════════════════════════════╝
532
+ ```
533
+
534
+ Generate this summary with:
535
+
536
+ ```bash
537
+ # For each submodule with commits — adapt branch name per repo:
538
+ cd ${SUBMODULE}
539
+ echo "Ahead: $(git rev-list origin/${PUSH_BRANCH}..HEAD --count) commits"
540
+ git log origin/${PUSH_BRANCH}..HEAD --oneline
541
+ git diff origin/${PUSH_BRANCH}..HEAD --stat | tail -1
542
+ ```
543
+
544
+ **Then ask the user:**
545
+
546
+ > ✅ All validations passed. The commits above are ready to push to `origin/iteration/develop`.
547
+ >
548
+ > **Ready to push? Reply `yes` to push, or `no` to stop here and leave local commits intact.**
549
+
550
+ **Branching logic:**
551
+
552
+ - If user replies **`yes`** (or `ok`, `go`, `approved`, `looks good`) → proceed to STEP 3b.
553
+ - If user replies **`no`** (or `stop`, `cancel`, `wait`) → print:
554
+
555
+ ```
556
+ Push cancelled. Local commits preserved:
557
+ common : <SHA>
558
+ uicomponents : <SHA>
559
+ wiki : <SHA>
560
+
561
+ Run /figma-iteration-commit again when ready to push.
562
+ ```
563
+
564
+ Then **HALT** — do not revert any local commits, do not push anything.
565
+
566
+ ---
567
+
568
+ ### 3b. Push with Rebase-Retry Loop
569
+
570
+ For each submodule (common, uicomponents), push with this logic:
571
+
572
+ ```
573
+ 1. Attempt push
574
+ 2. If push succeeds → done
575
+ 3. If push rejected (remote has new commits):
576
+ a. Fetch latest from origin
577
+ b. Rebase local commits onto updated remote
578
+ c. Re-run build (STEP 1a) to verify nothing broke after rebase
579
+ d. If build passes → retry push (go to 1)
580
+ e. If build fails → HALT, report conflict
581
+ ```
582
+
583
+ **Per submodule:**
584
+
585
+ ```bash
586
+ cd ${SUBMODULE}
587
+ PUSH_BRANCH="iteration/develop" # or "master" for wiki
588
+
589
+ MAX_RETRIES=3
590
+ for i in $(seq 1 $MAX_RETRIES); do
591
+ git push origin ${PUSH_BRANCH} && break
592
+
593
+ echo "Push rejected — remote updated. Rebasing (attempt $i)..."
594
+ git fetch origin ${PUSH_BRANCH}
595
+ git rebase origin/${PUSH_BRANCH}
596
+
597
+ if [ $? -ne 0 ]; then
598
+ # CONFLICT HANDLING — do NOT abort or delete any changes
599
+ echo "⚠️ Rebase conflict detected during push retry."
600
+ echo "Conflicting files:"
601
+ CONFLICTED_FILES=$(git diff --name-only --diff-filter=U)
602
+ echo "${CONFLICTED_FILES}"
603
+
604
+ # Auto-resolve by file classification (see "Conflict File Classification" section)
605
+ AUTO_RESOLVED=()
606
+ MANUAL_NEEDED=()
607
+
608
+ for FILE in ${CONFLICTED_FILES}; do
609
+ case "${FILE}" in
610
+ iOS/Sources/*/Generated/*|Shared/Figma/Generated/*|iOS/Sources/LocalizationAssets/Resources/*.xcstrings|iOS/Sources/AccessibilityAssets/Resources/*.xcstrings|Shared/Localization/*/Metadata/*|Shared/UITestingIdentifiers/Metadata/*)
611
+ # Accept remote (will regenerate)
612
+ git checkout --ours "${FILE}" && git add "${FILE}"
613
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will regenerate)")
614
+ ;;
615
+ Sources/Suggested/*.json|Shared/Figma/Components/*.json)
616
+ # Our version wins (we created these)
617
+ git checkout --theirs "${FILE}" && git add "${FILE}"
618
+ AUTO_RESOLVED+=("${FILE} → kept ours (we created it)")
619
+ ;;
620
+ Shared/UITestingIdentifiers/ui-testing-identifiers.json)
621
+ # Take remote + re-add keys via tool (see Guardrails)
622
+ git checkout --ours "${FILE}" && git add "${FILE}"
623
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will re-add keys via tool after)")
624
+ ;;
625
+ Shared/UIAssets/Colors/*.json)
626
+ # Take remote + manually insert new entries
627
+ git checkout --ours "${FILE}" && git add "${FILE}"
628
+ AUTO_RESOLVED+=("${FILE} → accepted remote (will insert new entries after)")
629
+ ;;
630
+ *)
631
+ MANUAL_NEEDED+=("${FILE}")
632
+ ;;
633
+ esac
634
+ done
635
+
636
+ if [ ${#AUTO_RESOLVED[@]} -gt 0 ]; then
637
+ echo "\n✅ Auto-resolved files:"
638
+ for ENTRY in "${AUTO_RESOLVED[@]}"; do echo " - ${ENTRY}"; done
639
+ fi
640
+
641
+ # If ui-testing-identifiers.json was conflicted, re-add our keys via /common-utility
642
+ if echo "${CONFLICTED_FILES}" | grep -q 'ui-testing-identifiers.json'; then
643
+ echo "\n📋 Re-adding our keys to ui-testing-identifiers.json via /common-utility (utility-add-key)..."
644
+ # Agent: use /common-utility utility-add-key for each key from Shared/Figma/Components/{nodeId}.json
645
+ fi
646
+
647
+ # If all files were auto-resolved, rebuild and continue
648
+ if [ ${#MANUAL_NEEDED[@]} -eq 0 ]; then
649
+ echo "\n✅ All conflicts auto-resolved."
650
+
651
+ # ── ui-testing-identifiers.json integrity guard (ALWAYS run before rebuild) ──
652
+ # The implement agent regenerates this file from identifier-keys.json only.
653
+ # An auto-merge can silently drop keys that exist on iteration/develop but not locally.
654
+ REMOTE_KEY_COUNT=$(git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null | grep -c '".*" : "' || echo 0)
655
+ LOCAL_KEY_COUNT=$(grep -c '".*" : "' Shared/UITestingIdentifiers/ui-testing-identifiers.json 2>/dev/null || echo 0)
656
+ if [ "${LOCAL_KEY_COUNT}" -lt "${REMOTE_KEY_COUNT}" ]; then
657
+ MISSING=$((REMOTE_KEY_COUNT - LOCAL_KEY_COUNT))
658
+ echo "⚠️ INTEGRITY FIX: ui-testing-identifiers.json lost ${MISSING} keys vs origin/iteration/develop. Restoring..."
659
+ git show origin/iteration/develop:Shared/UITestingIdentifiers/ui-testing-identifiers.json \
660
+ > Shared/UITestingIdentifiers/ui-testing-identifiers.json
661
+ .build/debug/UITestingIdentifierTool generate \
662
+ --config Shared/UITestingIdentifiers/Config/identifier-config.json
663
+ git add Shared/UITestingIdentifiers/ui-testing-identifiers.json
664
+ git add iOS/Sources/UITestingIdentifiers/Generated/UITestingIdentifierKeys.swift
665
+ echo "✅ Restored ${REMOTE_KEY_COUNT} remote keys + re-added component keys."
666
+ fi
667
+ # ─────────────────────────────────────────────────────────────────────────────
668
+
669
+ # ── Generated Swift keys integrity guard (ALWAYS run before rebuild) ──
670
+ # The codegen tool regenerates from config JSONs + Sources/Suggested/*.json.
671
+ # An auto-merge can silently drop enum blocks from other developers' components.
672
+ LOC_FILE="iOS/Sources/LocalizationStringKeys/Generated/LocalizationStringKeys.swift"
673
+ A11Y_FILE="iOS/Sources/AccessibilityStringKeys/Generated/LocalizedAccessibilityStringKeys.swift"
674
+ for GEN_FILE in "$LOC_FILE" "$A11Y_FILE"; do
675
+ REMOTE_ENUMS=$(git show origin/iteration/develop:"${GEN_FILE}" 2>/dev/null | grep -oE 'enum [A-Za-z0-9_]+' | sort -u || true)
676
+ LOCAL_ENUMS=$(grep -oE 'enum [A-Za-z0-9_]+' "${GEN_FILE}" 2>/dev/null | sort -u || true)
677
+ MISSING_ENUMS=$(comm -23 <(echo "$REMOTE_ENUMS") <(echo "$LOCAL_ENUMS"))
678
+ if [ -n "$MISSING_ENUMS" ]; then
679
+ echo "⚠️ INTEGRITY FIX: ${GEN_FILE##*/} lost enum blocks vs origin/iteration/develop:"
680
+ echo "$MISSING_ENUMS"
681
+ echo " Restoring remote version (rebuild will re-add our component's keys)..."
682
+ git show origin/iteration/develop:"${GEN_FILE}" > "${GEN_FILE}"
683
+ git add "${GEN_FILE}"
684
+ fi
685
+ done
686
+ # ─────────────────────────────────────────────────────────────────────────────
687
+
688
+ # ── Sources/Suggested/*.json integrity guard (ALWAYS run before rebuild) ──
689
+ for SUGGESTED_DIR in \
690
+ "Shared/Localization/LocalizationStrings/Sources/Suggested" \
691
+ "Shared/Localization/AccessibilityStrings/Sources/Suggested"; do
692
+
693
+ REMOTE_FILES=$(git ls-tree --name-only origin/iteration/develop -- "${SUGGESTED_DIR}/" 2>/dev/null | sed "s|${SUGGESTED_DIR}/||" | sort)
694
+ LOCAL_FILES=$(ls -1 "${SUGGESTED_DIR}/" 2>/dev/null | sort)
695
+ MISSING_FILES=$(comm -23 <(echo "$REMOTE_FILES") <(echo "$LOCAL_FILES"))
696
+
697
+ if [ -n "$MISSING_FILES" ]; then
698
+ MISSING_COUNT=$(echo "$MISSING_FILES" | wc -l | tr -d ' ')
699
+ echo "⚠️ INTEGRITY FIX: ${SUGGESTED_DIR##*/} lost ${MISSING_COUNT} source JSON file(s) vs origin/iteration/develop:"
700
+ echo "$MISSING_FILES" | head -20
701
+ echo " Restoring missing files from origin/iteration/develop..."
702
+ while IFS= read -r FILE; do
703
+ git show "origin/iteration/develop:${SUGGESTED_DIR}/${FILE}" > "${SUGGESTED_DIR}/${FILE}"
704
+ git add "${SUGGESTED_DIR}/${FILE}"
705
+ done <<< "$MISSING_FILES"
706
+ echo "✅ Restored ${MISSING_COUNT} missing source JSON file(s)."
707
+ fi
708
+ done
709
+ # ─────────────────────────────────────────────────────────────────────────────
710
+
711
+ echo "Rebuilding derived artifacts..."
712
+ bash "${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh"
713
+ git add -A
714
+ git rebase --continue
715
+ else
716
+ # Show remaining conflicts that need manual resolution
717
+ echo "\n⚠️ Files needing manual resolution:"
718
+ for FILE in "${MANUAL_NEEDED[@]}"; do
719
+ echo "\n--- Conflict in: ${FILE} ---"
720
+ grep -n '<<<<<<<\|=======\|>>>>>>>' "${FILE}" || true
721
+ done
722
+
723
+ echo "\n📋 Suggested resolution:"
724
+ echo " - Review the conflict markers above"
725
+ echo " - Both local and remote changes are preserved in the conflict markers"
726
+ echo " - Edit the conflicting files to keep the desired changes from both sides"
727
+ echo " - After resolving, rebuild: bash \"${REPO_ROOT}/.instructions/common/scripts/common-rebuild-derived-artifacts.sh\""
728
+ echo " - Then run: git add <resolved-files> && git rebase --continue"
729
+
730
+ # ASK the user whether to continue
731
+ # The agent MUST use the ask-questions tool here:
732
+ # Question: "Rebase conflict detected during push. Auto-resolved N files, M need manual resolution.
733
+ # Would you like to: (a) resolve manually and continue pushing, or (b) abort the rebase and stop?"
734
+ # If user chooses (b): git rebase --abort && HALT
735
+ # If user chooses (a): wait for user to resolve, then rebuild derived artifacts, then git rebase --continue and re-validate build
736
+ #
737
+ # IMPORTANT: Do NOT auto-abort. Do NOT delete any committed changes.
738
+ # Leave all changes intact and let the user decide.
739
+ fi
740
+ fi
741
+
742
+ # Re-validate build after rebase
743
+ xcodebuild build -project "${REPO_ROOT}/{build.xcodeproj}" \
744
+ -scheme {build.scheme} -destination 'generic/platform=iOS' \
745
+ CODE_SIGNING_ALLOWED=NO -quiet
746
+
747
+ if [ $? -ne 0 ]; then
748
+ echo "HALT: Build failed after rebase. Fix before pushing."
749
+ exit 1
750
+ fi
751
+ done
752
+ ```
753
+
754
+ ### 3c. Fetch all remotes
755
+
756
+ After successful push, sync all local branches:
757
+
758
+ ```bash
759
+ cd ${MAIN_REPO} && git fetch origin develop
760
+ cd ${COMMON} && git fetch origin iteration/develop
761
+ cd ${UICOMPONENTS} && git fetch origin iteration/develop
762
+ ```
763
+
764
+ ---
765
+
766
+ ## STEP 4 — Issue Housekeeping
767
+
768
+ ### 4a. Comment on issue
769
+
770
+ If issue was found/provided:
771
+
772
+ ```bash
773
+ COMMON_SHA=$(git -C ${COMMON} rev-parse --short HEAD)
774
+ UICOMP_SHA=$(git -C ${UICOMPONENTS} rev-parse --short HEAD)
775
+
776
+ gh issue comment <N> --repo ${GH_REPO} --body "$(cat <<'EOF'
777
+ Committed to iteration/develop (submodules):
778
+ - common: ${COMMON_SHA}
779
+ - uicomponents: ${UICOMP_SHA}
780
+
781
+ Ready for review.
782
+ EOF
783
+ )"
784
+ ```
785
+
786
+ ### 4b. Sync issue from registry
787
+
788
+ Phase state is tracked per-flag in the component registry
789
+ (`status.ios.{implemented,tested,codeConnect,wiki}`), written by the
790
+ phase finalize scripts during STEP 2 of `/figma-cli-iterate`. The
791
+ issue's labels and Progress table are projections of that state — no
792
+ filesystem inference anymore.
793
+
794
+ Run the registry sync once, after the commit succeeds:
795
+
796
+ ```bash
797
+ python3 .instructions/figma/figma-to-swiftui/scripts/update-issue-from-registry.py \
798
+ --node-id "<NODE_ID>" \
799
+ --platform ios
800
+ ```
801
+
802
+ This call is idempotent:
803
+
804
+ - Adds/removes `impl:*`/`test:*`/`cc:*`/`wiki:*` labels to match
805
+ registry state (green when current, yellow when stale or against an
806
+ older impl.version).
807
+ - Rewrites the `### Progress` table in the issue body.
808
+ - Strips any legacy `phase:*` labels.
809
+ - If zero open issues reference this node-id, creates a new one with
810
+ `team:core` as default.
811
+ - If multiple open issues reference the node-id, closes all but the
812
+ lowest-numbered one with a "Duplicate of #N" comment.
813
+
814
+ If the call fails (gh not authenticated, rate limit, etc.), log the
815
+ error but don't fail the commit — the sync can always be re-run
816
+ manually or via `bulk-sync-issues.py`.
817
+
818
+ ### 4c. Link wiki to issue
819
+
820
+ If wiki was committed (HAS_WIKI), add or update the **Wiki** section in the issue body:
821
+
822
+ ```
823
+ WIKI_URL=https://github.com/${GH_REPO}/wiki/${COMPONENT_PASCAL}
824
+ ```
825
+
826
+ Read the current issue body, then:
827
+ - If a `### Wiki` section already exists, replace its content with the new link.
828
+ - If no `### Wiki` section exists, insert it before `### Notes`.
829
+
830
+ The Wiki section format:
831
+
832
+ ```markdown
833
+ ### Wiki
834
+
835
+ [${COMPONENT_PASCAL}](${WIKI_URL})
836
+ ```
837
+
838
+ Use a Python script written to a temp file to avoid shell quoting issues with `gh issue edit --body-file`:
839
+
840
+ ```python
841
+ import subprocess, json, re
842
+
843
+ COMPONENT = "${COMPONENT_PASCAL}"
844
+ GH_REPO = "${GH_REPO}"
845
+ ISSUE_N = <N>
846
+ WIKI_URL = f"https://github.com/{GH_REPO}/wiki/{COMPONENT}"
847
+ WIKI_SECTION = f"### Wiki\n\n[{COMPONENT}]({WIKI_URL})"
848
+
849
+ result = subprocess.run(
850
+ ["gh", "issue", "view", str(ISSUE_N), "--repo", GH_REPO, "--json", "body"],
851
+ capture_output=True, text=True)
852
+ body = json.loads(result.stdout)["body"]
853
+
854
+ if "### Wiki" in body:
855
+ body = re.sub(r"### Wiki\n\n.*?\n(\n###|\Z)", lambda m: WIKI_SECTION + "\n" + m.group(1), body, flags=re.DOTALL)
856
+ else:
857
+ body = body.replace("### Notes", WIKI_SECTION + "\n\n### Notes")
858
+
859
+ with open("/tmp/issue_body_update.md", "w") as f:
860
+ f.write(body)
861
+
862
+ subprocess.run(["gh", "issue", "edit", str(ISSUE_N), "--repo", GH_REPO, "--body-file", "/tmp/issue_body_update.md"])
863
+ ```
864
+
865
+ ### 4d. Link Sub-Component Issues
866
+
867
+ Read the nested components artifact to find which sub-components this component uses:
868
+
869
+ ```bash
870
+ # Get artifactPath from registry
871
+ ARTIFACT_PATH=$(cd ${COMMON} && .build/debug/FigmaRegistryUtility lookup --node-id "${NODE_ID}" 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('suggestedArtifactPath',''))" 2>/dev/null || echo "")
872
+
873
+ NESTED_FILE="${REPO_ROOT}/${ARTIFACT_PATH}/pass3/03_nested_components.md"
874
+ ```
875
+
876
+ If `NESTED_FILE` does not exist → skip this step silently.
877
+
878
+ If it exists, parse connected components:
879
+
880
+ ```bash
881
+ # Extract component names from the Connected Components table in 03_nested_components.md
882
+ # Lines look like: | ComponentName | Sources/... | `Init...` |
883
+ CONNECTED_COMPONENTS=$(grep '^\| [A-Z]' "${NESTED_FILE}" | awk -F'|' '{print $2}' | tr -d ' ')
884
+ ```
885
+
886
+ For each connected component name, find its GitHub issue and add as sub-issue:
887
+
888
+ ```python
889
+ import subprocess, json, re
890
+
891
+ GH_REPO = "${GH_REPO}"
892
+ PARENT_ISSUE_N = <N>
893
+
894
+ # Read connected components from nested file
895
+ nested_path = "${NESTED_FILE}"
896
+ connected = []
897
+ in_connected_section = False
898
+
899
+ with open(nested_path) as f:
900
+ for line in f:
901
+ if line.strip() == "## Connected Components":
902
+ in_connected_section = True
903
+ continue
904
+ if in_connected_section and line.startswith("## "):
905
+ break
906
+ if in_connected_section and line.startswith("| "):
907
+ parts = [p.strip() for p in line.split("|")]
908
+ # parts[1] = component name, skip header and separator rows
909
+ if len(parts) > 2 and parts[1] and not parts[1].startswith("-") and parts[1] != "Component":
910
+ connected.append(parts[1])
911
+
912
+ sub_issues_added = []
913
+
914
+ for comp_name in connected:
915
+ # Search for the sub-component's issue
916
+ result = subprocess.run(
917
+ ["gh", "issue", "list", "--repo", GH_REPO, "--state", "open",
918
+ "--label", "component", "--search", comp_name,
919
+ "--json", "number,title"],
920
+ capture_output=True, text=True
921
+ )
922
+ if result.returncode != 0:
923
+ print(f" ⚠️ Could not search issue for {comp_name}")
924
+ continue
925
+
926
+ issues = json.loads(result.stdout)
927
+ # Find closest match (title contains exact component name)
928
+ match = next((i for i in issues if comp_name.lower() in i["title"].lower()), None)
929
+ if not match:
930
+ print(f" ⚠️ No open issue found for sub-component: {comp_name}")
931
+ continue
932
+
933
+ sub_issue_n = match["number"]
934
+
935
+ # Add as sub-issue via GitHub API
936
+ api_result = subprocess.run(
937
+ ["gh", "api", "--method", "POST",
938
+ f"repos/{GH_REPO}/issues/{PARENT_ISSUE_N}/sub_issues",
939
+ "--field", f"sub_issue_id={sub_issue_n}"],
940
+ capture_output=True, text=True
941
+ )
942
+
943
+ if api_result.returncode == 0:
944
+ sub_issues_added.append(f"#{sub_issue_n} ({comp_name})")
945
+ print(f" ✅ Linked sub-issue #{sub_issue_n} ({comp_name})")
946
+ else:
947
+ # May already be linked — not a fatal error
948
+ print(f" ℹ️ Could not link #{sub_issue_n} ({comp_name}): {api_result.stderr.strip()}")
949
+
950
+ if sub_issues_added:
951
+ print(f"\nSub-issues linked: {', '.join(sub_issues_added)}")
952
+ else:
953
+ print("No sub-issues linked (no matching open issues found).")
954
+ ```
955
+
956
+ > **Non-fatal:** If this step fails (artifact missing, gh API error, no matching issues), log and continue — it must never block the commit.
957
+
958
+
959
+ ---
960
+
961
+ ## STEP 5 — Auto-Unblock Dependents
962
+
963
+ Scan all open issues with `blocked` label:
964
+
965
+ ```bash
966
+ gh issue list --repo ${GH_REPO} --state open --label blocked --json number,title,body
967
+ ```
968
+
969
+ For each blocked issue:
970
+ 1. Read the issue body or sub-issue comments to find what it's blocked by (component names).
971
+ 2. For each blocking component, check if `{ComponentName}.swift` exists:
972
+ ```bash
973
+ find ${UICOMPONENTS}/Sources -name "{BlockingComponent}.swift" -type f | head -1
974
+ ```
975
+ 3. If ALL blocking components now have Swift files → unblock:
976
+ ```bash
977
+ gh issue edit <BLOCKED_N> --repo ${GH_REPO} --remove-label "blocked"
978
+ gh issue comment <BLOCKED_N> --repo ${GH_REPO} --body "Auto-unblocked: all dependencies now implemented."
979
+ ```
980
+
981
+ Print any unblocked issues.
982
+
983
+ ---
984
+
985
+ ## STEP 6 — Summary
986
+
987
+ ```
988
+ Iteration Commit: ${COMPONENT_PASCAL}
989
+
990
+ | Repo | Commit | Status |
991
+ |------|--------|--------|
992
+ | common | ${COMMON_SHA} | ✅ pushed |
993
+ | uicomponents | ${UICOMP_SHA} | ✅ pushed |
994
+ | wiki | ${WIKI_SHA} | ✅ pushed |
995
+ | main | ${MAIN_SHA} | ✅ pushed / PR created |
996
+
997
+ Validation: PASS
998
+ Issue: #N — commented + phase updated
999
+ Sub-issues: #X (ComponentA), #Y (ComponentB) (or "none")
1000
+ Unblocked: #M, #K (or "none")
1001
+ Jira: ${JIRA_ISSUE}
1002
+ ```
1003
+
1004
+ ---
1005
+
1006
+ ## Error Handling
1007
+
1008
+ - **Submodules not on iteration/develop**: Checkout automatically (rebase-merge if commits exist).
1009
+ - **Build fails**: HALT — fix before committing.
1010
+ - **Tests fail**: HALT — fix before committing.
1011
+ - **Key sync fails**: HALT — regenerate keys first.
1012
+ - **Push rejected**: Report error, do NOT force-push.
1013
+ - **No changes**: Print "Nothing to commit" and exit.
1014
+ - **Issue not found**: Commit without issue housekeeping, print warning.
1015
+ - **Rebase/cherry-pick conflict**: Do NOT abort or delete any changes. Show conflicting files and conflict markers, suggest resolution steps, and ASK the user whether to (a) resolve and continue or (b) abort. Preserve all local and remote changes in conflict markers until the user decides. For `ui-testing-identifiers.json` conflicts, always suggest the take-remote + re-add-keys approach (see Guardrails).