@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
package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js
CHANGED
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bindVariablesToComponent
|
|
3
|
-
*
|
|
4
|
-
* Binds design token variables to the visual properties of a component node.
|
|
5
|
-
* Supports fills, strokes, all padding directions, item spacing, and corner radius.
|
|
6
|
-
* Only binds properties for which a variable ID is provided in `bindings`.
|
|
7
|
-
*
|
|
8
|
-
* This function should be called on each variant individually within a component
|
|
9
|
-
* set, OR on the component set itself for properties shared by all variants.
|
|
10
|
-
*
|
|
11
|
-
* @param {ComponentNode | FrameNode | RectangleNode} component
|
|
12
|
-
* The Figma node to mutate. Usually a ComponentNode or one of its children.
|
|
13
|
-
* @param {{
|
|
14
|
-
* fills?: string,
|
|
15
|
-
* strokes?: string,
|
|
16
|
-
* paddingTop?: string,
|
|
17
|
-
* paddingBottom?: string,
|
|
18
|
-
* paddingLeft?: string,
|
|
19
|
-
* paddingRight?: string,
|
|
20
|
-
* itemSpacing?: string,
|
|
21
|
-
* cornerRadius?: string
|
|
22
|
-
* }} bindings
|
|
23
|
-
* Each key is a visual property name; each value is a Figma Variable ID
|
|
24
|
-
* (e.g. "VariableID:123:456"). Omit a key to skip binding that property.
|
|
25
|
-
* @returns {{ mutatedNodeIds: string[] }}
|
|
26
|
-
* List of node IDs that were mutated (for audit/validation purposes).
|
|
27
|
-
*/
|
|
28
|
-
function bindVariablesToComponent(component, bindings) {
|
|
29
|
-
const mutatedNodeIds = []
|
|
30
|
-
|
|
31
|
-
if (!component) {
|
|
32
|
-
return { mutatedNodeIds }
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// --- Fills ---
|
|
36
|
-
if (bindings.fills) {
|
|
37
|
-
const fillVar = figma.variables.getVariableById(bindings.fills)
|
|
38
|
-
if (fillVar) {
|
|
39
|
-
const existingFills = component.fills
|
|
40
|
-
if (Array.isArray(existingFills) && existingFills.length > 0) {
|
|
41
|
-
// Bind the color of the first fill to the variable
|
|
42
|
-
const boundFill = figma.variables.setBoundVariableForPaint(
|
|
43
|
-
existingFills[0],
|
|
44
|
-
'color',
|
|
45
|
-
fillVar,
|
|
46
|
-
)
|
|
47
|
-
component.fills = [boundFill, ...existingFills.slice(1)]
|
|
48
|
-
} else {
|
|
49
|
-
// No existing fill — create a solid fill bound to the variable
|
|
50
|
-
const boundFill = figma.variables.setBoundVariableForPaint(
|
|
51
|
-
{ type: 'SOLID', color: { r: 0.5, g: 0.5, b: 0.5 } },
|
|
52
|
-
'color',
|
|
53
|
-
fillVar,
|
|
54
|
-
)
|
|
55
|
-
component.fills = [boundFill]
|
|
56
|
-
}
|
|
57
|
-
mutatedNodeIds.push(component.id)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// --- Strokes ---
|
|
62
|
-
if (bindings.strokes) {
|
|
63
|
-
const strokeVar = figma.variables.getVariableById(bindings.strokes)
|
|
64
|
-
if (strokeVar) {
|
|
65
|
-
const existingStrokes = component.strokes
|
|
66
|
-
if (Array.isArray(existingStrokes) && existingStrokes.length > 0) {
|
|
67
|
-
const boundStroke = figma.variables.setBoundVariableForPaint(
|
|
68
|
-
existingStrokes[0],
|
|
69
|
-
'color',
|
|
70
|
-
strokeVar,
|
|
71
|
-
)
|
|
72
|
-
component.strokes = [boundStroke, ...existingStrokes.slice(1)]
|
|
73
|
-
} else {
|
|
74
|
-
const boundStroke = figma.variables.setBoundVariableForPaint(
|
|
75
|
-
{ type: 'SOLID', color: { r: 0.5, g: 0.5, b: 0.5 } },
|
|
76
|
-
'color',
|
|
77
|
-
strokeVar,
|
|
78
|
-
)
|
|
79
|
-
component.strokes = [boundStroke]
|
|
80
|
-
}
|
|
81
|
-
if (!mutatedNodeIds.includes(component.id)) {
|
|
82
|
-
mutatedNodeIds.push(component.id)
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// --- Spacing properties (FLOAT variables bound via setBoundVariable) ---
|
|
88
|
-
const floatBindings = [
|
|
89
|
-
['paddingTop', 'paddingTop'],
|
|
90
|
-
['paddingBottom', 'paddingBottom'],
|
|
91
|
-
['paddingLeft', 'paddingLeft'],
|
|
92
|
-
['paddingRight', 'paddingRight'],
|
|
93
|
-
['itemSpacing', 'itemSpacing'],
|
|
94
|
-
['cornerRadius', 'cornerRadius'],
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
for (const [bindingKey, figmaProp] of floatBindings) {
|
|
98
|
-
if (bindings[bindingKey]) {
|
|
99
|
-
const variable = figma.variables.getVariableById(bindings[bindingKey])
|
|
100
|
-
if (variable) {
|
|
101
|
-
component.setBoundVariable(figmaProp, variable)
|
|
102
|
-
if (!mutatedNodeIds.includes(component.id)) {
|
|
103
|
-
mutatedNodeIds.push(component.id)
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return { mutatedNodeIds }
|
|
110
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* bindVariablesToComponent
|
|
3
|
+
*
|
|
4
|
+
* Binds design token variables to the visual properties of a component node.
|
|
5
|
+
* Supports fills, strokes, all padding directions, item spacing, and corner radius.
|
|
6
|
+
* Only binds properties for which a variable ID is provided in `bindings`.
|
|
7
|
+
*
|
|
8
|
+
* This function should be called on each variant individually within a component
|
|
9
|
+
* set, OR on the component set itself for properties shared by all variants.
|
|
10
|
+
*
|
|
11
|
+
* @param {ComponentNode | FrameNode | RectangleNode} component
|
|
12
|
+
* The Figma node to mutate. Usually a ComponentNode or one of its children.
|
|
13
|
+
* @param {{
|
|
14
|
+
* fills?: string,
|
|
15
|
+
* strokes?: string,
|
|
16
|
+
* paddingTop?: string,
|
|
17
|
+
* paddingBottom?: string,
|
|
18
|
+
* paddingLeft?: string,
|
|
19
|
+
* paddingRight?: string,
|
|
20
|
+
* itemSpacing?: string,
|
|
21
|
+
* cornerRadius?: string
|
|
22
|
+
* }} bindings
|
|
23
|
+
* Each key is a visual property name; each value is a Figma Variable ID
|
|
24
|
+
* (e.g. "VariableID:123:456"). Omit a key to skip binding that property.
|
|
25
|
+
* @returns {{ mutatedNodeIds: string[] }}
|
|
26
|
+
* List of node IDs that were mutated (for audit/validation purposes).
|
|
27
|
+
*/
|
|
28
|
+
function bindVariablesToComponent(component, bindings) {
|
|
29
|
+
const mutatedNodeIds = []
|
|
30
|
+
|
|
31
|
+
if (!component) {
|
|
32
|
+
return { mutatedNodeIds }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// --- Fills ---
|
|
36
|
+
if (bindings.fills) {
|
|
37
|
+
const fillVar = figma.variables.getVariableById(bindings.fills)
|
|
38
|
+
if (fillVar) {
|
|
39
|
+
const existingFills = component.fills
|
|
40
|
+
if (Array.isArray(existingFills) && existingFills.length > 0) {
|
|
41
|
+
// Bind the color of the first fill to the variable
|
|
42
|
+
const boundFill = figma.variables.setBoundVariableForPaint(
|
|
43
|
+
existingFills[0],
|
|
44
|
+
'color',
|
|
45
|
+
fillVar,
|
|
46
|
+
)
|
|
47
|
+
component.fills = [boundFill, ...existingFills.slice(1)]
|
|
48
|
+
} else {
|
|
49
|
+
// No existing fill — create a solid fill bound to the variable
|
|
50
|
+
const boundFill = figma.variables.setBoundVariableForPaint(
|
|
51
|
+
{ type: 'SOLID', color: { r: 0.5, g: 0.5, b: 0.5 } },
|
|
52
|
+
'color',
|
|
53
|
+
fillVar,
|
|
54
|
+
)
|
|
55
|
+
component.fills = [boundFill]
|
|
56
|
+
}
|
|
57
|
+
mutatedNodeIds.push(component.id)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// --- Strokes ---
|
|
62
|
+
if (bindings.strokes) {
|
|
63
|
+
const strokeVar = figma.variables.getVariableById(bindings.strokes)
|
|
64
|
+
if (strokeVar) {
|
|
65
|
+
const existingStrokes = component.strokes
|
|
66
|
+
if (Array.isArray(existingStrokes) && existingStrokes.length > 0) {
|
|
67
|
+
const boundStroke = figma.variables.setBoundVariableForPaint(
|
|
68
|
+
existingStrokes[0],
|
|
69
|
+
'color',
|
|
70
|
+
strokeVar,
|
|
71
|
+
)
|
|
72
|
+
component.strokes = [boundStroke, ...existingStrokes.slice(1)]
|
|
73
|
+
} else {
|
|
74
|
+
const boundStroke = figma.variables.setBoundVariableForPaint(
|
|
75
|
+
{ type: 'SOLID', color: { r: 0.5, g: 0.5, b: 0.5 } },
|
|
76
|
+
'color',
|
|
77
|
+
strokeVar,
|
|
78
|
+
)
|
|
79
|
+
component.strokes = [boundStroke]
|
|
80
|
+
}
|
|
81
|
+
if (!mutatedNodeIds.includes(component.id)) {
|
|
82
|
+
mutatedNodeIds.push(component.id)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// --- Spacing properties (FLOAT variables bound via setBoundVariable) ---
|
|
88
|
+
const floatBindings = [
|
|
89
|
+
['paddingTop', 'paddingTop'],
|
|
90
|
+
['paddingBottom', 'paddingBottom'],
|
|
91
|
+
['paddingLeft', 'paddingLeft'],
|
|
92
|
+
['paddingRight', 'paddingRight'],
|
|
93
|
+
['itemSpacing', 'itemSpacing'],
|
|
94
|
+
['cornerRadius', 'cornerRadius'],
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
for (const [bindingKey, figmaProp] of floatBindings) {
|
|
98
|
+
if (bindings[bindingKey]) {
|
|
99
|
+
const variable = figma.variables.getVariableById(bindings[bindingKey])
|
|
100
|
+
if (variable) {
|
|
101
|
+
component.setBoundVariable(figmaProp, variable)
|
|
102
|
+
if (!mutatedNodeIds.includes(component.id)) {
|
|
103
|
+
mutatedNodeIds.push(component.id)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { mutatedNodeIds }
|
|
110
|
+
}
|
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cleanupOrphans
|
|
3
|
-
*
|
|
4
|
-
* Finds and removes all Figma nodes (pages, frames, components, variables,
|
|
5
|
-
* and variable collections) that were tagged with the given `dsb_run_id`
|
|
6
|
-
* by a previous build run. This is safe cleanup: it uses plugin data tags,
|
|
7
|
-
* never name-prefix matching, so it cannot accidentally delete user-owned nodes.
|
|
8
|
-
*
|
|
9
|
-
* Use this when a build run fails mid-way and you need to reset to a clean
|
|
10
|
-
* slate before retrying. The function traverses the entire document looking
|
|
11
|
-
* for `dsb_run_id` plugin data matching `runId`.
|
|
12
|
-
*
|
|
13
|
-
* Variables and variable collections are handled separately (they are not
|
|
14
|
-
* scene nodes and cannot be discovered via node traversal).
|
|
15
|
-
*
|
|
16
|
-
* @param {string} runId - The dsb_run_id value to match (e.g. "ds-build-2024-001").
|
|
17
|
-
* @returns {Promise<{
|
|
18
|
-
* removedCount: number,
|
|
19
|
-
* removedIds: string[]
|
|
20
|
-
* }>}
|
|
21
|
-
*/
|
|
22
|
-
async function cleanupOrphans(runId) {
|
|
23
|
-
if (!runId) {
|
|
24
|
-
throw new Error('cleanupOrphans: runId is required.')
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const removedIds = []
|
|
28
|
-
const originalPage = figma.currentPage
|
|
29
|
-
|
|
30
|
-
// --- Remove tagged scene nodes (pages, frames, components, etc.) ---
|
|
31
|
-
// Collect pages to remove (can't remove during iteration)
|
|
32
|
-
const pagesToRemove = []
|
|
33
|
-
|
|
34
|
-
for (const page of figma.root.children) {
|
|
35
|
-
if (page.getPluginData('dsb_run_id') === runId) {
|
|
36
|
-
pagesToRemove.push(page)
|
|
37
|
-
continue
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Traverse all nodes on this page
|
|
41
|
-
await figma.setCurrentPageAsync(page)
|
|
42
|
-
|
|
43
|
-
const nodesToRemove = []
|
|
44
|
-
page.findAll((node) => {
|
|
45
|
-
if (node.getPluginData('dsb_run_id') === runId) {
|
|
46
|
-
nodesToRemove.push(node)
|
|
47
|
-
return false // Don't descend — removing the parent removes its children
|
|
48
|
-
}
|
|
49
|
-
return true
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
// Remove deepest nodes first (children before parents) to avoid
|
|
53
|
-
// "parent no longer exists" errors
|
|
54
|
-
const sorted = nodesToRemove.sort((a, b) => {
|
|
55
|
-
// Sort by depth descending: deeper nodes first
|
|
56
|
-
return getDepth(b) - getDepth(a)
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
for (const node of sorted) {
|
|
60
|
-
if (node && node.parent) {
|
|
61
|
-
removedIds.push(node.id)
|
|
62
|
-
node.remove()
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Remove tagged pages last
|
|
68
|
-
for (const page of pagesToRemove) {
|
|
69
|
-
// Cannot remove the last page in the document
|
|
70
|
-
if (figma.root.children.length <= 1) {
|
|
71
|
-
break
|
|
72
|
-
}
|
|
73
|
-
removedIds.push(page.id)
|
|
74
|
-
page.remove()
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// --- Remove tagged variables ---
|
|
78
|
-
const allVariables = figma.variables.getLocalVariables()
|
|
79
|
-
for (const variable of allVariables) {
|
|
80
|
-
if (variable.getPluginData('dsb_run_id') === runId) {
|
|
81
|
-
removedIds.push(variable.id)
|
|
82
|
-
variable.remove()
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// --- Remove tagged variable collections ---
|
|
87
|
-
// Must be done after variables are removed
|
|
88
|
-
const allCollections = figma.variables.getLocalVariableCollections()
|
|
89
|
-
for (const collection of allCollections) {
|
|
90
|
-
if (collection.getPluginData('dsb_run_id') === runId) {
|
|
91
|
-
removedIds.push(collection.id)
|
|
92
|
-
collection.remove()
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Restore original page (if it still exists)
|
|
97
|
-
try {
|
|
98
|
-
await figma.setCurrentPageAsync(originalPage)
|
|
99
|
-
} catch (_) {
|
|
100
|
-
// Original page was removed — switch to first available page
|
|
101
|
-
if (figma.root.children.length > 0) {
|
|
102
|
-
await figma.setCurrentPageAsync(figma.root.children[0])
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
removedCount: removedIds.length,
|
|
108
|
-
removedIds,
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Returns the depth of a node in the document tree.
|
|
114
|
-
* Root children (pages) have depth 1; their children have depth 2; etc.
|
|
115
|
-
*
|
|
116
|
-
* @param {BaseNode} node
|
|
117
|
-
* @returns {number}
|
|
118
|
-
*/
|
|
119
|
-
function getDepth(node) {
|
|
120
|
-
let depth = 0
|
|
121
|
-
let current = node
|
|
122
|
-
while (current.parent) {
|
|
123
|
-
depth++
|
|
124
|
-
current = current.parent
|
|
125
|
-
}
|
|
126
|
-
return depth
|
|
127
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* cleanupOrphans
|
|
3
|
+
*
|
|
4
|
+
* Finds and removes all Figma nodes (pages, frames, components, variables,
|
|
5
|
+
* and variable collections) that were tagged with the given `dsb_run_id`
|
|
6
|
+
* by a previous build run. This is safe cleanup: it uses plugin data tags,
|
|
7
|
+
* never name-prefix matching, so it cannot accidentally delete user-owned nodes.
|
|
8
|
+
*
|
|
9
|
+
* Use this when a build run fails mid-way and you need to reset to a clean
|
|
10
|
+
* slate before retrying. The function traverses the entire document looking
|
|
11
|
+
* for `dsb_run_id` plugin data matching `runId`.
|
|
12
|
+
*
|
|
13
|
+
* Variables and variable collections are handled separately (they are not
|
|
14
|
+
* scene nodes and cannot be discovered via node traversal).
|
|
15
|
+
*
|
|
16
|
+
* @param {string} runId - The dsb_run_id value to match (e.g. "ds-build-2024-001").
|
|
17
|
+
* @returns {Promise<{
|
|
18
|
+
* removedCount: number,
|
|
19
|
+
* removedIds: string[]
|
|
20
|
+
* }>}
|
|
21
|
+
*/
|
|
22
|
+
async function cleanupOrphans(runId) {
|
|
23
|
+
if (!runId) {
|
|
24
|
+
throw new Error('cleanupOrphans: runId is required.')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const removedIds = []
|
|
28
|
+
const originalPage = figma.currentPage
|
|
29
|
+
|
|
30
|
+
// --- Remove tagged scene nodes (pages, frames, components, etc.) ---
|
|
31
|
+
// Collect pages to remove (can't remove during iteration)
|
|
32
|
+
const pagesToRemove = []
|
|
33
|
+
|
|
34
|
+
for (const page of figma.root.children) {
|
|
35
|
+
if (page.getPluginData('dsb_run_id') === runId) {
|
|
36
|
+
pagesToRemove.push(page)
|
|
37
|
+
continue
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Traverse all nodes on this page
|
|
41
|
+
await figma.setCurrentPageAsync(page)
|
|
42
|
+
|
|
43
|
+
const nodesToRemove = []
|
|
44
|
+
page.findAll((node) => {
|
|
45
|
+
if (node.getPluginData('dsb_run_id') === runId) {
|
|
46
|
+
nodesToRemove.push(node)
|
|
47
|
+
return false // Don't descend — removing the parent removes its children
|
|
48
|
+
}
|
|
49
|
+
return true
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
// Remove deepest nodes first (children before parents) to avoid
|
|
53
|
+
// "parent no longer exists" errors
|
|
54
|
+
const sorted = nodesToRemove.sort((a, b) => {
|
|
55
|
+
// Sort by depth descending: deeper nodes first
|
|
56
|
+
return getDepth(b) - getDepth(a)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
for (const node of sorted) {
|
|
60
|
+
if (node && node.parent) {
|
|
61
|
+
removedIds.push(node.id)
|
|
62
|
+
node.remove()
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Remove tagged pages last
|
|
68
|
+
for (const page of pagesToRemove) {
|
|
69
|
+
// Cannot remove the last page in the document
|
|
70
|
+
if (figma.root.children.length <= 1) {
|
|
71
|
+
break
|
|
72
|
+
}
|
|
73
|
+
removedIds.push(page.id)
|
|
74
|
+
page.remove()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// --- Remove tagged variables ---
|
|
78
|
+
const allVariables = figma.variables.getLocalVariables()
|
|
79
|
+
for (const variable of allVariables) {
|
|
80
|
+
if (variable.getPluginData('dsb_run_id') === runId) {
|
|
81
|
+
removedIds.push(variable.id)
|
|
82
|
+
variable.remove()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// --- Remove tagged variable collections ---
|
|
87
|
+
// Must be done after variables are removed
|
|
88
|
+
const allCollections = figma.variables.getLocalVariableCollections()
|
|
89
|
+
for (const collection of allCollections) {
|
|
90
|
+
if (collection.getPluginData('dsb_run_id') === runId) {
|
|
91
|
+
removedIds.push(collection.id)
|
|
92
|
+
collection.remove()
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Restore original page (if it still exists)
|
|
97
|
+
try {
|
|
98
|
+
await figma.setCurrentPageAsync(originalPage)
|
|
99
|
+
} catch (_) {
|
|
100
|
+
// Original page was removed — switch to first available page
|
|
101
|
+
if (figma.root.children.length > 0) {
|
|
102
|
+
await figma.setCurrentPageAsync(figma.root.children[0])
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
removedCount: removedIds.length,
|
|
108
|
+
removedIds,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Returns the depth of a node in the document tree.
|
|
114
|
+
* Root children (pages) have depth 1; their children have depth 2; etc.
|
|
115
|
+
*
|
|
116
|
+
* @param {BaseNode} node
|
|
117
|
+
* @returns {number}
|
|
118
|
+
*/
|
|
119
|
+
function getDepth(node) {
|
|
120
|
+
let depth = 0
|
|
121
|
+
let current = node
|
|
122
|
+
while (current.parent) {
|
|
123
|
+
depth++
|
|
124
|
+
current = current.parent
|
|
125
|
+
}
|
|
126
|
+
return depth
|
|
127
|
+
}
|