@fprad0/skill-master-mcp 0.0.11 → 1.0.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 (337) hide show
  1. package/CHANGELOG.md +96 -83
  2. package/README.md +472 -443
  3. package/VERSION.md +9 -9
  4. package/bin/lib/bootstrap-global-core.mjs +34 -0
  5. package/bin/lib/client-config.mjs +293 -268
  6. package/bin/lib/doctor-core.mjs +202 -0
  7. package/bin/lib/menu-core.mjs +1629 -1154
  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 -0
  11. package/bin/lib/update-cli-core.mjs +117 -0
  12. package/bin/skill-master-activation.mjs +163 -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 -181
  16. package/bin/skill-master-eval-activation.mjs +32 -32
  17. package/bin/skill-master-install-global-skills.mjs +59 -97
  18. package/bin/skill-master-install-project-skills.mjs +97 -0
  19. package/bin/skill-master-menu.mjs +406 -320
  20. package/bin/skill-master-register-clients.mjs +232 -98
  21. package/bin/skill-master-success-skills.mjs +307 -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 -255
  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 -0
  41. package/docs/operations/assets/menu-frame-compact.html +76 -0
  42. package/docs/operations/assets/menu-frame-compact.png +0 -0
  43. package/docs/operations/assets/menu-frame-large.html +84 -0
  44. package/docs/operations/assets/menu-frame-large.png +0 -0
  45. package/docs/operations/assets/menu-frame-running.html +80 -0
  46. package/docs/operations/assets/menu-frame-running.png +0 -0
  47. package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -0
  48. package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -0
  49. package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -0
  50. package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -0
  51. package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -0
  52. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -0
  53. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -0
  54. package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyan-hud-frame-sheet.jpg +0 -0
  55. package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyberpunk-pattern-sheet.jpg +0 -0
  56. package/docs/operations/reborn-menu-cyberpunk-transfer/references/fluid-workflow-windows.gif +0 -0
  57. package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
  58. package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
  59. package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
  60. package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
  61. package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
  62. package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
  63. package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
  64. package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
  65. package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
  66. package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
  67. package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -0
  68. package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -0
  69. package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -0
  70. package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -0
  71. package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -0
  72. package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -0
  73. package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -0
  74. package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -0
  75. package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -0
  76. package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -0
  77. package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -0
  78. package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -0
  79. package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -0
  80. package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -0
  81. package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -0
  82. package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -0
  83. package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -0
  84. package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
  85. package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -0
  86. package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
  87. package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
  88. package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
  89. package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
  90. package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
  91. package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
  92. package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
  93. package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
  94. package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
  95. package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
  96. package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
  97. package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
  98. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
  99. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
  100. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
  101. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
  102. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
  103. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
  104. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
  105. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
  106. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
  107. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
  108. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
  109. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
  110. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
  111. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
  112. package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
  113. package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
  114. package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
  115. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
  116. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
  117. package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
  118. package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
  119. package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
  120. package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
  121. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
  122. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
  123. package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
  124. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
  125. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
  126. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
  127. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
  128. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
  129. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
  130. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
  131. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
  132. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
  133. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
  134. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
  135. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
  136. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
  137. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
  138. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
  139. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
  140. package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
  141. package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
  142. package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
  143. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
  144. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
  145. package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
  146. package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
  147. package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
  148. package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
  149. package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
  150. package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
  151. package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
  152. package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
  153. package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
  154. package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
  155. package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
  156. package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
  157. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
  158. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
  159. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
  160. package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
  161. package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
  162. package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
  163. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
  164. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
  165. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
  166. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
  167. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
  168. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
  169. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
  170. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
  171. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
  172. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
  173. package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
  174. package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
  175. package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
  176. package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
  177. package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
  178. package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
  179. package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
  180. package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
  181. package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
  182. package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
  183. package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
  184. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
  185. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
  186. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
  187. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
  188. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
  189. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
  190. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
  191. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
  192. package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
  193. package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
  194. package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
  195. package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
  196. package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
  197. package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
  198. package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
  199. package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
  200. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
  201. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
  202. package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
  203. package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
  204. package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
  205. package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
  206. package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
  207. package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
  208. package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
  209. package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
  210. package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
  211. package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
  212. package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
  213. package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
  214. package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
  215. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
  216. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
  217. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
  218. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
  219. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
  220. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
  221. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
  222. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
  223. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
  224. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
  225. package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
  226. package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
  227. package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
  228. package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
  229. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
  230. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
  231. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
  232. package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
  233. package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
  234. package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
  235. package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
  236. package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
  237. package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
  238. package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
  239. package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
  240. package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
  241. package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
  242. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
  243. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
  244. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
  245. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
  246. package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
  247. package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
  248. package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
  249. package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
  250. package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
  251. package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
  252. package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
  253. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
  254. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
  255. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
  256. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
  257. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
  258. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
  259. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
  260. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
  261. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
  262. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
  263. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
  264. package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
  265. package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
  266. package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
  267. package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
  268. package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
  269. package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
  270. package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
  271. package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
  272. package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
  273. package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
  274. package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
  275. package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
  276. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
  277. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
  278. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
  279. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
  280. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
  281. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
  282. package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
  283. package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
  284. package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
  285. package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
  286. package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
  287. package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
  288. package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
  289. package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
  290. package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
  291. package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
  292. package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
  293. package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
  294. package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
  295. package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -0
  296. package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -0
  297. package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -0
  298. package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -0
  299. package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -0
  300. package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -0
  301. package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
  302. package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -0
  303. package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -0
  304. package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -0
  305. package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -0
  306. package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -0
  307. package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
  308. package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -0
  309. package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
  310. package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
  311. package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
  312. package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
  313. package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
  314. package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
  315. package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
  316. package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
  317. package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
  318. package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
  319. package/examples/client-configs/claude-code.commands.md +21 -17
  320. package/examples/client-configs/claude-code.project.mcp.json +18 -18
  321. package/examples/client-configs/claude-desktop.macos.json +18 -18
  322. package/examples/client-configs/claude-desktop.windows.json +20 -20
  323. package/examples/client-configs/codex.windows.toml +11 -11
  324. package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
  325. package/examples/client-configs/gemini.linux.settings.json +21 -21
  326. package/examples/client-configs/gemini.windows.settings.json +23 -23
  327. package/examples/client-configs/generic-stdio.json +16 -16
  328. package/manifests/channels/beta.json +26 -26
  329. package/manifests/channels/stable.json +27 -27
  330. package/network/approved-skills.json +54 -54
  331. package/network/unapproved-skill-candidates.json +110 -110
  332. package/package.json +87 -78
  333. package/scripts/configure-private-registry.mjs +208 -208
  334. package/scripts/lib/private-registry.mjs +97 -97
  335. package/scripts/render-menu-evidence.mjs +130 -0
  336. package/scripts/verify-menu-actions.mjs +117 -115
  337. 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
+ ```