@fprad0/skill-master-mcp 0.0.12 → 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.
- package/CHANGELOG.md +96 -90
- package/README.md +472 -472
- package/VERSION.md +9 -9
- package/bin/lib/bootstrap-global-core.mjs +34 -0
- package/bin/lib/client-config.mjs +293 -293
- package/bin/lib/doctor-core.mjs +202 -0
- package/bin/lib/menu-core.mjs +1629 -1522
- package/bin/lib/operation-result.mjs +59 -0
- package/bin/lib/register-clients-core.mjs +247 -0
- package/bin/lib/skill-installation.mjs +215 -215
- package/bin/lib/update-cli-core.mjs +117 -0
- package/bin/skill-master-activation.mjs +163 -163
- package/bin/skill-master-bootstrap-global.mjs +61 -49
- package/bin/skill-master-configure-private-registry.mjs +3 -3
- package/bin/skill-master-doctor.mjs +239 -228
- package/bin/skill-master-eval-activation.mjs +32 -32
- package/bin/skill-master-install-global-skills.mjs +59 -59
- package/bin/skill-master-install-project-skills.mjs +97 -97
- package/bin/skill-master-menu.mjs +406 -405
- package/bin/skill-master-register-clients.mjs +232 -153
- package/bin/skill-master-success-skills.mjs +307 -307
- package/bin/skill-master-update.mjs +121 -72
- package/bin/skill-master.mjs +3 -3
- package/dist/activation.d.ts.map +1 -1
- package/dist/activation.js +12 -0
- package/dist/activation.js.map +1 -1
- package/dist/prompt-router.d.ts.map +1 -1
- package/dist/prompt-router.js +19 -0
- package/dist/prompt-router.js.map +1 -1
- package/dist/recommender.d.ts.map +1 -1
- package/dist/recommender.js +4 -1
- package/dist/recommender.js.map +1 -1
- package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -125
- package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -9
- package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -341
- package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -148
- package/docs/operations/GUIA_MULTI_COMPUTADOR.md +262 -262
- package/docs/operations/GUIA_NPM_PRIVADO.md +294 -294
- package/docs/operations/GUIA_NPM_PUBLICO.md +147 -147
- package/docs/operations/MENU_VISUAL_EVIDENCE_2026-06-28.md +66 -66
- package/docs/operations/assets/menu-frame-compact.html +75 -75
- package/docs/operations/assets/menu-frame-large.html +83 -83
- package/docs/operations/assets/menu-frame-running.html +79 -79
- package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -140
- package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -85
- package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -174
- package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -119
- package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -134
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -84
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -56
- package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
- package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
- package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
- package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
- package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
- package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
- package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
- package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
- package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
- package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
- package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -83
- package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -88
- package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -156
- package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -105
- package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -119
- package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -120
- package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -123
- package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -114
- package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -157
- package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -127
- package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -107
- package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -80
- package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
- package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -6
- package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
- package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
- package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
- package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
- package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
- package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
- package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
- package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
- package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
- package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
- package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
- package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
- package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
- package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
- package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
- package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
- package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
- package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
- package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
- package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
- package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
- package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
- package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
- package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
- package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
- package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
- package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
- package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
- package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
- package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
- package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
- package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
- package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
- package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
- package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
- package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
- package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
- package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
- package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
- package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
- package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
- package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
- package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
- package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
- package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
- package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
- package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
- package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
- package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
- package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
- package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
- package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
- package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
- package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
- package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
- package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
- package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
- package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -48
- package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
- package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -35
- package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
- package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
- package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
- package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
- package/examples/client-configs/claude-code.commands.md +21 -21
- package/examples/client-configs/claude-code.project.mcp.json +18 -18
- package/examples/client-configs/claude-desktop.macos.json +18 -18
- package/examples/client-configs/claude-desktop.windows.json +20 -20
- package/examples/client-configs/codex.windows.toml +11 -11
- package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
- package/examples/client-configs/gemini.linux.settings.json +21 -21
- package/examples/client-configs/gemini.windows.settings.json +23 -23
- package/examples/client-configs/generic-stdio.json +16 -16
- package/manifests/channels/beta.json +26 -26
- package/manifests/channels/stable.json +27 -27
- package/network/approved-skills.json +54 -54
- package/network/unapproved-skill-candidates.json +110 -110
- package/package.json +87 -86
- package/scripts/configure-private-registry.mjs +208 -208
- package/scripts/lib/private-registry.mjs +97 -97
- package/scripts/render-menu-evidence.mjs +130 -130
- package/scripts/verify-menu-actions.mjs +117 -117
- package/sources.json +11 -11
|
@@ -1,203 +1,203 @@
|
|
|
1
|
-
# Text Style API Patterns
|
|
2
|
-
|
|
3
|
-
> Part of the [use_figma skill](../SKILL.md). How to create, apply, and inspect text styles using the Plugin API.
|
|
4
|
-
>
|
|
5
|
-
> For design system context (when to create text styles, how they relate to tokens, headless limitations), see [wwds-text-styles](working-with-design-systems/wwds-text-styles.md).
|
|
6
|
-
|
|
7
|
-
## Contents
|
|
8
|
-
|
|
9
|
-
- Listing Text Styles
|
|
10
|
-
- Creating a Text Style
|
|
11
|
-
- Probing Font Styles
|
|
12
|
-
- Creating a Type Ramp (Multi-Step)
|
|
13
|
-
- Applying Text Styles to Nodes
|
|
14
|
-
|
|
15
|
-
## Listing Text Styles
|
|
16
|
-
|
|
17
|
-
```javascript
|
|
18
|
-
/**
|
|
19
|
-
* Lists all local text styles with their key properties.
|
|
20
|
-
*
|
|
21
|
-
* @returns {Promise<Array<{id: string, name: string, key: string, fontSize: number, fontName: FontName, lineHeight: LineHeight, letterSpacing: LetterSpacing}>>}
|
|
22
|
-
*/
|
|
23
|
-
async function listTextStyles() {
|
|
24
|
-
const styles = await figma.getLocalTextStylesAsync();
|
|
25
|
-
return styles.map(s => ({
|
|
26
|
-
id: s.id,
|
|
27
|
-
name: s.name,
|
|
28
|
-
key: s.key,
|
|
29
|
-
fontSize: s.fontSize,
|
|
30
|
-
fontName: s.fontName,
|
|
31
|
-
lineHeight: s.lineHeight,
|
|
32
|
-
letterSpacing: s.letterSpacing
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Full runnable script:
|
|
38
|
-
|
|
39
|
-
```javascript
|
|
40
|
-
(async () => {
|
|
41
|
-
try {
|
|
42
|
-
const results = await listTextStyles();
|
|
43
|
-
figma.closePlugin(JSON.stringify(results));
|
|
44
|
-
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
45
|
-
})()
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Creating a Text Style
|
|
49
|
-
|
|
50
|
-
Font **MUST** be loaded before setting `fontName`. `lineHeight` and `letterSpacing` must be `{value, unit}` objects — bare numbers throw.
|
|
51
|
-
|
|
52
|
-
```javascript
|
|
53
|
-
/**
|
|
54
|
-
* Creates a text style with all typographic properties set.
|
|
55
|
-
* Font MUST be loaded before calling.
|
|
56
|
-
*
|
|
57
|
-
* @param {string} name - Slash-delimited name, e.g. "body/base"
|
|
58
|
-
* @param {{ family: string, style: string }} fontName
|
|
59
|
-
* @param {number} fontSize - In pixels
|
|
60
|
-
* @param {{ value: number, unit: 'PIXELS' | 'PERCENT' } | { unit: 'AUTO' }} lineHeight
|
|
61
|
-
* @param {{ value: number, unit: 'PIXELS' | 'PERCENT' }} [letterSpacing]
|
|
62
|
-
* @param {string} [description] - e.g. the CSS variable name "CSS: var(--font-body-base)"
|
|
63
|
-
* @returns {TextStyle}
|
|
64
|
-
*/
|
|
65
|
-
function createTextStyleFull(name, fontName, fontSize, lineHeight, letterSpacing, description) {
|
|
66
|
-
const style = figma.createTextStyle();
|
|
67
|
-
style.name = name;
|
|
68
|
-
style.fontName = fontName;
|
|
69
|
-
style.fontSize = fontSize;
|
|
70
|
-
style.lineHeight = lineHeight; // { unit: 'AUTO' } | { value, unit: 'PIXELS'|'PERCENT' }
|
|
71
|
-
if (letterSpacing) style.letterSpacing = letterSpacing;
|
|
72
|
-
if (description) style.description = description;
|
|
73
|
-
return style;
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Probing Font Styles
|
|
78
|
-
|
|
79
|
-
Font style names vary per provider and per file (`"SemiBold"` vs `"Semi Bold"`). Always probe before hardcoding:
|
|
80
|
-
|
|
81
|
-
```javascript
|
|
82
|
-
/**
|
|
83
|
-
* Probes available font styles for a given family.
|
|
84
|
-
* Useful when font style names are unknown (e.g. "SemiBold" vs "Semi Bold").
|
|
85
|
-
*
|
|
86
|
-
* @param {string} family - Font family name, e.g. "Inter"
|
|
87
|
-
* @param {string[]} stylesToTest - Candidate style names to probe
|
|
88
|
-
* @returns {Promise<string[]>} - Style names that loaded successfully
|
|
89
|
-
*/
|
|
90
|
-
async function probeAvailableFontStyles(family, stylesToTest) {
|
|
91
|
-
const available = [];
|
|
92
|
-
for (const style of stylesToTest) {
|
|
93
|
-
try {
|
|
94
|
-
await figma.loadFontAsync({ family, style });
|
|
95
|
-
available.push(style);
|
|
96
|
-
} catch (_) {}
|
|
97
|
-
}
|
|
98
|
-
return available;
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Creating a Type Ramp (Multi-Step)
|
|
103
|
-
|
|
104
|
-
Handles font loading, deduplication, and idempotency. Each entry: `[name, fontFamily, fontStyle, fontSize_px, lineHeight, cssVar]`.
|
|
105
|
-
|
|
106
|
-
**HEADLESS NOTE:** `setBoundVariable` on `TextStyle` is not supported in `use_figma`. This function sets raw values. To bind variables, do it interactively in Figma after creation.
|
|
107
|
-
|
|
108
|
-
```javascript
|
|
109
|
-
/**
|
|
110
|
-
* Creates a full type ramp from a token definition array.
|
|
111
|
-
* Handles font loading, deduplication, and idempotency.
|
|
112
|
-
*
|
|
113
|
-
* Each entry: [name, fontFamily, fontStyle, fontSize_px, lineHeight, cssVar]
|
|
114
|
-
* - lineHeight: { unit: 'AUTO' } or { value: number, unit: 'PIXELS' | 'PERCENT' }
|
|
115
|
-
*
|
|
116
|
-
* @param {Array} defs - Array of [name, fontFamily, fontStyle, fontSize, lineHeight, cssVar] tuples
|
|
117
|
-
* @returns {Promise<{ created: string[], skipped: string[] }>}
|
|
118
|
-
*/
|
|
119
|
-
async function createTypeRamp(defs) {
|
|
120
|
-
const uniqueFonts = new Set();
|
|
121
|
-
for (const [, family, style] of defs) {
|
|
122
|
-
uniqueFonts.add(JSON.stringify({ family, style }));
|
|
123
|
-
}
|
|
124
|
-
await Promise.all(
|
|
125
|
-
[...uniqueFonts].map(f => figma.loadFontAsync(JSON.parse(f)))
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
const existing = new Set(
|
|
129
|
-
(await figma.getLocalTextStylesAsync()).map(s => s.name)
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
const created = [];
|
|
133
|
-
const skipped = [];
|
|
134
|
-
|
|
135
|
-
for (const [name, family, style, fontSize, lineHeight, cssVar] of defs) {
|
|
136
|
-
if (existing.has(name)) {
|
|
137
|
-
skipped.push(name);
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
const ts = figma.createTextStyle();
|
|
141
|
-
ts.name = name;
|
|
142
|
-
ts.fontName = { family, style };
|
|
143
|
-
ts.fontSize = fontSize;
|
|
144
|
-
ts.lineHeight = lineHeight ?? { unit: 'AUTO' };
|
|
145
|
-
if (cssVar) ts.description = `CSS: var(${cssVar})`;
|
|
146
|
-
created.push(name);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return { created, skipped };
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Full runnable script:
|
|
154
|
-
|
|
155
|
-
```javascript
|
|
156
|
-
(async () => {
|
|
157
|
-
try {
|
|
158
|
-
const defs = [
|
|
159
|
-
['heading/xl', 'Inter', 'Bold', 48, { unit: 'PIXELS', value: 56 }, '--font-heading-xl'],
|
|
160
|
-
['heading/lg', 'Inter', 'Bold', 36, { unit: 'PIXELS', value: 44 }, '--font-heading-lg'],
|
|
161
|
-
['body/base', 'Inter', 'Regular', 16, { unit: 'AUTO' }, '--font-body-base'],
|
|
162
|
-
['body/sm', 'Inter', 'Regular', 14, { unit: 'AUTO' }, '--font-body-sm'],
|
|
163
|
-
['code/base', 'Roboto Mono', 'Regular', 14, { unit: 'AUTO' }, '--font-code-base'],
|
|
164
|
-
];
|
|
165
|
-
const result = await createTypeRamp(defs);
|
|
166
|
-
figma.closePlugin(JSON.stringify(result));
|
|
167
|
-
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
168
|
-
})()
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
## Applying Text Styles to Nodes
|
|
172
|
-
|
|
173
|
-
```javascript
|
|
174
|
-
/**
|
|
175
|
-
* Applies a text style to all TEXT nodes on the current page that match a given name pattern.
|
|
176
|
-
*
|
|
177
|
-
* @param {string} styleId - The ID of a TextStyle.
|
|
178
|
-
* @param {string} nodeNamePattern - Substring match against node names.
|
|
179
|
-
* @returns {Promise<number>} - Number of nodes the style was applied to.
|
|
180
|
-
*/
|
|
181
|
-
async function applyTextStyleToMatchingNodes(styleId, nodeNamePattern) {
|
|
182
|
-
const textNodes = figma.currentPage.findAllWithCriteria({ types: ['TEXT'] });
|
|
183
|
-
let applied = 0;
|
|
184
|
-
for (const node of textNodes) {
|
|
185
|
-
if (node.name.includes(nodeNamePattern)) {
|
|
186
|
-
await node.setTextStyleIdAsync(styleId);
|
|
187
|
-
applied++;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return applied;
|
|
191
|
-
}
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Full runnable script:
|
|
195
|
-
|
|
196
|
-
```javascript
|
|
197
|
-
(async () => {
|
|
198
|
-
try {
|
|
199
|
-
const applied = await applyTextStyleToMatchingNodes('STYLE_ID', 'Heading');
|
|
200
|
-
figma.closePlugin(JSON.stringify({ applied }));
|
|
201
|
-
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
202
|
-
})()
|
|
203
|
-
```
|
|
1
|
+
# Text Style API Patterns
|
|
2
|
+
|
|
3
|
+
> Part of the [use_figma skill](../SKILL.md). How to create, apply, and inspect text styles using the Plugin API.
|
|
4
|
+
>
|
|
5
|
+
> For design system context (when to create text styles, how they relate to tokens, headless limitations), see [wwds-text-styles](working-with-design-systems/wwds-text-styles.md).
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- Listing Text Styles
|
|
10
|
+
- Creating a Text Style
|
|
11
|
+
- Probing Font Styles
|
|
12
|
+
- Creating a Type Ramp (Multi-Step)
|
|
13
|
+
- Applying Text Styles to Nodes
|
|
14
|
+
|
|
15
|
+
## Listing Text Styles
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
/**
|
|
19
|
+
* Lists all local text styles with their key properties.
|
|
20
|
+
*
|
|
21
|
+
* @returns {Promise<Array<{id: string, name: string, key: string, fontSize: number, fontName: FontName, lineHeight: LineHeight, letterSpacing: LetterSpacing}>>}
|
|
22
|
+
*/
|
|
23
|
+
async function listTextStyles() {
|
|
24
|
+
const styles = await figma.getLocalTextStylesAsync();
|
|
25
|
+
return styles.map(s => ({
|
|
26
|
+
id: s.id,
|
|
27
|
+
name: s.name,
|
|
28
|
+
key: s.key,
|
|
29
|
+
fontSize: s.fontSize,
|
|
30
|
+
fontName: s.fontName,
|
|
31
|
+
lineHeight: s.lineHeight,
|
|
32
|
+
letterSpacing: s.letterSpacing
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Full runnable script:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
(async () => {
|
|
41
|
+
try {
|
|
42
|
+
const results = await listTextStyles();
|
|
43
|
+
figma.closePlugin(JSON.stringify(results));
|
|
44
|
+
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
45
|
+
})()
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Creating a Text Style
|
|
49
|
+
|
|
50
|
+
Font **MUST** be loaded before setting `fontName`. `lineHeight` and `letterSpacing` must be `{value, unit}` objects — bare numbers throw.
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
/**
|
|
54
|
+
* Creates a text style with all typographic properties set.
|
|
55
|
+
* Font MUST be loaded before calling.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} name - Slash-delimited name, e.g. "body/base"
|
|
58
|
+
* @param {{ family: string, style: string }} fontName
|
|
59
|
+
* @param {number} fontSize - In pixels
|
|
60
|
+
* @param {{ value: number, unit: 'PIXELS' | 'PERCENT' } | { unit: 'AUTO' }} lineHeight
|
|
61
|
+
* @param {{ value: number, unit: 'PIXELS' | 'PERCENT' }} [letterSpacing]
|
|
62
|
+
* @param {string} [description] - e.g. the CSS variable name "CSS: var(--font-body-base)"
|
|
63
|
+
* @returns {TextStyle}
|
|
64
|
+
*/
|
|
65
|
+
function createTextStyleFull(name, fontName, fontSize, lineHeight, letterSpacing, description) {
|
|
66
|
+
const style = figma.createTextStyle();
|
|
67
|
+
style.name = name;
|
|
68
|
+
style.fontName = fontName;
|
|
69
|
+
style.fontSize = fontSize;
|
|
70
|
+
style.lineHeight = lineHeight; // { unit: 'AUTO' } | { value, unit: 'PIXELS'|'PERCENT' }
|
|
71
|
+
if (letterSpacing) style.letterSpacing = letterSpacing;
|
|
72
|
+
if (description) style.description = description;
|
|
73
|
+
return style;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Probing Font Styles
|
|
78
|
+
|
|
79
|
+
Font style names vary per provider and per file (`"SemiBold"` vs `"Semi Bold"`). Always probe before hardcoding:
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
/**
|
|
83
|
+
* Probes available font styles for a given family.
|
|
84
|
+
* Useful when font style names are unknown (e.g. "SemiBold" vs "Semi Bold").
|
|
85
|
+
*
|
|
86
|
+
* @param {string} family - Font family name, e.g. "Inter"
|
|
87
|
+
* @param {string[]} stylesToTest - Candidate style names to probe
|
|
88
|
+
* @returns {Promise<string[]>} - Style names that loaded successfully
|
|
89
|
+
*/
|
|
90
|
+
async function probeAvailableFontStyles(family, stylesToTest) {
|
|
91
|
+
const available = [];
|
|
92
|
+
for (const style of stylesToTest) {
|
|
93
|
+
try {
|
|
94
|
+
await figma.loadFontAsync({ family, style });
|
|
95
|
+
available.push(style);
|
|
96
|
+
} catch (_) {}
|
|
97
|
+
}
|
|
98
|
+
return available;
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Creating a Type Ramp (Multi-Step)
|
|
103
|
+
|
|
104
|
+
Handles font loading, deduplication, and idempotency. Each entry: `[name, fontFamily, fontStyle, fontSize_px, lineHeight, cssVar]`.
|
|
105
|
+
|
|
106
|
+
**HEADLESS NOTE:** `setBoundVariable` on `TextStyle` is not supported in `use_figma`. This function sets raw values. To bind variables, do it interactively in Figma after creation.
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
/**
|
|
110
|
+
* Creates a full type ramp from a token definition array.
|
|
111
|
+
* Handles font loading, deduplication, and idempotency.
|
|
112
|
+
*
|
|
113
|
+
* Each entry: [name, fontFamily, fontStyle, fontSize_px, lineHeight, cssVar]
|
|
114
|
+
* - lineHeight: { unit: 'AUTO' } or { value: number, unit: 'PIXELS' | 'PERCENT' }
|
|
115
|
+
*
|
|
116
|
+
* @param {Array} defs - Array of [name, fontFamily, fontStyle, fontSize, lineHeight, cssVar] tuples
|
|
117
|
+
* @returns {Promise<{ created: string[], skipped: string[] }>}
|
|
118
|
+
*/
|
|
119
|
+
async function createTypeRamp(defs) {
|
|
120
|
+
const uniqueFonts = new Set();
|
|
121
|
+
for (const [, family, style] of defs) {
|
|
122
|
+
uniqueFonts.add(JSON.stringify({ family, style }));
|
|
123
|
+
}
|
|
124
|
+
await Promise.all(
|
|
125
|
+
[...uniqueFonts].map(f => figma.loadFontAsync(JSON.parse(f)))
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const existing = new Set(
|
|
129
|
+
(await figma.getLocalTextStylesAsync()).map(s => s.name)
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const created = [];
|
|
133
|
+
const skipped = [];
|
|
134
|
+
|
|
135
|
+
for (const [name, family, style, fontSize, lineHeight, cssVar] of defs) {
|
|
136
|
+
if (existing.has(name)) {
|
|
137
|
+
skipped.push(name);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const ts = figma.createTextStyle();
|
|
141
|
+
ts.name = name;
|
|
142
|
+
ts.fontName = { family, style };
|
|
143
|
+
ts.fontSize = fontSize;
|
|
144
|
+
ts.lineHeight = lineHeight ?? { unit: 'AUTO' };
|
|
145
|
+
if (cssVar) ts.description = `CSS: var(${cssVar})`;
|
|
146
|
+
created.push(name);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { created, skipped };
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Full runnable script:
|
|
154
|
+
|
|
155
|
+
```javascript
|
|
156
|
+
(async () => {
|
|
157
|
+
try {
|
|
158
|
+
const defs = [
|
|
159
|
+
['heading/xl', 'Inter', 'Bold', 48, { unit: 'PIXELS', value: 56 }, '--font-heading-xl'],
|
|
160
|
+
['heading/lg', 'Inter', 'Bold', 36, { unit: 'PIXELS', value: 44 }, '--font-heading-lg'],
|
|
161
|
+
['body/base', 'Inter', 'Regular', 16, { unit: 'AUTO' }, '--font-body-base'],
|
|
162
|
+
['body/sm', 'Inter', 'Regular', 14, { unit: 'AUTO' }, '--font-body-sm'],
|
|
163
|
+
['code/base', 'Roboto Mono', 'Regular', 14, { unit: 'AUTO' }, '--font-code-base'],
|
|
164
|
+
];
|
|
165
|
+
const result = await createTypeRamp(defs);
|
|
166
|
+
figma.closePlugin(JSON.stringify(result));
|
|
167
|
+
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
168
|
+
})()
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Applying Text Styles to Nodes
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
/**
|
|
175
|
+
* Applies a text style to all TEXT nodes on the current page that match a given name pattern.
|
|
176
|
+
*
|
|
177
|
+
* @param {string} styleId - The ID of a TextStyle.
|
|
178
|
+
* @param {string} nodeNamePattern - Substring match against node names.
|
|
179
|
+
* @returns {Promise<number>} - Number of nodes the style was applied to.
|
|
180
|
+
*/
|
|
181
|
+
async function applyTextStyleToMatchingNodes(styleId, nodeNamePattern) {
|
|
182
|
+
const textNodes = figma.currentPage.findAllWithCriteria({ types: ['TEXT'] });
|
|
183
|
+
let applied = 0;
|
|
184
|
+
for (const node of textNodes) {
|
|
185
|
+
if (node.name.includes(nodeNamePattern)) {
|
|
186
|
+
await node.setTextStyleIdAsync(styleId);
|
|
187
|
+
applied++;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return applied;
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Full runnable script:
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
(async () => {
|
|
198
|
+
try {
|
|
199
|
+
const applied = await applyTextStyleToMatchingNodes('STYLE_ID', 'Heading');
|
|
200
|
+
figma.closePlugin(JSON.stringify({ applied }));
|
|
201
|
+
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
202
|
+
})()
|
|
203
|
+
```
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
# Validation Workflow & Error Recovery
|
|
2
|
-
|
|
3
|
-
> Part of the [use_figma skill](../SKILL.md). How to debug, validate, and recover from errors.
|
|
4
|
-
|
|
5
|
-
## Contents
|
|
6
|
-
|
|
7
|
-
- `get_metadata` vs `get_screenshot`
|
|
8
|
-
- Error Recovery After Failed `use_figma`
|
|
9
|
-
- Cleanup Pattern
|
|
10
|
-
- Recommended Workflow
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## `get_metadata` vs `get_screenshot`
|
|
14
|
-
|
|
15
|
-
After each `use_figma` call, validate results using the right tool for the job. Do NOT reach for `get_screenshot` every time — it is expensive and should be reserved for visual checks.
|
|
16
|
-
|
|
17
|
-
### `get_metadata` — Use for intermediate validation (preferred)
|
|
18
|
-
|
|
19
|
-
`get_metadata` returns an XML tree of node IDs, types, names, positions, and sizes. Use it to confirm:
|
|
20
|
-
|
|
21
|
-
- **Structure & hierarchy**: correct parent-child relationships, component nesting, section contents
|
|
22
|
-
- **Node counts**: expected number of variants created, children present
|
|
23
|
-
- **Naming**: variant property names follow the `property=value` convention
|
|
24
|
-
- **Positioning & alignment**: x/y coordinates, width/height values match expectations
|
|
25
|
-
- **Layout properties**: auto-layout direction, sizing mode, padding, spacing
|
|
26
|
-
- **Component set membership**: all expected variants are inside the ComponentSet
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
Example: After creating a ComponentSet with 120 variants, call get_metadata on the
|
|
30
|
-
ComponentSet node to verify all 120 children exist with correct names, sizes, and positions
|
|
31
|
-
— without waiting for a full render.
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**When to use `get_metadata`:**
|
|
35
|
-
- After creating/modifying nodes — to verify structure, counts, and names
|
|
36
|
-
- After layout operations — to verify positions and dimensions
|
|
37
|
-
- After combining variants — to confirm all components are in the ComponentSet
|
|
38
|
-
- After binding variables — to verify node properties (use use_figma to read bound variables if needed)
|
|
39
|
-
- Between multi-step workflows — to confirm step N succeeded before starting step N+1
|
|
40
|
-
|
|
41
|
-
### `get_screenshot` — Use after each major creation milestone
|
|
42
|
-
|
|
43
|
-
`get_screenshot` renders a pixel-accurate image. It is the only way to verify visual correctness (colors, typography rendering, effects, variable mode resolution). It is slower and produces large responses, so don't call it after every single `use_figma` — but do call it after each major milestone to catch visual problems early.
|
|
44
|
-
|
|
45
|
-
**When to use `get_screenshot`:**
|
|
46
|
-
- **After creating a component set** — verify variants look correct, grid is readable, nothing is collapsed or overlapping
|
|
47
|
-
- **After composing a layout** — verify overall structure and spacing
|
|
48
|
-
- **After binding variables/modes** — verify colors and tokens resolved correctly
|
|
49
|
-
- **After any fix or recovery** — verify the fix didn't introduce new visual issues
|
|
50
|
-
- **Before reporting results to the user** — final visual proof
|
|
51
|
-
|
|
52
|
-
**What to look for in screenshots** — these are the most commonly missed issues:
|
|
53
|
-
- **Cropped/clipped text** — line heights or frame sizing cutting off descenders, ascenders, or entire lines
|
|
54
|
-
- **Overlapping content** — elements stacking on top of each other due to incorrect sizing or missing auto-layout
|
|
55
|
-
- **Placeholder text** still showing ("Title", "Heading", "Button") instead of actual content
|
|
56
|
-
|
|
57
|
-
## CRITICAL: Error Recovery After Failed `use_figma`
|
|
58
|
-
|
|
59
|
-
> **THIS IS NOT OPTIONAL.** Every `use_figma` error MUST trigger the recovery steps below. Skipping these steps leaves orphaned nodes in the file that will cause duplicates and inconsistencies on retry.
|
|
60
|
-
|
|
61
|
-
**Scripts can partially execute before hitting an error.** A failed `use_figma` does NOT roll back — nodes created before the error line persist in the file. This leaves the file in an **inconsistent, partially-modified state**.
|
|
62
|
-
|
|
63
|
-
**Mandatory recovery steps when `use_figma` returns an error (DO NOT SKIP):**
|
|
64
|
-
1. **STOP — do NOT immediately fix the code and retry.** The file has partial state that must be inspected first.
|
|
65
|
-
2. **Immediately call `get_metadata`** on the parent node (section, page, or ComponentSet) to see what was partially created.
|
|
66
|
-
3. **If `get_metadata` doesn't make the damage clear** (e.g. positions look fine but visual state is uncertain), call `get_screenshot` to assess visual damage.
|
|
67
|
-
4. **Write a cleanup script** to remove orphaned/incomplete nodes before retrying. Use `page.findChildren()` to locate stray nodes.
|
|
68
|
-
5. **Only after cleanup is confirmed**, fix the original script and retry.
|
|
69
|
-
6. **Never retry the failed script blindly** — the partial state means a retry will create duplicates or hit new errors.
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
Example: A script creating 8 components fails on component #5.
|
|
73
|
-
Components 1-4 exist on the page. A naive retry creates components 1-8 again,
|
|
74
|
-
leaving 12 components total (4 orphaned duplicates). Always clean up first.
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Cleanup Pattern
|
|
78
|
-
|
|
79
|
-
```js
|
|
80
|
-
// Cleanup pattern: find and remove orphaned nodes from a failed run
|
|
81
|
-
(async () => {
|
|
82
|
-
try {
|
|
83
|
-
const page = figma.currentPage;
|
|
84
|
-
// Find orphaned components that weren't combined into a ComponentSet
|
|
85
|
-
const orphans = page.findChildren(n =>
|
|
86
|
-
n.type === 'COMPONENT' && n.name.includes('variant=')
|
|
87
|
-
);
|
|
88
|
-
for (const orphan of orphans) orphan.remove();
|
|
89
|
-
figma.closePlugin('Cleaned up ' + orphans.length + ' orphaned nodes');
|
|
90
|
-
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
91
|
-
})()
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Recommended Workflow
|
|
95
|
-
|
|
96
|
-
```
|
|
97
|
-
1. use_figma → Create/modify nodes
|
|
98
|
-
2. get_metadata → Verify structure, counts, names, positions (fast, cheap)
|
|
99
|
-
3. use_figma → Fix any structural issues found
|
|
100
|
-
4. get_metadata → Re-verify fixes
|
|
101
|
-
5. ... repeat as needed ...
|
|
102
|
-
6. get_screenshot → Visual check after each major milestone
|
|
103
|
-
|
|
104
|
-
⚠️ ON ERROR at any step:
|
|
105
|
-
a. get_metadata → Inspect partial state (always do this first)
|
|
106
|
-
b. get_screenshot → Only if metadata doesn't make the damage clear
|
|
107
|
-
c. use_figma → Clean up orphaned/incomplete nodes
|
|
108
|
-
d. THEN retry the failed operation
|
|
109
|
-
```
|
|
1
|
+
# Validation Workflow & Error Recovery
|
|
2
|
+
|
|
3
|
+
> Part of the [use_figma skill](../SKILL.md). How to debug, validate, and recover from errors.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `get_metadata` vs `get_screenshot`
|
|
8
|
+
- Error Recovery After Failed `use_figma`
|
|
9
|
+
- Cleanup Pattern
|
|
10
|
+
- Recommended Workflow
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## `get_metadata` vs `get_screenshot`
|
|
14
|
+
|
|
15
|
+
After each `use_figma` call, validate results using the right tool for the job. Do NOT reach for `get_screenshot` every time — it is expensive and should be reserved for visual checks.
|
|
16
|
+
|
|
17
|
+
### `get_metadata` — Use for intermediate validation (preferred)
|
|
18
|
+
|
|
19
|
+
`get_metadata` returns an XML tree of node IDs, types, names, positions, and sizes. Use it to confirm:
|
|
20
|
+
|
|
21
|
+
- **Structure & hierarchy**: correct parent-child relationships, component nesting, section contents
|
|
22
|
+
- **Node counts**: expected number of variants created, children present
|
|
23
|
+
- **Naming**: variant property names follow the `property=value` convention
|
|
24
|
+
- **Positioning & alignment**: x/y coordinates, width/height values match expectations
|
|
25
|
+
- **Layout properties**: auto-layout direction, sizing mode, padding, spacing
|
|
26
|
+
- **Component set membership**: all expected variants are inside the ComponentSet
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Example: After creating a ComponentSet with 120 variants, call get_metadata on the
|
|
30
|
+
ComponentSet node to verify all 120 children exist with correct names, sizes, and positions
|
|
31
|
+
— without waiting for a full render.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**When to use `get_metadata`:**
|
|
35
|
+
- After creating/modifying nodes — to verify structure, counts, and names
|
|
36
|
+
- After layout operations — to verify positions and dimensions
|
|
37
|
+
- After combining variants — to confirm all components are in the ComponentSet
|
|
38
|
+
- After binding variables — to verify node properties (use use_figma to read bound variables if needed)
|
|
39
|
+
- Between multi-step workflows — to confirm step N succeeded before starting step N+1
|
|
40
|
+
|
|
41
|
+
### `get_screenshot` — Use after each major creation milestone
|
|
42
|
+
|
|
43
|
+
`get_screenshot` renders a pixel-accurate image. It is the only way to verify visual correctness (colors, typography rendering, effects, variable mode resolution). It is slower and produces large responses, so don't call it after every single `use_figma` — but do call it after each major milestone to catch visual problems early.
|
|
44
|
+
|
|
45
|
+
**When to use `get_screenshot`:**
|
|
46
|
+
- **After creating a component set** — verify variants look correct, grid is readable, nothing is collapsed or overlapping
|
|
47
|
+
- **After composing a layout** — verify overall structure and spacing
|
|
48
|
+
- **After binding variables/modes** — verify colors and tokens resolved correctly
|
|
49
|
+
- **After any fix or recovery** — verify the fix didn't introduce new visual issues
|
|
50
|
+
- **Before reporting results to the user** — final visual proof
|
|
51
|
+
|
|
52
|
+
**What to look for in screenshots** — these are the most commonly missed issues:
|
|
53
|
+
- **Cropped/clipped text** — line heights or frame sizing cutting off descenders, ascenders, or entire lines
|
|
54
|
+
- **Overlapping content** — elements stacking on top of each other due to incorrect sizing or missing auto-layout
|
|
55
|
+
- **Placeholder text** still showing ("Title", "Heading", "Button") instead of actual content
|
|
56
|
+
|
|
57
|
+
## CRITICAL: Error Recovery After Failed `use_figma`
|
|
58
|
+
|
|
59
|
+
> **THIS IS NOT OPTIONAL.** Every `use_figma` error MUST trigger the recovery steps below. Skipping these steps leaves orphaned nodes in the file that will cause duplicates and inconsistencies on retry.
|
|
60
|
+
|
|
61
|
+
**Scripts can partially execute before hitting an error.** A failed `use_figma` does NOT roll back — nodes created before the error line persist in the file. This leaves the file in an **inconsistent, partially-modified state**.
|
|
62
|
+
|
|
63
|
+
**Mandatory recovery steps when `use_figma` returns an error (DO NOT SKIP):**
|
|
64
|
+
1. **STOP — do NOT immediately fix the code and retry.** The file has partial state that must be inspected first.
|
|
65
|
+
2. **Immediately call `get_metadata`** on the parent node (section, page, or ComponentSet) to see what was partially created.
|
|
66
|
+
3. **If `get_metadata` doesn't make the damage clear** (e.g. positions look fine but visual state is uncertain), call `get_screenshot` to assess visual damage.
|
|
67
|
+
4. **Write a cleanup script** to remove orphaned/incomplete nodes before retrying. Use `page.findChildren()` to locate stray nodes.
|
|
68
|
+
5. **Only after cleanup is confirmed**, fix the original script and retry.
|
|
69
|
+
6. **Never retry the failed script blindly** — the partial state means a retry will create duplicates or hit new errors.
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Example: A script creating 8 components fails on component #5.
|
|
73
|
+
Components 1-4 exist on the page. A naive retry creates components 1-8 again,
|
|
74
|
+
leaving 12 components total (4 orphaned duplicates). Always clean up first.
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Cleanup Pattern
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
// Cleanup pattern: find and remove orphaned nodes from a failed run
|
|
81
|
+
(async () => {
|
|
82
|
+
try {
|
|
83
|
+
const page = figma.currentPage;
|
|
84
|
+
// Find orphaned components that weren't combined into a ComponentSet
|
|
85
|
+
const orphans = page.findChildren(n =>
|
|
86
|
+
n.type === 'COMPONENT' && n.name.includes('variant=')
|
|
87
|
+
);
|
|
88
|
+
for (const orphan of orphans) orphan.remove();
|
|
89
|
+
figma.closePlugin('Cleaned up ' + orphans.length + ' orphaned nodes');
|
|
90
|
+
} catch(e) { figma.closePluginWithFailure(e.toString()); }
|
|
91
|
+
})()
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Recommended Workflow
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
1. use_figma → Create/modify nodes
|
|
98
|
+
2. get_metadata → Verify structure, counts, names, positions (fast, cheap)
|
|
99
|
+
3. use_figma → Fix any structural issues found
|
|
100
|
+
4. get_metadata → Re-verify fixes
|
|
101
|
+
5. ... repeat as needed ...
|
|
102
|
+
6. get_screenshot → Visual check after each major milestone
|
|
103
|
+
|
|
104
|
+
⚠️ ON ERROR at any step:
|
|
105
|
+
a. get_metadata → Inspect partial state (always do this first)
|
|
106
|
+
b. get_screenshot → Only if metadata doesn't make the damage clear
|
|
107
|
+
c. use_figma → Clean up orphaned/incomplete nodes
|
|
108
|
+
d. THEN retry the failed operation
|
|
109
|
+
```
|