@layoutdesign/context 0.2.3 → 0.2.5
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/dist/bin/cli.js +1 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/cli/doctor.d.ts +2 -0
- package/dist/src/cli/doctor.d.ts.map +1 -1
- package/dist/src/cli/doctor.js +152 -38
- package/dist/src/cli/doctor.js.map +1 -1
- package/dist/src/cli/install.d.ts.map +1 -1
- package/dist/src/cli/install.js +15 -51
- package/dist/src/cli/install.js.map +1 -1
- package/dist/src/cli/setup-utils.d.ts +65 -0
- package/dist/src/cli/setup-utils.d.ts.map +1 -0
- package/dist/src/cli/setup-utils.js +225 -0
- package/dist/src/cli/setup-utils.js.map +1 -0
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +3 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/check-setup.d.ts +24 -0
- package/dist/src/mcp/tools/check-setup.d.ts.map +1 -0
- package/dist/src/mcp/tools/check-setup.js +195 -0
- package/dist/src/mcp/tools/check-setup.js.map +1 -0
- package/dist/src/preview/ensure.d.ts.map +1 -1
- package/dist/src/preview/ensure.js +43 -1
- package/dist/src/preview/ensure.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -71,6 +71,7 @@ program
|
|
|
71
71
|
.command("doctor")
|
|
72
72
|
.description("Check Node.js version, Claude CLI, and MCP dependencies")
|
|
73
73
|
.option("--fix", "Auto-install missing MCP servers")
|
|
74
|
+
.option("--verbose", "Show detailed diagnostic output including raw MCP server data")
|
|
74
75
|
.action(async (options) => {
|
|
75
76
|
await doctorCommand(options);
|
|
76
77
|
});
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CACV,+DAA+D,CAChE;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,+FAA+F,CAAC;KAC5G,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,UAAU,EAAE,gEAAgE,CAAC;KACpF,MAAM,CAAC,cAAc,EAAE,qCAAqC,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAmE,EAAE,EAAE;IACpF,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,+GAA+G,CAAC;KAC5H,MAAM,CAAC,YAAY,EAAE,8CAA8C,CAAC;KACpE,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAA2C,EAAE,EAAE;IAChF,MAAM,iBAAiB,CAAC,UAAU,EAAE;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,OAAO,EAAE,kCAAkC,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/doctor.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `layout-context doctor` — checks Node.js, Claude CLI, and MCP dependencies.
|
|
3
3
|
* With --fix, automatically installs missing MCP servers.
|
|
4
|
+
* With --verbose, shows raw MCP output and detailed transport/scope info.
|
|
4
5
|
*/
|
|
5
6
|
export declare function doctorCommand(options?: {
|
|
6
7
|
fix?: boolean;
|
|
8
|
+
verbose?: boolean;
|
|
7
9
|
}): Promise<void>;
|
|
8
10
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EhB"}
|
package/dist/src/cli/doctor.js
CHANGED
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
+
import { checkMcpRegistration, addFigmaMcpServer, addPlaywrightMcpServer, testEndpointReachable, } from "./setup-utils.js";
|
|
3
4
|
/**
|
|
4
5
|
* `layout-context doctor` — checks Node.js, Claude CLI, and MCP dependencies.
|
|
5
6
|
* With --fix, automatically installs missing MCP servers.
|
|
7
|
+
* With --verbose, shows raw MCP output and detailed transport/scope info.
|
|
6
8
|
*/
|
|
7
9
|
export async function doctorCommand(options) {
|
|
8
10
|
const autoFix = options?.fix ?? false;
|
|
11
|
+
const verbose = options?.verbose ?? false;
|
|
9
12
|
console.log();
|
|
10
13
|
console.log(chalk.bold("Layout Context — Dependency Check"));
|
|
11
14
|
if (autoFix) {
|
|
12
15
|
console.log(chalk.dim(" Mode: auto-fix enabled"));
|
|
13
16
|
}
|
|
17
|
+
if (verbose) {
|
|
18
|
+
console.log(chalk.dim(" Mode: verbose diagnostics"));
|
|
19
|
+
}
|
|
14
20
|
console.log();
|
|
15
21
|
const results = [
|
|
16
22
|
checkNodeVersion(),
|
|
17
23
|
checkClaudeCli(),
|
|
18
|
-
...checkMcpServers(),
|
|
19
24
|
];
|
|
25
|
+
// MCP server checks (deep Figma diagnostics)
|
|
26
|
+
const mcpResults = await checkMcpServersDeep(verbose);
|
|
27
|
+
results.push(...mcpResults);
|
|
20
28
|
let issues = 0;
|
|
21
29
|
let fixed = 0;
|
|
22
30
|
for (const r of results) {
|
|
23
31
|
if (r.ok) {
|
|
24
32
|
console.log(chalk.green(" ✅ ") + r.label + chalk.dim(` — ${r.detail}`));
|
|
33
|
+
if (r.warning) {
|
|
34
|
+
console.log(chalk.yellow(` ⚠ ${r.warning}`));
|
|
35
|
+
}
|
|
25
36
|
}
|
|
26
37
|
else {
|
|
27
38
|
issues++;
|
|
@@ -29,20 +40,11 @@ export async function doctorCommand(options) {
|
|
|
29
40
|
console.log(chalk.dim(` ${r.detail}`));
|
|
30
41
|
// Attempt auto-fix if --fix and we have a fixCmd
|
|
31
42
|
if (autoFix && r.fixCmd) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
35
|
-
});
|
|
36
|
-
console.log(chalk.green(` ✓ Fixed!`));
|
|
43
|
+
const fixResult = attemptFix(r);
|
|
44
|
+
if (fixResult) {
|
|
37
45
|
fixed++;
|
|
38
46
|
issues--;
|
|
39
47
|
}
|
|
40
|
-
catch {
|
|
41
|
-
console.log(chalk.red(` ✗ Auto-fix failed`));
|
|
42
|
-
if (r.fix) {
|
|
43
|
-
console.log(chalk.cyan(` Run manually: ${r.fix}`));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
48
|
}
|
|
47
49
|
else if (r.fix) {
|
|
48
50
|
console.log(chalk.cyan(` Fix: ${r.fix}`));
|
|
@@ -67,6 +69,44 @@ export async function doctorCommand(options) {
|
|
|
67
69
|
}
|
|
68
70
|
console.log();
|
|
69
71
|
}
|
|
72
|
+
function attemptFix(r) {
|
|
73
|
+
if (!r.fixCmd)
|
|
74
|
+
return false;
|
|
75
|
+
// Use shared utilities for Figma and Playwright
|
|
76
|
+
if (r.label.includes("Figma")) {
|
|
77
|
+
const result = addFigmaMcpServer();
|
|
78
|
+
if (result.success) {
|
|
79
|
+
console.log(chalk.green(` ✓ Fixed: ${result.message}`));
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
console.log(chalk.red(` ✗ Auto-fix failed: ${result.message}`));
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (r.label.includes("Playwright")) {
|
|
86
|
+
const result = addPlaywrightMcpServer();
|
|
87
|
+
if (result.success) {
|
|
88
|
+
console.log(chalk.green(` ✓ Fixed: ${result.message}`));
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
console.log(chalk.red(` ✗ Auto-fix failed: ${result.message}`));
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Generic fix via fixCmd
|
|
95
|
+
try {
|
|
96
|
+
execFileSync(r.fixCmd[0], r.fixCmd.slice(1), {
|
|
97
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
98
|
+
});
|
|
99
|
+
console.log(chalk.green(` ✓ Fixed!`));
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
console.log(chalk.red(` ✗ Auto-fix failed`));
|
|
104
|
+
if (r.fix) {
|
|
105
|
+
console.log(chalk.cyan(` Run manually: ${r.fix}`));
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
70
110
|
function checkNodeVersion() {
|
|
71
111
|
const [major] = process.versions.node.split(".").map(Number);
|
|
72
112
|
if (major !== undefined && major >= 18) {
|
|
@@ -102,16 +142,12 @@ function checkClaudeCli() {
|
|
|
102
142
|
};
|
|
103
143
|
}
|
|
104
144
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
145
|
+
/**
|
|
146
|
+
* Deep MCP server checks with Figma-specific diagnostics.
|
|
147
|
+
*/
|
|
148
|
+
async function checkMcpServersDeep(verbose) {
|
|
149
|
+
const state = checkMcpRegistration();
|
|
150
|
+
if (!state) {
|
|
115
151
|
return [
|
|
116
152
|
{
|
|
117
153
|
label: "MCP server list",
|
|
@@ -121,26 +157,94 @@ function checkMcpServers() {
|
|
|
121
157
|
},
|
|
122
158
|
];
|
|
123
159
|
}
|
|
160
|
+
if (verbose) {
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(chalk.dim(" Raw MCP list output:"));
|
|
163
|
+
for (const line of state.rawOutput.split("\n")) {
|
|
164
|
+
if (line.trim()) {
|
|
165
|
+
console.log(chalk.dim(` ${line}`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log();
|
|
169
|
+
}
|
|
124
170
|
const results = [];
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
171
|
+
// --- Figma MCP (deep check) ---
|
|
172
|
+
if (state.figma.registered) {
|
|
173
|
+
const entry = state.figma.entry;
|
|
174
|
+
let detail = "configured";
|
|
175
|
+
let warning;
|
|
176
|
+
// Transport check
|
|
177
|
+
if (!state.figma.correctTransport) {
|
|
178
|
+
detail += ` (transport: ${entry?.transport ?? "unknown"})`;
|
|
179
|
+
warning =
|
|
180
|
+
"Figma MCP should use HTTP transport for OAuth. " +
|
|
181
|
+
"Re-register with: claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp";
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
detail += " (http transport)";
|
|
185
|
+
}
|
|
186
|
+
// Scope check
|
|
187
|
+
if (!state.figma.correctScope) {
|
|
188
|
+
const scopeNote = `scope: ${entry?.scope ?? "unknown"}`;
|
|
189
|
+
detail += `, ${scopeNote}`;
|
|
190
|
+
if (!warning) {
|
|
191
|
+
warning =
|
|
192
|
+
"Figma MCP is registered at project scope — consider user scope for cross-project availability. " +
|
|
193
|
+
"Re-register with: claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp";
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
detail += ", user scope";
|
|
198
|
+
}
|
|
199
|
+
// Plugin shadow check
|
|
200
|
+
if (state.figma.pluginShadow) {
|
|
201
|
+
warning = warning
|
|
202
|
+
? warning +
|
|
203
|
+
" Also: a Claude plugin is providing a duplicate Figma registration — " +
|
|
204
|
+
"the plugin version uses OAuth that doesn't persist between sessions."
|
|
205
|
+
: "A Claude plugin is providing a duplicate Figma registration. " +
|
|
206
|
+
"The plugin version uses OAuth that doesn't persist between sessions. " +
|
|
207
|
+
"Ensure you also have a proper user-scoped registration.";
|
|
208
|
+
}
|
|
209
|
+
results.push({
|
|
129
210
|
label: "Figma MCP",
|
|
130
211
|
ok: true,
|
|
131
|
-
detail
|
|
132
|
-
|
|
133
|
-
|
|
212
|
+
detail,
|
|
213
|
+
warning,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
results.push({
|
|
134
218
|
label: "Figma MCP",
|
|
135
219
|
ok: false,
|
|
136
220
|
detail: "not found in MCP server list",
|
|
137
221
|
fix: "claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp",
|
|
138
|
-
fixCmd: [
|
|
222
|
+
fixCmd: [
|
|
223
|
+
"claude", "mcp", "add", "--scope", "user", "--transport", "http",
|
|
224
|
+
"figma", "https://mcp.figma.com/mcp",
|
|
225
|
+
],
|
|
139
226
|
requiredBy: "push-to-figma, design-in-figma, url-to-figma",
|
|
140
227
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
228
|
+
}
|
|
229
|
+
// --- Figma endpoint reachability ---
|
|
230
|
+
const reachability = await testEndpointReachable("https://mcp.figma.com/mcp");
|
|
231
|
+
if (reachability.reachable) {
|
|
232
|
+
results.push({
|
|
233
|
+
label: "Figma endpoint",
|
|
234
|
+
ok: true,
|
|
235
|
+
detail: `reachable (HTTP ${reachability.status})`,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
results.push({
|
|
240
|
+
label: "Figma endpoint",
|
|
241
|
+
ok: false,
|
|
242
|
+
detail: `unreachable — ${reachability.error}`,
|
|
243
|
+
fix: "Check your internet connection or firewall settings. Figma MCP connects to https://mcp.figma.com/mcp",
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// --- Playwright MCP ---
|
|
247
|
+
results.push(state.playwright.registered
|
|
144
248
|
? {
|
|
145
249
|
label: "Playwright MCP",
|
|
146
250
|
ok: true,
|
|
@@ -151,13 +255,14 @@ function checkMcpServers() {
|
|
|
151
255
|
ok: false,
|
|
152
256
|
detail: "not found in MCP server list",
|
|
153
257
|
fix: "claude mcp add --scope user playwright -- npx -y @anthropic-ai/mcp-playwright",
|
|
154
|
-
fixCmd: [
|
|
258
|
+
fixCmd: [
|
|
259
|
+
"claude", "mcp", "add", "--scope", "user",
|
|
260
|
+
"playwright", "--", "npx", "-y", "@anthropic-ai/mcp-playwright",
|
|
261
|
+
],
|
|
155
262
|
requiredBy: "push-to-figma, url-to-figma",
|
|
156
263
|
});
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
mcpListOutput.toLowerCase().includes("layoutdesign");
|
|
160
|
-
results.push(hasLayout
|
|
264
|
+
// --- Layout MCP ---
|
|
265
|
+
results.push(state.layout.registered
|
|
161
266
|
? {
|
|
162
267
|
label: "Layout MCP",
|
|
163
268
|
ok: true,
|
|
@@ -170,6 +275,15 @@ function checkMcpServers() {
|
|
|
170
275
|
fix: "npx @layoutdesign/context install",
|
|
171
276
|
requiredBy: "all design system tools",
|
|
172
277
|
});
|
|
278
|
+
// --- Verbose: show parsed entries ---
|
|
279
|
+
if (verbose && state.servers.length > 0) {
|
|
280
|
+
console.log();
|
|
281
|
+
console.log(chalk.dim(" Parsed MCP servers:"));
|
|
282
|
+
for (const s of state.servers) {
|
|
283
|
+
console.log(chalk.dim(` ${s.name} — transport: ${s.transport}, scope: ${s.scope}`));
|
|
284
|
+
}
|
|
285
|
+
console.log();
|
|
286
|
+
}
|
|
173
287
|
return results;
|
|
174
288
|
}
|
|
175
289
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"AAiMA,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhB"}
|
package/dist/src/cli/install.js
CHANGED
|
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
+
import { addFigmaMcpServer as sharedAddFigma, addPlaywrightMcpServer as sharedAddPlaywright, } from "./setup-utils.js";
|
|
5
6
|
const MCP_CONFIG = {
|
|
6
7
|
command: "npx",
|
|
7
8
|
args: ["-y", "@layoutdesign/context", "serve"],
|
|
@@ -119,67 +120,30 @@ function addMcpServerViaFile(target) {
|
|
|
119
120
|
return true;
|
|
120
121
|
}
|
|
121
122
|
/**
|
|
122
|
-
* Add Figma MCP server
|
|
123
|
-
*
|
|
124
|
-
* Important: we do NOT pre-check `claude mcp list`. The plugin
|
|
125
|
-
* `figma@claude-plugins-official` causes "figma" to appear in that list,
|
|
126
|
-
* which would make us skip this step — but the plugin-provided registration
|
|
127
|
-
* uses OAuth that doesn't persist between sessions. We must always ensure a
|
|
128
|
-
* proper user-scoped entry exists. Let `claude mcp add` itself handle the
|
|
129
|
-
* "already registered" case.
|
|
123
|
+
* Add Figma MCP server — delegates to shared utility, logs result.
|
|
130
124
|
*/
|
|
131
125
|
function addFigmaMcpServer() {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
"figma", "https://mcp.figma.com/mcp",
|
|
136
|
-
], { stdio: ["pipe", "pipe", "pipe"] });
|
|
137
|
-
console.log(chalk.green(" ✓"), "Figma MCP: registered globally (OAuth — authenticate once in Claude Code)");
|
|
138
|
-
return true;
|
|
126
|
+
const result = sharedAddFigma();
|
|
127
|
+
if (result.success) {
|
|
128
|
+
console.log(chalk.green(" ✓"), `Figma MCP: ${result.message}`);
|
|
139
129
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
// Already registered at user scope — this is fine
|
|
143
|
-
if (stderr.includes("already") || stderr.includes("exists")) {
|
|
144
|
-
console.log(chalk.dim(" ↳"), "Figma MCP: already configured at user scope");
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
console.log(chalk.yellow(" ⚠"), "Figma MCP: could not register automatically");
|
|
148
|
-
console.log(chalk.dim(" Run manually:"), chalk.cyan("claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp"));
|
|
149
|
-
return false;
|
|
130
|
+
else {
|
|
131
|
+
console.log(chalk.yellow(" ⚠"), `Figma MCP: ${result.message}`);
|
|
150
132
|
}
|
|
133
|
+
return result.success;
|
|
151
134
|
}
|
|
152
135
|
/**
|
|
153
|
-
* Add Playwright MCP server
|
|
154
|
-
* Uses --scope user so it's available across all projects.
|
|
136
|
+
* Add Playwright MCP server — delegates to shared utility, logs result.
|
|
155
137
|
*/
|
|
156
138
|
function addPlaywrightMcpServer() {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
161
|
-
});
|
|
162
|
-
if (list.toLowerCase().includes("playwright")) {
|
|
163
|
-
console.log(chalk.dim(" ↳"), "Playwright MCP: already configured");
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
return false;
|
|
139
|
+
const result = sharedAddPlaywright();
|
|
140
|
+
if (result.success) {
|
|
141
|
+
console.log(chalk.green(" ✓"), `Playwright MCP: ${result.message}`);
|
|
169
142
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
"mcp", "add", "--scope", "user",
|
|
173
|
-
"playwright", "--", "npx", "-y", "@anthropic-ai/mcp-playwright",
|
|
174
|
-
], { stdio: ["pipe", "pipe", "pipe"] });
|
|
175
|
-
console.log(chalk.green(" ✓"), "Playwright MCP: registered globally");
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
console.log(chalk.yellow(" ⚠"), "Playwright MCP: could not register automatically");
|
|
180
|
-
console.log(chalk.dim(" Run manually:"), chalk.cyan("npx @anthropic-ai/mcp-playwright install"));
|
|
181
|
-
return false;
|
|
143
|
+
else {
|
|
144
|
+
console.log(chalk.yellow(" ⚠"), `Playwright MCP: ${result.message}`);
|
|
182
145
|
}
|
|
146
|
+
return result.success;
|
|
183
147
|
}
|
|
184
148
|
export async function installCommand(options) {
|
|
185
149
|
console.log();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export interface McpServerEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
scope: "user" | "project" | "unknown";
|
|
4
|
+
transport: "http" | "stdio" | "unknown";
|
|
5
|
+
raw: string;
|
|
6
|
+
}
|
|
7
|
+
export interface McpRegistrationState {
|
|
8
|
+
/** Raw output from `claude mcp list` */
|
|
9
|
+
rawOutput: string;
|
|
10
|
+
/** All detected MCP servers */
|
|
11
|
+
servers: McpServerEntry[];
|
|
12
|
+
/** Figma-specific state */
|
|
13
|
+
figma: {
|
|
14
|
+
registered: boolean;
|
|
15
|
+
entry?: McpServerEntry;
|
|
16
|
+
/** True if a plugin-provided entry shadows the proper registration */
|
|
17
|
+
pluginShadow: boolean;
|
|
18
|
+
/** True if transport is http (required for OAuth) */
|
|
19
|
+
correctTransport: boolean;
|
|
20
|
+
/** True if registered at user scope */
|
|
21
|
+
correctScope: boolean;
|
|
22
|
+
};
|
|
23
|
+
/** Playwright state */
|
|
24
|
+
playwright: {
|
|
25
|
+
registered: boolean;
|
|
26
|
+
entry?: McpServerEntry;
|
|
27
|
+
};
|
|
28
|
+
/** Layout state */
|
|
29
|
+
layout: {
|
|
30
|
+
registered: boolean;
|
|
31
|
+
entry?: McpServerEntry;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface FixResult {
|
|
35
|
+
server: string;
|
|
36
|
+
success: boolean;
|
|
37
|
+
message: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run `claude mcp list` and parse the output into structured state.
|
|
41
|
+
* Returns null if the Claude CLI is unavailable.
|
|
42
|
+
*/
|
|
43
|
+
export declare function checkMcpRegistration(): McpRegistrationState | null;
|
|
44
|
+
/**
|
|
45
|
+
* Register Figma MCP server via `claude mcp add --scope user --transport http`.
|
|
46
|
+
*
|
|
47
|
+
* Important: we always attempt registration and let `claude mcp add` handle
|
|
48
|
+
* the "already registered" case. The plugin-provided registration
|
|
49
|
+
* (`figma@claude-plugins-official`) uses OAuth that doesn't persist between
|
|
50
|
+
* sessions, so we must ensure a proper user-scoped entry exists.
|
|
51
|
+
*/
|
|
52
|
+
export declare function addFigmaMcpServer(): FixResult;
|
|
53
|
+
/**
|
|
54
|
+
* Register Playwright MCP server via `claude mcp add --scope user`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function addPlaywrightMcpServer(): FixResult;
|
|
57
|
+
/**
|
|
58
|
+
* Test whether an HTTP endpoint is reachable (HEAD request with timeout).
|
|
59
|
+
*/
|
|
60
|
+
export declare function testEndpointReachable(url: string, timeoutMs?: number): Promise<{
|
|
61
|
+
reachable: boolean;
|
|
62
|
+
status?: number;
|
|
63
|
+
error?: string;
|
|
64
|
+
}>;
|
|
65
|
+
//# sourceMappingURL=setup-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/setup-utils.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,2BAA2B;IAC3B,KAAK,EAAE;QACL,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB,sEAAsE;QACtE,YAAY,EAAE,OAAO,CAAC;QACtB,qDAAqD;QACrD,gBAAgB,EAAE,OAAO,CAAC;QAC1B,uCAAuC;QACvC,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,uBAAuB;IACvB,UAAU,EAAE;QACV,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;IACF,mBAAmB;IACnB,MAAM,EAAE;QACN,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,CAgDlE;AA6ED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CA+B7C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,SAAS,CA4ClD;AAMD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,SAAS,SAAQ,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAclE"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
/* ------------------------------------------------------------------ */
|
|
3
|
+
/* Check MCP registration */
|
|
4
|
+
/* ------------------------------------------------------------------ */
|
|
5
|
+
/**
|
|
6
|
+
* Run `claude mcp list` and parse the output into structured state.
|
|
7
|
+
* Returns null if the Claude CLI is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export function checkMcpRegistration() {
|
|
10
|
+
let rawOutput;
|
|
11
|
+
try {
|
|
12
|
+
rawOutput = execFileSync("claude", ["mcp", "list"], {
|
|
13
|
+
encoding: "utf-8",
|
|
14
|
+
timeout: 10_000,
|
|
15
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const servers = parseMcpList(rawOutput);
|
|
22
|
+
const lower = rawOutput.toLowerCase();
|
|
23
|
+
// Figma analysis
|
|
24
|
+
const figmaEntry = servers.find((s) => s.name === "figma");
|
|
25
|
+
const hasPluginShadow = lower.includes("figma@claude-plugins") ||
|
|
26
|
+
lower.includes("claude-plugins-official");
|
|
27
|
+
// Playwright analysis
|
|
28
|
+
const playwrightEntry = servers.find((s) => s.name === "playwright");
|
|
29
|
+
// Layout analysis
|
|
30
|
+
const layoutEntry = servers.find((s) => s.name === "layout" || s.name === "layoutdesign");
|
|
31
|
+
return {
|
|
32
|
+
rawOutput,
|
|
33
|
+
servers,
|
|
34
|
+
figma: {
|
|
35
|
+
registered: !!figmaEntry,
|
|
36
|
+
entry: figmaEntry,
|
|
37
|
+
pluginShadow: hasPluginShadow,
|
|
38
|
+
correctTransport: figmaEntry?.transport === "http",
|
|
39
|
+
correctScope: figmaEntry?.scope === "user",
|
|
40
|
+
},
|
|
41
|
+
playwright: {
|
|
42
|
+
registered: !!playwrightEntry,
|
|
43
|
+
entry: playwrightEntry,
|
|
44
|
+
},
|
|
45
|
+
layout: {
|
|
46
|
+
registered: !!layoutEntry,
|
|
47
|
+
entry: layoutEntry,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse `claude mcp list` output into individual server entries.
|
|
53
|
+
*
|
|
54
|
+
* The output format varies but typically looks like:
|
|
55
|
+
* name: figma (user, http)
|
|
56
|
+
* name: layout (project, stdio)
|
|
57
|
+
*
|
|
58
|
+
* We parse flexibly to handle format changes.
|
|
59
|
+
*/
|
|
60
|
+
function parseMcpList(raw) {
|
|
61
|
+
const entries = [];
|
|
62
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
63
|
+
for (const line of lines) {
|
|
64
|
+
const lower = line.toLowerCase().trim();
|
|
65
|
+
// Skip headers, separators, empty lines
|
|
66
|
+
if (!lower || lower.startsWith("─") || lower.startsWith("="))
|
|
67
|
+
continue;
|
|
68
|
+
// Try to extract server name — look for common patterns
|
|
69
|
+
// Pattern: "name: serverName" or "serverName (scope, transport)" or just "serverName"
|
|
70
|
+
let name;
|
|
71
|
+
let scope = "unknown";
|
|
72
|
+
let transport = "unknown";
|
|
73
|
+
// Pattern: " serverName type: stdio scope: user"
|
|
74
|
+
const colonMatch = lower.match(/^\s*(\S+)\s+.*?type:\s*(http|stdio).*?scope:\s*(user|project)/);
|
|
75
|
+
if (colonMatch) {
|
|
76
|
+
name = colonMatch[1];
|
|
77
|
+
transport = colonMatch[2];
|
|
78
|
+
scope = colonMatch[3];
|
|
79
|
+
}
|
|
80
|
+
// Pattern: "serverName (user, http)" or "serverName http user"
|
|
81
|
+
if (!name) {
|
|
82
|
+
const parenMatch = lower.match(/^\s*(\S+)\s*\(([^)]+)\)/);
|
|
83
|
+
if (parenMatch) {
|
|
84
|
+
name = parenMatch[1];
|
|
85
|
+
const inner = parenMatch[2];
|
|
86
|
+
if (inner.includes("http"))
|
|
87
|
+
transport = "http";
|
|
88
|
+
else if (inner.includes("stdio"))
|
|
89
|
+
transport = "stdio";
|
|
90
|
+
if (inner.includes("user"))
|
|
91
|
+
scope = "user";
|
|
92
|
+
else if (inner.includes("project"))
|
|
93
|
+
scope = "project";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Fallback: just grab the first word if the line contains known server names
|
|
97
|
+
if (!name) {
|
|
98
|
+
const words = lower.split(/\s+/);
|
|
99
|
+
const knownNames = ["figma", "layout", "layoutdesign", "playwright"];
|
|
100
|
+
const found = words.find((w) => knownNames.includes(w));
|
|
101
|
+
if (found) {
|
|
102
|
+
name = found;
|
|
103
|
+
// Try to infer transport and scope from rest of line
|
|
104
|
+
if (lower.includes("http"))
|
|
105
|
+
transport = "http";
|
|
106
|
+
else if (lower.includes("stdio"))
|
|
107
|
+
transport = "stdio";
|
|
108
|
+
if (lower.includes("user"))
|
|
109
|
+
scope = "user";
|
|
110
|
+
else if (lower.includes("project"))
|
|
111
|
+
scope = "project";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (name) {
|
|
115
|
+
entries.push({ name, scope, transport, raw: line.trim() });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return entries;
|
|
119
|
+
}
|
|
120
|
+
/* ------------------------------------------------------------------ */
|
|
121
|
+
/* Fix / register MCP servers */
|
|
122
|
+
/* ------------------------------------------------------------------ */
|
|
123
|
+
/**
|
|
124
|
+
* Register Figma MCP server via `claude mcp add --scope user --transport http`.
|
|
125
|
+
*
|
|
126
|
+
* Important: we always attempt registration and let `claude mcp add` handle
|
|
127
|
+
* the "already registered" case. The plugin-provided registration
|
|
128
|
+
* (`figma@claude-plugins-official`) uses OAuth that doesn't persist between
|
|
129
|
+
* sessions, so we must ensure a proper user-scoped entry exists.
|
|
130
|
+
*/
|
|
131
|
+
export function addFigmaMcpServer() {
|
|
132
|
+
try {
|
|
133
|
+
execFileSync("claude", [
|
|
134
|
+
"mcp", "add", "--scope", "user", "--transport", "http",
|
|
135
|
+
"figma", "https://mcp.figma.com/mcp",
|
|
136
|
+
], { stdio: ["pipe", "pipe", "pipe"] });
|
|
137
|
+
return {
|
|
138
|
+
server: "figma",
|
|
139
|
+
success: true,
|
|
140
|
+
message: "Registered globally (OAuth — authenticate once in Claude Code)",
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
const stderr = err.stderr?.toString() ?? "";
|
|
145
|
+
if (stderr.includes("already") || stderr.includes("exists")) {
|
|
146
|
+
return {
|
|
147
|
+
server: "figma",
|
|
148
|
+
success: true,
|
|
149
|
+
message: "Already configured at user scope",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
server: "figma",
|
|
154
|
+
success: false,
|
|
155
|
+
message: "Could not register automatically. Run manually: claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Register Playwright MCP server via `claude mcp add --scope user`.
|
|
161
|
+
*/
|
|
162
|
+
export function addPlaywrightMcpServer() {
|
|
163
|
+
// Check if already registered
|
|
164
|
+
try {
|
|
165
|
+
const list = execFileSync("claude", ["mcp", "list"], {
|
|
166
|
+
encoding: "utf-8",
|
|
167
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
168
|
+
});
|
|
169
|
+
if (list.toLowerCase().includes("playwright")) {
|
|
170
|
+
return {
|
|
171
|
+
server: "playwright",
|
|
172
|
+
success: true,
|
|
173
|
+
message: "Already configured",
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return {
|
|
179
|
+
server: "playwright",
|
|
180
|
+
success: false,
|
|
181
|
+
message: "Could not check MCP list",
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
execFileSync("claude", [
|
|
186
|
+
"mcp", "add", "--scope", "user",
|
|
187
|
+
"playwright", "--", "npx", "-y", "@anthropic-ai/mcp-playwright",
|
|
188
|
+
], { stdio: ["pipe", "pipe", "pipe"] });
|
|
189
|
+
return {
|
|
190
|
+
server: "playwright",
|
|
191
|
+
success: true,
|
|
192
|
+
message: "Registered globally",
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return {
|
|
197
|
+
server: "playwright",
|
|
198
|
+
success: false,
|
|
199
|
+
message: "Could not register automatically. Run manually: claude mcp add --scope user playwright -- npx -y @anthropic-ai/mcp-playwright",
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/* ------------------------------------------------------------------ */
|
|
204
|
+
/* Endpoint reachability */
|
|
205
|
+
/* ------------------------------------------------------------------ */
|
|
206
|
+
/**
|
|
207
|
+
* Test whether an HTTP endpoint is reachable (HEAD request with timeout).
|
|
208
|
+
*/
|
|
209
|
+
export async function testEndpointReachable(url, timeoutMs = 5_000) {
|
|
210
|
+
try {
|
|
211
|
+
const controller = new AbortController();
|
|
212
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
213
|
+
const res = await fetch(url, {
|
|
214
|
+
method: "HEAD",
|
|
215
|
+
signal: controller.signal,
|
|
216
|
+
});
|
|
217
|
+
clearTimeout(timer);
|
|
218
|
+
return { reachable: true, status: res.status };
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
222
|
+
return { reachable: false, error: msg };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=setup-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-utils.js","sourceRoot":"","sources":["../../../src/cli/setup-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmHjD"}
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -19,6 +19,7 @@ import * as urlToFigma from "./tools/url-to-figma.js";
|
|
|
19
19
|
import * as designInFigma from "./tools/design-in-figma.js";
|
|
20
20
|
import * as updateTokens from "./tools/update-tokens.js";
|
|
21
21
|
import * as getScreenshots from "./tools/get-screenshots.js";
|
|
22
|
+
import * as checkSetup from "./tools/check-setup.js";
|
|
22
23
|
/**
|
|
23
24
|
* Start the Layout Context MCP server.
|
|
24
25
|
* Loads the kit from the current working directory and registers all tools.
|
|
@@ -44,7 +45,7 @@ export async function startServer() {
|
|
|
44
45
|
name: "layout-context",
|
|
45
46
|
version: pkg.version,
|
|
46
47
|
});
|
|
47
|
-
// Register all
|
|
48
|
+
// Register all 12 tools
|
|
48
49
|
server.tool(getDesignSystem.name, getDesignSystem.description, getDesignSystem.inputSchema, getDesignSystem.handler(kit));
|
|
49
50
|
server.tool(getTokens.name, getTokens.description, getTokens.inputSchema, getTokens.handler(kit));
|
|
50
51
|
server.tool(getComponent.name, getComponent.description, getComponent.inputSchema, getComponent.handler(kit));
|
|
@@ -56,6 +57,7 @@ export async function startServer() {
|
|
|
56
57
|
server.tool(designInFigma.name, designInFigma.description, designInFigma.inputSchema, designInFigma.handler(kit));
|
|
57
58
|
server.tool(updateTokens.name, updateTokens.description, updateTokens.inputSchema, updateTokens.handler());
|
|
58
59
|
server.tool(getScreenshots.name, getScreenshots.description, getScreenshots.inputSchema, getScreenshots.handler());
|
|
60
|
+
server.tool(checkSetup.name, checkSetup.description, checkSetup.inputSchema, checkSetup.handler());
|
|
59
61
|
// Connect via stdio
|
|
60
62
|
const transport = new StdioServerTransport();
|
|
61
63
|
await server.connect(transport);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,+DAA+D;AAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAwB,CAAC;AAEpE,eAAe;AACf,OAAO,KAAK,eAAe,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,cAAc,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,cAAc,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const name = "check-setup";
|
|
3
|
+
export declare const description: string;
|
|
4
|
+
export declare const inputSchema: {
|
|
5
|
+
focus: z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
figma: "figma";
|
|
7
|
+
playwright: "playwright";
|
|
8
|
+
layout: "layout";
|
|
9
|
+
all: "all";
|
|
10
|
+
}>>;
|
|
11
|
+
fix: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
};
|
|
13
|
+
type Input = {
|
|
14
|
+
focus?: "all" | "figma" | "playwright" | "layout";
|
|
15
|
+
fix?: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function handler(): (input: Input) => Promise<{
|
|
18
|
+
content: {
|
|
19
|
+
type: "text";
|
|
20
|
+
text: string;
|
|
21
|
+
}[];
|
|
22
|
+
}>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=check-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-setup.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/check-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAElC,eAAO,MAAM,WAAW,QAKoD,CAAC;AAE7E,eAAO,MAAM,WAAW;;;;;;;;CAWvB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;IAClD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAgB,OAAO,KACP,OAAO,KAAK;;;;;GAwC3B"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { checkMcpRegistration, addFigmaMcpServer, addPlaywrightMcpServer, testEndpointReachable, } from "../../cli/setup-utils.js";
|
|
3
|
+
export const name = "check-setup";
|
|
4
|
+
export const description = "Diagnose and optionally fix MCP server setup issues. " +
|
|
5
|
+
"Call this when Figma tools (push-to-figma, design-in-figma, url-to-figma) aren't working, " +
|
|
6
|
+
"or when the user reports that Figma MCP appears listed but isn't connected. " +
|
|
7
|
+
"Checks registration, transport type, OAuth status, and endpoint reachability. " +
|
|
8
|
+
"With fix=true, attempts to re-register missing or misconfigured servers.";
|
|
9
|
+
export const inputSchema = {
|
|
10
|
+
focus: z
|
|
11
|
+
.enum(["all", "figma", "playwright", "layout"])
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("What to check. Default: 'all'"),
|
|
14
|
+
fix: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("If true, attempt to auto-fix issues (re-register MCP servers). Default: false"),
|
|
18
|
+
};
|
|
19
|
+
export function handler() {
|
|
20
|
+
return async (input) => {
|
|
21
|
+
const focus = input.focus ?? "all";
|
|
22
|
+
const shouldFix = input.fix ?? false;
|
|
23
|
+
const sections = [];
|
|
24
|
+
sections.push("## Layout Setup Check\n");
|
|
25
|
+
// Check MCP registration
|
|
26
|
+
const state = checkMcpRegistration();
|
|
27
|
+
if (!state) {
|
|
28
|
+
sections.push("### Claude CLI ❌\n" +
|
|
29
|
+
"- Could not run `claude mcp list`\n" +
|
|
30
|
+
"- The Claude CLI may not be installed or not in PATH\n" +
|
|
31
|
+
"- Install: https://docs.anthropic.com/en/docs/claude-code\n");
|
|
32
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
33
|
+
}
|
|
34
|
+
// --- Figma MCP ---
|
|
35
|
+
if (focus === "all" || focus === "figma") {
|
|
36
|
+
sections.push(await checkFigma(state, shouldFix));
|
|
37
|
+
}
|
|
38
|
+
// --- Playwright MCP ---
|
|
39
|
+
if (focus === "all" || focus === "playwright") {
|
|
40
|
+
sections.push(checkPlaywright(state, shouldFix));
|
|
41
|
+
}
|
|
42
|
+
// --- Layout MCP ---
|
|
43
|
+
if (focus === "all" || focus === "layout") {
|
|
44
|
+
sections.push(checkLayout(state));
|
|
45
|
+
}
|
|
46
|
+
// --- Next Steps ---
|
|
47
|
+
sections.push(buildNextSteps(state, shouldFix));
|
|
48
|
+
return { content: [{ type: "text", text: sections.join("\n") }] };
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function checkFigma(state, shouldFix) {
|
|
52
|
+
const lines = [];
|
|
53
|
+
if (state.figma.registered) {
|
|
54
|
+
const entry = state.figma.entry;
|
|
55
|
+
const issues = [];
|
|
56
|
+
// Check transport
|
|
57
|
+
if (!state.figma.correctTransport) {
|
|
58
|
+
issues.push(`- **Wrong transport:** Using \`${entry?.transport ?? "unknown"}\` but Figma MCP requires \`http\` transport for OAuth`);
|
|
59
|
+
}
|
|
60
|
+
// Check scope
|
|
61
|
+
if (!state.figma.correctScope) {
|
|
62
|
+
issues.push(`- **Scope warning:** Registered at \`${entry?.scope ?? "unknown"}\` scope — \`user\` scope is recommended for cross-project availability`);
|
|
63
|
+
}
|
|
64
|
+
// Check plugin shadow
|
|
65
|
+
if (state.figma.pluginShadow) {
|
|
66
|
+
issues.push("- **Plugin shadow detected:** A Claude plugin is providing a duplicate Figma registration. " +
|
|
67
|
+
"The plugin version uses OAuth that doesn't persist between sessions — " +
|
|
68
|
+
"this is the most common cause of 'listed but not connected' issues");
|
|
69
|
+
}
|
|
70
|
+
if (issues.length === 0) {
|
|
71
|
+
lines.push(`### Figma MCP ✅\n` +
|
|
72
|
+
`- Status: registered (${entry?.scope ?? "user"} scope, ${entry?.transport ?? "http"} transport)\n` +
|
|
73
|
+
`- If tools still aren't working, you may need to re-authenticate with Figma OAuth\n` +
|
|
74
|
+
`- Try restarting your Claude Code session — you'll be prompted to authenticate\n`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const icon = !state.figma.correctTransport || state.figma.pluginShadow ? "⚠️" : "✅";
|
|
78
|
+
lines.push(`### Figma MCP ${icon}\n`);
|
|
79
|
+
lines.push(`- Status: registered (${entry?.scope ?? "unknown"} scope, ${entry?.transport ?? "unknown"} transport)\n`);
|
|
80
|
+
lines.push(...issues);
|
|
81
|
+
lines.push("");
|
|
82
|
+
// Attempt fix
|
|
83
|
+
if (shouldFix &&
|
|
84
|
+
(!state.figma.correctTransport || state.figma.pluginShadow)) {
|
|
85
|
+
const result = addFigmaMcpServer();
|
|
86
|
+
if (result.success) {
|
|
87
|
+
lines.push(`- **Fix applied:** ${result.message}\n`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
lines.push(`- **Fix failed:** ${result.message}\n`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (!state.figma.correctTransport || state.figma.pluginShadow) {
|
|
94
|
+
lines.push("- **To fix:** Run `claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp`\n" +
|
|
95
|
+
"- Or call this tool again with `fix: true`\n");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
lines.push("### Figma MCP ❌\n");
|
|
101
|
+
lines.push("- Status: not registered\n");
|
|
102
|
+
lines.push("- Required for: push-to-figma, design-in-figma, url-to-figma\n");
|
|
103
|
+
if (shouldFix) {
|
|
104
|
+
const result = addFigmaMcpServer();
|
|
105
|
+
if (result.success) {
|
|
106
|
+
lines.push(`- **Fix applied:** ${result.message}\n`);
|
|
107
|
+
lines.push("- **Action needed:** Restart Claude Code to activate, then authenticate with Figma when prompted\n");
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
lines.push(`- **Fix failed:** ${result.message}\n`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
lines.push("- **To fix:** Run `claude mcp add --scope user --transport http figma https://mcp.figma.com/mcp`\n" +
|
|
115
|
+
"- Or call this tool again with `fix: true`\n");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Endpoint reachability
|
|
119
|
+
const reachability = await testEndpointReachable("https://mcp.figma.com/mcp");
|
|
120
|
+
if (reachability.reachable) {
|
|
121
|
+
lines.push(`- Endpoint: reachable (HTTP ${reachability.status})\n`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
lines.push(`- Endpoint: **unreachable** — ${reachability.error}\n` +
|
|
125
|
+
"- Check internet connection or firewall settings\n");
|
|
126
|
+
}
|
|
127
|
+
return lines.join("\n");
|
|
128
|
+
}
|
|
129
|
+
function checkPlaywright(state, shouldFix) {
|
|
130
|
+
const lines = [];
|
|
131
|
+
if (state.playwright.registered) {
|
|
132
|
+
lines.push("### Playwright MCP ✅\n" + "- Status: registered\n");
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
lines.push("### Playwright MCP ❌\n");
|
|
136
|
+
lines.push("- Status: not registered\n");
|
|
137
|
+
lines.push("- Required for: push-to-figma, url-to-figma\n");
|
|
138
|
+
if (shouldFix) {
|
|
139
|
+
const result = addPlaywrightMcpServer();
|
|
140
|
+
if (result.success) {
|
|
141
|
+
lines.push(`- **Fix applied:** ${result.message}\n`);
|
|
142
|
+
lines.push("- **Action needed:** Restart Claude Code to activate\n");
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
lines.push(`- **Fix failed:** ${result.message}\n`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
lines.push("- **To fix:** Run `claude mcp add --scope user playwright -- npx -y @anthropic-ai/mcp-playwright`\n" +
|
|
150
|
+
"- Or call this tool again with `fix: true`\n");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return lines.join("\n");
|
|
154
|
+
}
|
|
155
|
+
function checkLayout(state) {
|
|
156
|
+
if (state.layout.registered) {
|
|
157
|
+
return ("### Layout MCP ✅\n" +
|
|
158
|
+
"- Status: connected (you're using it right now!)\n");
|
|
159
|
+
}
|
|
160
|
+
// If they're calling this tool, Layout IS connected even if not in the list
|
|
161
|
+
// (the tool itself runs inside the Layout MCP server)
|
|
162
|
+
return ("### Layout MCP ✅\n" +
|
|
163
|
+
"- Status: connected (this tool is running inside it)\n" +
|
|
164
|
+
"- Note: not found in `claude mcp list` — may be registered under a different name or at project scope\n");
|
|
165
|
+
}
|
|
166
|
+
function buildNextSteps(state, fixApplied) {
|
|
167
|
+
const steps = [];
|
|
168
|
+
steps.push("### Next Steps\n");
|
|
169
|
+
if (fixApplied) {
|
|
170
|
+
steps.push("1. **Restart Claude Code** to activate the changes\n" +
|
|
171
|
+
"2. When prompted, **authenticate with Figma** (OAuth)\n" +
|
|
172
|
+
"3. Try your Figma command again\n");
|
|
173
|
+
return steps.join("");
|
|
174
|
+
}
|
|
175
|
+
const hasIssues = !state.figma.registered ||
|
|
176
|
+
!state.figma.correctTransport ||
|
|
177
|
+
state.figma.pluginShadow ||
|
|
178
|
+
!state.playwright.registered;
|
|
179
|
+
if (!hasIssues) {
|
|
180
|
+
steps.push("Everything looks correctly configured. If Figma tools still aren't working:\n\n" +
|
|
181
|
+
"1. **Restart Claude Code** — this forces MCP servers to reconnect\n" +
|
|
182
|
+
"2. **Re-authenticate with Figma** — OAuth tokens may have expired\n" +
|
|
183
|
+
"3. **Check Figma permissions** — ensure your Figma account has edit access to the target file\n" +
|
|
184
|
+
"4. Run this tool again with `fix: true` to re-register servers\n");
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
steps.push("Issues were found. To fix automatically:\n\n" +
|
|
188
|
+
'1. Call `check-setup` with `fix: true` to re-register servers\n' +
|
|
189
|
+
"2. **Restart Claude Code** after fixes are applied\n" +
|
|
190
|
+
"3. **Authenticate with Figma** when prompted (OAuth)\n" +
|
|
191
|
+
"4. Try your Figma command again\n");
|
|
192
|
+
}
|
|
193
|
+
return steps.join("");
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=check-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-setup.js","sourceRoot":"","sources":["../../../../src/mcp/tools/check-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAiCrE,iEAAiE;AACjE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAkBlE;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE5D"}
|
|
@@ -1,10 +1,52 @@
|
|
|
1
|
+
import { PREVIEW_PORT } from "../kit/types.js";
|
|
1
2
|
import { startPreviewServer } from "./server.js";
|
|
2
3
|
let previewServer = null;
|
|
4
|
+
/**
|
|
5
|
+
* Check if an existing preview server is responding on the port.
|
|
6
|
+
* Returns a stub PreviewServer if reachable, null otherwise.
|
|
7
|
+
*/
|
|
8
|
+
async function probeExistingServer() {
|
|
9
|
+
const http = await import("node:http");
|
|
10
|
+
const url = `http://localhost:${PREVIEW_PORT}`;
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const req = http.default.get(url, { timeout: 2000 }, (res) => {
|
|
13
|
+
res.resume(); // drain response
|
|
14
|
+
if (res.statusCode === 200) {
|
|
15
|
+
resolve({
|
|
16
|
+
url,
|
|
17
|
+
broadcast: () => { },
|
|
18
|
+
close: () => { },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
resolve(null);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
req.on("error", () => resolve(null));
|
|
26
|
+
req.on("timeout", () => {
|
|
27
|
+
req.destroy();
|
|
28
|
+
resolve(null);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
3
32
|
/** Ensure the preview server is running. Starts it if needed. */
|
|
4
33
|
export async function ensurePreviewServer() {
|
|
5
34
|
if (previewServer)
|
|
6
35
|
return previewServer;
|
|
7
|
-
|
|
36
|
+
try {
|
|
37
|
+
previewServer = await startPreviewServer(undefined, { openBrowser: false });
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
// Port already in use — check if there's a working server there
|
|
41
|
+
if (err instanceof Error && err.message.includes("already in use")) {
|
|
42
|
+
const existing = await probeExistingServer();
|
|
43
|
+
if (existing) {
|
|
44
|
+
previewServer = existing;
|
|
45
|
+
return previewServer;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
8
50
|
return previewServer;
|
|
9
51
|
}
|
|
10
52
|
/** Called from MCP server startup to store the initial reference. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure.js","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AAErE,IAAI,aAAa,GAAyB,IAAI,CAAC;AAE/C,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure.js","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AAErE,IAAI,aAAa,GAAyB,IAAI,CAAC;AAE/C;;;GAGG;AACH,KAAK,UAAU,mBAAmB;IAChC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,oBAAoB,YAAY,EAAE,CAAC;IAE/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3D,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC/B,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC;oBACN,GAAG;oBACH,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;oBACnB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;iBAChB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gEAAgE;QAChE,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,GAAG,QAAQ,CAAC;gBACzB,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC"}
|