devglow-mcp 1.0.3 → 1.0.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/build/deeplink.js CHANGED
@@ -24,12 +24,14 @@ export async function startProject(id) {
24
24
  export async function stopProject(id) {
25
25
  await openDeepLink(buildUrl("stop", { id }));
26
26
  }
27
- export async function runProcess(name, path, command, port, source) {
27
+ export async function runProcess(name, path, command, port, source, description) {
28
28
  const params = { name, path, command };
29
29
  if (port !== undefined)
30
30
  params.port = String(port);
31
31
  if (source)
32
32
  params.source = source;
33
+ if (description)
34
+ params.description = description;
33
35
  await openDeepLink(buildUrl("run", params));
34
36
  }
35
37
  export async function stopProcess(name) {
@@ -38,3 +40,9 @@ export async function stopProcess(name) {
38
40
  export async function exportLogs(id) {
39
41
  await openDeepLink(buildUrl("export-logs", { id }));
40
42
  }
43
+ export async function updateProject(id, description) {
44
+ const params = { id };
45
+ if (description !== undefined)
46
+ params.description = description;
47
+ await openDeepLink(buildUrl("update-project", params));
48
+ }
package/build/index.js CHANGED
@@ -11,7 +11,7 @@ import { fileURLToPath } from "node:url";
11
11
  import { dirname, join } from "node:path";
12
12
  import { z } from "zod";
13
13
  import { loadProjects, loadAiProcesses, loadStatuses, loadExportedLogs, } from "./storage.js";
14
- import { startProject, stopProject, runProcess, stopProcess, exportLogs, } from "./deeplink.js";
14
+ import { startProject, stopProject, runProcess, stopProcess, exportLogs, updateProject, } from "./deeplink.js";
15
15
  const __dirname = dirname(fileURLToPath(import.meta.url));
16
16
  const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
17
17
  // --- Orphan process prevention constants ---
@@ -205,14 +205,40 @@ function createMcpServer() {
205
205
  .number()
206
206
  .optional()
207
207
  .describe("Port number the process will listen on. Check package.json scripts or config files for --port flags. Important for DevGlow to show the correct port badge."),
208
+ description: z
209
+ .string()
210
+ .max(280)
211
+ .optional()
212
+ .describe("Short summary of what the app does (max 280 chars). Helps the user remember the project later. Write 1-2 plain sentences from the user's perspective."),
208
213
  },
209
- }, async ({ name, path, command, port }) => {
214
+ }, async ({ name, path, command, port, description }) => {
210
215
  // Auto-detect port from command if not explicitly provided
211
216
  const resolvedPort = port ?? detectPortFromCommand(command);
212
- await runProcess(name, path, command, resolvedPort, "claude");
217
+ await runProcess(name, path, command, resolvedPort, "claude", description);
213
218
  // Brief wait for DevGlow to register the process
214
219
  await new Promise((resolve) => setTimeout(resolve, 300));
215
- const text = `AI process "${name}" started.\nCommand: ${command}\nPath: ${path}${resolvedPort ? `\nPort: ${resolvedPort}` : ""}`;
220
+ const text = `AI process "${name}" started.\nCommand: ${command}\nPath: ${path}${resolvedPort ? `\nPort: ${resolvedPort}` : ""}${description ? `\nDescription: ${description}` : ""}`;
221
+ return { content: [{ type: "text", text }] };
222
+ });
223
+ // ── Tool: update_project ──
224
+ server.registerTool("update_project", {
225
+ title: "Update a project's metadata",
226
+ description: "Update a kept (permanent) DevGlow project's metadata (currently only description). Does NOT apply to temporary AI processes — for those, set the description at run_process time, or have the user keep the process first.",
227
+ inputSchema: {
228
+ id: z
229
+ .string()
230
+ .describe("Project id (call list_projects first). Must be a permanent project, not an AI process (those have ids starting with 'ai-')."),
231
+ description: z
232
+ .string()
233
+ .max(280)
234
+ .describe("Short summary of what the app does (max 280 chars). Pass an empty string to clear the existing description."),
235
+ },
236
+ }, async ({ id, description }) => {
237
+ await updateProject(id, description);
238
+ await new Promise((resolve) => setTimeout(resolve, 200));
239
+ const text = description
240
+ ? `Project ${id} description updated.`
241
+ : `Project ${id} description cleared.`;
216
242
  return { content: [{ type: "text", text }] };
217
243
  });
218
244
  // ── Tool: stop_process ──
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devglow-mcp",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "MCP server for DevGlow — manage local dev processes through AI agents",
5
5
  "type": "module",
6
6
  "bin": {