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,540 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// MCP server: lets Claude (Desktop, Code) and Raycast AI call your dx tools.
|
|
3
|
+
// It talks over stdin/stdout, so nothing here may print to stdout except the protocol.
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { addJournalEntry, auditDependencies, buildSummary, commandExists, describeVulnerabilities, findCleanup, formatBytes, formatSummary, findProjects, killPort, listListeningPorts, loadConfig, openInEditor, openTerminal, listAiTools, readJournal, recordRun, runDoctor, readProject, saveStackSpec, scanProjects, startOrder, detectStack, } from "@dx/core";
|
|
9
|
+
import { ensureDashboard, findDashboard } from "@dx/web/link";
|
|
10
|
+
const { version } = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
11
|
+
const server = new McpServer({ name: "dx", version });
|
|
12
|
+
const text = (value) => ({
|
|
13
|
+
content: [{ type: "text", text: typeof value === "string" ? value : JSON.stringify(value, null, 2) }],
|
|
14
|
+
});
|
|
15
|
+
const failure = (message) => ({ ...text(message), isError: true });
|
|
16
|
+
server.registerTool("list_projects", {
|
|
17
|
+
title: "List projects",
|
|
18
|
+
description: "List the user's local code projects, most recently active first. Optionally fuzzy-search by name. " +
|
|
19
|
+
"Each project has its folder, kind (node, go, …), package manager, dev command and local URL.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
query: z.string().optional().describe("Part of a project name, e.g. 'todo-app'"),
|
|
22
|
+
limit: z.number().int().min(1).max(200).optional().describe("Maximum number of projects (default 25)"),
|
|
23
|
+
},
|
|
24
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
25
|
+
}, async ({ query, limit }) => {
|
|
26
|
+
const all = scanProjects(loadConfig());
|
|
27
|
+
const list = query ? findProjects(query, all).candidates : all;
|
|
28
|
+
return text(list.slice(0, limit ?? 25).map((p) => ({
|
|
29
|
+
name: p.name,
|
|
30
|
+
dir: p.dir,
|
|
31
|
+
kind: p.kind,
|
|
32
|
+
packageManager: p.packageManager,
|
|
33
|
+
devCommand: p.devCommand,
|
|
34
|
+
url: p.url,
|
|
35
|
+
lastActive: p.lastActive ? new Date(p.lastActive).toISOString() : undefined,
|
|
36
|
+
})));
|
|
37
|
+
});
|
|
38
|
+
server.registerTool("open_project", {
|
|
39
|
+
title: "Open project",
|
|
40
|
+
description: "Open one of the user's projects in their editor, and optionally start its dev server in a new terminal window. " +
|
|
41
|
+
"To run the app yourself and see its output and errors, use start_dev_server instead.",
|
|
42
|
+
inputSchema: {
|
|
43
|
+
name: z.string().describe("Project name, or part of it"),
|
|
44
|
+
start_dev_server: z.boolean().optional().describe("Also start the dev server (default false)"),
|
|
45
|
+
},
|
|
46
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
47
|
+
}, async ({ name, start_dev_server }) => {
|
|
48
|
+
const config = loadConfig();
|
|
49
|
+
const { match, candidates } = findProjects(name, scanProjects(config));
|
|
50
|
+
const project = match ?? (candidates.length === 1 ? candidates[0] : undefined);
|
|
51
|
+
if (!project) {
|
|
52
|
+
return candidates.length
|
|
53
|
+
? failure(`Several projects match "${name}": ${candidates.slice(0, 8).map((p) => p.name).join(", ")}. Which one?`)
|
|
54
|
+
: failure(`No project matches "${name}".`);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await openInEditor(project.dir, project.editor ?? config.editor);
|
|
58
|
+
let started = "";
|
|
59
|
+
if (start_dev_server) {
|
|
60
|
+
if (!project.devCommand) {
|
|
61
|
+
started = " It has no dev command (add one in .devrc.json).";
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const command = (await commandExists("dx")) ? "dx go . --no-editor" : project.devCommand;
|
|
65
|
+
await openTerminal(project.dir, command, project.name);
|
|
66
|
+
started = ` Started \`${project.devCommand}\` in a new terminal window${project.url ? `; it will be at ${project.url}` : ""}.`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
recordRun("go", true, project.name, "mcp", { project: project.name });
|
|
70
|
+
return text(`Opened ${project.name} (${project.dir}) in ${project.editor ?? config.editor}.${started}`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
recordRun("go", false, `${project.name}: ${err.message}`, "mcp", { project: project.name });
|
|
74
|
+
return failure(`Couldn't open ${project.name}: ${err.message}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.registerTool("list_ports", {
|
|
78
|
+
title: "List listening ports",
|
|
79
|
+
description: "List TCP ports that are listening on this computer, with the process name, PID and command line. " +
|
|
80
|
+
"By default only ports 1024 and up that don't belong to the operating system.",
|
|
81
|
+
inputSchema: {
|
|
82
|
+
port: z.number().int().min(1).max(65535).optional().describe("Only this port"),
|
|
83
|
+
include_system: z.boolean().optional().describe("Include ports below 1024 and system processes"),
|
|
84
|
+
},
|
|
85
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
86
|
+
}, async ({ port, include_system }) => {
|
|
87
|
+
try {
|
|
88
|
+
let entries = await listListeningPorts(port);
|
|
89
|
+
if (port === undefined && !include_system)
|
|
90
|
+
entries = entries.filter((e) => e.port >= 1024 && !e.system);
|
|
91
|
+
return text(entries.length ? entries : port ? `Nothing is listening on port ${port}.` : "No listening ports.");
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return failure(err.message);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
server.registerTool("kill_port", {
|
|
98
|
+
title: "Kill process on port",
|
|
99
|
+
description: "Stop whatever process is listening on a TCP port (and its child processes). Never touches operating-system processes. " +
|
|
100
|
+
"Use list_ports first and tell the user what will be stopped.",
|
|
101
|
+
inputSchema: { port: z.number().int().min(1).max(65535).describe("The port to free, e.g. 3000") },
|
|
102
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
103
|
+
}, async ({ port }) => {
|
|
104
|
+
try {
|
|
105
|
+
const { entries, results } = await killPort(port);
|
|
106
|
+
if (entries.length === 0)
|
|
107
|
+
return text(`Nothing was listening on port ${port}.`);
|
|
108
|
+
const ok = results.every((r) => r.ok);
|
|
109
|
+
recordRun("port.kill", ok, `port ${port}: ${results.map((r) => r.message).join("; ")}`, "mcp");
|
|
110
|
+
const summary = results.map((r) => r.message).join("\n");
|
|
111
|
+
return ok ? text(summary) : failure(summary);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return failure(err.message);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
server.registerTool("add_log_entry", {
|
|
118
|
+
title: "Add work journal entry",
|
|
119
|
+
description: "Add one line to the user's work journal (what they did, shipped or decided). Only when the user asks.",
|
|
120
|
+
inputSchema: { text: z.string().min(1).describe("The entry, one line") },
|
|
121
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
122
|
+
}, async ({ text: entryText }) => {
|
|
123
|
+
try {
|
|
124
|
+
const entry = addJournalEntry(entryText);
|
|
125
|
+
recordRun("log", true, undefined, "mcp");
|
|
126
|
+
return text(`Logged under ${entry.date} at ${entry.time}: ${entry.text}`);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return failure(err.message);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
server.registerTool("read_log", {
|
|
133
|
+
title: "Read work journal",
|
|
134
|
+
description: "Read the user's work journal entries for recent days, e.g. to write a weekly summary or standup.",
|
|
135
|
+
inputSchema: { days: z.number().int().min(1).max(366).optional().describe("How many days back (default 7)") },
|
|
136
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
137
|
+
}, async ({ days }) => {
|
|
138
|
+
const entries = readJournal({ sinceDays: days ?? 7 });
|
|
139
|
+
return text(entries.length ? entries : `Nothing logged in the last ${days ?? 7} day(s).`);
|
|
140
|
+
});
|
|
141
|
+
server.registerTool("work_summary", {
|
|
142
|
+
title: "Work summary",
|
|
143
|
+
description: "Summarize what the user did over the last few days: their git commits across all their local projects plus " +
|
|
144
|
+
"their work journal, as markdown. Use it to write a standup, weekly update or status report.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
days: z.number().int().min(1).max(366).optional().describe("How many days back, today included (default 7)"),
|
|
147
|
+
all_authors: z.boolean().optional().describe("Count everyone's commits, not only the user's (default false)"),
|
|
148
|
+
github: z.boolean().optional().describe("Include merged and reviewed GitHub pull requests (default true)"),
|
|
149
|
+
},
|
|
150
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
151
|
+
}, async ({ days, all_authors, github }) => {
|
|
152
|
+
try {
|
|
153
|
+
const summary = await buildSummary({ days: days ?? 7, allAuthors: all_authors, github: github ?? true });
|
|
154
|
+
const skipped = summary.skipped.map((s) => `- ${s.project}: ${s.reason}`).join("\n");
|
|
155
|
+
return text(formatSummary(summary) + (skipped ? `\nRepos that couldn't be read:\n${skipped}\n` : ""));
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return failure(err.message);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
server.registerTool("find_cleanup", {
|
|
162
|
+
title: "Find disk space to free",
|
|
163
|
+
description: "List node_modules and build folders in projects the user hasn't touched for a while, with their sizes. " +
|
|
164
|
+
"Read-only: to delete them, tell the user to run `dx clean` in a terminal, which asks before deleting.",
|
|
165
|
+
inputSchema: { days: z.number().int().min(0).max(3650).optional().describe("Projects idle for at least this many days (default 30)") },
|
|
166
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
167
|
+
}, async ({ days }) => {
|
|
168
|
+
const scan = await findCleanup({ days: days ?? 30 });
|
|
169
|
+
if (!scan.items.length)
|
|
170
|
+
return text(`Nothing to clean in projects idle for ${scan.olderThanDays}+ days.`);
|
|
171
|
+
return text({
|
|
172
|
+
total: formatBytes(scan.totalBytes),
|
|
173
|
+
olderThanDays: scan.olderThanDays,
|
|
174
|
+
folders: scan.items.map((i) => ({ project: i.project, folder: i.relative, size: formatBytes(i.bytes), path: i.dir })),
|
|
175
|
+
howToDelete: "dx clean",
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
server.registerTool("audit_dependencies", {
|
|
179
|
+
title: "Audit dependencies",
|
|
180
|
+
description: "Check the user's Node projects for outdated packages (npm outdated) and known vulnerabilities (npm audit). " +
|
|
181
|
+
"Read-only; takes a few seconds per project because it asks the npm registry.",
|
|
182
|
+
inputSchema: {
|
|
183
|
+
query: z.string().optional().describe("Only projects matching this name"),
|
|
184
|
+
active_days: z.number().int().min(1).max(3650).optional().describe("Only projects active in the last N days"),
|
|
185
|
+
},
|
|
186
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
187
|
+
}, async ({ query, active_days }) => {
|
|
188
|
+
try {
|
|
189
|
+
const reports = await auditDependencies({ query, activeDays: active_days });
|
|
190
|
+
if (!reports.length)
|
|
191
|
+
return text(query ? `No Node project matches "${query}".` : "No Node projects found.");
|
|
192
|
+
return text(reports.map((r) => r.skipped
|
|
193
|
+
? { project: r.project, skipped: r.skipped }
|
|
194
|
+
: {
|
|
195
|
+
project: r.project,
|
|
196
|
+
vulnerabilities: describeVulnerabilities(r.vulnerabilities),
|
|
197
|
+
outdated: r.outdated.map((p) => `${p.name} ${p.current ?? p.wanted ?? "?"} → ${p.latest}${p.major ? " (major)" : ""}`),
|
|
198
|
+
notes: r.notes.length ? r.notes : undefined,
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return failure(err.message);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
// ------------------------------------------------------------ running apps
|
|
206
|
+
// The dev servers live in the dx dashboard, which keeps running after this session ends and shows
|
|
207
|
+
// the user what's running. These tools start it in the background when needed.
|
|
208
|
+
/** The last output line the agent has seen, per project folder, so later calls show only what's new. */
|
|
209
|
+
const seen = new Map();
|
|
210
|
+
function pickProject(name) {
|
|
211
|
+
const { match, candidates } = findProjects(name, scanProjects(loadConfig()));
|
|
212
|
+
const project = match ?? (candidates.length === 1 ? candidates[0] : undefined);
|
|
213
|
+
if (project)
|
|
214
|
+
return project;
|
|
215
|
+
return candidates.length
|
|
216
|
+
? `Several projects match "${name}": ${candidates.slice(0, 8).map((p) => p.name).join(", ")}. Which one?`
|
|
217
|
+
: `No project matches "${name}". list_projects shows them all.`;
|
|
218
|
+
}
|
|
219
|
+
function formatLines(lines, max = 80) {
|
|
220
|
+
const shown = lines.slice(-max);
|
|
221
|
+
const cut = lines.length > shown.length ? `(${lines.length - shown.length} earlier lines left out)\n` : "";
|
|
222
|
+
const label = (l) => `${l.service ? `[${l.service}] ` : ""}${l.stream === "dx" ? "[dx] " : l.stream === "err" ? "[stderr] " : ""}`;
|
|
223
|
+
return cut + shown.map((l) => `${label(l)}${l.text}`).join("\n");
|
|
224
|
+
}
|
|
225
|
+
function formatError(e, detail = 8) {
|
|
226
|
+
const where = e.file ? ` at ${e.file}${e.line ? `:${e.line}${e.column ? `:${e.column}` : ""}` : ""}` : "";
|
|
227
|
+
const times = e.count > 1 ? ` (×${e.count})` : "";
|
|
228
|
+
const body = e.lines
|
|
229
|
+
.slice(1, detail)
|
|
230
|
+
.map((l) => ` ${l}`)
|
|
231
|
+
.join("\n");
|
|
232
|
+
const service = e.service ? `${e.service}: ` : "";
|
|
233
|
+
return `- [${e.kind}] ${service}${e.message}${where}${times}${e.resolved ? " (resolved)" : ""}${body ? `\n${body}` : ""}`;
|
|
234
|
+
}
|
|
235
|
+
function formatErrors(errors, none = "No errors.") {
|
|
236
|
+
return errors.length ? errors.map((e) => formatError(e)).join("\n") : none;
|
|
237
|
+
}
|
|
238
|
+
function describe(server) {
|
|
239
|
+
if (!server)
|
|
240
|
+
return "Not running.";
|
|
241
|
+
const by = server.startedBy === "ai" ? "started by an AI agent" : `started from the ${server.startedBy}`;
|
|
242
|
+
const at = (s) => (s.url ? ` at ${s.url}${s.localUrl ? ` (also ${s.localUrl})` : ""}` : "");
|
|
243
|
+
const head = `${server.project}: ${server.status}${at(server)} (${server.services ? `a stack of ${server.services.length} services, found from ${stackFrom(server.stackSource)}` : server.command}, ${by})`;
|
|
244
|
+
if (!server.services)
|
|
245
|
+
return head;
|
|
246
|
+
const rows = server.services.map((s) => ` - ${s.service}${s.role ? ` (${s.role})` : ""}: ${s.status}${at(s)}${s.errorCount ? `, ${s.errorCount} error(s)` : ""} — ${s.command}`);
|
|
247
|
+
return [head, ...rows, ...(server.note ? [` ${server.note}`] : [])].join("\n");
|
|
248
|
+
}
|
|
249
|
+
function stackFrom(source) {
|
|
250
|
+
const names = {
|
|
251
|
+
devrc: ".devrc.json",
|
|
252
|
+
procfile: "its Procfile",
|
|
253
|
+
runner: "its monorepo dev script",
|
|
254
|
+
scripts: "its dev:* scripts",
|
|
255
|
+
workspaces: "its workspaces",
|
|
256
|
+
compose: "docker-compose",
|
|
257
|
+
};
|
|
258
|
+
return names[source ?? ""] ?? "the project";
|
|
259
|
+
}
|
|
260
|
+
async function waitAndReport(client, project, until, after, timeoutMs) {
|
|
261
|
+
const r = await client.post("/api/dev/wait", { dir: project.dir, after, until, timeoutMs }, timeoutMs + 10_000);
|
|
262
|
+
if (r.server)
|
|
263
|
+
seen.set(project.dir, r.server.lastLine);
|
|
264
|
+
const parts = [describe(r.server)];
|
|
265
|
+
if (r.timedOut)
|
|
266
|
+
parts.push(until === "ready" ? `Still starting after ${Math.round(timeoutMs / 1000)}s.` : "The output didn't settle before the time ran out.");
|
|
267
|
+
if (until === "quiet" && !r.sawOutput) {
|
|
268
|
+
parts.push("The dev server printed nothing new: no rebuild was noticed (it may not watch this file, or it rebuilt silently).");
|
|
269
|
+
}
|
|
270
|
+
parts.push(r.newErrors.length
|
|
271
|
+
? `New errors:\n${formatErrors(r.newErrors)}`
|
|
272
|
+
: r.errors.length
|
|
273
|
+
? `No new errors. Still current:\n${formatErrors(r.errors)}`
|
|
274
|
+
: "No errors.");
|
|
275
|
+
if (r.lines.length)
|
|
276
|
+
parts.push(`Output:\n${formatLines(r.lines, 60)}`);
|
|
277
|
+
parts.push(`The user can watch it in the dx dashboard: ${client.url}`);
|
|
278
|
+
return parts.join("\n\n");
|
|
279
|
+
}
|
|
280
|
+
const notRunning = (name) => `${name} isn't running in dx. start_dev_server starts it.`;
|
|
281
|
+
server.registerTool("start_dev_server", {
|
|
282
|
+
title: "Start a project's dev server",
|
|
283
|
+
description: "Start one of the user's projects' dev server (npm run dev and the like) inside the dx dashboard, wait until it's " +
|
|
284
|
+
"ready or has failed, and return its URL, any errors and its output. If it's already running, report on it. " +
|
|
285
|
+
"When the project is a stack (front end, API, worker, databases in docker-compose…) every service starts, in order, " +
|
|
286
|
+
"and each is reported. Apps are also served at name.localhost. " +
|
|
287
|
+
"Use this to run the app you are working on; after editing files use wait_for_rebuild, and check_url to try pages.",
|
|
288
|
+
inputSchema: {
|
|
289
|
+
project: z.string().describe("Project name, or part of it"),
|
|
290
|
+
timeout_seconds: z.number().int().min(5).max(300).optional().describe("How long to wait for it to be ready (default 90)"),
|
|
291
|
+
},
|
|
292
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
293
|
+
}, async ({ project: name, timeout_seconds }) => {
|
|
294
|
+
const project = pickProject(name);
|
|
295
|
+
if (typeof project === "string")
|
|
296
|
+
return failure(project);
|
|
297
|
+
try {
|
|
298
|
+
const client = await ensureDashboard();
|
|
299
|
+
const started = await client.post("/api/dev/start", { dir: project.dir, by: "ai" });
|
|
300
|
+
recordRun("go", true, `${project.name} started by an AI agent`, "mcp", { project: project.name });
|
|
301
|
+
const after = started.status === "starting" ? 0 : (seen.get(project.dir) ?? 0);
|
|
302
|
+
return text(await waitAndReport(client, project, "ready", after, (timeout_seconds ?? 90) * 1000));
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
return failure(`Couldn't start ${project.name}: ${err.message}`);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
server.registerTool("stop_dev_server", {
|
|
309
|
+
title: "Stop a project's dev server",
|
|
310
|
+
description: "Stop a dev server running in the dx dashboard, with its child processes.",
|
|
311
|
+
inputSchema: { project: z.string().describe("Project name, or part of it") },
|
|
312
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
313
|
+
}, async ({ project: name }) => {
|
|
314
|
+
const project = pickProject(name);
|
|
315
|
+
if (typeof project === "string")
|
|
316
|
+
return failure(project);
|
|
317
|
+
const client = await findDashboard();
|
|
318
|
+
if (!client)
|
|
319
|
+
return text(`${project.name} isn't running in dx.`);
|
|
320
|
+
try {
|
|
321
|
+
const r = await client.post("/api/dev/stop", { dir: project.dir });
|
|
322
|
+
return text(r ? `Stopping ${project.name}.` : `${project.name} isn't running in dx.`);
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
return failure(err.message);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
server.registerTool("restart_dev_server", {
|
|
329
|
+
title: "Restart a project's dev server",
|
|
330
|
+
description: "Stop a project's dev server and start it again, e.g. after changing its config or installing packages. Waits until it's ready.",
|
|
331
|
+
inputSchema: { project: z.string().describe("Project name, or part of it") },
|
|
332
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
333
|
+
}, async ({ project: name }) => {
|
|
334
|
+
const project = pickProject(name);
|
|
335
|
+
if (typeof project === "string")
|
|
336
|
+
return failure(project);
|
|
337
|
+
try {
|
|
338
|
+
const client = await ensureDashboard();
|
|
339
|
+
await client.post("/api/dev/restart", { dir: project.dir, by: "ai" }, 30_000);
|
|
340
|
+
return text(await waitAndReport(client, project, "ready", 0, 90_000));
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
return failure(err.message);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
server.registerTool("dev_servers", {
|
|
347
|
+
title: "List running dev servers",
|
|
348
|
+
description: "List the dev servers dx is running, with their status, URL, who started them and how many errors they currently show.",
|
|
349
|
+
inputSchema: {},
|
|
350
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
351
|
+
}, async () => {
|
|
352
|
+
const client = await findDashboard();
|
|
353
|
+
const list = client ? await client.get("/api/dev") : [];
|
|
354
|
+
if (!list.length)
|
|
355
|
+
return text("No dev servers are running in dx.");
|
|
356
|
+
return text(list.map((s) => `${describe(s)}${s.errorCount ? ` — ${s.errorCount} error(s)` : ""}`).join("\n"));
|
|
357
|
+
});
|
|
358
|
+
server.registerTool("dev_logs", {
|
|
359
|
+
title: "Read a dev server's output",
|
|
360
|
+
description: "Read what a project's dev server printed. By default only what's new since you last looked; since_line: 0 gives everything kept (the last 2000 lines).",
|
|
361
|
+
inputSchema: {
|
|
362
|
+
project: z.string().describe("Project name, or part of it"),
|
|
363
|
+
since_line: z.number().int().min(0).optional().describe("Only lines after this number"),
|
|
364
|
+
max_lines: z.number().int().min(1).max(500).optional().describe("At most this many of the newest lines (default 120)"),
|
|
365
|
+
},
|
|
366
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
367
|
+
}, async ({ project: name, since_line, max_lines }) => {
|
|
368
|
+
const project = pickProject(name);
|
|
369
|
+
if (typeof project === "string")
|
|
370
|
+
return failure(project);
|
|
371
|
+
const client = await findDashboard();
|
|
372
|
+
if (!client)
|
|
373
|
+
return text(notRunning(project.name));
|
|
374
|
+
const after = since_line ?? seen.get(project.dir) ?? 0;
|
|
375
|
+
const r = await client.get(`/api/dev/logs?dir=${encodeURIComponent(project.dir)}&after=${after}`);
|
|
376
|
+
if (!r.server)
|
|
377
|
+
return text(notRunning(project.name));
|
|
378
|
+
seen.set(project.dir, r.server.lastLine);
|
|
379
|
+
return text(`${describe(r.server)}\n\n${r.lines.length ? formatLines(r.lines, max_lines ?? 120) : "No new output."}`);
|
|
380
|
+
});
|
|
381
|
+
server.registerTool("dev_errors", {
|
|
382
|
+
title: "Errors in running apps",
|
|
383
|
+
description: "Errors dx found in dev server output: compile errors, stack traces, crashes. Each has its file:line when the output names one " +
|
|
384
|
+
"and how often it happened; an error is dropped once the server rebuilds cleanly. Without a project, covers every running server.",
|
|
385
|
+
inputSchema: {
|
|
386
|
+
project: z.string().optional().describe("Project name, or part of it; every running server when left out"),
|
|
387
|
+
include_resolved: z.boolean().optional().describe("Also list errors a later clean rebuild resolved"),
|
|
388
|
+
},
|
|
389
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
390
|
+
}, async ({ project: name, include_resolved }) => {
|
|
391
|
+
let dir = "";
|
|
392
|
+
if (name) {
|
|
393
|
+
const project = pickProject(name);
|
|
394
|
+
if (typeof project === "string")
|
|
395
|
+
return failure(project);
|
|
396
|
+
dir = project.dir;
|
|
397
|
+
}
|
|
398
|
+
const client = await findDashboard();
|
|
399
|
+
const r = client
|
|
400
|
+
? await client.get(`/api/dev/errors?dir=${encodeURIComponent(dir)}${include_resolved ? "&all=1" : ""}`)
|
|
401
|
+
: [];
|
|
402
|
+
if (!r.length)
|
|
403
|
+
return text(name ? notRunning(name) : "No dev servers are running in dx.");
|
|
404
|
+
return text(r.map((s) => `${s.project}:\n${formatErrors(s.errors, " No errors.")}`).join("\n\n"));
|
|
405
|
+
});
|
|
406
|
+
server.registerTool("wait_for_rebuild", {
|
|
407
|
+
title: "Wait for the app to rebuild",
|
|
408
|
+
description: "Call after editing a project's files while its dev server runs: waits for the server to notice the change and finish " +
|
|
409
|
+
"rebuilding, then returns what it printed and whether the change introduced or fixed errors.",
|
|
410
|
+
inputSchema: {
|
|
411
|
+
project: z.string().describe("Project name, or part of it"),
|
|
412
|
+
timeout_seconds: z.number().int().min(2).max(120).optional().describe("Longest wait (default 60)"),
|
|
413
|
+
},
|
|
414
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
415
|
+
}, async ({ project: name, timeout_seconds }) => {
|
|
416
|
+
const project = pickProject(name);
|
|
417
|
+
if (typeof project === "string")
|
|
418
|
+
return failure(project);
|
|
419
|
+
const client = await findDashboard();
|
|
420
|
+
if (!client)
|
|
421
|
+
return text(notRunning(project.name));
|
|
422
|
+
try {
|
|
423
|
+
return text(await waitAndReport(client, project, "quiet", seen.get(project.dir) ?? 0, (timeout_seconds ?? 60) * 1000));
|
|
424
|
+
}
|
|
425
|
+
catch (err) {
|
|
426
|
+
return failure(err.message);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
server.registerTool("check_url", {
|
|
430
|
+
title: "Request a page or API route",
|
|
431
|
+
description: "Request a URL on a locally running app (localhost only) and report the status, timing, page title and the start of the body, " +
|
|
432
|
+
"plus what the dev server printed and any errors it logged while answering. Use it to confirm a change works. " +
|
|
433
|
+
"Give either a full URL, or a project and a path.",
|
|
434
|
+
inputSchema: {
|
|
435
|
+
url: z.string().optional().describe("e.g. http://localhost:5173/checkout, or a stack service's local domain: http://api.shop.localhost/health"),
|
|
436
|
+
project: z.string().optional().describe("Project name; its dev server's address is used"),
|
|
437
|
+
path: z.string().optional().describe("Path on the project's server, e.g. /api/cart (default /)"),
|
|
438
|
+
method: z.string().optional().describe("GET (default), POST, PUT, DELETE…"),
|
|
439
|
+
body: z.string().optional().describe("Request body, e.g. JSON text"),
|
|
440
|
+
headers: z.record(z.string(), z.string()).optional().describe("Request headers"),
|
|
441
|
+
},
|
|
442
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
443
|
+
}, async ({ url, project: name, path, method, body, headers }) => {
|
|
444
|
+
let dir;
|
|
445
|
+
if (!url) {
|
|
446
|
+
if (!name)
|
|
447
|
+
return failure("Give a url, or a project and a path.");
|
|
448
|
+
const project = pickProject(name);
|
|
449
|
+
if (typeof project === "string")
|
|
450
|
+
return failure(project);
|
|
451
|
+
dir = project.dir;
|
|
452
|
+
}
|
|
453
|
+
try {
|
|
454
|
+
const client = await ensureDashboard();
|
|
455
|
+
const r = await client.post("/api/check", { url, dir, path, method, body, headers });
|
|
456
|
+
const verb = (method ?? "GET").toUpperCase();
|
|
457
|
+
const head = r.error
|
|
458
|
+
? `${verb} ${r.url} failed after ${r.ms} ms: ${r.error}`
|
|
459
|
+
: `${verb} ${r.url} → ${r.status} ${r.statusText ?? ""} in ${r.ms} ms${r.contentType ? ` (${r.contentType}, ${r.bytes} bytes)` : ""}`;
|
|
460
|
+
const parts = [head];
|
|
461
|
+
if (r.location)
|
|
462
|
+
parts.push(`Redirects to ${r.location} (not followed).`);
|
|
463
|
+
if (r.title)
|
|
464
|
+
parts.push(`Title: ${r.title}`);
|
|
465
|
+
if (r.snippet)
|
|
466
|
+
parts.push(`Body starts:\n${r.snippet}`);
|
|
467
|
+
if (r.project) {
|
|
468
|
+
parts.push(r.serverErrors.length ? `Errors ${r.project} logged meanwhile:\n${formatErrors(r.serverErrors)}` : `${r.project} logged no errors meanwhile.`);
|
|
469
|
+
if (r.serverOutput.length)
|
|
470
|
+
parts.push(`Its output meanwhile:\n${formatLines(r.serverOutput, 40)}`);
|
|
471
|
+
}
|
|
472
|
+
const result = text(parts.join("\n\n"));
|
|
473
|
+
return r.error || (r.status ?? 0) >= 500 ? { ...result, isError: true } : result;
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
return failure(err.message);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
server.registerTool("set_stack", {
|
|
480
|
+
title: "Define a project's stack",
|
|
481
|
+
description: "Say which processes a project needs running together, when dx can't find that by itself: a front end and an API in two " +
|
|
482
|
+
"repositories, a worker, a database from docker-compose. dx already finds stacks from Procfiles, workspaces, turbo/nx/" +
|
|
483
|
+
"concurrently dev scripts, dev:* scripts and docker-compose databases, so read the project first and only call this when " +
|
|
484
|
+
"start_dev_server doesn't start everything. Writes \"stack\" in the project's .devrc.json; an empty services list removes it.",
|
|
485
|
+
inputSchema: {
|
|
486
|
+
project: z.string().describe("The project the stack belongs to (usually the front end), name or part of it"),
|
|
487
|
+
services: z
|
|
488
|
+
.array(z.object({
|
|
489
|
+
name: z.string().describe("Short name: web, api, worker, db"),
|
|
490
|
+
command: z.string().optional().describe("Command to run, e.g. npm run dev"),
|
|
491
|
+
dir: z.string().optional().describe("Folder to run it in, relative to the project, e.g. ../shop-api"),
|
|
492
|
+
project: z.string().optional().describe("Instead of command and dir: another project folder whose own dev command dx uses, e.g. ../shop-api"),
|
|
493
|
+
url: z.string().optional().describe("Where it listens, if it doesn't print it"),
|
|
494
|
+
depends_on: z.array(z.string()).optional().describe("Services that must be ready first"),
|
|
495
|
+
docker: z.string().optional().describe("A docker compose service of this project to start instead of a command"),
|
|
496
|
+
}))
|
|
497
|
+
.describe("The services; empty to remove the stack"),
|
|
498
|
+
},
|
|
499
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
500
|
+
}, async ({ project: name, services }) => {
|
|
501
|
+
const project = pickProject(name);
|
|
502
|
+
if (typeof project === "string")
|
|
503
|
+
return failure(project);
|
|
504
|
+
for (const s of services) {
|
|
505
|
+
if (!s.command && !s.project && !s.docker)
|
|
506
|
+
return failure(`Service ${s.name} needs a command, a project or a docker service.`);
|
|
507
|
+
}
|
|
508
|
+
const spec = Object.fromEntries(services.map((s) => [
|
|
509
|
+
s.name,
|
|
510
|
+
{ dev: s.command, dir: s.dir, project: s.project, url: s.url, dependsOn: s.depends_on, docker: s.docker },
|
|
511
|
+
]));
|
|
512
|
+
try {
|
|
513
|
+
const file = saveStackSpec(project.dir, services.length ? JSON.parse(JSON.stringify(spec)) : undefined);
|
|
514
|
+
const stack = detectStack(readProject(project.dir) ?? project);
|
|
515
|
+
if (!services.length)
|
|
516
|
+
return text(`Removed the stack from ${file}.${stack ? ` dx now finds this one by itself: ${stack.services.map((s) => s.name).join(", ")}.` : ""}`);
|
|
517
|
+
if (!stack)
|
|
518
|
+
return failure(`Wrote ${file}, but dx couldn't read a stack from it. Check the folders and commands.`);
|
|
519
|
+
const order = startOrder(stack).map((wave) => wave.map((s) => s.name).join(" + ")).join(" → ");
|
|
520
|
+
return text(`Saved in ${file}. ${project.name} now starts as: ${order}.\n${stack.services.map((s) => `- ${s.name}: ${s.command} (in ${s.dir})`).join("\n")}\nIf it's running, restart_dev_server applies it.`);
|
|
521
|
+
}
|
|
522
|
+
catch (err) {
|
|
523
|
+
return failure(err.message);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
server.registerTool("dx_setup_check", {
|
|
527
|
+
title: "Check dx's setup",
|
|
528
|
+
description: "Check that everything dx needs works on this computer: Node, projects folders, editor, port listing, clipboard and AI tool connections. " +
|
|
529
|
+
"Each problem comes with a fix, a command to run or a setting to change. Offer to apply the fixes for the user; " +
|
|
530
|
+
"`dx setup` connects dx to every installed AI tool.",
|
|
531
|
+
inputSchema: {},
|
|
532
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
533
|
+
}, async () => {
|
|
534
|
+
const [checks, ai] = await Promise.all([runDoctor(), listAiTools()]);
|
|
535
|
+
const lines = checks.map((c) => `${c.status === "ok" ? "ok " : c.status === "warn" ? "warn" : "FAIL"} ${c.name}: ${c.detail}${c.fix ? `\n fix: ${c.fix}` : ""}`);
|
|
536
|
+
const tools = ai.map((t) => ` ${t.name}: ${!t.installed ? "not installed" : t.connected ? (t.current ? "connected" : "points at an old copy of dx (fix: dx setup)") : "not connected (fix: dx setup)"}`);
|
|
537
|
+
return text(`${lines.join("\n")}\n\nAI tools:\n${tools.join("\n")}`);
|
|
538
|
+
});
|
|
539
|
+
await server.connect(new StdioServerTransport());
|
|
540
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** A request the page made, already parsed. */
|
|
2
|
+
export interface ApiRequest {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
query: URLSearchParams;
|
|
6
|
+
body: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare class HttpError extends Error {
|
|
9
|
+
status: number;
|
|
10
|
+
constructor(status: number, message: string);
|
|
11
|
+
}
|
|
12
|
+
export declare function handleApi(req: ApiRequest): Promise<unknown>;
|
|
13
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAsDA,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,SAAU,SAAQ,KAAK;IAEzB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAIlB;AA6SD,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjE"}
|