@mp3wizard/figma-console-mcp 1.14.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 +816 -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/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
- package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
- package/dist/cloudflare/apps/token-browser/server.js +136 -0
- package/dist/cloudflare/browser/base.js +5 -0
- package/dist/cloudflare/browser/cloudflare.js +156 -0
- package/dist/cloudflare/browser-manager.js +157 -0
- package/dist/cloudflare/core/cloud-websocket-connector.js +267 -0
- package/dist/cloudflare/core/cloud-websocket-relay.js +199 -0
- package/dist/cloudflare/core/comment-tools.js +292 -0
- package/dist/cloudflare/core/config.js +161 -0
- package/dist/cloudflare/core/console-monitor.js +427 -0
- package/dist/cloudflare/core/design-code-tools.js +2504 -0
- package/dist/cloudflare/core/design-system-manifest.js +260 -0
- package/dist/cloudflare/core/design-system-tools.js +863 -0
- package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
- package/dist/cloudflare/core/enrichment/index.js +7 -0
- package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
- package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
- package/dist/cloudflare/core/figma-api.js +409 -0
- package/dist/cloudflare/core/figma-connector.js +7 -0
- package/dist/cloudflare/core/figma-desktop-connector.js +1184 -0
- package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
- package/dist/cloudflare/core/figma-style-extractor.js +311 -0
- package/dist/cloudflare/core/figma-tools.js +2947 -0
- package/dist/cloudflare/core/logger.js +53 -0
- package/dist/cloudflare/core/port-discovery.js +282 -0
- package/dist/cloudflare/core/snippet-injector.js +96 -0
- package/dist/cloudflare/core/types/design-code.js +4 -0
- package/dist/cloudflare/core/types/enriched.js +5 -0
- package/dist/cloudflare/core/types/index.js +4 -0
- package/dist/cloudflare/core/websocket-connector.js +256 -0
- package/dist/cloudflare/core/websocket-server.js +646 -0
- package/dist/cloudflare/core/write-tools.js +2091 -0
- package/dist/cloudflare/index.js +2899 -0
- package/dist/cloudflare/test-browser.js +88 -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 +162 -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/design-code-tools.d.ts +127 -0
- package/dist/core/design-code-tools.d.ts.map +1 -0
- package/dist/core/design-code-tools.js +2505 -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 +17 -0
- package/dist/core/design-system-tools.d.ts.map +1 -0
- package/dist/core/design-system-tools.js +864 -0
- package/dist/core/design-system-tools.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 +273 -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/figma-api.d.ts +201 -0
- package/dist/core/figma-api.d.ts.map +1 -0
- package/dist/core/figma-api.js +410 -0
- package/dist/core/figma-api.js.map +1 -0
- package/dist/core/figma-connector.d.ts +48 -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 +265 -0
- package/dist/core/figma-desktop-connector.d.ts.map +1 -0
- package/dist/core/figma-desktop-connector.js +1184 -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 +23 -0
- package/dist/core/figma-tools.d.ts.map +1 -0
- package/dist/core/figma-tools.js +2948 -0
- package/dist/core/figma-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 +110 -0
- package/dist/core/port-discovery.d.ts.map +1 -0
- package/dist/core/port-discovery.js +283 -0
- package/dist/core/port-discovery.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/types/design-code.d.ts +262 -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 +112 -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/websocket-connector.d.ts +55 -0
- package/dist/core/websocket-connector.d.ts.map +1 -0
- package/dist/core/websocket-connector.js +257 -0
- package/dist/core/websocket-connector.js.map +1 -0
- package/dist/core/websocket-server.d.ts +191 -0
- package/dist/core/websocket-server.d.ts.map +1 -0
- package/dist/core/websocket-server.js +647 -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 +2092 -0
- package/dist/core/write-tools.js.map +1 -0
- package/dist/local.d.ts +84 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +5039 -0
- package/dist/local.js.map +1 -0
- package/figma-desktop-bridge/README.md +313 -0
- package/figma-desktop-bridge/code.js +2818 -0
- package/figma-desktop-bridge/manifest.json +67 -0
- package/figma-desktop-bridge/ui.html +1236 -0
- package/package.json +87 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Metadata Scorer (weight: 0.20)
|
|
3
|
+
*
|
|
4
|
+
* Checks component quality and completeness within the design system.
|
|
5
|
+
* Evaluates description presence, description quality, property completeness,
|
|
6
|
+
* variant structure, and category organization.
|
|
7
|
+
*
|
|
8
|
+
* Scores against "scorable units" (component sets + standalone components)
|
|
9
|
+
* rather than raw variant count to avoid inflated totals.
|
|
10
|
+
*/
|
|
11
|
+
import { clamp, getSeverity } from "./types.js";
|
|
12
|
+
/** Maximum examples to include in a finding. */
|
|
13
|
+
const MAX_EXAMPLES = 5;
|
|
14
|
+
/** Minimum description length to be considered "quality" documentation. */
|
|
15
|
+
const MIN_QUALITY_DESC_LENGTH = 20;
|
|
16
|
+
/**
|
|
17
|
+
* Build a lookup structure for matching components to variant groups.
|
|
18
|
+
* Collects component set node IDs for `containing_frame.containingComponentSet`
|
|
19
|
+
* matching (primary REST API path) and name prefixes as fallback.
|
|
20
|
+
*/
|
|
21
|
+
function buildComponentSetLookup(data) {
|
|
22
|
+
const nodeIds = new Set();
|
|
23
|
+
const namePrefixes = new Set();
|
|
24
|
+
for (const cs of data.componentSets) {
|
|
25
|
+
if (cs.node_id)
|
|
26
|
+
nodeIds.add(cs.node_id);
|
|
27
|
+
if (cs.name)
|
|
28
|
+
namePrefixes.add(cs.name + "/");
|
|
29
|
+
}
|
|
30
|
+
return { nodeIds, namePrefixes };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a component belongs to a variant set.
|
|
34
|
+
*
|
|
35
|
+
* Detection order:
|
|
36
|
+
* 1. Plugin API: `componentSetId` (set on ComponentNode by Figma plugin runtime)
|
|
37
|
+
* 2. REST API: `containing_frame.containingComponentSet` (present on variants
|
|
38
|
+
* returned by GET /v1/files/:key/components)
|
|
39
|
+
* 3. File JSON: `component_set_id` (snake_case field on COMPONENT nodes in file tree)
|
|
40
|
+
* 4. Name prefix: variant names starting with "SetName/" (some API formats)
|
|
41
|
+
* 5. Frame node ID: containing_frame.nodeId matching a known component set node
|
|
42
|
+
*/
|
|
43
|
+
function isComponentInSet(component, lookup) {
|
|
44
|
+
// Plugin API: direct componentSetId
|
|
45
|
+
if (component.componentSetId)
|
|
46
|
+
return true;
|
|
47
|
+
// REST API: containing_frame.containingComponentSet is set on variant components
|
|
48
|
+
if (component.containing_frame?.containingComponentSet)
|
|
49
|
+
return true;
|
|
50
|
+
// File JSON: snake_case variant of componentSetId
|
|
51
|
+
if (component.component_set_id)
|
|
52
|
+
return true;
|
|
53
|
+
// Name-based fallback: variant names may start with "SetName/"
|
|
54
|
+
if (component.name) {
|
|
55
|
+
for (const prefix of lookup.namePrefixes) {
|
|
56
|
+
if (component.name.startsWith(prefix))
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Frame node ID fallback
|
|
61
|
+
const frameNodeId = component.containing_frame?.nodeId;
|
|
62
|
+
if (frameNodeId && lookup.nodeIds.has(frameNodeId))
|
|
63
|
+
return true;
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Classify components into standalone, variants, and component sets.
|
|
68
|
+
* Scoring evaluates `scorableUnits` (standalone + componentSets)
|
|
69
|
+
* instead of the raw component list which double-counts variants.
|
|
70
|
+
*/
|
|
71
|
+
export function classifyComponents(data) {
|
|
72
|
+
const lookup = buildComponentSetLookup(data);
|
|
73
|
+
const standalone = [];
|
|
74
|
+
const variants = [];
|
|
75
|
+
for (const comp of data.components) {
|
|
76
|
+
if (isComponentInSet(comp, lookup)) {
|
|
77
|
+
variants.push(comp);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
standalone.push(comp);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
standalone,
|
|
85
|
+
variants,
|
|
86
|
+
componentSets: data.componentSets,
|
|
87
|
+
scorableUnits: [...standalone, ...data.componentSets],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Scoring functions (operate on scorable units)
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Score description presence across scorable units.
|
|
95
|
+
* Component sets and standalone components should have non-empty descriptions.
|
|
96
|
+
*/
|
|
97
|
+
function scoreDescriptionPresence(classification) {
|
|
98
|
+
const { scorableUnits } = classification;
|
|
99
|
+
if (scorableUnits.length === 0) {
|
|
100
|
+
return {
|
|
101
|
+
id: "component-desc-presence",
|
|
102
|
+
label: "Description presence",
|
|
103
|
+
score: 100,
|
|
104
|
+
severity: "info",
|
|
105
|
+
tooltip: "Components and component sets should have descriptions. Descriptions appear in Figma's asset panel and help designers find the right component.",
|
|
106
|
+
details: "No components to evaluate.",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const withDesc = scorableUnits.filter((c) => c.description && c.description.trim().length > 0);
|
|
110
|
+
const withoutDesc = scorableUnits.filter((c) => !c.description || c.description.trim().length === 0);
|
|
111
|
+
const ratio = withDesc.length / scorableUnits.length;
|
|
112
|
+
const score = clamp(ratio * 100);
|
|
113
|
+
return {
|
|
114
|
+
id: "component-desc-presence",
|
|
115
|
+
label: "Description presence",
|
|
116
|
+
score,
|
|
117
|
+
severity: getSeverity(score),
|
|
118
|
+
tooltip: "Components and component sets should have descriptions. Descriptions appear in Figma's asset panel and help designers find the right component.",
|
|
119
|
+
details: `${withDesc.length} of ${scorableUnits.length} components have descriptions (${Math.round(ratio * 100)}%).`,
|
|
120
|
+
examples: withoutDesc.length > 0
|
|
121
|
+
? withoutDesc.slice(0, MAX_EXAMPLES).map((c) => c.name)
|
|
122
|
+
: undefined,
|
|
123
|
+
locations: withoutDesc.length > 0
|
|
124
|
+
? withoutDesc.slice(0, MAX_EXAMPLES).map((c) => ({
|
|
125
|
+
name: c.name,
|
|
126
|
+
nodeId: c.node_id,
|
|
127
|
+
type: "component",
|
|
128
|
+
}))
|
|
129
|
+
: undefined,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Score description quality.
|
|
134
|
+
* Descriptions should be meaningful (>20 chars), not just the component name.
|
|
135
|
+
*/
|
|
136
|
+
function scoreDescriptionQuality(classification) {
|
|
137
|
+
const { scorableUnits } = classification;
|
|
138
|
+
const withDesc = scorableUnits.filter((c) => c.description && c.description.trim().length > 0);
|
|
139
|
+
if (withDesc.length === 0) {
|
|
140
|
+
return {
|
|
141
|
+
id: "component-desc-quality",
|
|
142
|
+
label: "Description quality",
|
|
143
|
+
score: 0,
|
|
144
|
+
severity: scorableUnits.length === 0 ? "info" : "fail",
|
|
145
|
+
tooltip: "Descriptions should be meaningful (20+ characters) and explain usage, not just repeat the name. Good descriptions reduce misuse.",
|
|
146
|
+
details: scorableUnits.length === 0
|
|
147
|
+
? "No components to evaluate."
|
|
148
|
+
: "No components have descriptions to evaluate quality.",
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const shortDescs = withDesc.filter((c) => c.description.trim().length < MIN_QUALITY_DESC_LENGTH);
|
|
152
|
+
const qualityCount = withDesc.length - shortDescs.length;
|
|
153
|
+
const ratio = qualityCount / withDesc.length;
|
|
154
|
+
const score = clamp(ratio * 100);
|
|
155
|
+
return {
|
|
156
|
+
id: "component-desc-quality",
|
|
157
|
+
label: "Description quality",
|
|
158
|
+
score,
|
|
159
|
+
severity: getSeverity(score),
|
|
160
|
+
tooltip: "Descriptions should be meaningful (20+ characters) and explain usage, not just repeat the name. Good descriptions reduce misuse.",
|
|
161
|
+
details: shortDescs.length > 0
|
|
162
|
+
? `${shortDescs.length} of ${withDesc.length} descriptions are too short (<${MIN_QUALITY_DESC_LENGTH} chars). Provide usage guidance, not just names.`
|
|
163
|
+
: `All ${withDesc.length} descriptions provide meaningful documentation.`,
|
|
164
|
+
examples: shortDescs.length > 0
|
|
165
|
+
? shortDescs.slice(0, MAX_EXAMPLES).map((c) => c.name)
|
|
166
|
+
: undefined,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Score property completeness.
|
|
171
|
+
* Standalone components should define properties for flexibility.
|
|
172
|
+
* Component sets inherently have properties via their variants.
|
|
173
|
+
*/
|
|
174
|
+
function scorePropertyCompleteness(classification) {
|
|
175
|
+
const { standalone, componentSets, scorableUnits } = classification;
|
|
176
|
+
if (scorableUnits.length === 0) {
|
|
177
|
+
return {
|
|
178
|
+
id: "component-property-completeness",
|
|
179
|
+
label: "Property completeness",
|
|
180
|
+
score: 100,
|
|
181
|
+
severity: "info",
|
|
182
|
+
tooltip: "Components should expose properties or use variant sets. Properties make components flexible and reduce the need for detaching instances.",
|
|
183
|
+
details: "No components to evaluate.",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Component sets always count as having properties (they are variant groups)
|
|
187
|
+
// For standalone, check if they have any property definitions
|
|
188
|
+
const standaloneWithProps = standalone.filter((c) => c.componentPropertyDefinitions &&
|
|
189
|
+
Object.keys(c.componentPropertyDefinitions).length > 0);
|
|
190
|
+
const standaloneWithoutProps = standalone.filter((c) => !c.componentPropertyDefinitions ||
|
|
191
|
+
Object.keys(c.componentPropertyDefinitions).length === 0);
|
|
192
|
+
const withProperties = standaloneWithProps.length + componentSets.length;
|
|
193
|
+
const ratio = withProperties / scorableUnits.length;
|
|
194
|
+
const score = clamp(ratio * 100);
|
|
195
|
+
return {
|
|
196
|
+
id: "component-property-completeness",
|
|
197
|
+
label: "Property completeness",
|
|
198
|
+
score,
|
|
199
|
+
severity: getSeverity(score),
|
|
200
|
+
tooltip: "Components should expose properties or use variant sets. Properties make components flexible and reduce the need for detaching instances.",
|
|
201
|
+
details: `${withProperties} of ${scorableUnits.length} components have defined properties or variants (${Math.round(ratio * 100)}%).`,
|
|
202
|
+
examples: standaloneWithoutProps.length > 0
|
|
203
|
+
? standaloneWithoutProps.slice(0, MAX_EXAMPLES).map((c) => c.name)
|
|
204
|
+
: undefined,
|
|
205
|
+
locations: standaloneWithoutProps.length > 0
|
|
206
|
+
? standaloneWithoutProps.slice(0, MAX_EXAMPLES).map((c) => ({
|
|
207
|
+
name: c.name,
|
|
208
|
+
nodeId: c.node_id,
|
|
209
|
+
type: "component",
|
|
210
|
+
}))
|
|
211
|
+
: undefined,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Score variant structure.
|
|
216
|
+
* A higher ratio of component sets to total scorable units indicates
|
|
217
|
+
* good use of variant organization.
|
|
218
|
+
*/
|
|
219
|
+
function scoreVariantStructure(classification) {
|
|
220
|
+
const { standalone, componentSets, scorableUnits } = classification;
|
|
221
|
+
if (scorableUnits.length === 0) {
|
|
222
|
+
return {
|
|
223
|
+
id: "component-variant-structure",
|
|
224
|
+
label: "Variant structure",
|
|
225
|
+
score: 100,
|
|
226
|
+
severity: "info",
|
|
227
|
+
tooltip: "Related component variants should be organized into component sets. Sets make variant switching easy and reduce component sprawl.",
|
|
228
|
+
details: "No components to evaluate.",
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const setCount = componentSets.length;
|
|
232
|
+
const ratio = setCount / scorableUnits.length;
|
|
233
|
+
const score = clamp(ratio * 100);
|
|
234
|
+
return {
|
|
235
|
+
id: "component-variant-structure",
|
|
236
|
+
label: "Variant structure",
|
|
237
|
+
score,
|
|
238
|
+
severity: getSeverity(score),
|
|
239
|
+
tooltip: "Related component variants should be organized into component sets. Sets make variant switching easy and reduce component sprawl.",
|
|
240
|
+
details: setCount > 0
|
|
241
|
+
? `${setCount} of ${scorableUnits.length} components use variant sets (${Math.round(ratio * 100)}%). ${standalone.length} standalone component${standalone.length === 1 ? "" : "s"}.`
|
|
242
|
+
: "No components use variant structures. Consider organizing components into sets with variants.",
|
|
243
|
+
examples: standalone.length > 0 && setCount > 0
|
|
244
|
+
? standalone.slice(0, MAX_EXAMPLES).map((c) => `${c.name} (standalone)`)
|
|
245
|
+
: undefined,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Score category organization.
|
|
250
|
+
* Components should use path separators (/) for logical grouping.
|
|
251
|
+
*/
|
|
252
|
+
function scoreCategoryOrganization(classification) {
|
|
253
|
+
const { scorableUnits } = classification;
|
|
254
|
+
if (scorableUnits.length === 0) {
|
|
255
|
+
return {
|
|
256
|
+
id: "component-category-org",
|
|
257
|
+
label: "Category organization",
|
|
258
|
+
score: 100,
|
|
259
|
+
severity: "info",
|
|
260
|
+
tooltip: 'Component names should use path separators (/) for grouping (e.g. Forms/Input). Organized naming improves asset panel navigation.',
|
|
261
|
+
details: "No components to evaluate.",
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const withPath = scorableUnits.filter((c) => c.name?.includes("/"));
|
|
265
|
+
const withoutPath = scorableUnits.filter((c) => !c.name?.includes("/"));
|
|
266
|
+
const ratio = withPath.length / scorableUnits.length;
|
|
267
|
+
const score = clamp(ratio * 100);
|
|
268
|
+
return {
|
|
269
|
+
id: "component-category-org",
|
|
270
|
+
label: "Category organization",
|
|
271
|
+
score,
|
|
272
|
+
severity: getSeverity(score),
|
|
273
|
+
tooltip: 'Component names should use path separators (/) for grouping (e.g. Forms/Input). Organized naming improves asset panel navigation.',
|
|
274
|
+
details: withPath.length > 0
|
|
275
|
+
? `${withPath.length} of ${scorableUnits.length} components use path-based grouping (${Math.round(ratio * 100)}%).`
|
|
276
|
+
: 'No components use path separators for grouping. Use "/" in names for organization (e.g., "Forms/Input").',
|
|
277
|
+
examples: withoutPath.length > 0
|
|
278
|
+
? withoutPath.slice(0, MAX_EXAMPLES).map((c) => c.name)
|
|
279
|
+
: undefined,
|
|
280
|
+
locations: withoutPath.length > 0
|
|
281
|
+
? withoutPath.slice(0, MAX_EXAMPLES).map((c) => ({
|
|
282
|
+
name: c.name,
|
|
283
|
+
nodeId: c.node_id,
|
|
284
|
+
type: "component",
|
|
285
|
+
}))
|
|
286
|
+
: undefined,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/** Matches Figma auto-generated layer names like "Frame 347", "Group 12", "Rectangle 5". */
|
|
290
|
+
const GENERIC_NAME_RE = /^(Frame|Group|Rectangle|Ellipse|Line|Polygon|Vector|Text|Image|Slice|Component|Instance|Section|Boolean\s*Group)\s*\d*$/i;
|
|
291
|
+
/**
|
|
292
|
+
* Score generic layer naming.
|
|
293
|
+
* Published components should have intentional names, not auto-generated ones.
|
|
294
|
+
*/
|
|
295
|
+
function scoreGenericNaming(classification) {
|
|
296
|
+
const { scorableUnits } = classification;
|
|
297
|
+
if (scorableUnits.length === 0) {
|
|
298
|
+
return {
|
|
299
|
+
id: "component-generic-naming",
|
|
300
|
+
label: "Layer naming",
|
|
301
|
+
score: 100,
|
|
302
|
+
severity: "info",
|
|
303
|
+
tooltip: "Published components should have intentional names. Auto-generated names like Frame 347 or Group 12 indicate layers that were never renamed.",
|
|
304
|
+
details: "No components to evaluate.",
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const genericComps = scorableUnits.filter((c) => {
|
|
308
|
+
const segments = (c.name || "").split("/").map((s) => s.trim());
|
|
309
|
+
return segments.some((seg) => GENERIC_NAME_RE.test(seg));
|
|
310
|
+
});
|
|
311
|
+
const ratio = 1 - genericComps.length / scorableUnits.length;
|
|
312
|
+
const score = clamp(ratio * 100);
|
|
313
|
+
return {
|
|
314
|
+
id: "component-generic-naming",
|
|
315
|
+
label: "Layer naming",
|
|
316
|
+
score,
|
|
317
|
+
severity: getSeverity(score),
|
|
318
|
+
tooltip: "Published components should have intentional names. Auto-generated names like Frame 347 or Group 12 indicate layers that were never renamed.",
|
|
319
|
+
details: genericComps.length > 0
|
|
320
|
+
? `${genericComps.length} of ${scorableUnits.length} components have auto-generated layer names (e.g. Frame, Group, Rectangle).`
|
|
321
|
+
: "All components have intentional names.",
|
|
322
|
+
examples: genericComps.length > 0
|
|
323
|
+
? genericComps.slice(0, MAX_EXAMPLES).map((c) => c.name)
|
|
324
|
+
: undefined,
|
|
325
|
+
locations: genericComps.length > 0
|
|
326
|
+
? genericComps.slice(0, MAX_EXAMPLES).map((c) => ({
|
|
327
|
+
name: c.name,
|
|
328
|
+
nodeId: c.node_id,
|
|
329
|
+
type: "component",
|
|
330
|
+
}))
|
|
331
|
+
: undefined,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Component Metadata category scorer.
|
|
336
|
+
* Returns the average score across all component metadata checks.
|
|
337
|
+
*/
|
|
338
|
+
export function scoreComponentMetadata(data) {
|
|
339
|
+
const classification = classifyComponents(data);
|
|
340
|
+
const findings = [
|
|
341
|
+
scoreDescriptionPresence(classification),
|
|
342
|
+
scoreDescriptionQuality(classification),
|
|
343
|
+
scorePropertyCompleteness(classification),
|
|
344
|
+
scoreVariantStructure(classification),
|
|
345
|
+
scoreCategoryOrganization(classification),
|
|
346
|
+
scoreGenericNaming(classification),
|
|
347
|
+
];
|
|
348
|
+
const score = clamp(findings.reduce((sum, f) => sum + f.score, 0) / findings.length);
|
|
349
|
+
return {
|
|
350
|
+
id: "component-metadata",
|
|
351
|
+
label: "Component Metadata",
|
|
352
|
+
shortLabel: "Components",
|
|
353
|
+
score,
|
|
354
|
+
weight: 0.2,
|
|
355
|
+
findings,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=component-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-metadata.js","sourceRoot":"","sources":["../../../../src/apps/design-system-dashboard/scoring/component-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consistency Scorer (weight: 0.15)
|
|
3
|
+
*
|
|
4
|
+
* Checks pattern uniformity across the design system.
|
|
5
|
+
* Evaluates naming delimiter consistency, casing consistency,
|
|
6
|
+
* size value consistency, and mode naming consistency.
|
|
7
|
+
*/
|
|
8
|
+
import type { CategoryScore, DesignSystemRawData } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Consistency category scorer.
|
|
11
|
+
* Returns the average score across all consistency checks.
|
|
12
|
+
*/
|
|
13
|
+
export declare function scoreConsistency(data: DesignSystemRawData): CategoryScore;
|
|
14
|
+
//# sourceMappingURL=consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../../../src/apps/design-system-dashboard/scoring/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAW,MAAM,YAAY,CAAC;AA6X9E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,aAAa,CAoBzE"}
|