dx-devkit 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/LICENSE +21 -0
- package/README.md +475 -2
- package/bin/dx-mcp.js +2 -0
- package/dist/command.d.ts +9 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +2 -0
- package/dist/command.js.map +1 -0
- package/dist/commands/ai.d.ts +7 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +148 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/clean.d.ts +3 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +72 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/deps.d.ts +3 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +98 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/go.d.ts +3 -0
- package/dist/commands/go.d.ts.map +1 -0
- package/dist/commands/go.js +202 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +51 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +117 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/port.d.ts +4 -0
- package/dist/commands/port.d.ts.map +1 -0
- package/dist/commands/port.js +106 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/projects.d.ts +5 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +46 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/stack.d.ts +34 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +140 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/summary.d.ts +3 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +88 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/system.d.ts +5 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +104 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +96 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.d.ts +27 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +104 -0
- package/dist/ui.js.map +1 -0
- package/node_modules/@dx/core/dist/config.d.ts +46 -0
- package/node_modules/@dx/core/dist/config.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/config.js +131 -0
- package/node_modules/@dx/core/dist/config.js.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts +15 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.js +63 -0
- package/node_modules/@dx/core/dist/fuzzy.js.map +1 -0
- package/node_modules/@dx/core/dist/index.d.ts +17 -0
- package/node_modules/@dx/core/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/index.js +19 -0
- package/node_modules/@dx/core/dist/index.js.map +1 -0
- package/node_modules/@dx/core/dist/runs.d.ts +19 -0
- package/node_modules/@dx/core/dist/runs.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/runs.js +41 -0
- package/node_modules/@dx/core/dist/runs.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js +243 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts +61 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js +171 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts +57 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.js +151 -0
- package/node_modules/@dx/core/dist/tools/deps.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts +74 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js +261 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts +12 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.js +176 -0
- package/node_modules/@dx/core/dist/tools/doctor.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts +31 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.js +80 -0
- package/node_modules/@dx/core/dist/tools/github.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts +23 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.js +80 -0
- package/node_modules/@dx/core/dist/tools/journal.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts +24 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.js +137 -0
- package/node_modules/@dx/core/dist/tools/launch.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts +42 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.js +220 -0
- package/node_modules/@dx/core/dist/tools/ports.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.js +208 -0
- package/node_modules/@dx/core/dist/tools/projects.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts +40 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js +188 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts +119 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.js +386 -0
- package/node_modules/@dx/core/dist/tools/stacks.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts +87 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.js +331 -0
- package/node_modules/@dx/core/dist/tools/summary.js.map +1 -0
- package/node_modules/@dx/core/package.json +20 -0
- package/node_modules/@dx/mcp/dist/index.d.ts +3 -0
- package/node_modules/@dx/mcp/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/mcp/dist/index.js +540 -0
- package/node_modules/@dx/mcp/dist/index.js.map +1 -0
- package/node_modules/@dx/mcp/package.json +8 -0
- package/node_modules/@dx/web/dist/api.d.ts +13 -0
- package/node_modules/@dx/web/dist/api.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/api.js +351 -0
- package/node_modules/@dx/web/dist/api.js.map +1 -0
- package/node_modules/@dx/web/dist/background.d.ts +2 -0
- package/node_modules/@dx/web/dist/background.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/background.js +24 -0
- package/node_modules/@dx/web/dist/background.js.map +1 -0
- package/node_modules/@dx/web/dist/check.d.ts +39 -0
- package/node_modules/@dx/web/dist/check.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/check.js +97 -0
- package/node_modules/@dx/web/dist/check.js.map +1 -0
- package/node_modules/@dx/web/dist/dev.d.ts +109 -0
- package/node_modules/@dx/web/dist/dev.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/dev.js +645 -0
- package/node_modules/@dx/web/dist/dev.js.map +1 -0
- package/node_modules/@dx/web/dist/link.d.ts +45 -0
- package/node_modules/@dx/web/dist/link.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/link.js +150 -0
- package/node_modules/@dx/web/dist/link.js.map +1 -0
- package/node_modules/@dx/web/dist/proxy.d.ts +21 -0
- package/node_modules/@dx/web/dist/proxy.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/proxy.js +140 -0
- package/node_modules/@dx/web/dist/proxy.js.map +1 -0
- package/node_modules/@dx/web/dist/server.d.ts +33 -0
- package/node_modules/@dx/web/dist/server.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/server.js +184 -0
- package/node_modules/@dx/web/dist/server.js.map +1 -0
- package/node_modules/@dx/web/package.json +26 -0
- package/node_modules/@dx/web/public/app.js +1553 -0
- package/node_modules/@dx/web/public/icon.svg +1 -0
- package/node_modules/@dx/web/public/index.html +47 -0
- package/node_modules/@dx/web/public/styles.css +1124 -0
- package/package.json +52 -4
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { loadConfig, saveConfig, stripBom } from "../config.js";
|
|
7
|
+
import { commandExists } from "./doctor.js";
|
|
8
|
+
/** The MCP server's entry point in this checkout: packages/mcp/dist/index.js. */
|
|
9
|
+
export function mcpServerScript() {
|
|
10
|
+
// This file is packages/core/dist/tools/aiSetup.js.
|
|
11
|
+
return path.resolve(fileURLToPath(new URL("../../../mcp/dist/index.js", import.meta.url)));
|
|
12
|
+
}
|
|
13
|
+
export function defaultAiEnv() {
|
|
14
|
+
const home = os.homedir();
|
|
15
|
+
const platform = process.platform;
|
|
16
|
+
const appData = platform === "win32"
|
|
17
|
+
? (process.env.APPDATA ?? path.join(home, "AppData", "Roaming"))
|
|
18
|
+
: platform === "darwin"
|
|
19
|
+
? path.join(home, "Library", "Application Support")
|
|
20
|
+
: (process.env.XDG_CONFIG_HOME ?? path.join(home, ".config"));
|
|
21
|
+
return { home, appData, platform, node: process.execPath, script: mcpServerScript() };
|
|
22
|
+
}
|
|
23
|
+
const FILE_TOOLS = [
|
|
24
|
+
{
|
|
25
|
+
id: "claude-desktop",
|
|
26
|
+
name: "Claude Desktop",
|
|
27
|
+
marker: (e) => path.join(e.appData, "Claude"),
|
|
28
|
+
file: (e) => path.join(e.appData, "Claude", "claude_desktop_config.json"),
|
|
29
|
+
key: "mcpServers",
|
|
30
|
+
entry: (e) => ({ command: e.node, args: [e.script] }),
|
|
31
|
+
note: "Restart Claude Desktop to load it.",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "cursor",
|
|
35
|
+
name: "Cursor",
|
|
36
|
+
marker: (e) => path.join(e.home, ".cursor"),
|
|
37
|
+
file: (e) => path.join(e.home, ".cursor", "mcp.json"),
|
|
38
|
+
key: "mcpServers",
|
|
39
|
+
entry: (e) => ({ command: e.node, args: [e.script] }),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "windsurf",
|
|
43
|
+
name: "Windsurf",
|
|
44
|
+
marker: (e) => path.join(e.home, ".codeium", "windsurf"),
|
|
45
|
+
file: (e) => path.join(e.home, ".codeium", "windsurf", "mcp_config.json"),
|
|
46
|
+
key: "mcpServers",
|
|
47
|
+
entry: (e) => ({ command: e.node, args: [e.script] }),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "vscode",
|
|
51
|
+
name: "VS Code",
|
|
52
|
+
marker: (e) => path.join(e.appData, "Code", "User"),
|
|
53
|
+
file: (e) => path.join(e.appData, "Code", "User", "mcp.json"),
|
|
54
|
+
key: "servers",
|
|
55
|
+
entry: (e) => ({ type: "stdio", command: e.node, args: [e.script] }),
|
|
56
|
+
note: "In Copilot Chat's agent mode, the dx tools appear under Tools.",
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
const SERVER_NAME = "dx";
|
|
60
|
+
export async function listAiTools(env = defaultAiEnv()) {
|
|
61
|
+
const out = [await claudeCodeStatus(env)];
|
|
62
|
+
for (const tool of FILE_TOOLS) {
|
|
63
|
+
const file = tool.file(env);
|
|
64
|
+
const entry = readEntry(file, tool.key);
|
|
65
|
+
out.push({
|
|
66
|
+
id: tool.id,
|
|
67
|
+
name: tool.name,
|
|
68
|
+
installed: fs.existsSync(tool.marker(env)),
|
|
69
|
+
connected: !!entry,
|
|
70
|
+
current: !!entry && entryIsCurrent(entry, env),
|
|
71
|
+
configFile: file,
|
|
72
|
+
note: tool.note,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/** Adds dx to the given tools, or to every installed one. An outdated entry is replaced. */
|
|
78
|
+
export async function connectAiTools(ids, env = defaultAiEnv()) {
|
|
79
|
+
if (!fs.existsSync(env.script)) {
|
|
80
|
+
return [{ id: "claude-code", name: "dx", ok: false, message: `The MCP server isn't built yet (${env.script}). Run npm run build in the dx folder.` }];
|
|
81
|
+
}
|
|
82
|
+
const statuses = await listAiTools(env);
|
|
83
|
+
const wanted = statuses.filter((s) => (ids ? ids.includes(s.id) : s.installed));
|
|
84
|
+
const results = [];
|
|
85
|
+
for (const s of wanted) {
|
|
86
|
+
if (s.connected && s.current) {
|
|
87
|
+
results.push({ id: s.id, name: s.name, ok: true, message: "already connected" });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
if (s.id === "claude-code") {
|
|
92
|
+
const cli = env.claudeCli ?? runClaude;
|
|
93
|
+
if (s.connected)
|
|
94
|
+
await cli(["mcp", "remove", "-s", "user", SERVER_NAME]);
|
|
95
|
+
const r = await cli(["mcp", "add", "-s", "user", SERVER_NAME, "--", env.node, env.script]);
|
|
96
|
+
if (!r.ok)
|
|
97
|
+
throw new Error(r.output.trim() || "claude mcp add failed");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const tool = FILE_TOOLS.find((t) => t.id === s.id);
|
|
101
|
+
writeEntry(tool.file(env), tool.key, tool.entry(env));
|
|
102
|
+
}
|
|
103
|
+
results.push({ id: s.id, name: s.name, ok: true, message: s.connected ? "updated to this copy of dx" : `connected${s.note ? `. ${s.note}` : ""}` });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
results.push({ id: s.id, name: s.name, ok: false, message: err.message });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
/** Removes dx from the given tools, or from every tool it's in. */
|
|
112
|
+
export async function disconnectAiTools(ids, env = defaultAiEnv()) {
|
|
113
|
+
const statuses = await listAiTools(env);
|
|
114
|
+
const results = [];
|
|
115
|
+
for (const s of statuses.filter((x) => x.connected && (!ids || ids.includes(x.id)))) {
|
|
116
|
+
try {
|
|
117
|
+
if (s.id === "claude-code") {
|
|
118
|
+
const r = await (env.claudeCli ?? runClaude)(["mcp", "remove", "-s", "user", SERVER_NAME]);
|
|
119
|
+
if (!r.ok)
|
|
120
|
+
throw new Error(r.output.trim() || "claude mcp remove failed");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const tool = FILE_TOOLS.find((t) => t.id === s.id);
|
|
124
|
+
removeEntry(tool.file(env), tool.key);
|
|
125
|
+
}
|
|
126
|
+
results.push({ id: s.id, name: s.name, ok: true, message: "disconnected" });
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
results.push({ id: s.id, name: s.name, ok: false, message: err.message });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return results;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The no-setup step, run on dx's first use and whenever the dashboard starts: connects dx to AI
|
|
136
|
+
* tools it hasn't seen before, and repoints entries that point at an old copy of dx or an old
|
|
137
|
+
* Node. A tool the user disconnected by hand stays disconnected (it's been seen), and
|
|
138
|
+
* `autoConnectAi: false` in the config turns this off.
|
|
139
|
+
*/
|
|
140
|
+
export async function autoConnectAiTools(env = defaultAiEnv()) {
|
|
141
|
+
const config = loadConfig();
|
|
142
|
+
if (config.autoConnectAi === false || !fs.existsSync(env.script))
|
|
143
|
+
return [];
|
|
144
|
+
const seen = new Set(config.aiToolsSeen ?? []);
|
|
145
|
+
const statuses = await listAiTools(env);
|
|
146
|
+
const todo = statuses.filter((s) => s.installed && ((!seen.has(s.id) && !s.connected) || (s.connected && !s.current)));
|
|
147
|
+
const results = todo.length ? await connectAiTools(todo.map((s) => s.id), env) : [];
|
|
148
|
+
const installed = statuses.filter((s) => s.installed).map((s) => s.id);
|
|
149
|
+
if (config.aiToolsSeen === undefined || installed.some((id) => !seen.has(id))) {
|
|
150
|
+
saveConfig({ ...loadConfig(), aiToolsSeen: [...new Set([...seen, ...installed])] });
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
// ------------------------------------------------------------ Claude Code
|
|
155
|
+
async function claudeCodeStatus(env) {
|
|
156
|
+
const installed = env.hasClaudeCli ? await env.hasClaudeCli() : !!(await commandExists("claude"));
|
|
157
|
+
// Claude Code keeps user-scope MCP servers at the top level of ~/.claude.json.
|
|
158
|
+
const file = path.join(env.home, ".claude.json");
|
|
159
|
+
const entry = readEntry(file, "mcpServers");
|
|
160
|
+
return {
|
|
161
|
+
id: "claude-code",
|
|
162
|
+
name: "Claude Code",
|
|
163
|
+
installed,
|
|
164
|
+
connected: !!entry,
|
|
165
|
+
current: !!entry && entryIsCurrent(entry, env),
|
|
166
|
+
configFile: file,
|
|
167
|
+
note: "New Claude Code sessions have the dx tools.",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function runClaude(args) {
|
|
171
|
+
return new Promise((resolve) => {
|
|
172
|
+
const isWin = process.platform === "win32";
|
|
173
|
+
// claude is a .cmd shim when installed with npm on Windows, so it goes through the shell there.
|
|
174
|
+
const cmd = isWin ? `claude ${args.map((a) => (/[\s"]/.test(a) ? `"${a.replace(/"/g, '""')}"` : a)).join(" ")}` : "claude";
|
|
175
|
+
execFile(isWin ? "cmd.exe" : cmd, isWin ? ["/d", "/s", "/c", cmd] : args, { windowsHide: true, timeout: 30_000, windowsVerbatimArguments: isWin }, (err, stdout, stderr) => resolve({ ok: !err, output: `${stdout}${stderr}` }));
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// ------------------------------------------------------------ JSON files
|
|
179
|
+
function entryIsCurrent(entry, env) {
|
|
180
|
+
const args = Array.isArray(entry.args) ? entry.args.map(String) : [];
|
|
181
|
+
const command = String(entry.command ?? "");
|
|
182
|
+
const same = (a, b) => (env.platform === "win32" ? path.resolve(a).toLowerCase() === path.resolve(b).toLowerCase() : path.resolve(a) === path.resolve(b));
|
|
183
|
+
const scriptOk = args.some((a) => same(a, env.script));
|
|
184
|
+
const nodeOk = command === "node" || fs.existsSync(command);
|
|
185
|
+
return scriptOk && nodeOk;
|
|
186
|
+
}
|
|
187
|
+
function readJsonc(file) {
|
|
188
|
+
if (!fs.existsSync(file))
|
|
189
|
+
return undefined;
|
|
190
|
+
const raw = stripBom(fs.readFileSync(file, "utf8"));
|
|
191
|
+
if (!raw.trim())
|
|
192
|
+
return {};
|
|
193
|
+
try {
|
|
194
|
+
return JSON.parse(raw);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// VS Code's files may have comments and trailing commas.
|
|
198
|
+
const cleaned = raw
|
|
199
|
+
.replace(/("(?:[^"\\]|\\.)*")|\/\/[^\n]*|\/\*[\s\S]*?\*\//g, (_m, str) => str ?? "")
|
|
200
|
+
.replace(/,(\s*[}\]])/g, "$1");
|
|
201
|
+
try {
|
|
202
|
+
return JSON.parse(cleaned);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
throw new Error(`${file} isn't valid JSON, so dx left it alone. Fix or delete it, then try again.`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function readEntry(file, key) {
|
|
210
|
+
try {
|
|
211
|
+
const json = readJsonc(file);
|
|
212
|
+
const servers = json?.[key];
|
|
213
|
+
if (!servers || typeof servers !== "object")
|
|
214
|
+
return undefined;
|
|
215
|
+
const entry = servers[SERVER_NAME];
|
|
216
|
+
return entry && typeof entry === "object" ? entry : undefined;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function writeEntry(file, key, entry) {
|
|
223
|
+
const json = readJsonc(file) ?? {};
|
|
224
|
+
backupOnce(file);
|
|
225
|
+
const servers = json[key] && typeof json[key] === "object" ? json[key] : {};
|
|
226
|
+
json[key] = { ...servers, [SERVER_NAME]: entry };
|
|
227
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
228
|
+
fs.writeFileSync(file, JSON.stringify(json, null, 2) + "\n", "utf8");
|
|
229
|
+
}
|
|
230
|
+
function removeEntry(file, key) {
|
|
231
|
+
const json = readJsonc(file);
|
|
232
|
+
if (!json || !json[key] || typeof json[key] !== "object")
|
|
233
|
+
return;
|
|
234
|
+
backupOnce(file);
|
|
235
|
+
delete json[key][SERVER_NAME];
|
|
236
|
+
fs.writeFileSync(file, JSON.stringify(json, null, 2) + "\n", "utf8");
|
|
237
|
+
}
|
|
238
|
+
function backupOnce(file) {
|
|
239
|
+
const backup = `${file}.dx-backup`;
|
|
240
|
+
if (fs.existsSync(file) && !fs.existsSync(backup))
|
|
241
|
+
fs.copyFileSync(file, backup);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=aiSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiSetup.js","sourceRoot":"","sources":["../../src/tools/aiSetup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type DxConfig } from "../config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Finds folders that a build or an install recreates (node_modules, .next, dist, …) in projects
|
|
4
|
+
* you haven't touched for a while, so their disk space can be given back.
|
|
5
|
+
*
|
|
6
|
+
* Safety rules, so nothing that matters is ever offered for deletion:
|
|
7
|
+
* - In a git repo, a folder only counts if git ignores it. A committed `build/` is left alone.
|
|
8
|
+
* - Outside git, only folders that are always regenerated count (node_modules, .next, …), never dist/build.
|
|
9
|
+
* - Symlinks and junctions are never followed, so workspace links can't take their targets with them.
|
|
10
|
+
*/
|
|
11
|
+
export interface CleanupItem {
|
|
12
|
+
project: string;
|
|
13
|
+
projectDir: string;
|
|
14
|
+
/** Absolute path of the folder. */
|
|
15
|
+
dir: string;
|
|
16
|
+
/** Path inside the project, e.g. "packages/web/node_modules". */
|
|
17
|
+
relative: string;
|
|
18
|
+
bytes: number;
|
|
19
|
+
files: number;
|
|
20
|
+
/** When the project was last active (ms since epoch). */
|
|
21
|
+
lastActive: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CleanupScan {
|
|
24
|
+
olderThanDays: number;
|
|
25
|
+
/** Biggest first. */
|
|
26
|
+
items: CleanupItem[];
|
|
27
|
+
totalBytes: number;
|
|
28
|
+
/** How many idle projects were looked at. */
|
|
29
|
+
projectsScanned: number;
|
|
30
|
+
}
|
|
31
|
+
/** Always regenerated by an install or a dev server, so safe even outside git. */
|
|
32
|
+
export declare const ALWAYS_REBUILDABLE: string[];
|
|
33
|
+
/** Usually build output, but sometimes committed, so only when git ignores them. */
|
|
34
|
+
export declare const BUILD_OUTPUT: string[];
|
|
35
|
+
export interface CleanupOptions {
|
|
36
|
+
/** Only projects idle for at least this many days (default 30). */
|
|
37
|
+
days?: number;
|
|
38
|
+
now?: Date;
|
|
39
|
+
config?: DxConfig;
|
|
40
|
+
/** Called as each project is scanned, for a progress line. */
|
|
41
|
+
onProgress?: (done: number, total: number, project: string) => void;
|
|
42
|
+
}
|
|
43
|
+
export declare function findCleanup(options?: CleanupOptions): Promise<CleanupScan>;
|
|
44
|
+
/** Folders with a known build/install name, up to a few levels down (monorepo packages), not inside each other. */
|
|
45
|
+
export declare function findCandidates(projectDir: string): string[];
|
|
46
|
+
/** Total size of every file below `dir`, without following symlinks or junctions. */
|
|
47
|
+
export declare function folderSize(dir: string): Promise<{
|
|
48
|
+
bytes: number;
|
|
49
|
+
files: number;
|
|
50
|
+
}>;
|
|
51
|
+
export interface DeleteResult {
|
|
52
|
+
dir: string;
|
|
53
|
+
ok: boolean;
|
|
54
|
+
bytes: number;
|
|
55
|
+
message: string;
|
|
56
|
+
}
|
|
57
|
+
/** Deletes the folders. Each one is checked again first, so a stale list can't delete the wrong thing. */
|
|
58
|
+
export declare function deleteCleanup(items: CleanupItem[]): Promise<DeleteResult[]>;
|
|
59
|
+
/** 1536 → "1.5 KB" */
|
|
60
|
+
export declare function formatBytes(bytes: number): string;
|
|
61
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/tools/cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGzD;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,UAW9B,CAAC;AACF,oFAAoF;AACpF,eAAO,MAAM,YAAY,UAAuE,CAAC;AAGjG,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BpF;AAED,mHAAmH;AACnH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB3D;AA0BD,qFAAqF;AACrF,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCvF;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0GAA0G;AAC1G,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBjF;AAED,sBAAsB;AACtB,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
import { scanProjects } from "./projects.js";
|
|
6
|
+
/** Always regenerated by an install or a dev server, so safe even outside git. */
|
|
7
|
+
export const ALWAYS_REBUILDABLE = [
|
|
8
|
+
"node_modules",
|
|
9
|
+
".next",
|
|
10
|
+
".nuxt",
|
|
11
|
+
".svelte-kit",
|
|
12
|
+
".turbo",
|
|
13
|
+
".parcel-cache",
|
|
14
|
+
".angular",
|
|
15
|
+
".expo",
|
|
16
|
+
"__pycache__",
|
|
17
|
+
".pytest_cache",
|
|
18
|
+
];
|
|
19
|
+
/** Usually build output, but sometimes committed, so only when git ignores them. */
|
|
20
|
+
export const BUILD_OUTPUT = ["dist", "build", "out", "coverage", "target", ".output", ".vercel"];
|
|
21
|
+
const SEARCH_DEPTH = 3;
|
|
22
|
+
export async function findCleanup(options = {}) {
|
|
23
|
+
const days = Math.max(0, options.days ?? 30);
|
|
24
|
+
const now = (options.now ?? new Date()).getTime();
|
|
25
|
+
const config = options.config ?? loadConfig();
|
|
26
|
+
const cutoff = now - days * 86_400_000;
|
|
27
|
+
const idle = scanProjects(config).filter((p) => p.lastActive && p.lastActive < cutoff);
|
|
28
|
+
const items = [];
|
|
29
|
+
let done = 0;
|
|
30
|
+
for (const project of idle) {
|
|
31
|
+
options.onProgress?.(done, idle.length, project.name);
|
|
32
|
+
const candidates = findCandidates(project.dir);
|
|
33
|
+
const allowed = project.hasGit ? await gitIgnored(project.dir, candidates) : candidates.filter(isAlwaysRebuildable);
|
|
34
|
+
for (const dir of allowed) {
|
|
35
|
+
const { bytes, files } = await folderSize(dir);
|
|
36
|
+
if (bytes === 0 && files === 0)
|
|
37
|
+
continue;
|
|
38
|
+
items.push({
|
|
39
|
+
project: project.name,
|
|
40
|
+
projectDir: project.dir,
|
|
41
|
+
dir,
|
|
42
|
+
relative: path.relative(project.dir, dir).split(path.sep).join("/"),
|
|
43
|
+
bytes,
|
|
44
|
+
files,
|
|
45
|
+
lastActive: project.lastActive,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
done++;
|
|
49
|
+
}
|
|
50
|
+
options.onProgress?.(done, idle.length, "");
|
|
51
|
+
items.sort((a, b) => b.bytes - a.bytes);
|
|
52
|
+
return { olderThanDays: days, items, totalBytes: items.reduce((n, i) => n + i.bytes, 0), projectsScanned: idle.length };
|
|
53
|
+
}
|
|
54
|
+
/** Folders with a known build/install name, up to a few levels down (monorepo packages), not inside each other. */
|
|
55
|
+
export function findCandidates(projectDir) {
|
|
56
|
+
const names = new Set([...ALWAYS_REBUILDABLE, ...BUILD_OUTPUT]);
|
|
57
|
+
const found = [];
|
|
58
|
+
const walk = (dir, depth) => {
|
|
59
|
+
let entries;
|
|
60
|
+
try {
|
|
61
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (const e of entries) {
|
|
67
|
+
if (!e.isDirectory())
|
|
68
|
+
continue; // symlinks and junctions are not directories here
|
|
69
|
+
const full = path.join(dir, e.name);
|
|
70
|
+
if (names.has(e.name)) {
|
|
71
|
+
found.push(full);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (e.name.startsWith(".") || depth >= SEARCH_DEPTH)
|
|
75
|
+
continue;
|
|
76
|
+
walk(full, depth + 1);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
walk(projectDir, 1);
|
|
80
|
+
return found;
|
|
81
|
+
}
|
|
82
|
+
function isAlwaysRebuildable(dir) {
|
|
83
|
+
return ALWAYS_REBUILDABLE.includes(path.basename(dir));
|
|
84
|
+
}
|
|
85
|
+
/** The subset of `dirs` that git ignores in this repo. If git can't answer, nothing is returned. */
|
|
86
|
+
async function gitIgnored(repo, dirs) {
|
|
87
|
+
if (dirs.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const rel = dirs.map((d) => path.relative(repo, d).split(path.sep).join("/") + "/");
|
|
90
|
+
try {
|
|
91
|
+
const stdout = await new Promise((resolve, reject) => {
|
|
92
|
+
const child = execFile("git", ["-C", repo, "check-ignore", "--stdin"], { windowsHide: true }, (err, out) => {
|
|
93
|
+
// Exit code 1 means "none of them are ignored", which is an answer, not a failure.
|
|
94
|
+
if (err && err.code !== 1)
|
|
95
|
+
reject(err);
|
|
96
|
+
else
|
|
97
|
+
resolve(out ?? "");
|
|
98
|
+
});
|
|
99
|
+
child.stdin?.end(rel.join("\n") + "\n");
|
|
100
|
+
});
|
|
101
|
+
const ignored = new Set(stdout.split(/\r?\n/).map((l) => l.trim().replace(/\/$/, "")).filter(Boolean));
|
|
102
|
+
return dirs.filter((_, i) => ignored.has(rel[i].replace(/\/$/, "")));
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Total size of every file below `dir`, without following symlinks or junctions. */
|
|
109
|
+
export async function folderSize(dir) {
|
|
110
|
+
let bytes = 0;
|
|
111
|
+
let files = 0;
|
|
112
|
+
const queue = [dir];
|
|
113
|
+
while (queue.length) {
|
|
114
|
+
const batch = queue.splice(0, 64);
|
|
115
|
+
await Promise.all(batch.map(async (d) => {
|
|
116
|
+
let entries;
|
|
117
|
+
try {
|
|
118
|
+
entries = await fs.promises.readdir(d, { withFileTypes: true });
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const stats = [];
|
|
124
|
+
for (const e of entries) {
|
|
125
|
+
const full = path.join(d, e.name);
|
|
126
|
+
if (e.isDirectory())
|
|
127
|
+
queue.push(full);
|
|
128
|
+
else if (e.isFile()) {
|
|
129
|
+
stats.push(fs.promises.lstat(full).then((s) => {
|
|
130
|
+
bytes += s.size;
|
|
131
|
+
files++;
|
|
132
|
+
}, () => undefined));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
await Promise.all(stats);
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
return { bytes, files };
|
|
139
|
+
}
|
|
140
|
+
/** Deletes the folders. Each one is checked again first, so a stale list can't delete the wrong thing. */
|
|
141
|
+
export async function deleteCleanup(items) {
|
|
142
|
+
const known = new Set([...ALWAYS_REBUILDABLE, ...BUILD_OUTPUT]);
|
|
143
|
+
const results = [];
|
|
144
|
+
for (const item of items) {
|
|
145
|
+
const inside = path.relative(item.projectDir, item.dir);
|
|
146
|
+
if (!known.has(path.basename(item.dir)) || !inside || inside.startsWith("..") || path.isAbsolute(inside)) {
|
|
147
|
+
results.push({ dir: item.dir, ok: false, bytes: 0, message: "not a build folder inside its project; left alone" });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
await fs.promises.rm(item.dir, { recursive: true, force: true, maxRetries: 3 });
|
|
152
|
+
results.push({ dir: item.dir, ok: true, bytes: item.bytes, message: "deleted" });
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
results.push({ dir: item.dir, ok: false, bytes: 0, message: err.message });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
/** 1536 → "1.5 KB" */
|
|
161
|
+
export function formatBytes(bytes) {
|
|
162
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
163
|
+
let n = bytes;
|
|
164
|
+
let i = 0;
|
|
165
|
+
while (n >= 1024 && i < units.length - 1) {
|
|
166
|
+
n /= 1024;
|
|
167
|
+
i++;
|
|
168
|
+
}
|
|
169
|
+
return `${i === 0 ? n : n.toFixed(n >= 100 ? 0 : 1)} ${units[i]}`;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/tools/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type DxConfig } from "../config.js";
|
|
2
|
+
import { type PackageManager } from "./projects.js";
|
|
3
|
+
/**
|
|
4
|
+
* Dependency audit across all your Node projects: which packages are out of date (and which of
|
|
5
|
+
* those are a major version behind) and how many known vulnerabilities `npm audit` reports.
|
|
6
|
+
*/
|
|
7
|
+
export interface OutdatedPackage {
|
|
8
|
+
name: string;
|
|
9
|
+
/** Installed version; undefined when node_modules isn't installed. */
|
|
10
|
+
current?: string;
|
|
11
|
+
/** Newest version the package.json range allows. */
|
|
12
|
+
wanted?: string;
|
|
13
|
+
latest: string;
|
|
14
|
+
/** The latest version is a new major version, so updating may need code changes. */
|
|
15
|
+
major: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface VulnerabilityCounts {
|
|
18
|
+
critical: number;
|
|
19
|
+
high: number;
|
|
20
|
+
moderate: number;
|
|
21
|
+
low: number;
|
|
22
|
+
info: number;
|
|
23
|
+
total: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DepsReport {
|
|
26
|
+
project: string;
|
|
27
|
+
dir: string;
|
|
28
|
+
packageManager: PackageManager;
|
|
29
|
+
outdated: OutdatedPackage[];
|
|
30
|
+
/** Undefined when the audit couldn't run (see `notes`). */
|
|
31
|
+
vulnerabilities?: VulnerabilityCounts;
|
|
32
|
+
/** Why something is missing, e.g. "no lockfile, so npm audit can't run". */
|
|
33
|
+
notes: string[];
|
|
34
|
+
/** Set when this package manager isn't supported or installed; nothing was checked. */
|
|
35
|
+
skipped?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DepsOptions {
|
|
38
|
+
/** Only projects matching this name. */
|
|
39
|
+
query?: string;
|
|
40
|
+
/** Only projects active in the last N days. */
|
|
41
|
+
activeDays?: number;
|
|
42
|
+
config?: DxConfig;
|
|
43
|
+
now?: Date;
|
|
44
|
+
onProgress?: (done: number, total: number, project: string) => void;
|
|
45
|
+
/** Projects checked at the same time (default 4). */
|
|
46
|
+
concurrency?: number;
|
|
47
|
+
}
|
|
48
|
+
export declare function auditDependencies(options?: DepsOptions): Promise<DepsReport[]>;
|
|
49
|
+
/** Reads `npm outdated --json` or `pnpm outdated --format json`. */
|
|
50
|
+
export declare function parseOutdated(json: unknown): OutdatedPackage[];
|
|
51
|
+
/** Reads the totals from `npm audit --json` (v2 and v1) or `pnpm audit --json`. */
|
|
52
|
+
export declare function parseAuditCounts(json: unknown): VulnerabilityCounts | undefined;
|
|
53
|
+
/** "2 critical, 1 high" (most severe first), or "none". */
|
|
54
|
+
export declare function describeVulnerabilities(v?: VulnerabilityCounts): string;
|
|
55
|
+
/** 1.x → 2.x, and for 0.x versions 0.4 → 0.5 too, since those count as breaking in semver. */
|
|
56
|
+
export declare function isMajorBump(from: string | undefined, to: string): boolean;
|
|
57
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/tools/deps.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAA8B,KAAK,cAAc,EAAgB,MAAM,eAAe,CAAC;AAE9F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBxF;AA8DD,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,EAAE,CAY9D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,GAAG,SAAS,CAO/E;AAOD,2DAA2D;AAC3D,wBAAgB,uBAAuB,CAAC,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAIvE;AAQD,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAUzE"}
|