@obra-studio/figma-console-mcp 1.32.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/LICENSE +21 -0
- package/README.md +879 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
- package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
- package/dist/apps/design-system-dashboard/server.d.ts +24 -0
- package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/server.js +160 -0
- package/dist/apps/design-system-dashboard/server.js.map +1 -0
- package/dist/apps/token-browser/server.d.ts +26 -0
- package/dist/apps/token-browser/server.d.ts.map +1 -0
- package/dist/apps/token-browser/server.js +137 -0
- package/dist/apps/token-browser/server.js.map +1 -0
- package/dist/browser/base.d.ts +58 -0
- package/dist/browser/base.d.ts.map +1 -0
- package/dist/browser/base.js +6 -0
- package/dist/browser/base.js.map +1 -0
- package/dist/browser/local.d.ts +87 -0
- package/dist/browser/local.d.ts.map +1 -0
- package/dist/browser/local.js +318 -0
- package/dist/browser/local.js.map +1 -0
- package/dist/core/accessibility-tools.d.ts +21 -0
- package/dist/core/accessibility-tools.d.ts.map +1 -0
- package/dist/core/accessibility-tools.js +307 -0
- package/dist/core/accessibility-tools.js.map +1 -0
- package/dist/core/annotation-tools.d.ts +14 -0
- package/dist/core/annotation-tools.d.ts.map +1 -0
- package/dist/core/annotation-tools.js +231 -0
- package/dist/core/annotation-tools.js.map +1 -0
- package/dist/core/autodocs-tools.d.ts +7 -0
- package/dist/core/autodocs-tools.d.ts.map +1 -0
- package/dist/core/autodocs-tools.js +195 -0
- package/dist/core/autodocs-tools.js.map +1 -0
- package/dist/core/comment-tools.d.ts +11 -0
- package/dist/core/comment-tools.d.ts.map +1 -0
- package/dist/core/comment-tools.js +293 -0
- package/dist/core/comment-tools.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +154 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/console-monitor.d.ts +82 -0
- package/dist/core/console-monitor.d.ts.map +1 -0
- package/dist/core/console-monitor.js +428 -0
- package/dist/core/console-monitor.js.map +1 -0
- package/dist/core/deep-component-tools.d.ts +14 -0
- package/dist/core/deep-component-tools.d.ts.map +1 -0
- package/dist/core/deep-component-tools.js +129 -0
- package/dist/core/deep-component-tools.js.map +1 -0
- package/dist/core/design-code-tools.d.ts +116 -0
- package/dist/core/design-code-tools.d.ts.map +1 -0
- package/dist/core/design-code-tools.js +2751 -0
- package/dist/core/design-code-tools.js.map +1 -0
- package/dist/core/design-system-manifest.d.ts +272 -0
- package/dist/core/design-system-manifest.d.ts.map +1 -0
- package/dist/core/design-system-manifest.js +261 -0
- package/dist/core/design-system-manifest.js.map +1 -0
- package/dist/core/design-system-tools.d.ts +67 -0
- package/dist/core/design-system-tools.d.ts.map +1 -0
- package/dist/core/design-system-tools.js +874 -0
- package/dist/core/design-system-tools.js.map +1 -0
- package/dist/core/diagnose-tool.d.ts +33 -0
- package/dist/core/diagnose-tool.d.ts.map +1 -0
- package/dist/core/diagnose-tool.js +97 -0
- package/dist/core/diagnose-tool.js.map +1 -0
- package/dist/core/diff/changelog-formatter.d.ts +35 -0
- package/dist/core/diff/changelog-formatter.d.ts.map +1 -0
- package/dist/core/diff/changelog-formatter.js +276 -0
- package/dist/core/diff/changelog-formatter.js.map +1 -0
- package/dist/core/diff/diff-engine.d.ts +127 -0
- package/dist/core/diff/diff-engine.d.ts.map +1 -0
- package/dist/core/diff/diff-engine.js +335 -0
- package/dist/core/diff/diff-engine.js.map +1 -0
- package/dist/core/diff/property-compare.d.ts +19 -0
- package/dist/core/diff/property-compare.d.ts.map +1 -0
- package/dist/core/diff/property-compare.js +37 -0
- package/dist/core/diff/property-compare.js.map +1 -0
- package/dist/core/diff/version-cache.d.ts +40 -0
- package/dist/core/diff/version-cache.d.ts.map +1 -0
- package/dist/core/diff/version-cache.js +75 -0
- package/dist/core/diff/version-cache.js.map +1 -0
- package/dist/core/enrichment/enrichment-service.d.ts +52 -0
- package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
- package/dist/core/enrichment/enrichment-service.js +369 -0
- package/dist/core/enrichment/enrichment-service.js.map +1 -0
- package/dist/core/enrichment/index.d.ts +8 -0
- package/dist/core/enrichment/index.d.ts.map +1 -0
- package/dist/core/enrichment/index.js +8 -0
- package/dist/core/enrichment/index.js.map +1 -0
- package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
- package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
- package/dist/core/enrichment/relationship-mapper.js +352 -0
- package/dist/core/enrichment/relationship-mapper.js.map +1 -0
- package/dist/core/enrichment/style-resolver.d.ts +80 -0
- package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
- package/dist/core/enrichment/style-resolver.js +327 -0
- package/dist/core/enrichment/style-resolver.js.map +1 -0
- package/dist/core/figjam-tools.d.ts +8 -0
- package/dist/core/figjam-tools.d.ts.map +1 -0
- package/dist/core/figjam-tools.js +548 -0
- package/dist/core/figjam-tools.js.map +1 -0
- package/dist/core/figma-api.d.ts +245 -0
- package/dist/core/figma-api.d.ts.map +1 -0
- package/dist/core/figma-api.js +446 -0
- package/dist/core/figma-api.js.map +1 -0
- package/dist/core/figma-connector.d.ts +180 -0
- package/dist/core/figma-connector.d.ts.map +1 -0
- package/dist/core/figma-connector.js +8 -0
- package/dist/core/figma-connector.js.map +1 -0
- package/dist/core/figma-desktop-connector.d.ts +312 -0
- package/dist/core/figma-desktop-connector.d.ts.map +1 -0
- package/dist/core/figma-desktop-connector.js +1298 -0
- package/dist/core/figma-desktop-connector.js.map +1 -0
- package/dist/core/figma-reconstruction-spec.d.ts +166 -0
- package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
- package/dist/core/figma-reconstruction-spec.js +403 -0
- package/dist/core/figma-reconstruction-spec.js.map +1 -0
- package/dist/core/figma-style-extractor.d.ts +76 -0
- package/dist/core/figma-style-extractor.d.ts.map +1 -0
- package/dist/core/figma-style-extractor.js +312 -0
- package/dist/core/figma-style-extractor.js.map +1 -0
- package/dist/core/figma-tools.d.ts +22 -0
- package/dist/core/figma-tools.d.ts.map +1 -0
- package/dist/core/figma-tools.js +3187 -0
- package/dist/core/figma-tools.js.map +1 -0
- package/dist/core/identity.d.ts +41 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +97 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/library-tools.d.ts +17 -0
- package/dist/core/library-tools.d.ts.map +1 -0
- package/dist/core/library-tools.js +581 -0
- package/dist/core/library-tools.js.map +1 -0
- package/dist/core/logger.d.ts +22 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/port-discovery.d.ts +171 -0
- package/dist/core/port-discovery.d.ts.map +1 -0
- package/dist/core/port-discovery.js +563 -0
- package/dist/core/port-discovery.js.map +1 -0
- package/dist/core/resolve-package-root.d.ts +2 -0
- package/dist/core/resolve-package-root.d.ts.map +1 -0
- package/dist/core/resolve-package-root.js +12 -0
- package/dist/core/resolve-package-root.js.map +1 -0
- package/dist/core/slides-tools.d.ts +8 -0
- package/dist/core/slides-tools.d.ts.map +1 -0
- package/dist/core/slides-tools.js +715 -0
- package/dist/core/slides-tools.js.map +1 -0
- package/dist/core/snippet-injector.d.ts +24 -0
- package/dist/core/snippet-injector.d.ts.map +1 -0
- package/dist/core/snippet-injector.js +97 -0
- package/dist/core/snippet-injector.js.map +1 -0
- package/dist/core/tokens/alias-resolver.d.ts +55 -0
- package/dist/core/tokens/alias-resolver.d.ts.map +1 -0
- package/dist/core/tokens/alias-resolver.js +136 -0
- package/dist/core/tokens/alias-resolver.js.map +1 -0
- package/dist/core/tokens/config.d.ts +87 -0
- package/dist/core/tokens/config.d.ts.map +1 -0
- package/dist/core/tokens/config.js +285 -0
- package/dist/core/tokens/config.js.map +1 -0
- package/dist/core/tokens/figma-converter.d.ts +81 -0
- package/dist/core/tokens/figma-converter.d.ts.map +1 -0
- package/dist/core/tokens/figma-converter.js +196 -0
- package/dist/core/tokens/figma-converter.js.map +1 -0
- package/dist/core/tokens/formatters/css-vars.d.ts +24 -0
- package/dist/core/tokens/formatters/css-vars.d.ts.map +1 -0
- package/dist/core/tokens/formatters/css-vars.js +330 -0
- package/dist/core/tokens/formatters/css-vars.js.map +1 -0
- package/dist/core/tokens/formatters/dtcg.d.ts +28 -0
- package/dist/core/tokens/formatters/dtcg.d.ts.map +1 -0
- package/dist/core/tokens/formatters/dtcg.js +301 -0
- package/dist/core/tokens/formatters/dtcg.js.map +1 -0
- package/dist/core/tokens/formatters/index.d.ts +30 -0
- package/dist/core/tokens/formatters/index.d.ts.map +1 -0
- package/dist/core/tokens/formatters/index.js +46 -0
- package/dist/core/tokens/formatters/index.js.map +1 -0
- package/dist/core/tokens/formatters/json.d.ts +37 -0
- package/dist/core/tokens/formatters/json.d.ts.map +1 -0
- package/dist/core/tokens/formatters/json.js +188 -0
- package/dist/core/tokens/formatters/json.js.map +1 -0
- package/dist/core/tokens/formatters/less.d.ts +4 -0
- package/dist/core/tokens/formatters/less.d.ts.map +1 -0
- package/dist/core/tokens/formatters/less.js +5 -0
- package/dist/core/tokens/formatters/less.js.map +1 -0
- package/dist/core/tokens/formatters/scss.d.ts +26 -0
- package/dist/core/tokens/formatters/scss.d.ts.map +1 -0
- package/dist/core/tokens/formatters/scss.js +253 -0
- package/dist/core/tokens/formatters/scss.js.map +1 -0
- package/dist/core/tokens/formatters/stubs.d.ts +9 -0
- package/dist/core/tokens/formatters/stubs.d.ts.map +1 -0
- package/dist/core/tokens/formatters/stubs.js +14 -0
- package/dist/core/tokens/formatters/stubs.js.map +1 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts +45 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts.map +1 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.js +208 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.js.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v3.d.ts +37 -0
- package/dist/core/tokens/formatters/tailwind-v3.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v3.js +238 -0
- package/dist/core/tokens/formatters/tailwind-v3.js.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v4.d.ts +41 -0
- package/dist/core/tokens/formatters/tailwind-v4.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v4.js +331 -0
- package/dist/core/tokens/formatters/tailwind-v4.js.map +1 -0
- package/dist/core/tokens/formatters/tokens-studio.d.ts +44 -0
- package/dist/core/tokens/formatters/tokens-studio.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tokens-studio.js +251 -0
- package/dist/core/tokens/formatters/tokens-studio.js.map +1 -0
- package/dist/core/tokens/formatters/ts-module.d.ts +35 -0
- package/dist/core/tokens/formatters/ts-module.d.ts.map +1 -0
- package/dist/core/tokens/formatters/ts-module.js +199 -0
- package/dist/core/tokens/formatters/ts-module.js.map +1 -0
- package/dist/core/tokens/index.d.ts +17 -0
- package/dist/core/tokens/index.d.ts.map +1 -0
- package/dist/core/tokens/index.js +16 -0
- package/dist/core/tokens/index.js.map +1 -0
- package/dist/core/tokens/parsers/css-vars.d.ts +3 -0
- package/dist/core/tokens/parsers/css-vars.d.ts.map +1 -0
- package/dist/core/tokens/parsers/css-vars.js +5 -0
- package/dist/core/tokens/parsers/css-vars.js.map +1 -0
- package/dist/core/tokens/parsers/dtcg.d.ts +21 -0
- package/dist/core/tokens/parsers/dtcg.d.ts.map +1 -0
- package/dist/core/tokens/parsers/dtcg.js +254 -0
- package/dist/core/tokens/parsers/dtcg.js.map +1 -0
- package/dist/core/tokens/parsers/index.d.ts +37 -0
- package/dist/core/tokens/parsers/index.d.ts.map +1 -0
- package/dist/core/tokens/parsers/index.js +139 -0
- package/dist/core/tokens/parsers/index.js.map +1 -0
- package/dist/core/tokens/parsers/json.d.ts +4 -0
- package/dist/core/tokens/parsers/json.d.ts.map +1 -0
- package/dist/core/tokens/parsers/json.js +8 -0
- package/dist/core/tokens/parsers/json.js.map +1 -0
- package/dist/core/tokens/parsers/scss.d.ts +3 -0
- package/dist/core/tokens/parsers/scss.d.ts.map +1 -0
- package/dist/core/tokens/parsers/scss.js +5 -0
- package/dist/core/tokens/parsers/scss.js.map +1 -0
- package/dist/core/tokens/parsers/stubs.d.ts +15 -0
- package/dist/core/tokens/parsers/stubs.d.ts.map +1 -0
- package/dist/core/tokens/parsers/stubs.js +21 -0
- package/dist/core/tokens/parsers/stubs.js.map +1 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.d.ts +3 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.d.ts.map +1 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.js +5 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.js.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v3.d.ts +3 -0
- package/dist/core/tokens/parsers/tailwind-v3.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v3.js +5 -0
- package/dist/core/tokens/parsers/tailwind-v3.js.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v4.d.ts +3 -0
- package/dist/core/tokens/parsers/tailwind-v4.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v4.js +5 -0
- package/dist/core/tokens/parsers/tailwind-v4.js.map +1 -0
- package/dist/core/tokens/parsers/tokens-studio.d.ts +3 -0
- package/dist/core/tokens/parsers/tokens-studio.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tokens-studio.js +5 -0
- package/dist/core/tokens/parsers/tokens-studio.js.map +1 -0
- package/dist/core/tokens/schemas.d.ts +31 -0
- package/dist/core/tokens/schemas.d.ts.map +1 -0
- package/dist/core/tokens/schemas.js +149 -0
- package/dist/core/tokens/schemas.js.map +1 -0
- package/dist/core/tokens/transforms/color.d.ts +9 -0
- package/dist/core/tokens/transforms/color.d.ts.map +1 -0
- package/dist/core/tokens/transforms/color.js +13 -0
- package/dist/core/tokens/transforms/color.js.map +1 -0
- package/dist/core/tokens/transforms/index.d.ts +36 -0
- package/dist/core/tokens/transforms/index.d.ts.map +1 -0
- package/dist/core/tokens/transforms/index.js +30 -0
- package/dist/core/tokens/transforms/index.js.map +1 -0
- package/dist/core/tokens/transforms/size.d.ts +7 -0
- package/dist/core/tokens/transforms/size.d.ts.map +1 -0
- package/dist/core/tokens/transforms/size.js +8 -0
- package/dist/core/tokens/transforms/size.js.map +1 -0
- package/dist/core/tokens/types.d.ts +228 -0
- package/dist/core/tokens/types.d.ts.map +1 -0
- package/dist/core/tokens/types.js +19 -0
- package/dist/core/tokens/types.js.map +1 -0
- package/dist/core/tokens-tools.d.ts +42 -0
- package/dist/core/tokens-tools.d.ts.map +1 -0
- package/dist/core/tokens-tools.js +860 -0
- package/dist/core/tokens-tools.js.map +1 -0
- package/dist/core/types/design-code.d.ts +271 -0
- package/dist/core/types/design-code.d.ts.map +1 -0
- package/dist/core/types/design-code.js +5 -0
- package/dist/core/types/design-code.js.map +1 -0
- package/dist/core/types/enriched.d.ts +213 -0
- package/dist/core/types/enriched.d.ts.map +1 -0
- package/dist/core/types/enriched.js +6 -0
- package/dist/core/types/enriched.js.map +1 -0
- package/dist/core/types/index.d.ts +104 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +5 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/variable-resolver.d.ts +45 -0
- package/dist/core/variable-resolver.d.ts.map +1 -0
- package/dist/core/variable-resolver.js +86 -0
- package/dist/core/variable-resolver.js.map +1 -0
- package/dist/core/version-tools.d.ts +59 -0
- package/dist/core/version-tools.d.ts.map +1 -0
- package/dist/core/version-tools.js +1159 -0
- package/dist/core/version-tools.js.map +1 -0
- package/dist/core/websocket-connector.d.ts +187 -0
- package/dist/core/websocket-connector.d.ts.map +1 -0
- package/dist/core/websocket-connector.js +378 -0
- package/dist/core/websocket-connector.js.map +1 -0
- package/dist/core/websocket-server.js +866 -0
- package/dist/core/websocket-server.js.map +1 -0
- package/dist/core/write-tools.d.ts +7 -0
- package/dist/core/write-tools.d.ts.map +1 -0
- package/dist/core/write-tools.js +2172 -0
- package/dist/core/write-tools.js.map +1 -0
- package/dist/local.d.ts +95 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +3036 -0
- package/dist/local.js.map +1 -0
- package/dist/vendor/obra-autodocs/autodocs-body.generated.d.ts +2 -0
- package/dist/vendor/obra-autodocs/autodocs-body.generated.d.ts.map +1 -0
- package/dist/vendor/obra-autodocs/autodocs-body.generated.js +6 -0
- package/dist/vendor/obra-autodocs/autodocs-body.generated.js.map +1 -0
- package/figma-desktop-bridge/README.md +365 -0
- package/figma-desktop-bridge/code.js +6504 -0
- package/figma-desktop-bridge/icon.png +0 -0
- package/figma-desktop-bridge/manifest.json +67 -0
- package/figma-desktop-bridge/ui.html +2441 -0
- package/package.json +98 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console Monitor
|
|
3
|
+
* Captures and manages console logs from Figma plugins
|
|
4
|
+
* Monitors both main page console AND Web Worker consoles (where Figma plugins run)
|
|
5
|
+
*/
|
|
6
|
+
import { createChildLogger } from './logger.js';
|
|
7
|
+
const logger = createChildLogger({ component: 'console-monitor' });
|
|
8
|
+
/**
|
|
9
|
+
* Console Monitor
|
|
10
|
+
* Listens to page console events and maintains a circular buffer of logs
|
|
11
|
+
* Also monitors Web Workers to capture Figma plugin console logs
|
|
12
|
+
*/
|
|
13
|
+
export class ConsoleMonitor {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.logs = [];
|
|
16
|
+
this.isMonitoring = false;
|
|
17
|
+
this.page = null; // @cloudflare/puppeteer Page (this class is cloud-mode-only after Phase 3).
|
|
18
|
+
this.workers = new Set();
|
|
19
|
+
this.lastUrl = ''; // Track the last URL to detect real navigations vs hash changes
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Start monitoring console logs on a page.
|
|
24
|
+
* Accepts the @cloudflare/puppeteer Page type (cloud mode only).
|
|
25
|
+
*/
|
|
26
|
+
async startMonitoring(page) {
|
|
27
|
+
if (this.isMonitoring && this.page === page) {
|
|
28
|
+
logger.info('Already monitoring this page');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.page = page;
|
|
32
|
+
this.isMonitoring = true;
|
|
33
|
+
logger.info('Starting console monitoring (page + workers + frames)');
|
|
34
|
+
// DIAGNOSTIC: Log all frames on the page and add to console
|
|
35
|
+
const frames = page.frames();
|
|
36
|
+
logger.info({ frameCount: frames.length }, 'Frames detected on page');
|
|
37
|
+
// Add diagnostic marker to console logs
|
|
38
|
+
this.addLog({
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
level: 'info',
|
|
41
|
+
message: `[MCP DIAGNOSTIC] Monitoring started. Detected ${frames.length} frames and ${page.workers().length} workers.`,
|
|
42
|
+
args: [],
|
|
43
|
+
source: 'page',
|
|
44
|
+
});
|
|
45
|
+
for (const frame of frames) {
|
|
46
|
+
const frameUrl = frame.url();
|
|
47
|
+
const frameName = frame.name() || 'unnamed';
|
|
48
|
+
logger.info({
|
|
49
|
+
frameUrl,
|
|
50
|
+
isDetached: frame.isDetached(),
|
|
51
|
+
name: frameName
|
|
52
|
+
}, 'Frame details');
|
|
53
|
+
// Add frame detection to console logs
|
|
54
|
+
this.addLog({
|
|
55
|
+
timestamp: Date.now(),
|
|
56
|
+
level: 'info',
|
|
57
|
+
message: `[MCP DIAGNOSTIC] Frame detected: ${frameName} - ${frameUrl}`,
|
|
58
|
+
args: [],
|
|
59
|
+
source: 'page',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Listen to ALL console events (includes main page, iframes, and workers)
|
|
63
|
+
page.on('console', async (msg) => {
|
|
64
|
+
try {
|
|
65
|
+
const location = msg.location();
|
|
66
|
+
const url = location?.url || 'unknown';
|
|
67
|
+
const text = msg.text();
|
|
68
|
+
const type = msg.type();
|
|
69
|
+
// DIAGNOSTIC: Log every console event with its source
|
|
70
|
+
logger.info({
|
|
71
|
+
type,
|
|
72
|
+
url,
|
|
73
|
+
textPreview: text.substring(0, 100),
|
|
74
|
+
location
|
|
75
|
+
}, 'Console event captured');
|
|
76
|
+
const entry = await this.processConsoleMessage(msg, 'page', url);
|
|
77
|
+
if (entry) {
|
|
78
|
+
this.addLog(entry);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.error({ error }, 'Failed to process console message');
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// Listen to page errors
|
|
86
|
+
page.on('pageerror', (error) => {
|
|
87
|
+
this.addLog({
|
|
88
|
+
timestamp: Date.now(),
|
|
89
|
+
level: 'error',
|
|
90
|
+
message: error.message,
|
|
91
|
+
args: [],
|
|
92
|
+
stackTrace: {
|
|
93
|
+
callFrames: error.stack
|
|
94
|
+
? error.stack.split('\n').map((line) => ({
|
|
95
|
+
functionName: line.trim(),
|
|
96
|
+
url: '',
|
|
97
|
+
lineNumber: 0,
|
|
98
|
+
columnNumber: 0,
|
|
99
|
+
}))
|
|
100
|
+
: [],
|
|
101
|
+
},
|
|
102
|
+
source: 'page',
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// Monitor existing workers (for Figma plugin console logs)
|
|
106
|
+
const existingWorkers = page.workers();
|
|
107
|
+
logger.info({ workerCount: existingWorkers.length }, 'Found existing workers');
|
|
108
|
+
for (const worker of existingWorkers) {
|
|
109
|
+
this.attachWorkerListeners(worker);
|
|
110
|
+
}
|
|
111
|
+
// Listen for new workers being created (e.g., when plugin starts)
|
|
112
|
+
page.on('workercreated', (worker) => {
|
|
113
|
+
logger.info({ workerUrl: worker.url() }, 'New worker created');
|
|
114
|
+
this.attachWorkerListeners(worker);
|
|
115
|
+
});
|
|
116
|
+
// Listen for workers being destroyed
|
|
117
|
+
page.on('workerdestroyed', (worker) => {
|
|
118
|
+
logger.info({ workerUrl: worker.url() }, 'Worker destroyed');
|
|
119
|
+
this.workers.delete(worker);
|
|
120
|
+
});
|
|
121
|
+
// Listen for new frames being attached (e.g., when plugin UI loads)
|
|
122
|
+
page.on('frameattached', (frame) => {
|
|
123
|
+
const frameUrl = frame.url();
|
|
124
|
+
const frameName = frame.name() || 'unnamed';
|
|
125
|
+
logger.info({ frameUrl, frameName }, 'New frame attached');
|
|
126
|
+
// Add diagnostic marker for new frame
|
|
127
|
+
this.addLog({
|
|
128
|
+
timestamp: Date.now(),
|
|
129
|
+
level: 'info',
|
|
130
|
+
message: `[MCP DIAGNOSTIC] New frame attached: ${frameName} - ${frameUrl}`,
|
|
131
|
+
args: [],
|
|
132
|
+
source: 'page',
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
// Listen for frames being detached
|
|
136
|
+
page.on('framedetached', (frame) => {
|
|
137
|
+
logger.info({ frameUrl: frame.url() }, 'Frame detached');
|
|
138
|
+
});
|
|
139
|
+
// Listen for main frame navigation - clear logs when navigating to a DIFFERENT page
|
|
140
|
+
// (not just hash changes or SPA navigations within the same Figma file)
|
|
141
|
+
page.on('framenavigated', (frame) => {
|
|
142
|
+
// Only handle main frame navigation (not iframe navigations)
|
|
143
|
+
if (frame === page.mainFrame()) {
|
|
144
|
+
const frameUrl = frame.url();
|
|
145
|
+
// Extract base URL without hash/query params to detect real navigation
|
|
146
|
+
const getBaseUrl = (url) => {
|
|
147
|
+
try {
|
|
148
|
+
const urlObj = new URL(url);
|
|
149
|
+
// For Figma, consider the file ID part of the path
|
|
150
|
+
// Example: https://figma.com/design/FILE_ID/...
|
|
151
|
+
// Only clear if the file ID changes
|
|
152
|
+
return urlObj.origin + urlObj.pathname.split('?')[0].split('#')[0];
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return url;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const currentBaseUrl = getBaseUrl(frameUrl);
|
|
159
|
+
const previousBaseUrl = this.lastUrl ? getBaseUrl(this.lastUrl) : '';
|
|
160
|
+
// Only clear logs if we've actually navigated to a different file
|
|
161
|
+
// (not just hash changes like going from one component to another)
|
|
162
|
+
if (previousBaseUrl && currentBaseUrl !== previousBaseUrl) {
|
|
163
|
+
logger.info({
|
|
164
|
+
from: previousBaseUrl,
|
|
165
|
+
to: currentBaseUrl
|
|
166
|
+
}, 'Navigated to different file - clearing console logs');
|
|
167
|
+
// Clear old logs to prevent stale data from previous file
|
|
168
|
+
this.logs = [];
|
|
169
|
+
// Add diagnostic marker for navigation
|
|
170
|
+
this.addLog({
|
|
171
|
+
timestamp: Date.now(),
|
|
172
|
+
level: 'info',
|
|
173
|
+
message: `[MCP DIAGNOSTIC] Navigated to new file: ${frameUrl}. Console logs cleared.`,
|
|
174
|
+
args: [],
|
|
175
|
+
source: 'page',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// Update last URL for next comparison
|
|
179
|
+
this.lastUrl = frameUrl;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
logger.info({
|
|
183
|
+
pageMonitoring: true,
|
|
184
|
+
workerMonitoring: true,
|
|
185
|
+
frameMonitoring: true,
|
|
186
|
+
initialWorkerCount: existingWorkers.length,
|
|
187
|
+
initialFrameCount: frames.length
|
|
188
|
+
}, 'Console monitoring started');
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Attach console listeners to a Web Worker
|
|
192
|
+
* This captures Figma plugin console logs
|
|
193
|
+
*/
|
|
194
|
+
attachWorkerListeners(worker) {
|
|
195
|
+
this.workers.add(worker);
|
|
196
|
+
const workerUrl = worker.url();
|
|
197
|
+
logger.info({ workerUrl }, 'Attaching console listener to worker');
|
|
198
|
+
// DIAGNOSTIC: Log a marker when worker listener is attached
|
|
199
|
+
this.addLog({
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
level: 'info',
|
|
202
|
+
message: `[MCP] Worker detected and monitored: ${workerUrl}`,
|
|
203
|
+
args: [],
|
|
204
|
+
source: 'plugin',
|
|
205
|
+
workerUrl,
|
|
206
|
+
});
|
|
207
|
+
// Listen to worker console events
|
|
208
|
+
worker.on('console', async (msg) => {
|
|
209
|
+
try {
|
|
210
|
+
logger.info({ workerUrl, type: msg.type(), text: msg.text() }, 'Worker console event received');
|
|
211
|
+
const entry = await this.processConsoleMessage(msg, 'worker', workerUrl);
|
|
212
|
+
if (entry) {
|
|
213
|
+
this.addLog(entry);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger.error({ error, workerUrl }, 'Failed to process worker console message');
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// Worker doesn't have pageerror, but console.error will be captured above
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Process console message from Puppeteer
|
|
224
|
+
* @param msg - Console message from page or worker
|
|
225
|
+
* @param context - Where the message came from ('page' or 'worker')
|
|
226
|
+
* @param workerUrl - URL of the worker (if context is 'worker')
|
|
227
|
+
*/
|
|
228
|
+
async processConsoleMessage(msg, context, workerUrl) {
|
|
229
|
+
const level = msg.type();
|
|
230
|
+
// Filter by configured levels
|
|
231
|
+
if (this.config.filterLevels.length > 0 &&
|
|
232
|
+
!this.config.filterLevels.includes(level)) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
// Extract message text
|
|
237
|
+
const message = msg.text();
|
|
238
|
+
// Extract arguments (with truncation)
|
|
239
|
+
const args = await Promise.all(msg.args().map(async (arg) => {
|
|
240
|
+
try {
|
|
241
|
+
const jsonValue = await arg.jsonValue();
|
|
242
|
+
return this.truncateValue(jsonValue);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return String(arg);
|
|
246
|
+
}
|
|
247
|
+
}));
|
|
248
|
+
// Determine source based on context
|
|
249
|
+
let source;
|
|
250
|
+
if (context === 'worker') {
|
|
251
|
+
// Workers are where Figma plugins run
|
|
252
|
+
source = 'plugin';
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Page console - determine if plugin or figma
|
|
256
|
+
const location = msg.location();
|
|
257
|
+
source = this.determineSource(location?.url);
|
|
258
|
+
}
|
|
259
|
+
const entry = {
|
|
260
|
+
timestamp: Date.now(),
|
|
261
|
+
level,
|
|
262
|
+
message: this.truncateString(message),
|
|
263
|
+
args,
|
|
264
|
+
source,
|
|
265
|
+
};
|
|
266
|
+
// Add worker URL metadata for debugging
|
|
267
|
+
if (workerUrl && context === 'worker') {
|
|
268
|
+
entry.workerUrl = workerUrl;
|
|
269
|
+
}
|
|
270
|
+
// Add stack trace for errors
|
|
271
|
+
if (level === 'error' && msg.stackTrace) {
|
|
272
|
+
entry.stackTrace = {
|
|
273
|
+
callFrames: msg.stackTrace().callFrames || [],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return entry;
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
logger.error({ error, context, workerUrl }, 'Failed to extract console message details');
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Determine if log is from plugin or Figma based on URL
|
|
285
|
+
*/
|
|
286
|
+
determineSource(url) {
|
|
287
|
+
if (!url)
|
|
288
|
+
return 'unknown';
|
|
289
|
+
// Check for plugin-related URLs
|
|
290
|
+
// Plugins might run in:
|
|
291
|
+
// - iframes with plugin-specific URLs
|
|
292
|
+
// - blob: URLs created by the plugin
|
|
293
|
+
// - chrome-extension: URLs (for dev mode)
|
|
294
|
+
// - any URL containing "plugin"
|
|
295
|
+
if (url.includes('plugin') ||
|
|
296
|
+
url.includes('iframe') ||
|
|
297
|
+
url.startsWith('blob:') ||
|
|
298
|
+
url.startsWith('chrome-extension:') ||
|
|
299
|
+
url.includes('figma.com/plugin') ||
|
|
300
|
+
url.includes('/plugin-')) {
|
|
301
|
+
return 'plugin';
|
|
302
|
+
}
|
|
303
|
+
// Main Figma application
|
|
304
|
+
if (url.includes('figma.com')) {
|
|
305
|
+
return 'figma';
|
|
306
|
+
}
|
|
307
|
+
return 'unknown';
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Add log to circular buffer
|
|
311
|
+
*/
|
|
312
|
+
addLog(entry) {
|
|
313
|
+
this.logs.push(entry);
|
|
314
|
+
// Maintain buffer size
|
|
315
|
+
if (this.logs.length > this.config.bufferSize) {
|
|
316
|
+
this.logs.shift();
|
|
317
|
+
}
|
|
318
|
+
logger.debug({ level: entry.level, source: entry.source }, 'Log captured');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Truncate string to max length
|
|
322
|
+
*/
|
|
323
|
+
truncateString(str) {
|
|
324
|
+
const maxLength = this.config.truncation.maxStringLength;
|
|
325
|
+
if (str.length <= maxLength) {
|
|
326
|
+
return str;
|
|
327
|
+
}
|
|
328
|
+
return str.substring(0, maxLength) + '... (truncated)';
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Truncate value (string, array, object) intelligently
|
|
332
|
+
* Based on AgentDesk pattern to prevent context overflow
|
|
333
|
+
*/
|
|
334
|
+
truncateValue(value, depth = 0) {
|
|
335
|
+
const { maxStringLength, maxArrayLength, maxObjectDepth } = this.config.truncation;
|
|
336
|
+
// Max depth reached
|
|
337
|
+
if (depth >= maxObjectDepth) {
|
|
338
|
+
return '[Max depth reached]';
|
|
339
|
+
}
|
|
340
|
+
// Handle null/undefined
|
|
341
|
+
if (value === null || value === undefined) {
|
|
342
|
+
return value;
|
|
343
|
+
}
|
|
344
|
+
// Handle strings
|
|
345
|
+
if (typeof value === 'string') {
|
|
346
|
+
return this.truncateString(value);
|
|
347
|
+
}
|
|
348
|
+
// Handle arrays
|
|
349
|
+
if (Array.isArray(value)) {
|
|
350
|
+
const truncated = value.slice(0, maxArrayLength).map((item) => this.truncateValue(item, depth + 1));
|
|
351
|
+
if (value.length > maxArrayLength) {
|
|
352
|
+
truncated.push(`... (${value.length - maxArrayLength} more items)`);
|
|
353
|
+
}
|
|
354
|
+
return truncated;
|
|
355
|
+
}
|
|
356
|
+
// Handle objects
|
|
357
|
+
if (typeof value === 'object') {
|
|
358
|
+
const result = {};
|
|
359
|
+
let count = 0;
|
|
360
|
+
for (const [key, val] of Object.entries(value)) {
|
|
361
|
+
if (count >= 10) {
|
|
362
|
+
// Limit object properties
|
|
363
|
+
result['...'] = '(more properties)';
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
result[key] = this.truncateValue(val, depth + 1);
|
|
367
|
+
count++;
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
// Primitives (number, boolean, etc.)
|
|
372
|
+
return value;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get logs with optional filtering
|
|
376
|
+
*/
|
|
377
|
+
getLogs(options) {
|
|
378
|
+
let filtered = [...this.logs];
|
|
379
|
+
// Filter by timestamp
|
|
380
|
+
if (options?.since) {
|
|
381
|
+
filtered = filtered.filter((log) => log.timestamp >= options.since);
|
|
382
|
+
}
|
|
383
|
+
// Filter by level
|
|
384
|
+
if (options?.level && options.level !== 'all') {
|
|
385
|
+
filtered = filtered.filter((log) => log.level === options.level);
|
|
386
|
+
}
|
|
387
|
+
// Limit count (get most recent)
|
|
388
|
+
if (options?.count) {
|
|
389
|
+
filtered = filtered.slice(-options.count);
|
|
390
|
+
}
|
|
391
|
+
return filtered;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Clear log buffer
|
|
395
|
+
*/
|
|
396
|
+
clear() {
|
|
397
|
+
const count = this.logs.length;
|
|
398
|
+
this.logs = [];
|
|
399
|
+
logger.info({ clearedCount: count }, 'Console buffer cleared');
|
|
400
|
+
return count;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Stop monitoring
|
|
404
|
+
*/
|
|
405
|
+
stopMonitoring() {
|
|
406
|
+
if (!this.isMonitoring) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
this.isMonitoring = false;
|
|
410
|
+
this.page = null;
|
|
411
|
+
this.lastUrl = ''; // Clear last URL to prevent stale comparisons after restart
|
|
412
|
+
logger.info('Console monitoring stopped');
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get monitoring status
|
|
416
|
+
*/
|
|
417
|
+
getStatus() {
|
|
418
|
+
return {
|
|
419
|
+
isMonitoring: this.isMonitoring,
|
|
420
|
+
logCount: this.logs.length,
|
|
421
|
+
bufferSize: this.config.bufferSize,
|
|
422
|
+
workerCount: this.workers.size,
|
|
423
|
+
oldestTimestamp: this.logs[0]?.timestamp,
|
|
424
|
+
newestTimestamp: this.logs[this.logs.length - 1]?.timestamp,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=console-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-monitor.js","sourceRoot":"","sources":["../../src/core/console-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Component Extraction MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Provides unlimited-depth component tree extraction via the Desktop Bridge
|
|
5
|
+
* Plugin API. Returns full visual properties, resolved design token names,
|
|
6
|
+
* instance references (mainComponent), prototype reactions, and annotations
|
|
7
|
+
* at every level of the tree.
|
|
8
|
+
*
|
|
9
|
+
* This complements figma_get_component_for_development (REST API, depth 4)
|
|
10
|
+
* with deeper, richer data when the Desktop Bridge plugin is connected.
|
|
11
|
+
*/
|
|
12
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
|
+
export declare function registerDeepComponentTools(server: McpServer, getDesktopConnector: () => Promise<any>): void;
|
|
14
|
+
//# sourceMappingURL=deep-component-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-component-tools.d.ts","sourceRoot":"","sources":["../../src/core/deep-component-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,SAAS,EACjB,mBAAmB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GACrC,IAAI,CAyIN"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Component Extraction MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Provides unlimited-depth component tree extraction via the Desktop Bridge
|
|
5
|
+
* Plugin API. Returns full visual properties, resolved design token names,
|
|
6
|
+
* instance references (mainComponent), prototype reactions, and annotations
|
|
7
|
+
* at every level of the tree.
|
|
8
|
+
*
|
|
9
|
+
* This complements figma_get_component_for_development (REST API, depth 4)
|
|
10
|
+
* with deeper, richer data when the Desktop Bridge plugin is connected.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { createChildLogger } from "./logger.js";
|
|
14
|
+
const logger = createChildLogger({ component: "deep-component-tools" });
|
|
15
|
+
export function registerDeepComponentTools(server, getDesktopConnector) {
|
|
16
|
+
server.tool("figma_get_component_for_development_deep", "Get a deeply nested component tree with full visual properties, resolved design token names, instance references, prototype interactions, and annotations at every level. Uses the Desktop Bridge Plugin API for unlimited depth traversal — essential for complex components like data tables, nested menus, date pickers, and compound form fields where the standard depth-4 REST API tool misses deeper structure. Returns boundVariables resolved to actual token names (not just IDs), mainComponent references for INSTANCE nodes, and reactions for interaction states. Requires Desktop Bridge plugin. For simpler components (depth ≤ 4), use figma_get_component_for_development instead.", {
|
|
17
|
+
nodeId: z
|
|
18
|
+
.string()
|
|
19
|
+
.describe("Component node ID to extract (e.g., '695:313')"),
|
|
20
|
+
depth: z.preprocess((v) => (typeof v === "string" ? Number(v) : v), z.number().optional().default(10)).describe("Maximum tree depth to traverse (default: 10, max: 20). Use higher values for deeply nested components."),
|
|
21
|
+
}, async ({ nodeId, depth = 10 }) => {
|
|
22
|
+
try {
|
|
23
|
+
const clampedDepth = Math.min(Math.max(depth, 1), 20);
|
|
24
|
+
logger.info({ nodeId, depth: clampedDepth }, "Deep component extraction");
|
|
25
|
+
const connector = await getDesktopConnector();
|
|
26
|
+
const result = await connector.deepGetComponent(nodeId, clampedDepth);
|
|
27
|
+
if (!result || (result.success === false)) {
|
|
28
|
+
throw new Error(result?.error || "Failed to extract component");
|
|
29
|
+
}
|
|
30
|
+
const data = result.data || result;
|
|
31
|
+
// Measure response size and warn if large
|
|
32
|
+
const responseJson = JSON.stringify(data);
|
|
33
|
+
const sizeKB = Math.round(responseJson.length / 1024);
|
|
34
|
+
const response = {
|
|
35
|
+
nodeId,
|
|
36
|
+
component: data,
|
|
37
|
+
metadata: {
|
|
38
|
+
purpose: "deep_component_development",
|
|
39
|
+
treeDepth: clampedDepth,
|
|
40
|
+
responseSizeKB: sizeKB,
|
|
41
|
+
variablesResolved: data._variableMapSize || 0,
|
|
42
|
+
note: [
|
|
43
|
+
`Deep component tree extracted via Plugin API (depth ${clampedDepth}).`,
|
|
44
|
+
"boundVariables are resolved to token names, collections, and codeSyntax.",
|
|
45
|
+
"INSTANCE nodes include mainComponent references (key, name, component set).",
|
|
46
|
+
"Use this data to generate production-quality, token-aware, accessible code.",
|
|
47
|
+
sizeKB > 200 ? "Response is large — consider targeting a specific child node for deeper analysis." : null,
|
|
48
|
+
].filter(Boolean).join(" "),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: JSON.stringify(response),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
logger.error({ error }, "Deep component extraction failed");
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: JSON.stringify({
|
|
68
|
+
error: "deep_component_failed",
|
|
69
|
+
message: `Cannot extract deep component. ${message}`,
|
|
70
|
+
hint: "This tool requires the Desktop Bridge plugin to be running in Figma. For REST API fallback (depth 4), use figma_get_component_for_development.",
|
|
71
|
+
}),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
isError: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// -----------------------------------------------------------------------
|
|
79
|
+
// Tool: figma_analyze_component_set
|
|
80
|
+
// -----------------------------------------------------------------------
|
|
81
|
+
server.tool("figma_analyze_component_set", "Analyze a Figma COMPONENT_SET to extract variant state machine and cross-variant diffs for code generation. Returns: (1) variant axes (size, state) with all values, (2) CSS pseudo-class mappings for interaction states (hover→:hover, focus→:focus-visible, disabled→:disabled, error→[aria-invalid]), (3) visual diff from default state per variant (only changed properties — fill token, stroke token, stroke weight, text color, opacity, effects, visibility), (4) component property definitions mapped to code props (BOOLEAN→boolean, TEXT→string, INSTANCE_SWAP→slot/ReactNode). Use this on the parent COMPONENT_SET node, not individual variants. Requires Desktop Bridge plugin.", {
|
|
82
|
+
nodeId: z
|
|
83
|
+
.string()
|
|
84
|
+
.describe("COMPONENT_SET node ID (the parent of all variants, e.g., '214:274')"),
|
|
85
|
+
}, async ({ nodeId }) => {
|
|
86
|
+
try {
|
|
87
|
+
logger.info({ nodeId }, "Analyzing component set");
|
|
88
|
+
const connector = await getDesktopConnector();
|
|
89
|
+
const result = await connector.analyzeComponentSet(nodeId);
|
|
90
|
+
if (!result || (result.success === false)) {
|
|
91
|
+
throw new Error(result?.error || "Failed to analyze component set");
|
|
92
|
+
}
|
|
93
|
+
const data = result.data || result;
|
|
94
|
+
return {
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: "text",
|
|
98
|
+
text: JSON.stringify({
|
|
99
|
+
nodeId,
|
|
100
|
+
analysis: data,
|
|
101
|
+
metadata: {
|
|
102
|
+
purpose: "variant_state_machine",
|
|
103
|
+
note: "Use cssMapping to implement interaction states as CSS pseudo-classes/attributes. diffFromDefault shows only what changes per variant — apply as style overrides. componentProps maps to your component's TypeScript interface.",
|
|
104
|
+
},
|
|
105
|
+
}),
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
112
|
+
logger.error({ error }, "Component set analysis failed");
|
|
113
|
+
return {
|
|
114
|
+
content: [
|
|
115
|
+
{
|
|
116
|
+
type: "text",
|
|
117
|
+
text: JSON.stringify({
|
|
118
|
+
error: "analyze_component_set_failed",
|
|
119
|
+
message: `Cannot analyze component set. ${message}`,
|
|
120
|
+
hint: "This tool requires the Desktop Bridge plugin and a COMPONENT_SET node ID (not an individual variant). Use figma_search_components to find component sets.",
|
|
121
|
+
}),
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
isError: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=deep-component-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-component-tools.js","sourceRoot":"","sources":["../../src/core/deep-component-tools.ts"],"names":[],"mappings":"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"}
|