@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging infrastructure using pino
|
|
3
|
+
*/
|
|
4
|
+
import pino from 'pino';
|
|
5
|
+
/**
|
|
6
|
+
* Create logger instance
|
|
7
|
+
* Note: In Cloudflare Workers, console methods are automatically captured
|
|
8
|
+
*/
|
|
9
|
+
export function createLogger(level = 'info') {
|
|
10
|
+
// Check if running in Cloudflare Workers environment
|
|
11
|
+
const isWorkers = typeof globalThis.caches !== 'undefined';
|
|
12
|
+
if (isWorkers) {
|
|
13
|
+
// Cloudflare Workers: use simple console-based logging
|
|
14
|
+
return pino({
|
|
15
|
+
level: process.env.LOG_LEVEL || level,
|
|
16
|
+
browser: {
|
|
17
|
+
asObject: true,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// Node.js environment: detect MCP stdio mode
|
|
22
|
+
// When stdout is not a TTY, we're likely in MCP stdio mode
|
|
23
|
+
const isMCPStdio = !process.stdout.isTTY;
|
|
24
|
+
// MCP stdio mode: NO pretty printing, stderr only
|
|
25
|
+
if (isMCPStdio) {
|
|
26
|
+
return pino({ level: process.env.LOG_LEVEL || level }, pino.destination({ dest: 2, sync: false }));
|
|
27
|
+
}
|
|
28
|
+
// Development/terminal mode: use pretty printing
|
|
29
|
+
return pino({
|
|
30
|
+
level: process.env.LOG_LEVEL || level,
|
|
31
|
+
transport: process.env.NODE_ENV !== 'production'
|
|
32
|
+
? {
|
|
33
|
+
target: 'pino-pretty',
|
|
34
|
+
options: {
|
|
35
|
+
colorize: true,
|
|
36
|
+
translateTime: 'HH:MM:ss',
|
|
37
|
+
ignore: 'pid,hostname',
|
|
38
|
+
destination: 2, // Explicit stderr for transport
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
: undefined,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Default logger instance
|
|
46
|
+
*/
|
|
47
|
+
export const logger = createLogger();
|
|
48
|
+
/**
|
|
49
|
+
* Create child logger with additional context
|
|
50
|
+
*/
|
|
51
|
+
export function createChildLogger(bindings) {
|
|
52
|
+
return logger.child(bindings);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,MAAM;IACnD,qDAAqD;IACrD,MAAM,SAAS,GAAG,OAAQ,UAAkB,CAAC,MAAM,KAAK,WAAW,CAAC;IAEpE,IAAI,SAAS,EAAE;QACb,uDAAuD;QACvD,OAAO,IAAI,CAAC;YACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK;YACrC,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;aACf;SACF,CAAC,CAAC;KACJ;IAED,6CAA6C;IAC7C,2DAA2D;IAC3D,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAEzC,kDAAkD;IAClD,IAAI,UAAU,EAAE;QACd,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,EAAE,EACzC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAC3C,CAAC;KACH;IAED,iDAAiD;IACjD,OAAO,IAAI,CACT;QACE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK;QACrC,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACnC,CAAC,CAAC;gBACE,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,UAAU;oBACzB,MAAM,EAAE,cAAc;oBACtB,WAAW,EAAE,CAAC,EAAE,gCAAgC;iBACjD;aACF;YACH,CAAC,CAAC,SAAS;KAChB,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiC;IACjE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port Discovery Module
|
|
3
|
+
*
|
|
4
|
+
* Handles dynamic WebSocket port assignment with range-based fallback.
|
|
5
|
+
* When the preferred port (default 9223) is taken by another MCP server instance
|
|
6
|
+
* (e.g., Claude Desktop Chat tab vs Code tab), the server automatically tries
|
|
7
|
+
* the next port in a fixed range (9223-9232).
|
|
8
|
+
*
|
|
9
|
+
* Port advertisement files are written to /tmp so the Figma plugin can discover
|
|
10
|
+
* which port to connect to. Each instance writes its own file with PID for
|
|
11
|
+
* stale-file detection.
|
|
12
|
+
*
|
|
13
|
+
* Zombie process detection:
|
|
14
|
+
* Active servers refresh their port file every 30s (heartbeat).
|
|
15
|
+
* On startup, cleanupStalePortFiles() detects zombies via:
|
|
16
|
+
* 1. Dead PID — process no longer exists (existing behavior)
|
|
17
|
+
* 2. Stale heartbeat — lastSeen older than 5 minutes (process frozen/hung)
|
|
18
|
+
* 3. Age ceiling — startedAt older than 4 hours with no heartbeat (pre-v1.12 compat)
|
|
19
|
+
* Zombie processes are terminated with SIGTERM to free their ports.
|
|
20
|
+
*
|
|
21
|
+
* Data flow:
|
|
22
|
+
* Server binds port → writes /tmp/figma-console-mcp-{port}.json
|
|
23
|
+
* Server heartbeat → refreshes lastSeen every 30s
|
|
24
|
+
* Plugin scans ports 9223-9232 → connects to first responding server
|
|
25
|
+
* External tools read port files for discovery
|
|
26
|
+
*/
|
|
27
|
+
/** Default preferred WebSocket port */
|
|
28
|
+
export declare const DEFAULT_WS_PORT = 9223;
|
|
29
|
+
/** Number of ports in the fallback range (9223-9232 = 10 ports) */
|
|
30
|
+
export declare const PORT_RANGE_SIZE = 10;
|
|
31
|
+
/** Maximum age before a port file without heartbeat is considered stale (4 hours) */
|
|
32
|
+
export declare const MAX_PORT_FILE_AGE_MS: number;
|
|
33
|
+
/** Maximum time since last heartbeat before a process is considered stale (5 minutes) */
|
|
34
|
+
export declare const HEARTBEAT_STALE_MS: number;
|
|
35
|
+
/** Grace period after SIGTERM before escalating to SIGKILL (ms) */
|
|
36
|
+
export declare const TERMINATE_GRACE_MS = 400;
|
|
37
|
+
/**
|
|
38
|
+
* Minimum process age before an orphan may be reaped (ms). Protects a sibling
|
|
39
|
+
* server that is mid-startup — it has bound a port but not yet written its
|
|
40
|
+
* advertisement file, so it would otherwise look like an orphan. By the time a
|
|
41
|
+
* real server is this old it has advertised and is in the known-PID set.
|
|
42
|
+
*/
|
|
43
|
+
export declare const ORPHAN_MIN_AGE_MS: number;
|
|
44
|
+
/** Interval for the periodic background reaper (ms) */
|
|
45
|
+
export declare const REAP_INTERVAL_MS: number;
|
|
46
|
+
/** Minimum age before an instance can be evicted as last resort (2 minutes) */
|
|
47
|
+
export declare const EVICTION_MIN_AGE_MS: number;
|
|
48
|
+
/** Interval between heartbeat refreshes (30 seconds) */
|
|
49
|
+
export declare const HEARTBEAT_INTERVAL_MS: number;
|
|
50
|
+
export interface PortFileData {
|
|
51
|
+
port: number;
|
|
52
|
+
pid: number;
|
|
53
|
+
host: string;
|
|
54
|
+
startedAt: string;
|
|
55
|
+
/** Updated by heartbeat every 30s. Missing in port files from pre-v1.12 instances. */
|
|
56
|
+
lastSeen?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Try to bind a WebSocket server to ports in a range, starting from the preferred port.
|
|
60
|
+
* Returns the first port that binds successfully.
|
|
61
|
+
*
|
|
62
|
+
* @param preferredPort - The port to try first (default 9223)
|
|
63
|
+
* @param host - The host to bind to (default 'localhost')
|
|
64
|
+
* @returns The actual port that was bound
|
|
65
|
+
* @throws If all ports in the range are exhausted
|
|
66
|
+
*/
|
|
67
|
+
export declare function getPortRange(preferredPort?: number): number[];
|
|
68
|
+
/**
|
|
69
|
+
* Get the file path for a port advertisement file.
|
|
70
|
+
*/
|
|
71
|
+
export declare function getPortFilePath(port: number): string;
|
|
72
|
+
/**
|
|
73
|
+
* Write a port advertisement file so clients can discover this server instance.
|
|
74
|
+
* Includes PID for stale-file detection and lastSeen for heartbeat tracking.
|
|
75
|
+
*/
|
|
76
|
+
export declare function advertisePort(port: number, host?: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Refresh the lastSeen timestamp in a port advertisement file.
|
|
79
|
+
* Called periodically as a heartbeat to prove this server is still active.
|
|
80
|
+
* Non-fatal — heartbeat failures are silently ignored.
|
|
81
|
+
*/
|
|
82
|
+
export declare function refreshPortAdvertisement(port: number): void;
|
|
83
|
+
/**
|
|
84
|
+
* Remove the port advertisement file for this instance.
|
|
85
|
+
* Call on clean shutdown.
|
|
86
|
+
*/
|
|
87
|
+
export declare function unadvertisePort(port: number): void;
|
|
88
|
+
/**
|
|
89
|
+
* Determine if a port file represents a zombie/stale MCP instance.
|
|
90
|
+
*
|
|
91
|
+
* Detection layers:
|
|
92
|
+
* 1. If lastSeen exists (v1.12+): stale if older than HEARTBEAT_STALE_MS (5 min)
|
|
93
|
+
* 2. If lastSeen is missing (pre-v1.12): stale if startedAt older than MAX_PORT_FILE_AGE_MS (4h)
|
|
94
|
+
*
|
|
95
|
+
* Assumes the owning process IS alive (PID check should happen before calling this).
|
|
96
|
+
*/
|
|
97
|
+
export declare function isStaleInstance(data: PortFileData): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Read and validate a port advertisement file.
|
|
100
|
+
* Returns null if the file doesn't exist, is invalid, or the owning process is dead.
|
|
101
|
+
*/
|
|
102
|
+
export declare function readPortFile(port: number): PortFileData | null;
|
|
103
|
+
/**
|
|
104
|
+
* Discover all active Figma Console MCP server instances by scanning port files.
|
|
105
|
+
* Validates each file's PID to filter out stale entries.
|
|
106
|
+
*/
|
|
107
|
+
export declare function discoverActiveInstances(preferredPort?: number): PortFileData[];
|
|
108
|
+
/**
|
|
109
|
+
* Clean up stale port files and terminate zombie MCP processes.
|
|
110
|
+
*
|
|
111
|
+
* Runs at startup before port binding. Detects stale instances via:
|
|
112
|
+
* 1. Dead PID — process no longer exists → delete file
|
|
113
|
+
* 2. Zombie process — alive but stale (no heartbeat or expired heartbeat)
|
|
114
|
+
* → send SIGTERM to free the port, then delete file
|
|
115
|
+
* 3. Corrupt file — invalid JSON → delete file
|
|
116
|
+
*/
|
|
117
|
+
export declare function cleanupStalePortFiles(): number;
|
|
118
|
+
/**
|
|
119
|
+
* Deep scan for orphaned MCP server processes that hold ports but have no port files.
|
|
120
|
+
* These are processes left behind by Claude Desktop when tabs close without proper cleanup.
|
|
121
|
+
*
|
|
122
|
+
* Uses lsof (macOS/Linux) to find PIDs listening on each port in the range,
|
|
123
|
+
* then verifies they're figma-console-mcp before terminating.
|
|
124
|
+
*
|
|
125
|
+
* Call AFTER cleanupStalePortFiles() — that handles the port-file-based cleanup first,
|
|
126
|
+
* then this catches any remaining ghosts.
|
|
127
|
+
*/
|
|
128
|
+
export declare function cleanupOrphanedProcesses(preferredPort?: number, options?: {
|
|
129
|
+
minAgeMs?: number;
|
|
130
|
+
}): number;
|
|
131
|
+
/**
|
|
132
|
+
* Last-resort eviction: terminate the oldest MCP server instance to free a port.
|
|
133
|
+
*
|
|
134
|
+
* Called ONLY when all ports in the range are exhausted after both cleanup phases
|
|
135
|
+
* (cleanupStalePortFiles + cleanupOrphanedProcesses) have already run. This handles
|
|
136
|
+
* the case where old instances are still alive and heartbeating but no longer needed
|
|
137
|
+
* (e.g., from yesterday's Claude Desktop session that was closed without terminating
|
|
138
|
+
* the MCP server process).
|
|
139
|
+
*
|
|
140
|
+
* Safety guards:
|
|
141
|
+
* - Only evicts instances older than EVICTION_MIN_AGE_MS (2 min) to prevent cascade
|
|
142
|
+
* - Never evicts our own PID
|
|
143
|
+
* - Re-reads port file before kill to avoid TOCTOU race
|
|
144
|
+
* - Uses SIGTERM for graceful shutdown
|
|
145
|
+
* - Waits briefly for port release before returning
|
|
146
|
+
*
|
|
147
|
+
* @returns true if an instance was evicted (caller should retry port binding), false otherwise
|
|
148
|
+
*/
|
|
149
|
+
export declare function evictOldestInstance(preferredPort?: number): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Register process exit handlers to clean up port advertisement file.
|
|
152
|
+
* Should be called once after the port is successfully bound.
|
|
153
|
+
*/
|
|
154
|
+
export declare function registerPortCleanup(port: number): void;
|
|
155
|
+
/**
|
|
156
|
+
* Start a periodic background reaper that re-runs the cleanup passes while this
|
|
157
|
+
* server is alive. Startup-only reaping leaves orphans to accumulate between
|
|
158
|
+
* launches (a sibling client that closes without its server exiting cleanly
|
|
159
|
+
* keeps holding a port until the *next* server starts). Periodic reaping keeps
|
|
160
|
+
* the range clean continuously.
|
|
161
|
+
*
|
|
162
|
+
* Safe against live siblings: they hold fresh advertisement files (heartbeat
|
|
163
|
+
* every 30s) so they are in the known-PID set and skipped, and the age guard in
|
|
164
|
+
* cleanupOrphanedProcesses protects mid-startup siblings.
|
|
165
|
+
*
|
|
166
|
+
* The interval is unref'd so it never keeps the process alive on its own.
|
|
167
|
+
*
|
|
168
|
+
* @returns a stop function that clears the interval.
|
|
169
|
+
*/
|
|
170
|
+
export declare function startPeriodicReaper(preferredPort?: number): () => void;
|
|
171
|
+
//# sourceMappingURL=port-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-discovery.d.ts","sourceRoot":"","sources":["../../src/core/port-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,uCAAuC;AACvC,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,mEAAmE;AACnE,eAAO,MAAM,eAAe,KAAK,CAAC;AAQlC,qFAAqF;AACrF,eAAO,MAAM,oBAAoB,QAAqB,CAAC;AAEvD,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,QAAgB,CAAC;AAEhD,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAE3C,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,QAAgB,CAAC;AAE9C,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,QAAgB,CAAC;AAEjD,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,aAAa,GAAE,MAAwB,GAAG,MAAM,EAAE,CAM9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB,GAAG,IAAI,CAiB5E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAa3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUlD;AAcD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAY3D;AAgFD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoB9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,GAAE,MAAwB,GAAG,YAAY,EAAE,CAW/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAsC9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,GAAE,MAAwB,EACvC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,MAAM,CAiFR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,GAAE,MAAwB,GAAG,OAAO,CA0EpF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAatD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,GAAE,MAAwB,GAAG,MAAM,IAAI,CAYvF"}
|