@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,354 +1,354 @@
1
- # Variable & Token API Patterns
2
-
3
- > Part of the [use_figma skill](../SKILL.md). How to correctly create, bind, scope, and alias variables using the Plugin API.
4
- >
5
- > For design system context (aliasing strategy, mode decisions, code syntax philosophy, grouping conventions), see [wwds-variables](working-with-design-systems/wwds-variables.md).
6
-
7
- ## Contents
8
-
9
- - Creating Variable Collections and Modes
10
- - Creating Variables (All Types)
11
- - Binding Variables to Node Properties
12
- - Variable Scopes: What They Are and How to Set Them
13
- - Variable Aliasing (VARIABLE_ALIAS)
14
- - Code Syntax (setVariableCodeSyntax)
15
- - Discovering Existing Variables in the File
16
- - Effect Styles (For Shadows)
17
-
18
-
19
- ## Creating Variable Collections and Modes
20
-
21
- ```javascript
22
- const collection = figma.variables.createVariableCollection("MyCollection");
23
-
24
- // A new collection starts with 1 mode named "Mode 1" — always rename it
25
- collection.renameMode(collection.modes[0].modeId, "Light");
26
-
27
- // Add additional modes (returns the new modeId)
28
- const darkModeId = collection.addMode("Dark");
29
- const lightModeId = collection.modes[0].modeId;
30
- ```
31
-
32
- **Mode limits are plan-dependent:** Free = 1 mode, Professional = up to 4, Organization/Enterprise = 40+. If you need many modes, split across multiple collections.
33
-
34
- ## Creating Variables (All Types)
35
-
36
- `figma.variables.createVariable(name, collection, resolvedType)` — the second argument accepts a collection object or ID string (object preferred).
37
-
38
- ```javascript
39
- // COLOR — values use {r, g, b, a} (all 0–1 range, includes alpha)
40
- const colorVar = figma.variables.createVariable("my-color", collection, "COLOR");
41
- colorVar.setValueForMode(modeId, { r: 0.2, g: 0.36, b: 0.96, a: 1 });
42
-
43
- // FLOAT — for spacing, radii, sizing, numeric values
44
- const floatVar = figma.variables.createVariable("my-spacing", collection, "FLOAT");
45
- floatVar.setValueForMode(modeId, 16);
46
-
47
- // STRING — for font families, font style names, any text value
48
- const stringVar = figma.variables.createVariable("my-font", collection, "STRING");
49
- stringVar.setValueForMode(modeId, "Inter");
50
-
51
- // BOOLEAN
52
- const boolVar = figma.variables.createVariable("my-flag", collection, "BOOLEAN");
53
- boolVar.setValueForMode(modeId, true);
54
- ```
55
-
56
- **Note:** Paint colors use `{r, g, b}` (no alpha), but COLOR variable values use `{r, g, b, a}` (with alpha). Don't mix them up.
57
-
58
- ## Binding Variables to Node Properties
59
-
60
- ### Color Bindings (Fills, Strokes)
61
-
62
- `setBoundVariableForPaint` returns a **NEW paint** — you must capture the return value:
63
-
64
- ```javascript
65
- // Create a base paint, bind the variable, assign the result
66
- const basePaint = { type: 'SOLID', color: { r: 0, g: 0, b: 0 } };
67
- const boundPaint = figma.variables.setBoundVariableForPaint(basePaint, "color", colorVar);
68
- node.fills = [boundPaint];
69
-
70
- // Only SOLID paints support color variable binding — gradients/images will throw
71
- ```
72
-
73
- ### Numeric Bindings (Spacing, Radii, Sizing)
74
-
75
- `setBoundVariable` binds FLOAT/STRING/BOOLEAN variables to node properties:
76
-
77
- ```javascript
78
- // Padding
79
- node.setBoundVariable("paddingTop", spacingVar);
80
- node.setBoundVariable("paddingBottom", spacingVar);
81
- node.setBoundVariable("paddingLeft", spacingVar);
82
- node.setBoundVariable("paddingRight", spacingVar);
83
-
84
- // Gap
85
- node.setBoundVariable("itemSpacing", gapVar);
86
- node.setBoundVariable("counterAxisSpacing", gapVar);
87
-
88
- // Corner radius — use individual corners, NOT cornerRadius
89
- node.setBoundVariable("topLeftRadius", radiusVar);
90
- node.setBoundVariable("topRightRadius", radiusVar);
91
- node.setBoundVariable("bottomLeftRadius", radiusVar);
92
- node.setBoundVariable("bottomRightRadius", radiusVar);
93
-
94
- // Size
95
- node.setBoundVariable("width", sizeVar);
96
- node.setBoundVariable("height", sizeVar);
97
- node.setBoundVariable("minWidth", sizeVar);
98
- node.setBoundVariable("maxWidth", sizeVar);
99
-
100
- // Other
101
- node.setBoundVariable("opacity", opacityVar);
102
- node.setBoundVariable("strokeWeight", strokeVar);
103
- ```
104
-
105
- **Not bindable via setBoundVariable:** `fontSize`, `fontWeight`, `lineHeight` — set these directly on text nodes.
106
-
107
- ### Effect Bindings
108
-
109
- ```javascript
110
- const effectCopy = JSON.parse(JSON.stringify(node.effects[0]));
111
- const newEffect = figma.variables.setBoundVariableForEffect(effectCopy, "color", colorVar);
112
- // ⚠️ Returns a NEW effect — must capture return value!
113
- node.effects = [newEffect];
114
- // Valid fields: "color" (COLOR), "radius" | "spread" | "offsetX" | "offsetY" (FLOAT)
115
- ```
116
-
117
- ### Applying a Mode to a Frame
118
-
119
- ```javascript
120
- // All bound children of this frame will resolve to the specified mode's values
121
- frame.setExplicitVariableModeForCollection(collection.id, modeId);
122
- ```
123
-
124
- Without this, all nodes use the collection's default (first) mode.
125
-
126
- ## Variable Scopes: What They Are and How to Set Them
127
-
128
- `variable.scopes` controls which Figma property pickers show the variable. The default is `["ALL_SCOPES"]` which shows it everywhere — this is almost never what you want.
129
-
130
- ```javascript
131
- variable.scopes = ["FRAME_FILL", "SHAPE_FILL"]; // only fill pickers
132
- variable.scopes = ["TEXT_FILL"]; // only text color picker
133
- variable.scopes = ["GAP"]; // only gap/spacing pickers
134
- variable.scopes = ["CORNER_RADIUS"]; // only radius pickers
135
- variable.scopes = []; // hidden from all pickers
136
- ```
137
-
138
- **All valid scope values:**
139
- `ALL_SCOPES`, `TEXT_CONTENT`, `CORNER_RADIUS`, `WIDTH_HEIGHT`, `GAP`, `ALL_FILLS`, `FRAME_FILL`, `SHAPE_FILL`, `TEXT_FILL`, `STROKE_COLOR`, `STROKE_FLOAT`, `EFFECT_FLOAT`, `EFFECT_COLOR`, `OPACITY`, `FONT_FAMILY`, `FONT_STYLE`, `FONT_WEIGHT`, `FONT_SIZE`, `LINE_HEIGHT`, `LETTER_SPACING`, `PARAGRAPH_SPACING`, `PARAGRAPH_INDENT`
140
-
141
- **Always check the existing file's scope patterns before creating variables** — match whatever convention is already in use. See "Discovering Existing Variables" below.
142
-
143
- ## Variable Aliasing (VARIABLE_ALIAS)
144
-
145
- A variable's value can reference another variable via alias. This is how semantic tokens reference primitive tokens:
146
-
147
- ```javascript
148
- // Set a variable's value as an alias to another variable
149
- semanticVar.setValueForMode(modeId, {
150
- type: 'VARIABLE_ALIAS',
151
- id: primitiveVar.id
152
- });
153
- ```
154
-
155
- When the primitive changes, the semantic variable updates automatically across all modes.
156
-
157
- ## Code Syntax (setVariableCodeSyntax)
158
-
159
- Links a Figma variable back to its code counterpart. Call once per platform:
160
-
161
- ```javascript
162
- variable.setVariableCodeSyntax('WEB', 'var(--color-bg-default)');
163
- variable.setVariableCodeSyntax('ANDROID', 'colorBgDefault');
164
- variable.setVariableCodeSyntax('iOS', 'Color.bgDefault');
165
-
166
- // Read back: variable.codeSyntax → { WEB: '...', ANDROID: '...', iOS: '...' }
167
- ```
168
-
169
- **When deriving CSS names from Figma names**, replace both slashes AND spaces with hyphens:
170
-
171
- ```javascript
172
- // WRONG — leaves spaces in CSS variable name
173
- `var(--${figmaName.replace(/\//g, '-').toLowerCase()})`
174
-
175
- // CORRECT — replace all whitespace and slashes
176
- `var(--${figmaName.replace(/[\s\/]+/g, '-').toLowerCase()})`
177
-
178
- // BEST — use the original CSS variable name from the source, not a derived one
179
- `var(${token.cssVar})`
180
- ```
181
-
182
- ## Discovering Existing Variables in the File
183
-
184
- **Always inspect the file's existing variables before creating new ones.** Different files use different naming conventions, scope patterns, and collection structures. Match what's already there.
185
-
186
- ### List collections with mode info
187
-
188
- ```javascript
189
- (async () => {
190
- try {
191
- const collections = figma.variables.getLocalVariableCollections();
192
- const results = collections.map(c => ({
193
- name: c.name,
194
- id: c.id,
195
- varCount: c.variableIds.length,
196
- modes: c.modes.map(m => ({ name: m.name, id: m.modeId }))
197
- }));
198
- figma.closePlugin(JSON.stringify(results));
199
- } catch(e) { figma.closePluginWithFailure(e.toString()); }
200
- })()
201
- ```
202
-
203
- ### Inspect scope patterns used in existing variables
204
-
205
- ```javascript
206
- (async () => {
207
- try {
208
- const collections = figma.variables.getLocalVariableCollections();
209
- const scopeGroups = {};
210
- for (const c of collections) {
211
- for (const id of c.variableIds) {
212
- const v = figma.variables.getVariableById(id);
213
- const key = JSON.stringify(v.scopes);
214
- if (!scopeGroups[key]) scopeGroups[key] = [];
215
- scopeGroups[key].push(v.name);
216
- }
217
- }
218
- figma.closePlugin(JSON.stringify(scopeGroups));
219
- } catch(e) { figma.closePluginWithFailure(e.toString()); }
220
- })()
221
- ```
222
-
223
- ### Build a name→variable lookup for reuse
224
-
225
- ```javascript
226
- const varByName = {};
227
- for (const v of figma.variables.getLocalVariables()) {
228
- varByName[v.name] = v;
229
- }
230
-
231
- // Bind to existing variable by name — no hex values needed
232
- function bindFill(node, varName) {
233
- const v = varByName[varName];
234
- if (!v) throw new Error(`Variable not found: ${varName}`);
235
- const paint = figma.variables.setBoundVariableForPaint(
236
- { type: 'SOLID', color: { r: 0, g: 0, b: 0 } }, 'color', v
237
- );
238
- node.fills = [paint];
239
- }
240
- ```
241
-
242
- **Only create new variables for tokens that have no match in the file.** After building the lookup, compare against the needed tokens and create variables only for the delta.
243
-
244
- ## Listing Collections with Full Variable Details
245
-
246
- The async API returns richer data including code syntax and scopes per variable:
247
-
248
- ```javascript
249
- /**
250
- * Lists all local variable collections defined in the current Figma file,
251
- * including metadata for their modes and variables.
252
- *
253
- * @returns {Promise<Array<{
254
- * name: string,
255
- * id: string,
256
- * modes: Array<[name: string, modeId: string]>,
257
- * variables: Array<[name: string, id: string, codeSyntax: object, scopes: string[]]>
258
- * }>>}
259
- */
260
- async function listVariableCollectionsAndVariables() {
261
- const collections = await figma.variables.getLocalVariableCollectionsAsync();
262
- const results = [];
263
- for (const collection of collections) {
264
- const vars = [];
265
- for (const id of collection.variableIds) {
266
- const v = await figma.variables.getVariableByIdAsync(id);
267
- vars.push([v.name, v.id, v.codeSyntax, v.scopes]);
268
- }
269
- results.push({
270
- name: collection.name,
271
- id: collection.id,
272
- modes: collection.modes.map(m => [m.name, m.modeId]),
273
- variables: vars
274
- });
275
- }
276
- return results;
277
- }
278
- ```
279
-
280
- Full runnable script:
281
-
282
- ```javascript
283
- (async () => {
284
- try {
285
- const results = await listVariableCollectionsAndVariables();
286
- figma.closePlugin(JSON.stringify(results));
287
- } catch(e) { figma.closePluginWithFailure(e.toString()); }
288
- })()
289
- ```
290
-
291
- ## Setting and Removing Code Syntax
292
-
293
- Must be executed in the file the variable is defined in:
294
-
295
- ```javascript
296
- /**
297
- * Set the code syntax for a variable for a specific platform.
298
- *
299
- * @param {string} variableId
300
- * @param {'WEB'|'ANDROID'|'iOS'} platform
301
- * @param {string} syntax
302
- */
303
- async function setVariableCodeSyntax(variableId, platform, syntax) {
304
- const variable = await figma.variables.getVariableByIdAsync(variableId);
305
- variable.setVariableCodeSyntax(platform, syntax);
306
- }
307
-
308
- /**
309
- * Remove code syntax for a variable for one or more platforms.
310
- *
311
- * @param {string} variableId
312
- * @param {Array<'WEB'|'ANDROID'|'iOS'>} platforms — defaults to all three
313
- */
314
- async function removeVariableCodeSyntax(variableId, platforms = ["WEB", "ANDROID", "iOS"]) {
315
- const variable = await figma.variables.getVariableByIdAsync(variableId);
316
- for (const platform of platforms) {
317
- variable.removeVariableCodeSyntax(platform);
318
- }
319
- }
320
-
321
- /**
322
- * Set a value for a variable in a specific mode.
323
- * For aliases, value must be: { type: 'VARIABLE_ALIAS', id: '<variableId>' }
324
- *
325
- * @param {string} variableId
326
- * @param {string} modeId
327
- * @param {string|number|boolean|RGB|RGBA|{type: 'VARIABLE_ALIAS', id: string}} value
328
- */
329
- async function setVariableValueForMode(variableId, modeId, value) {
330
- const variable = await figma.variables.getVariableByIdAsync(variableId);
331
- variable.setValueForMode(modeId, value);
332
- }
333
- ```
334
-
335
- ## Effect Styles (For Shadows)
336
-
337
- Shadows can't be stored as variables. Use effect styles. For comprehensive patterns, see [effect-style-patterns.md](effect-style-patterns.md).
338
-
339
- ```javascript
340
- const shadow = figma.createEffectStyle();
341
- shadow.name = "Shadow/Subtle";
342
- shadow.effects = [{
343
- type: "DROP_SHADOW",
344
- color: { r: 0, g: 0, b: 0, a: 0.06 },
345
- offset: { x: 0, y: 2 },
346
- radius: 8,
347
- spread: 0,
348
- visible: true,
349
- blendMode: "NORMAL"
350
- }];
351
-
352
- // Apply to a node
353
- frame.effectStyleId = shadow.id;
354
- ```
1
+ # Variable & Token API Patterns
2
+
3
+ > Part of the [use_figma skill](../SKILL.md). How to correctly create, bind, scope, and alias variables using the Plugin API.
4
+ >
5
+ > For design system context (aliasing strategy, mode decisions, code syntax philosophy, grouping conventions), see [wwds-variables](working-with-design-systems/wwds-variables.md).
6
+
7
+ ## Contents
8
+
9
+ - Creating Variable Collections and Modes
10
+ - Creating Variables (All Types)
11
+ - Binding Variables to Node Properties
12
+ - Variable Scopes: What They Are and How to Set Them
13
+ - Variable Aliasing (VARIABLE_ALIAS)
14
+ - Code Syntax (setVariableCodeSyntax)
15
+ - Discovering Existing Variables in the File
16
+ - Effect Styles (For Shadows)
17
+
18
+
19
+ ## Creating Variable Collections and Modes
20
+
21
+ ```javascript
22
+ const collection = figma.variables.createVariableCollection("MyCollection");
23
+
24
+ // A new collection starts with 1 mode named "Mode 1" — always rename it
25
+ collection.renameMode(collection.modes[0].modeId, "Light");
26
+
27
+ // Add additional modes (returns the new modeId)
28
+ const darkModeId = collection.addMode("Dark");
29
+ const lightModeId = collection.modes[0].modeId;
30
+ ```
31
+
32
+ **Mode limits are plan-dependent:** Free = 1 mode, Professional = up to 4, Organization/Enterprise = 40+. If you need many modes, split across multiple collections.
33
+
34
+ ## Creating Variables (All Types)
35
+
36
+ `figma.variables.createVariable(name, collection, resolvedType)` — the second argument accepts a collection object or ID string (object preferred).
37
+
38
+ ```javascript
39
+ // COLOR — values use {r, g, b, a} (all 0–1 range, includes alpha)
40
+ const colorVar = figma.variables.createVariable("my-color", collection, "COLOR");
41
+ colorVar.setValueForMode(modeId, { r: 0.2, g: 0.36, b: 0.96, a: 1 });
42
+
43
+ // FLOAT — for spacing, radii, sizing, numeric values
44
+ const floatVar = figma.variables.createVariable("my-spacing", collection, "FLOAT");
45
+ floatVar.setValueForMode(modeId, 16);
46
+
47
+ // STRING — for font families, font style names, any text value
48
+ const stringVar = figma.variables.createVariable("my-font", collection, "STRING");
49
+ stringVar.setValueForMode(modeId, "Inter");
50
+
51
+ // BOOLEAN
52
+ const boolVar = figma.variables.createVariable("my-flag", collection, "BOOLEAN");
53
+ boolVar.setValueForMode(modeId, true);
54
+ ```
55
+
56
+ **Note:** Paint colors use `{r, g, b}` (no alpha), but COLOR variable values use `{r, g, b, a}` (with alpha). Don't mix them up.
57
+
58
+ ## Binding Variables to Node Properties
59
+
60
+ ### Color Bindings (Fills, Strokes)
61
+
62
+ `setBoundVariableForPaint` returns a **NEW paint** — you must capture the return value:
63
+
64
+ ```javascript
65
+ // Create a base paint, bind the variable, assign the result
66
+ const basePaint = { type: 'SOLID', color: { r: 0, g: 0, b: 0 } };
67
+ const boundPaint = figma.variables.setBoundVariableForPaint(basePaint, "color", colorVar);
68
+ node.fills = [boundPaint];
69
+
70
+ // Only SOLID paints support color variable binding — gradients/images will throw
71
+ ```
72
+
73
+ ### Numeric Bindings (Spacing, Radii, Sizing)
74
+
75
+ `setBoundVariable` binds FLOAT/STRING/BOOLEAN variables to node properties:
76
+
77
+ ```javascript
78
+ // Padding
79
+ node.setBoundVariable("paddingTop", spacingVar);
80
+ node.setBoundVariable("paddingBottom", spacingVar);
81
+ node.setBoundVariable("paddingLeft", spacingVar);
82
+ node.setBoundVariable("paddingRight", spacingVar);
83
+
84
+ // Gap
85
+ node.setBoundVariable("itemSpacing", gapVar);
86
+ node.setBoundVariable("counterAxisSpacing", gapVar);
87
+
88
+ // Corner radius — use individual corners, NOT cornerRadius
89
+ node.setBoundVariable("topLeftRadius", radiusVar);
90
+ node.setBoundVariable("topRightRadius", radiusVar);
91
+ node.setBoundVariable("bottomLeftRadius", radiusVar);
92
+ node.setBoundVariable("bottomRightRadius", radiusVar);
93
+
94
+ // Size
95
+ node.setBoundVariable("width", sizeVar);
96
+ node.setBoundVariable("height", sizeVar);
97
+ node.setBoundVariable("minWidth", sizeVar);
98
+ node.setBoundVariable("maxWidth", sizeVar);
99
+
100
+ // Other
101
+ node.setBoundVariable("opacity", opacityVar);
102
+ node.setBoundVariable("strokeWeight", strokeVar);
103
+ ```
104
+
105
+ **Not bindable via setBoundVariable:** `fontSize`, `fontWeight`, `lineHeight` — set these directly on text nodes.
106
+
107
+ ### Effect Bindings
108
+
109
+ ```javascript
110
+ const effectCopy = JSON.parse(JSON.stringify(node.effects[0]));
111
+ const newEffect = figma.variables.setBoundVariableForEffect(effectCopy, "color", colorVar);
112
+ // ⚠️ Returns a NEW effect — must capture return value!
113
+ node.effects = [newEffect];
114
+ // Valid fields: "color" (COLOR), "radius" | "spread" | "offsetX" | "offsetY" (FLOAT)
115
+ ```
116
+
117
+ ### Applying a Mode to a Frame
118
+
119
+ ```javascript
120
+ // All bound children of this frame will resolve to the specified mode's values
121
+ frame.setExplicitVariableModeForCollection(collection.id, modeId);
122
+ ```
123
+
124
+ Without this, all nodes use the collection's default (first) mode.
125
+
126
+ ## Variable Scopes: What They Are and How to Set Them
127
+
128
+ `variable.scopes` controls which Figma property pickers show the variable. The default is `["ALL_SCOPES"]` which shows it everywhere — this is almost never what you want.
129
+
130
+ ```javascript
131
+ variable.scopes = ["FRAME_FILL", "SHAPE_FILL"]; // only fill pickers
132
+ variable.scopes = ["TEXT_FILL"]; // only text color picker
133
+ variable.scopes = ["GAP"]; // only gap/spacing pickers
134
+ variable.scopes = ["CORNER_RADIUS"]; // only radius pickers
135
+ variable.scopes = []; // hidden from all pickers
136
+ ```
137
+
138
+ **All valid scope values:**
139
+ `ALL_SCOPES`, `TEXT_CONTENT`, `CORNER_RADIUS`, `WIDTH_HEIGHT`, `GAP`, `ALL_FILLS`, `FRAME_FILL`, `SHAPE_FILL`, `TEXT_FILL`, `STROKE_COLOR`, `STROKE_FLOAT`, `EFFECT_FLOAT`, `EFFECT_COLOR`, `OPACITY`, `FONT_FAMILY`, `FONT_STYLE`, `FONT_WEIGHT`, `FONT_SIZE`, `LINE_HEIGHT`, `LETTER_SPACING`, `PARAGRAPH_SPACING`, `PARAGRAPH_INDENT`
140
+
141
+ **Always check the existing file's scope patterns before creating variables** — match whatever convention is already in use. See "Discovering Existing Variables" below.
142
+
143
+ ## Variable Aliasing (VARIABLE_ALIAS)
144
+
145
+ A variable's value can reference another variable via alias. This is how semantic tokens reference primitive tokens:
146
+
147
+ ```javascript
148
+ // Set a variable's value as an alias to another variable
149
+ semanticVar.setValueForMode(modeId, {
150
+ type: 'VARIABLE_ALIAS',
151
+ id: primitiveVar.id
152
+ });
153
+ ```
154
+
155
+ When the primitive changes, the semantic variable updates automatically across all modes.
156
+
157
+ ## Code Syntax (setVariableCodeSyntax)
158
+
159
+ Links a Figma variable back to its code counterpart. Call once per platform:
160
+
161
+ ```javascript
162
+ variable.setVariableCodeSyntax('WEB', 'var(--color-bg-default)');
163
+ variable.setVariableCodeSyntax('ANDROID', 'colorBgDefault');
164
+ variable.setVariableCodeSyntax('iOS', 'Color.bgDefault');
165
+
166
+ // Read back: variable.codeSyntax → { WEB: '...', ANDROID: '...', iOS: '...' }
167
+ ```
168
+
169
+ **When deriving CSS names from Figma names**, replace both slashes AND spaces with hyphens:
170
+
171
+ ```javascript
172
+ // WRONG — leaves spaces in CSS variable name
173
+ `var(--${figmaName.replace(/\//g, '-').toLowerCase()})`
174
+
175
+ // CORRECT — replace all whitespace and slashes
176
+ `var(--${figmaName.replace(/[\s\/]+/g, '-').toLowerCase()})`
177
+
178
+ // BEST — use the original CSS variable name from the source, not a derived one
179
+ `var(${token.cssVar})`
180
+ ```
181
+
182
+ ## Discovering Existing Variables in the File
183
+
184
+ **Always inspect the file's existing variables before creating new ones.** Different files use different naming conventions, scope patterns, and collection structures. Match what's already there.
185
+
186
+ ### List collections with mode info
187
+
188
+ ```javascript
189
+ (async () => {
190
+ try {
191
+ const collections = figma.variables.getLocalVariableCollections();
192
+ const results = collections.map(c => ({
193
+ name: c.name,
194
+ id: c.id,
195
+ varCount: c.variableIds.length,
196
+ modes: c.modes.map(m => ({ name: m.name, id: m.modeId }))
197
+ }));
198
+ figma.closePlugin(JSON.stringify(results));
199
+ } catch(e) { figma.closePluginWithFailure(e.toString()); }
200
+ })()
201
+ ```
202
+
203
+ ### Inspect scope patterns used in existing variables
204
+
205
+ ```javascript
206
+ (async () => {
207
+ try {
208
+ const collections = figma.variables.getLocalVariableCollections();
209
+ const scopeGroups = {};
210
+ for (const c of collections) {
211
+ for (const id of c.variableIds) {
212
+ const v = figma.variables.getVariableById(id);
213
+ const key = JSON.stringify(v.scopes);
214
+ if (!scopeGroups[key]) scopeGroups[key] = [];
215
+ scopeGroups[key].push(v.name);
216
+ }
217
+ }
218
+ figma.closePlugin(JSON.stringify(scopeGroups));
219
+ } catch(e) { figma.closePluginWithFailure(e.toString()); }
220
+ })()
221
+ ```
222
+
223
+ ### Build a name→variable lookup for reuse
224
+
225
+ ```javascript
226
+ const varByName = {};
227
+ for (const v of figma.variables.getLocalVariables()) {
228
+ varByName[v.name] = v;
229
+ }
230
+
231
+ // Bind to existing variable by name — no hex values needed
232
+ function bindFill(node, varName) {
233
+ const v = varByName[varName];
234
+ if (!v) throw new Error(`Variable not found: ${varName}`);
235
+ const paint = figma.variables.setBoundVariableForPaint(
236
+ { type: 'SOLID', color: { r: 0, g: 0, b: 0 } }, 'color', v
237
+ );
238
+ node.fills = [paint];
239
+ }
240
+ ```
241
+
242
+ **Only create new variables for tokens that have no match in the file.** After building the lookup, compare against the needed tokens and create variables only for the delta.
243
+
244
+ ## Listing Collections with Full Variable Details
245
+
246
+ The async API returns richer data including code syntax and scopes per variable:
247
+
248
+ ```javascript
249
+ /**
250
+ * Lists all local variable collections defined in the current Figma file,
251
+ * including metadata for their modes and variables.
252
+ *
253
+ * @returns {Promise<Array<{
254
+ * name: string,
255
+ * id: string,
256
+ * modes: Array<[name: string, modeId: string]>,
257
+ * variables: Array<[name: string, id: string, codeSyntax: object, scopes: string[]]>
258
+ * }>>}
259
+ */
260
+ async function listVariableCollectionsAndVariables() {
261
+ const collections = await figma.variables.getLocalVariableCollectionsAsync();
262
+ const results = [];
263
+ for (const collection of collections) {
264
+ const vars = [];
265
+ for (const id of collection.variableIds) {
266
+ const v = await figma.variables.getVariableByIdAsync(id);
267
+ vars.push([v.name, v.id, v.codeSyntax, v.scopes]);
268
+ }
269
+ results.push({
270
+ name: collection.name,
271
+ id: collection.id,
272
+ modes: collection.modes.map(m => [m.name, m.modeId]),
273
+ variables: vars
274
+ });
275
+ }
276
+ return results;
277
+ }
278
+ ```
279
+
280
+ Full runnable script:
281
+
282
+ ```javascript
283
+ (async () => {
284
+ try {
285
+ const results = await listVariableCollectionsAndVariables();
286
+ figma.closePlugin(JSON.stringify(results));
287
+ } catch(e) { figma.closePluginWithFailure(e.toString()); }
288
+ })()
289
+ ```
290
+
291
+ ## Setting and Removing Code Syntax
292
+
293
+ Must be executed in the file the variable is defined in:
294
+
295
+ ```javascript
296
+ /**
297
+ * Set the code syntax for a variable for a specific platform.
298
+ *
299
+ * @param {string} variableId
300
+ * @param {'WEB'|'ANDROID'|'iOS'} platform
301
+ * @param {string} syntax
302
+ */
303
+ async function setVariableCodeSyntax(variableId, platform, syntax) {
304
+ const variable = await figma.variables.getVariableByIdAsync(variableId);
305
+ variable.setVariableCodeSyntax(platform, syntax);
306
+ }
307
+
308
+ /**
309
+ * Remove code syntax for a variable for one or more platforms.
310
+ *
311
+ * @param {string} variableId
312
+ * @param {Array<'WEB'|'ANDROID'|'iOS'>} platforms — defaults to all three
313
+ */
314
+ async function removeVariableCodeSyntax(variableId, platforms = ["WEB", "ANDROID", "iOS"]) {
315
+ const variable = await figma.variables.getVariableByIdAsync(variableId);
316
+ for (const platform of platforms) {
317
+ variable.removeVariableCodeSyntax(platform);
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Set a value for a variable in a specific mode.
323
+ * For aliases, value must be: { type: 'VARIABLE_ALIAS', id: '<variableId>' }
324
+ *
325
+ * @param {string} variableId
326
+ * @param {string} modeId
327
+ * @param {string|number|boolean|RGB|RGBA|{type: 'VARIABLE_ALIAS', id: string}} value
328
+ */
329
+ async function setVariableValueForMode(variableId, modeId, value) {
330
+ const variable = await figma.variables.getVariableByIdAsync(variableId);
331
+ variable.setValueForMode(modeId, value);
332
+ }
333
+ ```
334
+
335
+ ## Effect Styles (For Shadows)
336
+
337
+ Shadows can't be stored as variables. Use effect styles. For comprehensive patterns, see [effect-style-patterns.md](effect-style-patterns.md).
338
+
339
+ ```javascript
340
+ const shadow = figma.createEffectStyle();
341
+ shadow.name = "Shadow/Subtle";
342
+ shadow.effects = [{
343
+ type: "DROP_SHADOW",
344
+ color: { r: 0, g: 0, b: 0, a: 0.06 },
345
+ offset: { x: 0, y: 2 },
346
+ radius: 8,
347
+ spread: 0,
348
+ visible: true,
349
+ blendMode: "NORMAL"
350
+ }];
351
+
352
+ // Apply to a node
353
+ frame.effectStyleId = shadow.id;
354
+ ```