@fprad0/skill-master-mcp 0.0.12 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/CHANGELOG.md +100 -88
  2. package/README.md +472 -472
  3. package/VERSION.md +9 -9
  4. package/bin/lib/bootstrap-global-core.mjs +34 -0
  5. package/bin/lib/client-config.mjs +287 -285
  6. package/bin/lib/doctor-core.mjs +202 -0
  7. package/bin/lib/menu-core.mjs +1792 -1514
  8. package/bin/lib/operation-result.mjs +59 -0
  9. package/bin/lib/register-clients-core.mjs +247 -0
  10. package/bin/lib/skill-installation.mjs +215 -215
  11. package/bin/lib/update-cli-core.mjs +117 -0
  12. package/bin/skill-master-activation.mjs +165 -163
  13. package/bin/skill-master-bootstrap-global.mjs +61 -49
  14. package/bin/skill-master-configure-private-registry.mjs +3 -3
  15. package/bin/skill-master-doctor.mjs +239 -228
  16. package/bin/skill-master-eval-activation.mjs +32 -32
  17. package/bin/skill-master-install-global-skills.mjs +59 -59
  18. package/bin/skill-master-install-project-skills.mjs +97 -97
  19. package/bin/skill-master-menu.mjs +489 -378
  20. package/bin/skill-master-register-clients.mjs +232 -153
  21. package/bin/skill-master-success-skills.mjs +357 -307
  22. package/bin/skill-master-update.mjs +121 -72
  23. package/bin/skill-master.mjs +3 -3
  24. package/dist/activation.d.ts.map +1 -1
  25. package/dist/activation.js +12 -0
  26. package/dist/activation.js.map +1 -1
  27. package/dist/prompt-router.d.ts.map +1 -1
  28. package/dist/prompt-router.js +19 -0
  29. package/dist/prompt-router.js.map +1 -1
  30. package/dist/recommender.d.ts.map +1 -1
  31. package/dist/recommender.js +4 -1
  32. package/dist/recommender.js.map +1 -1
  33. package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -125
  34. package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -9
  35. package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -341
  36. package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -148
  37. package/docs/operations/GUIA_MULTI_COMPUTADOR.md +262 -262
  38. package/docs/operations/GUIA_NPM_PRIVADO.md +294 -294
  39. package/docs/operations/GUIA_NPM_PUBLICO.md +147 -147
  40. package/docs/operations/MENU_VISUAL_EVIDENCE_2026-06-28.md +66 -66
  41. package/docs/operations/assets/menu-frame-compact.html +36 -33
  42. package/docs/operations/assets/menu-frame-dna-hero.html +87 -0
  43. package/docs/operations/assets/menu-frame-fine-helix.html +89 -0
  44. package/docs/operations/assets/menu-frame-large.html +44 -41
  45. package/docs/operations/assets/menu-frame-running.html +41 -38
  46. package/docs/operations/assets/menu-frame-score-10-contact-sheet.html +184 -0
  47. package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -140
  48. package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -85
  49. package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -174
  50. package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -119
  51. package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -134
  52. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -84
  53. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -56
  54. package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
  55. package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
  56. package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
  57. package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
  58. package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
  59. package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
  60. package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
  61. package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
  62. package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
  63. package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
  64. package/docs/planning/mcp-1.0.0/00_RESUMO_EXECUTIVO_AUDITORIA_MENU.md +118 -0
  65. package/docs/planning/mcp-1.0.0/01_MATRIZ_TESTES_MENU_E_RESULTADOS.md +250 -0
  66. package/docs/planning/mcp-1.0.0/02_PLANO_CORRECAO_ATIVAR_SKILL_APRENDIDA.md +200 -0
  67. package/docs/planning/mcp-1.0.0/03_PLANO_COMPATIBILIDADE_WINDOWS_LINUX_MACOS.md +167 -0
  68. package/docs/planning/mcp-1.0.0/04_PLANO_UI_CYBERPUNK_PIXEL_ART_E_PERFORMANCE.md +165 -0
  69. package/docs/planning/mcp-1.0.0/05_PROMPT_TASK_EXECUCAO_CORRECOES.md +151 -0
  70. package/docs/planning/mcp-1.0.0/06_CHECKLIST_REGRESSAO_PRE_RELEASE.md +159 -0
  71. package/docs/planning/mcp-1.0.0/07_RELATORIO_APLICACAO_CORRECOES_MENU_SKILL_MASTER.md +136 -0
  72. package/docs/planning/mcp-1.0.0/08_AUDITORIA_CRITICA_MENU_NOTA_E_DNA_REFINADO.md +184 -0
  73. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/00_PROMPT_TASK_MASTER_NOTA_10_10.md +103 -0
  74. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/01_PROMPT_TASK_FINE_HELIX_DNA.md +116 -0
  75. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/02_PROMPT_TASK_DNA_HERO_BOOT_AND_MOTION.md +109 -0
  76. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/03_PROMPT_TASK_MENU_UX_HELP_ERROR_COPY.md +99 -0
  77. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/04_PROMPT_TASK_EVIDENCE_RENDERER_1_0_0.md +97 -0
  78. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/05_PROMPT_TASK_CROSS_PLATFORM_UTF8_MOJIBAKE.md +99 -0
  79. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/06_PROMPT_TASK_VISUAL_REGRESSION_QA.md +105 -0
  80. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/07_PROMPT_TASK_PRE_RELEASE_SCORE_GATE_10_10.md +104 -0
  81. package/docs/planning/mcp-1.0.0/prompt-tasks-nota-10-10/README_ORDEM_EXECUCAO_NOTA_10_10.md +77 -0
  82. package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -6
  83. package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -6
  84. package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -6
  85. package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -6
  86. package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -6
  87. package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -83
  88. package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -88
  89. package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -156
  90. package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -105
  91. package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -119
  92. package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -120
  93. package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -123
  94. package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -114
  95. package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -157
  96. package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -127
  97. package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -107
  98. package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -80
  99. package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
  100. package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -6
  101. package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
  102. package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
  103. package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
  104. package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
  105. package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
  106. package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
  107. package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
  108. package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
  109. package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
  110. package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
  111. package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
  112. package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
  113. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
  114. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
  115. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
  116. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
  117. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
  118. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
  119. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
  120. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
  121. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
  122. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
  123. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
  124. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
  125. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
  126. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
  127. package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
  128. package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
  129. package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
  130. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
  131. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
  132. package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
  133. package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
  134. package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
  135. package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
  136. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
  137. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
  138. package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
  139. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
  140. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
  141. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
  142. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
  143. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
  144. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
  145. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
  146. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
  147. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
  148. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
  149. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
  150. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
  151. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
  152. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
  153. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
  154. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
  155. package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
  156. package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
  157. package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
  158. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
  159. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
  160. package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
  161. package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
  162. package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
  163. package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
  164. package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
  165. package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
  166. package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
  167. package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
  168. package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
  169. package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
  170. package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
  171. package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
  172. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
  173. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
  174. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
  175. package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
  176. package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
  177. package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
  178. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
  179. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
  180. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
  181. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
  182. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
  183. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
  184. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
  185. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
  186. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
  187. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
  188. package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
  189. package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
  190. package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
  191. package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
  192. package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
  193. package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
  194. package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
  195. package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
  196. package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
  197. package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
  198. package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
  199. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
  200. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
  201. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
  202. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
  203. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
  204. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
  205. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
  206. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
  207. package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
  208. package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
  209. package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
  210. package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
  211. package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
  212. package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
  213. package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
  214. package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
  215. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
  216. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
  217. package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
  218. package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
  219. package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
  220. package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
  221. package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
  222. package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
  223. package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
  224. package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
  225. package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
  226. package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
  227. package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
  228. package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
  229. package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
  230. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
  231. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
  232. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
  233. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
  234. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
  235. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
  236. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
  237. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
  238. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
  239. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
  240. package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
  241. package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
  242. package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
  243. package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
  244. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
  245. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
  246. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
  247. package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
  248. package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
  249. package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
  250. package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
  251. package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
  252. package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
  253. package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
  254. package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
  255. package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
  256. package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
  257. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
  258. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
  259. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
  260. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
  261. package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
  262. package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
  263. package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
  264. package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
  265. package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
  266. package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
  267. package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
  268. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
  269. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
  270. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
  271. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
  272. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
  273. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
  274. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
  275. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
  276. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
  277. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
  278. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
  279. package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
  280. package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
  281. package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
  282. package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
  283. package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
  284. package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
  285. package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
  286. package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
  287. package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
  288. package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
  289. package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
  290. package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
  291. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
  292. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
  293. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
  294. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
  295. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
  296. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
  297. package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
  298. package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
  299. package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
  300. package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
  301. package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
  302. package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
  303. package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
  304. package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
  305. package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
  306. package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
  307. package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
  308. package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
  309. package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
  310. package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -32
  311. package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -32
  312. package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -32
  313. package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -32
  314. package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -32
  315. package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -32
  316. package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
  317. package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -32
  318. package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -32
  319. package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -32
  320. package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -48
  321. package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -31
  322. package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
  323. package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -35
  324. package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
  325. package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
  326. package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
  327. package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
  328. package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
  329. package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
  330. package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
  331. package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
  332. package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
  333. package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
  334. package/examples/client-configs/claude-code.commands.md +21 -21
  335. package/examples/client-configs/claude-code.project.mcp.json +18 -18
  336. package/examples/client-configs/claude-desktop.macos.json +18 -18
  337. package/examples/client-configs/claude-desktop.windows.json +20 -20
  338. package/examples/client-configs/codex.windows.toml +11 -11
  339. package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
  340. package/examples/client-configs/gemini.linux.settings.json +21 -21
  341. package/examples/client-configs/gemini.windows.settings.json +23 -23
  342. package/examples/client-configs/generic-stdio.json +16 -16
  343. package/manifests/channels/beta.json +24 -24
  344. package/manifests/channels/stable.json +25 -25
  345. package/network/approved-skills.json +54 -54
  346. package/network/unapproved-skill-candidates.json +110 -110
  347. package/package.json +89 -86
  348. package/scripts/configure-private-registry.mjs +208 -208
  349. package/scripts/lib/private-registry.mjs +97 -97
  350. package/scripts/render-menu-evidence.mjs +196 -130
  351. package/scripts/verify-menu-actions.mjs +112 -107
  352. package/scripts/verify-menu-visual.mjs +90 -0
  353. package/sources.json +11 -11
@@ -1,513 +1,513 @@
1
- # Plugin API Patterns
2
-
3
- > Part of the [use_figma skill](../SKILL.md). Quick reference for common Figma Plugin API operations.
4
-
5
- ## Contents
6
-
7
- - Execution Basics
8
- - Creating Nodes
9
- - Fills and Strokes
10
- - Auto Layout
11
- - Effects
12
- - Opacity and Blend Modes
13
- - Corner Radius and Clipping
14
- - Grouping and Organization
15
- - Components and Variants
16
- - Styles
17
- - Cloning, Finding Nodes, and Grids
18
- - Constraints and Viewport
19
-
20
-
21
- ## Execution Basics
22
-
23
- ### Page Context
24
-
25
- Page context resets between `use_figma` calls — `figma.currentPage` always starts on the first page. Use `await figma.setCurrentPageAsync(page)` at the start of each invocation to switch to the correct page.
26
-
27
- ```javascript
28
- const targetPage = figma.root.children.find(p => p.name === "My Page");
29
- await figma.setCurrentPageAsync(targetPage);
30
- // targetPage.children is now populated
31
- ```
32
-
33
- ### Closing the Plugin
34
-
35
- Every execution **must** call `figma.closePlugin()` on success and `figma.closePluginWithFailure()` on error:
36
-
37
- ```javascript
38
- figma.closePlugin("Success message describing what was done");
39
- figma.closePluginWithFailure("Description of what went wrong");
40
- ```
41
-
42
- `figma.notify()` does **not** exist. Return all information via the close message string.
43
-
44
- ### Working Incrementally
45
-
46
- Don't build an entire screen in one call. Break work into small steps:
47
- 1. Create tokens/variables
48
- 2. Create text styles
49
- 3. Build individual components
50
- 4. Compose sections
51
- 5. Assemble screens
52
-
53
- Verify structure with `get_metadata` between steps. Use `get_screenshot` after each major creation milestone to catch visual problems early.
54
-
55
- ## Creating Nodes
56
-
57
- ### Frames
58
-
59
- ```javascript
60
- const frame = figma.createFrame();
61
- frame.name = "Container";
62
- frame.resize(1440, 900);
63
- frame.x = 0;
64
- frame.y = 0;
65
- frame.fills = [{ type: "SOLID", color: { r: 0.98, g: 0.98, b: 0.99 } }];
66
- ```
67
-
68
- ### Text
69
-
70
- ```javascript
71
- // MUST load font before any text operations
72
- await figma.loadFontAsync({ family: "Inter", style: "Regular" });
73
-
74
- const text = figma.createText();
75
- text.fontName = { family: "Inter", style: "Regular" };
76
- text.fontSize = 16;
77
- text.lineHeight = { value: 24, unit: "PIXELS" };
78
- text.letterSpacing = { value: 0, unit: "PERCENT" };
79
- text.characters = "Hello World";
80
- text.fills = [{ type: "SOLID", color: { r: 0.1, g: 0.1, b: 0.12 } }];
81
- ```
82
-
83
- ### Rectangles
84
-
85
- ```javascript
86
- const rect = figma.createRectangle();
87
- rect.name = "Background";
88
- rect.resize(400, 300);
89
- rect.cornerRadius = 12;
90
- rect.fills = [{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } }];
91
- ```
92
-
93
- ### Ellipses
94
-
95
- ```javascript
96
- const circle = figma.createEllipse();
97
- circle.name = "Avatar Circle";
98
- circle.resize(48, 48);
99
- circle.fills = [{ type: "SOLID", color: { r: 0.85, g: 0.87, b: 0.90 } }];
100
- ```
101
-
102
- ### Lines
103
-
104
- ```javascript
105
- const line = figma.createLine();
106
- line.name = "Divider";
107
- line.resize(400, 0);
108
- line.strokes = [{ type: "SOLID", color: { r: 0, g: 0, b: 0 }, opacity: 0.08 }];
109
- line.strokeWeight = 1;
110
- ```
111
-
112
- ### SVG Import
113
-
114
- ```javascript
115
- const svgString = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
116
- <path d="M5 12h14M12 5l7 7-7 7" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
117
- </svg>`;
118
-
119
- const node = figma.createNodeFromSvg(svgString);
120
- node.name = "Icon/Arrow Right";
121
- node.resize(24, 24);
122
- ```
123
-
124
- ## Fills & Strokes
125
-
126
- ### Solid Fill
127
-
128
- ```javascript
129
- node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 } }];
130
- ```
131
-
132
- ### Fill with Opacity
133
-
134
- ```javascript
135
- node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 }, opacity: 0.5 }];
136
- ```
137
-
138
- ### No Fill (Transparent)
139
-
140
- ```javascript
141
- node.fills = [];
142
- ```
143
-
144
- ### Linear Gradient
145
-
146
- ```javascript
147
- node.fills = [{
148
- type: "GRADIENT_LINEAR",
149
- gradientStops: [
150
- { color: { r: 0.2, g: 0.36, b: 0.96, a: 1 }, position: 0 },
151
- { color: { r: 0.56, g: 0.24, b: 0.88, a: 1 }, position: 1 }
152
- ],
153
- gradientTransform: [[1, 0, 0], [0, 1, 0]]
154
- }];
155
- ```
156
-
157
- ### Strokes
158
-
159
- ```javascript
160
- node.strokes = [{ type: "SOLID", color: { r: 0.85, g: 0.85, b: 0.87 } }];
161
- node.strokeWeight = 1;
162
- node.strokeAlign = "INSIDE"; // "CENTER", "OUTSIDE"
163
- ```
164
-
165
- ### Multiple Fills (Layered)
166
-
167
- ```javascript
168
- node.fills = [
169
- { type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } },
170
- { type: "SOLID", color: { r: 0.2, g: 0.36, b: 0.96 }, opacity: 0.05 }
171
- ];
172
- ```
173
-
174
- ## Auto Layout
175
-
176
- ### Setting Up Auto Layout
177
-
178
- ```javascript
179
- const frame = figma.createFrame();
180
- frame.layoutMode = "VERTICAL"; // or "HORIZONTAL"
181
- frame.primaryAxisSizingMode = "AUTO"; // Hug main axis
182
- frame.counterAxisSizingMode = "FIXED"; // Fixed cross axis
183
- frame.resize(360, 1); // Width fixed, height auto
184
- frame.itemSpacing = 16; // Gap between children
185
- frame.paddingTop = 24;
186
- frame.paddingBottom = 24;
187
- frame.paddingLeft = 24;
188
- frame.paddingRight = 24;
189
- ```
190
-
191
- ### Alignment
192
-
193
- ```javascript
194
- // Main axis (direction of layout)
195
- frame.primaryAxisAlignItems = "MIN"; // Start
196
- frame.primaryAxisAlignItems = "CENTER"; // Center
197
- frame.primaryAxisAlignItems = "MAX"; // End
198
- frame.primaryAxisAlignItems = "SPACE_BETWEEN"; // Distribute
199
-
200
- // Cross axis
201
- frame.counterAxisAlignItems = "MIN"; // Start
202
- frame.counterAxisAlignItems = "CENTER"; // Center
203
- frame.counterAxisAlignItems = "MAX"; // End
204
- // NOTE: 'STRETCH' is NOT valid — use 'MIN' + child.layoutSizingX = 'FILL'
205
- ```
206
-
207
- ### Child Sizing
208
-
209
- ```javascript
210
- // IMPORTANT: FILL can only be set AFTER the child is appended to an auto-layout parent
211
- parent.appendChild(child)
212
- child.layoutSizingHorizontal = "FILL"; // Stretch to parent
213
- child.layoutSizingHorizontal = "HUG"; // Shrink to content
214
- child.layoutSizingHorizontal = "FIXED"; // Manual width
215
-
216
- child.layoutSizingVertical = "FILL";
217
- child.layoutSizingVertical = "HUG";
218
- child.layoutSizingVertical = "FIXED";
219
- ```
220
-
221
- ### Wrapping (Grid-like Layout)
222
-
223
- ```javascript
224
- frame.layoutMode = "HORIZONTAL";
225
- frame.layoutWrap = "WRAP";
226
- frame.itemSpacing = 24; // Horizontal gap
227
- frame.counterAxisSpacing = 24; // Vertical gap (between rows)
228
- ```
229
-
230
- ### Absolute Positioning Within Auto Layout
231
-
232
- ```javascript
233
- child.layoutPositioning = "ABSOLUTE";
234
- child.constraints = { horizontal: "MAX", vertical: "MIN" }; // Top-right
235
- child.x = parentWidth - childWidth - 8;
236
- child.y = 8;
237
- ```
238
-
239
- ## Effects
240
-
241
- ### Drop Shadow
242
-
243
- ```javascript
244
- node.effects = [{
245
- type: "DROP_SHADOW",
246
- color: { r: 0, g: 0, b: 0, a: 0.08 },
247
- offset: { x: 0, y: 4 },
248
- radius: 16,
249
- spread: -2,
250
- visible: true,
251
- blendMode: "NORMAL"
252
- }];
253
- ```
254
-
255
- ### Inner Shadow
256
-
257
- ```javascript
258
- node.effects = [{
259
- type: "INNER_SHADOW",
260
- color: { r: 0, g: 0, b: 0, a: 0.05 },
261
- offset: { x: 0, y: 1 },
262
- radius: 2,
263
- spread: 0,
264
- visible: true,
265
- blendMode: "NORMAL"
266
- }];
267
- ```
268
-
269
- ### Background Blur
270
-
271
- ```javascript
272
- node.effects = [{
273
- type: "BACKGROUND_BLUR",
274
- radius: 16,
275
- visible: true
276
- }];
277
- ```
278
-
279
- ### Layer Blur
280
-
281
- ```javascript
282
- node.effects = [{
283
- type: "LAYER_BLUR",
284
- radius: 8,
285
- visible: true
286
- }];
287
- ```
288
-
289
- ### Multiple Effects
290
-
291
- ```javascript
292
- node.effects = [
293
- { type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.04 }, offset: { x: 0, y: 1 }, radius: 3, spread: 0, visible: true, blendMode: "NORMAL" },
294
- { type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.06 }, offset: { x: 0, y: 8 }, radius: 24, spread: -4, visible: true, blendMode: "NORMAL" }
295
- ];
296
- ```
297
-
298
- ## Opacity & Blend Modes
299
-
300
- ```javascript
301
- node.opacity = 0.5;
302
- node.blendMode = "NORMAL"; // "MULTIPLY", "SCREEN", "OVERLAY", "DARKEN", "LIGHTEN", etc.
303
- ```
304
-
305
- ## Corner Radius
306
-
307
- ```javascript
308
- // Uniform
309
- node.cornerRadius = 12;
310
-
311
- // Per-corner
312
- node.topLeftRadius = 12;
313
- node.topRightRadius = 12;
314
- node.bottomLeftRadius = 0;
315
- node.bottomRightRadius = 0;
316
- ```
317
-
318
- ## Clipping
319
-
320
- ```javascript
321
- frame.clipsContent = true; // Children clipped to frame bounds
322
- ```
323
-
324
- ## Grouping & Organization
325
-
326
- ### Groups
327
-
328
- ```javascript
329
- const group = figma.group([node1, node2, node3], figma.currentPage);
330
- group.name = "Grouped Elements";
331
- ```
332
-
333
- ### Sections
334
-
335
- ```javascript
336
- const section = figma.createSection();
337
- section.name = "My Section";
338
- section.resizeWithoutConstraints(800, 600);
339
- section.x = 0;
340
- section.y = 0;
341
- // IMPORTANT: Sections don't auto-resize — always resize after adding content
342
- ```
343
-
344
- ### Appending Children
345
-
346
- ```javascript
347
- parentFrame.appendChild(childNode);
348
-
349
- // Insert at a specific index
350
- parentFrame.insertChild(0, childNode); // Insert at beginning
351
- ```
352
-
353
- ## Components & Variants
354
-
355
- ### Create Component
356
-
357
- ```javascript
358
- const component = figma.createComponent();
359
- component.name = "Button/Primary";
360
- component.description = "Primary action button.";
361
- ```
362
-
363
- ### Create Instance
364
-
365
- ```javascript
366
- const instance = component.createInstance();
367
- instance.x = 200;
368
- instance.y = 100;
369
- ```
370
-
371
- ### Import Components by Key (Team Libraries)
372
-
373
- These methods import components from **team libraries** (not the same file). For components in the current file, use `figma.getNodeByIdAsync()` or `findOne()`/`findAll()`.
374
-
375
- ```javascript
376
- // Import a published component from a team library by its key
377
- const comp = await figma.importComponentByKeyAsync(componentKey)
378
- const instance = comp.createInstance()
379
-
380
- // Import a published component set from a team library by its key
381
- const set = await figma.importComponentSetByKeyAsync(componentSetKey)
382
- const variant = set.defaultVariant
383
- const variantInstance = variant.createInstance()
384
- ```
385
-
386
- ### Combine as Variants
387
-
388
- ```javascript
389
- // IMPORTANT: Pass ComponentNodes (not frames)
390
- const componentSet = figma.combineAsVariants(
391
- [variantA, variantB, variantC],
392
- figma.currentPage
393
- );
394
- componentSet.name = "Button";
395
- componentSet.description = "Button component with multiple variants.";
396
-
397
- // CRITICAL: Layout variants in a grid after combining (they stack at 0,0)
398
- let maxX = 0, maxY = 0;
399
- componentSet.children.forEach((child, i) => {
400
- child.x = (i % numCols) * colWidth;
401
- child.y = Math.floor(i / numCols) * rowHeight;
402
- });
403
- for (const child of componentSet.children) {
404
- maxX = Math.max(maxX, child.x + child.width);
405
- maxY = Math.max(maxY, child.y + child.height);
406
- }
407
- componentSet.resizeWithoutConstraints(maxX + 40, maxY + 40);
408
- ```
409
-
410
- ### Component Properties
411
-
412
- ```javascript
413
- // addComponentProperty returns a STRING key — capture it!
414
- const labelKey = component.addComponentProperty("label", "TEXT", "Button");
415
- const showIconKey = component.addComponentProperty("showIcon", "BOOLEAN", true);
416
- const iconSlotKey = component.addComponentProperty("iconSlot", "INSTANCE_SWAP", defaultIconId);
417
-
418
- // MUST link properties to child nodes via componentPropertyReferences
419
- labelNode.componentPropertyReferences = { characters: labelKey };
420
- iconInstance.componentPropertyReferences = {
421
- visible: showIconKey,
422
- mainComponent: iconSlotKey
423
- };
424
- ```
425
-
426
- ## Styles
427
-
428
- ### Text Style
429
-
430
- ```javascript
431
- await figma.loadFontAsync({ family: "Inter", style: "Regular" });
432
-
433
- const style = figma.createTextStyle();
434
- style.name = "Body/Default";
435
- style.fontName = { family: "Inter", style: "Regular" };
436
- style.fontSize = 16;
437
- style.lineHeight = { value: 24, unit: "PIXELS" };
438
- style.letterSpacing = { value: 0, unit: "PERCENT" };
439
-
440
- // Apply to a text node
441
- textNode.textStyleId = style.id;
442
- ```
443
-
444
- ### Effect Style
445
-
446
- ```javascript
447
- const shadowStyle = figma.createEffectStyle();
448
- shadowStyle.name = "Shadow/Subtle";
449
- shadowStyle.effects = [{
450
- type: "DROP_SHADOW",
451
- color: { r: 0, g: 0, b: 0, a: 0.06 },
452
- offset: { x: 0, y: 2 },
453
- radius: 8,
454
- spread: 0,
455
- visible: true,
456
- blendMode: "NORMAL"
457
- }];
458
-
459
- // Apply to a node
460
- frame.effectStyleId = shadowStyle.id;
461
- ```
462
-
463
- ## Cloning & Duplication
464
-
465
- ```javascript
466
- const clone = originalNode.clone();
467
- clone.x = originalNode.x + originalNode.width + 40;
468
- clone.name = "Copy of " + originalNode.name;
469
- ```
470
-
471
- ## Finding Nodes
472
-
473
- ```javascript
474
- // Find by name on current page
475
- const node = figma.currentPage.findOne(n => n.name === "My Frame");
476
-
477
- // Find all by type
478
- const allTexts = figma.currentPage.findAll(n => n.type === "TEXT");
479
-
480
- // Find all by name pattern
481
- const allButtons = figma.currentPage.findAll(n => n.name.startsWith("Button/"));
482
- ```
483
-
484
- ## Layout Grids
485
-
486
- ```javascript
487
- frame.layoutGrids = [
488
- {
489
- pattern: "COLUMNS",
490
- alignment: "STRETCH",
491
- count: 12,
492
- gutterSize: 24,
493
- offset: 80,
494
- visible: true
495
- }
496
- ];
497
- ```
498
-
499
- ## Constraints (Non-Auto-Layout Frames)
500
-
501
- ```javascript
502
- child.constraints = {
503
- horizontal: "LEFT_RIGHT", // LEFT, RIGHT, CENTER, LEFT_RIGHT, SCALE
504
- vertical: "TOP" // TOP, BOTTOM, CENTER, TOP_BOTTOM, SCALE
505
- };
506
- ```
507
-
508
- ## Viewport & Zoom
509
-
510
- ```javascript
511
- // Zoom to fit specific nodes
512
- figma.viewport.scrollAndZoomIntoView([frame1, frame2]);
513
- ```
1
+ # Plugin API Patterns
2
+
3
+ > Part of the [use_figma skill](../SKILL.md). Quick reference for common Figma Plugin API operations.
4
+
5
+ ## Contents
6
+
7
+ - Execution Basics
8
+ - Creating Nodes
9
+ - Fills and Strokes
10
+ - Auto Layout
11
+ - Effects
12
+ - Opacity and Blend Modes
13
+ - Corner Radius and Clipping
14
+ - Grouping and Organization
15
+ - Components and Variants
16
+ - Styles
17
+ - Cloning, Finding Nodes, and Grids
18
+ - Constraints and Viewport
19
+
20
+
21
+ ## Execution Basics
22
+
23
+ ### Page Context
24
+
25
+ Page context resets between `use_figma` calls — `figma.currentPage` always starts on the first page. Use `await figma.setCurrentPageAsync(page)` at the start of each invocation to switch to the correct page.
26
+
27
+ ```javascript
28
+ const targetPage = figma.root.children.find(p => p.name === "My Page");
29
+ await figma.setCurrentPageAsync(targetPage);
30
+ // targetPage.children is now populated
31
+ ```
32
+
33
+ ### Closing the Plugin
34
+
35
+ Every execution **must** call `figma.closePlugin()` on success and `figma.closePluginWithFailure()` on error:
36
+
37
+ ```javascript
38
+ figma.closePlugin("Success message describing what was done");
39
+ figma.closePluginWithFailure("Description of what went wrong");
40
+ ```
41
+
42
+ `figma.notify()` does **not** exist. Return all information via the close message string.
43
+
44
+ ### Working Incrementally
45
+
46
+ Don't build an entire screen in one call. Break work into small steps:
47
+ 1. Create tokens/variables
48
+ 2. Create text styles
49
+ 3. Build individual components
50
+ 4. Compose sections
51
+ 5. Assemble screens
52
+
53
+ Verify structure with `get_metadata` between steps. Use `get_screenshot` after each major creation milestone to catch visual problems early.
54
+
55
+ ## Creating Nodes
56
+
57
+ ### Frames
58
+
59
+ ```javascript
60
+ const frame = figma.createFrame();
61
+ frame.name = "Container";
62
+ frame.resize(1440, 900);
63
+ frame.x = 0;
64
+ frame.y = 0;
65
+ frame.fills = [{ type: "SOLID", color: { r: 0.98, g: 0.98, b: 0.99 } }];
66
+ ```
67
+
68
+ ### Text
69
+
70
+ ```javascript
71
+ // MUST load font before any text operations
72
+ await figma.loadFontAsync({ family: "Inter", style: "Regular" });
73
+
74
+ const text = figma.createText();
75
+ text.fontName = { family: "Inter", style: "Regular" };
76
+ text.fontSize = 16;
77
+ text.lineHeight = { value: 24, unit: "PIXELS" };
78
+ text.letterSpacing = { value: 0, unit: "PERCENT" };
79
+ text.characters = "Hello World";
80
+ text.fills = [{ type: "SOLID", color: { r: 0.1, g: 0.1, b: 0.12 } }];
81
+ ```
82
+
83
+ ### Rectangles
84
+
85
+ ```javascript
86
+ const rect = figma.createRectangle();
87
+ rect.name = "Background";
88
+ rect.resize(400, 300);
89
+ rect.cornerRadius = 12;
90
+ rect.fills = [{ type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } }];
91
+ ```
92
+
93
+ ### Ellipses
94
+
95
+ ```javascript
96
+ const circle = figma.createEllipse();
97
+ circle.name = "Avatar Circle";
98
+ circle.resize(48, 48);
99
+ circle.fills = [{ type: "SOLID", color: { r: 0.85, g: 0.87, b: 0.90 } }];
100
+ ```
101
+
102
+ ### Lines
103
+
104
+ ```javascript
105
+ const line = figma.createLine();
106
+ line.name = "Divider";
107
+ line.resize(400, 0);
108
+ line.strokes = [{ type: "SOLID", color: { r: 0, g: 0, b: 0 }, opacity: 0.08 }];
109
+ line.strokeWeight = 1;
110
+ ```
111
+
112
+ ### SVG Import
113
+
114
+ ```javascript
115
+ const svgString = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
116
+ <path d="M5 12h14M12 5l7 7-7 7" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
117
+ </svg>`;
118
+
119
+ const node = figma.createNodeFromSvg(svgString);
120
+ node.name = "Icon/Arrow Right";
121
+ node.resize(24, 24);
122
+ ```
123
+
124
+ ## Fills & Strokes
125
+
126
+ ### Solid Fill
127
+
128
+ ```javascript
129
+ node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 } }];
130
+ ```
131
+
132
+ ### Fill with Opacity
133
+
134
+ ```javascript
135
+ node.fills = [{ type: "SOLID", color: { r: 0.2, g: 0.2, b: 0.25 }, opacity: 0.5 }];
136
+ ```
137
+
138
+ ### No Fill (Transparent)
139
+
140
+ ```javascript
141
+ node.fills = [];
142
+ ```
143
+
144
+ ### Linear Gradient
145
+
146
+ ```javascript
147
+ node.fills = [{
148
+ type: "GRADIENT_LINEAR",
149
+ gradientStops: [
150
+ { color: { r: 0.2, g: 0.36, b: 0.96, a: 1 }, position: 0 },
151
+ { color: { r: 0.56, g: 0.24, b: 0.88, a: 1 }, position: 1 }
152
+ ],
153
+ gradientTransform: [[1, 0, 0], [0, 1, 0]]
154
+ }];
155
+ ```
156
+
157
+ ### Strokes
158
+
159
+ ```javascript
160
+ node.strokes = [{ type: "SOLID", color: { r: 0.85, g: 0.85, b: 0.87 } }];
161
+ node.strokeWeight = 1;
162
+ node.strokeAlign = "INSIDE"; // "CENTER", "OUTSIDE"
163
+ ```
164
+
165
+ ### Multiple Fills (Layered)
166
+
167
+ ```javascript
168
+ node.fills = [
169
+ { type: "SOLID", color: { r: 0.95, g: 0.95, b: 0.96 } },
170
+ { type: "SOLID", color: { r: 0.2, g: 0.36, b: 0.96 }, opacity: 0.05 }
171
+ ];
172
+ ```
173
+
174
+ ## Auto Layout
175
+
176
+ ### Setting Up Auto Layout
177
+
178
+ ```javascript
179
+ const frame = figma.createFrame();
180
+ frame.layoutMode = "VERTICAL"; // or "HORIZONTAL"
181
+ frame.primaryAxisSizingMode = "AUTO"; // Hug main axis
182
+ frame.counterAxisSizingMode = "FIXED"; // Fixed cross axis
183
+ frame.resize(360, 1); // Width fixed, height auto
184
+ frame.itemSpacing = 16; // Gap between children
185
+ frame.paddingTop = 24;
186
+ frame.paddingBottom = 24;
187
+ frame.paddingLeft = 24;
188
+ frame.paddingRight = 24;
189
+ ```
190
+
191
+ ### Alignment
192
+
193
+ ```javascript
194
+ // Main axis (direction of layout)
195
+ frame.primaryAxisAlignItems = "MIN"; // Start
196
+ frame.primaryAxisAlignItems = "CENTER"; // Center
197
+ frame.primaryAxisAlignItems = "MAX"; // End
198
+ frame.primaryAxisAlignItems = "SPACE_BETWEEN"; // Distribute
199
+
200
+ // Cross axis
201
+ frame.counterAxisAlignItems = "MIN"; // Start
202
+ frame.counterAxisAlignItems = "CENTER"; // Center
203
+ frame.counterAxisAlignItems = "MAX"; // End
204
+ // NOTE: 'STRETCH' is NOT valid — use 'MIN' + child.layoutSizingX = 'FILL'
205
+ ```
206
+
207
+ ### Child Sizing
208
+
209
+ ```javascript
210
+ // IMPORTANT: FILL can only be set AFTER the child is appended to an auto-layout parent
211
+ parent.appendChild(child)
212
+ child.layoutSizingHorizontal = "FILL"; // Stretch to parent
213
+ child.layoutSizingHorizontal = "HUG"; // Shrink to content
214
+ child.layoutSizingHorizontal = "FIXED"; // Manual width
215
+
216
+ child.layoutSizingVertical = "FILL";
217
+ child.layoutSizingVertical = "HUG";
218
+ child.layoutSizingVertical = "FIXED";
219
+ ```
220
+
221
+ ### Wrapping (Grid-like Layout)
222
+
223
+ ```javascript
224
+ frame.layoutMode = "HORIZONTAL";
225
+ frame.layoutWrap = "WRAP";
226
+ frame.itemSpacing = 24; // Horizontal gap
227
+ frame.counterAxisSpacing = 24; // Vertical gap (between rows)
228
+ ```
229
+
230
+ ### Absolute Positioning Within Auto Layout
231
+
232
+ ```javascript
233
+ child.layoutPositioning = "ABSOLUTE";
234
+ child.constraints = { horizontal: "MAX", vertical: "MIN" }; // Top-right
235
+ child.x = parentWidth - childWidth - 8;
236
+ child.y = 8;
237
+ ```
238
+
239
+ ## Effects
240
+
241
+ ### Drop Shadow
242
+
243
+ ```javascript
244
+ node.effects = [{
245
+ type: "DROP_SHADOW",
246
+ color: { r: 0, g: 0, b: 0, a: 0.08 },
247
+ offset: { x: 0, y: 4 },
248
+ radius: 16,
249
+ spread: -2,
250
+ visible: true,
251
+ blendMode: "NORMAL"
252
+ }];
253
+ ```
254
+
255
+ ### Inner Shadow
256
+
257
+ ```javascript
258
+ node.effects = [{
259
+ type: "INNER_SHADOW",
260
+ color: { r: 0, g: 0, b: 0, a: 0.05 },
261
+ offset: { x: 0, y: 1 },
262
+ radius: 2,
263
+ spread: 0,
264
+ visible: true,
265
+ blendMode: "NORMAL"
266
+ }];
267
+ ```
268
+
269
+ ### Background Blur
270
+
271
+ ```javascript
272
+ node.effects = [{
273
+ type: "BACKGROUND_BLUR",
274
+ radius: 16,
275
+ visible: true
276
+ }];
277
+ ```
278
+
279
+ ### Layer Blur
280
+
281
+ ```javascript
282
+ node.effects = [{
283
+ type: "LAYER_BLUR",
284
+ radius: 8,
285
+ visible: true
286
+ }];
287
+ ```
288
+
289
+ ### Multiple Effects
290
+
291
+ ```javascript
292
+ node.effects = [
293
+ { type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.04 }, offset: { x: 0, y: 1 }, radius: 3, spread: 0, visible: true, blendMode: "NORMAL" },
294
+ { type: "DROP_SHADOW", color: { r: 0, g: 0, b: 0, a: 0.06 }, offset: { x: 0, y: 8 }, radius: 24, spread: -4, visible: true, blendMode: "NORMAL" }
295
+ ];
296
+ ```
297
+
298
+ ## Opacity & Blend Modes
299
+
300
+ ```javascript
301
+ node.opacity = 0.5;
302
+ node.blendMode = "NORMAL"; // "MULTIPLY", "SCREEN", "OVERLAY", "DARKEN", "LIGHTEN", etc.
303
+ ```
304
+
305
+ ## Corner Radius
306
+
307
+ ```javascript
308
+ // Uniform
309
+ node.cornerRadius = 12;
310
+
311
+ // Per-corner
312
+ node.topLeftRadius = 12;
313
+ node.topRightRadius = 12;
314
+ node.bottomLeftRadius = 0;
315
+ node.bottomRightRadius = 0;
316
+ ```
317
+
318
+ ## Clipping
319
+
320
+ ```javascript
321
+ frame.clipsContent = true; // Children clipped to frame bounds
322
+ ```
323
+
324
+ ## Grouping & Organization
325
+
326
+ ### Groups
327
+
328
+ ```javascript
329
+ const group = figma.group([node1, node2, node3], figma.currentPage);
330
+ group.name = "Grouped Elements";
331
+ ```
332
+
333
+ ### Sections
334
+
335
+ ```javascript
336
+ const section = figma.createSection();
337
+ section.name = "My Section";
338
+ section.resizeWithoutConstraints(800, 600);
339
+ section.x = 0;
340
+ section.y = 0;
341
+ // IMPORTANT: Sections don't auto-resize — always resize after adding content
342
+ ```
343
+
344
+ ### Appending Children
345
+
346
+ ```javascript
347
+ parentFrame.appendChild(childNode);
348
+
349
+ // Insert at a specific index
350
+ parentFrame.insertChild(0, childNode); // Insert at beginning
351
+ ```
352
+
353
+ ## Components & Variants
354
+
355
+ ### Create Component
356
+
357
+ ```javascript
358
+ const component = figma.createComponent();
359
+ component.name = "Button/Primary";
360
+ component.description = "Primary action button.";
361
+ ```
362
+
363
+ ### Create Instance
364
+
365
+ ```javascript
366
+ const instance = component.createInstance();
367
+ instance.x = 200;
368
+ instance.y = 100;
369
+ ```
370
+
371
+ ### Import Components by Key (Team Libraries)
372
+
373
+ These methods import components from **team libraries** (not the same file). For components in the current file, use `figma.getNodeByIdAsync()` or `findOne()`/`findAll()`.
374
+
375
+ ```javascript
376
+ // Import a published component from a team library by its key
377
+ const comp = await figma.importComponentByKeyAsync(componentKey)
378
+ const instance = comp.createInstance()
379
+
380
+ // Import a published component set from a team library by its key
381
+ const set = await figma.importComponentSetByKeyAsync(componentSetKey)
382
+ const variant = set.defaultVariant
383
+ const variantInstance = variant.createInstance()
384
+ ```
385
+
386
+ ### Combine as Variants
387
+
388
+ ```javascript
389
+ // IMPORTANT: Pass ComponentNodes (not frames)
390
+ const componentSet = figma.combineAsVariants(
391
+ [variantA, variantB, variantC],
392
+ figma.currentPage
393
+ );
394
+ componentSet.name = "Button";
395
+ componentSet.description = "Button component with multiple variants.";
396
+
397
+ // CRITICAL: Layout variants in a grid after combining (they stack at 0,0)
398
+ let maxX = 0, maxY = 0;
399
+ componentSet.children.forEach((child, i) => {
400
+ child.x = (i % numCols) * colWidth;
401
+ child.y = Math.floor(i / numCols) * rowHeight;
402
+ });
403
+ for (const child of componentSet.children) {
404
+ maxX = Math.max(maxX, child.x + child.width);
405
+ maxY = Math.max(maxY, child.y + child.height);
406
+ }
407
+ componentSet.resizeWithoutConstraints(maxX + 40, maxY + 40);
408
+ ```
409
+
410
+ ### Component Properties
411
+
412
+ ```javascript
413
+ // addComponentProperty returns a STRING key — capture it!
414
+ const labelKey = component.addComponentProperty("label", "TEXT", "Button");
415
+ const showIconKey = component.addComponentProperty("showIcon", "BOOLEAN", true);
416
+ const iconSlotKey = component.addComponentProperty("iconSlot", "INSTANCE_SWAP", defaultIconId);
417
+
418
+ // MUST link properties to child nodes via componentPropertyReferences
419
+ labelNode.componentPropertyReferences = { characters: labelKey };
420
+ iconInstance.componentPropertyReferences = {
421
+ visible: showIconKey,
422
+ mainComponent: iconSlotKey
423
+ };
424
+ ```
425
+
426
+ ## Styles
427
+
428
+ ### Text Style
429
+
430
+ ```javascript
431
+ await figma.loadFontAsync({ family: "Inter", style: "Regular" });
432
+
433
+ const style = figma.createTextStyle();
434
+ style.name = "Body/Default";
435
+ style.fontName = { family: "Inter", style: "Regular" };
436
+ style.fontSize = 16;
437
+ style.lineHeight = { value: 24, unit: "PIXELS" };
438
+ style.letterSpacing = { value: 0, unit: "PERCENT" };
439
+
440
+ // Apply to a text node
441
+ textNode.textStyleId = style.id;
442
+ ```
443
+
444
+ ### Effect Style
445
+
446
+ ```javascript
447
+ const shadowStyle = figma.createEffectStyle();
448
+ shadowStyle.name = "Shadow/Subtle";
449
+ shadowStyle.effects = [{
450
+ type: "DROP_SHADOW",
451
+ color: { r: 0, g: 0, b: 0, a: 0.06 },
452
+ offset: { x: 0, y: 2 },
453
+ radius: 8,
454
+ spread: 0,
455
+ visible: true,
456
+ blendMode: "NORMAL"
457
+ }];
458
+
459
+ // Apply to a node
460
+ frame.effectStyleId = shadowStyle.id;
461
+ ```
462
+
463
+ ## Cloning & Duplication
464
+
465
+ ```javascript
466
+ const clone = originalNode.clone();
467
+ clone.x = originalNode.x + originalNode.width + 40;
468
+ clone.name = "Copy of " + originalNode.name;
469
+ ```
470
+
471
+ ## Finding Nodes
472
+
473
+ ```javascript
474
+ // Find by name on current page
475
+ const node = figma.currentPage.findOne(n => n.name === "My Frame");
476
+
477
+ // Find all by type
478
+ const allTexts = figma.currentPage.findAll(n => n.type === "TEXT");
479
+
480
+ // Find all by name pattern
481
+ const allButtons = figma.currentPage.findAll(n => n.name.startsWith("Button/"));
482
+ ```
483
+
484
+ ## Layout Grids
485
+
486
+ ```javascript
487
+ frame.layoutGrids = [
488
+ {
489
+ pattern: "COLUMNS",
490
+ alignment: "STRETCH",
491
+ count: 12,
492
+ gutterSize: 24,
493
+ offset: 80,
494
+ visible: true
495
+ }
496
+ ];
497
+ ```
498
+
499
+ ## Constraints (Non-Auto-Layout Frames)
500
+
501
+ ```javascript
502
+ child.constraints = {
503
+ horizontal: "LEFT_RIGHT", // LEFT, RIGHT, CENTER, LEFT_RIGHT, SCALE
504
+ vertical: "TOP" // TOP, BOTTOM, CENTER, TOP_BOTTOM, SCALE
505
+ };
506
+ ```
507
+
508
+ ## Viewport & Zoom
509
+
510
+ ```javascript
511
+ // Zoom to fit specific nodes
512
+ figma.viewport.scrollAndZoomIntoView([frame1, frame2]);
513
+ ```