roadmap-skill 0.2.8 → 0.2.9

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/README.md CHANGED
@@ -243,6 +243,31 @@ Follow Windsurf MCP documentation and use:
243
243
 
244
244
  </details>
245
245
 
246
+ <details>
247
+ <summary><b>Codex CLI / Codex IDE</b></summary>
248
+
249
+ **One-liner (recommended):**
250
+
251
+ ```bash
252
+ codex mcp add roadmap -- npx -y roadmap-skill
253
+ ```
254
+
255
+ **Manual config** — edit `~/.codex/config.toml`:
256
+
257
+ ```toml
258
+ [mcp_servers.roadmap]
259
+ command = "npx"
260
+ args = ["-y", "roadmap-skill"]
261
+ ```
262
+
263
+ > **Windows**: No `cmd /c` wrapper needed — Codex handles the subprocess directly.
264
+
265
+ > **Server name**: Must match `^[a-zA-Z0-9_-]+$`. Names with spaces or parentheses are rejected.
266
+
267
+ > **Note**: Both Codex CLI and the Codex VSCode extension share the same `~/.codex/config.toml`. A syntax error breaks both.
268
+
269
+ </details>
270
+
246
271
  </details>
247
272
 
248
273
  <br>
package/README.zh.md CHANGED
@@ -241,6 +241,28 @@ Follow Windsurf MCP documentation and use:
241
241
  }
242
242
  ```
243
243
 
244
+ </details>
245
+ <details>
246
+ <summary><b>Codex CLI / Codex IDE</b></summary>
247
+
248
+ **一键安装(推荐):**
249
+
250
+ ```bash
251
+ codex mcp add roadmap -- npx -y roadmap-skill
252
+ ```
253
+
254
+ **手动配置** — 编辑 `~/.codex/config.toml`:
255
+
256
+ ```toml
257
+ [mcp_servers.roadmap]
258
+ command = "npx"
259
+ args = ["-y", "roadmap-skill"]
260
+ ```
261
+
262
+ > **Windows**:无需 `cmd /c` 包装 — Codex 会直接管理子进程。
263
+ > **服务器名称**:必须匹配 `^[a-zA-Z0-9_-]+$`,含空格或括号的名称会被拒绝。
264
+ > **注意**:Codex CLI 和 Codex VSCode 扩展共享同一个 `~/.codex/config.toml`,语法错误会同时影响两者。
265
+
244
266
  </details>
245
267
 
246
268
  </details>
package/dist/index.js CHANGED
@@ -276,7 +276,7 @@ var ProjectStorage = class {
276
276
  if (filters.searchText && !task.title.toLowerCase().includes(filters.searchText.toLowerCase()) && !task.description.toLowerCase().includes(filters.searchText.toLowerCase())) {
277
277
  continue;
278
278
  }
279
- if (filters.includeCompleted === false && task.status === "done") {
279
+ if (filters.includeCompleted !== true && task.status === "done") {
280
280
  continue;
281
281
  }
282
282
  results.push({ task, project: data.project });
@@ -345,15 +345,37 @@ var storage = new ProjectStorage();
345
345
  // src/tools/project-tools.ts
346
346
  var ProjectTypeEnum = z.enum(["roadmap", "skill-tree", "kanban"]);
347
347
  var ProjectStatusEnum = z.enum(["active", "completed", "archived"]);
348
+ function toProjectSummary(project, taskCount) {
349
+ return {
350
+ id: project.id,
351
+ name: project.name,
352
+ projectType: project.projectType,
353
+ status: project.status,
354
+ targetDate: project.targetDate,
355
+ taskCount
356
+ };
357
+ }
358
+ function toTaskSummary(task) {
359
+ return {
360
+ id: task.id,
361
+ title: task.title,
362
+ status: task.status,
363
+ priority: task.priority,
364
+ dueDate: task.dueDate,
365
+ assignee: task.assignee,
366
+ tags: task.tags
367
+ };
368
+ }
348
369
  var createProjectTool = {
349
370
  name: "create_project",
350
- description: "Create a new project roadmap",
371
+ description: "Create a new project roadmap. Returns summary by default; set verbose=true for full data.",
351
372
  inputSchema: z.object({
352
373
  name: z.string().min(1, "Project name is required"),
353
374
  description: z.string(),
354
375
  projectType: ProjectTypeEnum,
355
376
  startDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format"),
356
- targetDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format")
377
+ targetDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format"),
378
+ verbose: z.boolean().optional()
357
379
  }),
358
380
  async execute(input) {
359
381
  try {
@@ -367,7 +389,7 @@ var createProjectTool = {
367
389
  const projectData = await storage.createProject(projectInput);
368
390
  return {
369
391
  success: true,
370
- data: projectData
392
+ data: input.verbose ? projectData : toProjectSummary(projectData.project, 0)
371
393
  };
372
394
  } catch (error) {
373
395
  return {
@@ -379,14 +401,16 @@ var createProjectTool = {
379
401
  };
380
402
  var listProjectsTool = {
381
403
  name: "list_projects",
382
- description: "List all projects with their task and milestone counts",
383
- inputSchema: z.object({}),
384
- async execute() {
404
+ description: "List all projects. Returns summaries by default; set verbose=true for full project data.",
405
+ inputSchema: z.object({
406
+ verbose: z.boolean().optional()
407
+ }),
408
+ async execute(input) {
385
409
  try {
386
410
  const projects = await storage.listProjects();
387
411
  return {
388
412
  success: true,
389
- data: projects
413
+ data: input.verbose ? projects : projects.map((p) => toProjectSummary(p.project, p.taskCount))
390
414
  };
391
415
  } catch (error) {
392
416
  return {
@@ -398,9 +422,10 @@ var listProjectsTool = {
398
422
  };
399
423
  var getProjectTool = {
400
424
  name: "get_project",
401
- description: "Get a project by ID with all its data (tasks, tags, milestones)",
425
+ description: "Get a project by ID with all its data (tasks, tags, milestones). Tasks are returned as summaries by default; set verbose=true for full task data.",
402
426
  inputSchema: z.object({
403
- projectId: z.string().min(1, "Project ID is required")
427
+ projectId: z.string().min(1, "Project ID is required"),
428
+ verbose: z.boolean().optional()
404
429
  }),
405
430
  async execute(input) {
406
431
  try {
@@ -413,7 +438,10 @@ var getProjectTool = {
413
438
  }
414
439
  return {
415
440
  success: true,
416
- data: projectData
441
+ data: input.verbose ? projectData : {
442
+ ...projectData,
443
+ tasks: projectData.tasks.map(toTaskSummary)
444
+ }
417
445
  };
418
446
  } catch (error) {
419
447
  return {
@@ -425,7 +453,7 @@ var getProjectTool = {
425
453
  };
426
454
  var updateProjectTool = {
427
455
  name: "update_project",
428
- description: "Update an existing project",
456
+ description: "Update an existing project. Returns summary by default; set verbose=true for full data.",
429
457
  inputSchema: z.object({
430
458
  projectId: z.string().min(1, "Project ID is required"),
431
459
  name: z.string().min(1).optional(),
@@ -433,11 +461,12 @@ var updateProjectTool = {
433
461
  projectType: ProjectTypeEnum.optional(),
434
462
  status: ProjectStatusEnum.optional(),
435
463
  startDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
436
- targetDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
464
+ targetDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
465
+ verbose: z.boolean().optional()
437
466
  }),
438
467
  async execute(input) {
439
468
  try {
440
- const { projectId, ...updateData } = input;
469
+ const { projectId, verbose, ...updateData } = input;
441
470
  if (Object.keys(updateData).length === 0) {
442
471
  return {
443
472
  success: false,
@@ -454,7 +483,7 @@ var updateProjectTool = {
454
483
  }
455
484
  return {
456
485
  success: true,
457
- data: projectData
486
+ data: verbose ? projectData : toProjectSummary(projectData.project, projectData.tasks.length)
458
487
  };
459
488
  } catch (error) {
460
489
  return {
@@ -1105,9 +1134,20 @@ init_esm_shims();
1105
1134
  // src/tools/task-tools.ts
1106
1135
  var TaskStatusEnum = z2.enum(["todo", "in-progress", "review", "done"]);
1107
1136
  var TaskPriorityEnum = z2.enum(["low", "medium", "high", "critical"]);
1137
+ function toTaskSummary2(task) {
1138
+ return {
1139
+ id: task.id,
1140
+ title: task.title,
1141
+ status: task.status,
1142
+ priority: task.priority,
1143
+ dueDate: task.dueDate,
1144
+ assignee: task.assignee,
1145
+ tags: task.tags
1146
+ };
1147
+ }
1108
1148
  var createTaskTool = {
1109
1149
  name: "create_task",
1110
- description: "Create a new task in a project",
1150
+ description: "Create a new task in a project. Returns summary by default; set verbose=true for full data.",
1111
1151
  inputSchema: z2.object({
1112
1152
  projectId: z2.string().min(1, "Project ID is required"),
1113
1153
  title: z2.string().min(1, "Task title is required"),
@@ -1115,7 +1155,8 @@ var createTaskTool = {
1115
1155
  priority: TaskPriorityEnum.default("medium"),
1116
1156
  tags: z2.array(z2.string()).default([]),
1117
1157
  dueDate: z2.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
1118
- assignee: z2.string().optional()
1158
+ assignee: z2.string().optional(),
1159
+ verbose: z2.boolean().optional()
1119
1160
  }),
1120
1161
  async execute(input) {
1121
1162
  const result = await TaskService.create(input.projectId, {
@@ -1126,12 +1167,16 @@ var createTaskTool = {
1126
1167
  dueDate: input.dueDate,
1127
1168
  assignee: input.assignee
1128
1169
  });
1129
- return result;
1170
+ if (!result.success) return result;
1171
+ return {
1172
+ success: true,
1173
+ data: input.verbose ? result.data : toTaskSummary2(result.data)
1174
+ };
1130
1175
  }
1131
1176
  };
1132
1177
  var listTasksTool = {
1133
1178
  name: "list_tasks",
1134
- description: "List tasks with optional filters",
1179
+ description: "List tasks with optional filters. By default, completed (done) tasks are excluded. Set includeCompleted=true to include them. Returns summaries by default; set verbose=true for full task data.",
1135
1180
  inputSchema: z2.object({
1136
1181
  projectId: z2.string().optional(),
1137
1182
  status: TaskStatusEnum.optional(),
@@ -1140,7 +1185,8 @@ var listTasksTool = {
1140
1185
  assignee: z2.string().optional(),
1141
1186
  dueBefore: z2.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
1142
1187
  dueAfter: z2.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
1143
- includeCompleted: z2.boolean().optional()
1188
+ includeCompleted: z2.boolean().optional(),
1189
+ verbose: z2.boolean().optional()
1144
1190
  }),
1145
1191
  async execute(input) {
1146
1192
  try {
@@ -1154,9 +1200,10 @@ var listTasksTool = {
1154
1200
  dueAfter: input.dueAfter,
1155
1201
  includeCompleted: input.includeCompleted
1156
1202
  });
1203
+ const tasks = results.map((r) => r.task);
1157
1204
  return {
1158
1205
  success: true,
1159
- data: results
1206
+ data: input.verbose ? tasks : tasks.map(toTaskSummary2)
1160
1207
  };
1161
1208
  } catch (error) {
1162
1209
  return {
@@ -1180,7 +1227,7 @@ var getTaskTool = {
1180
1227
  };
1181
1228
  var updateTaskTool = {
1182
1229
  name: "update_task",
1183
- description: "Update an existing task",
1230
+ description: "Update an existing task. Returns summary by default; set verbose=true for full data.",
1184
1231
  inputSchema: z2.object({
1185
1232
  projectId: z2.string().min(1, "Project ID is required"),
1186
1233
  taskId: z2.string().min(1, "Task ID is required"),
@@ -1190,12 +1237,17 @@ var updateTaskTool = {
1190
1237
  priority: TaskPriorityEnum.optional(),
1191
1238
  tags: z2.array(z2.string()).optional(),
1192
1239
  dueDate: z2.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().nullable(),
1193
- assignee: z2.string().optional().nullable()
1240
+ assignee: z2.string().optional().nullable(),
1241
+ verbose: z2.boolean().optional()
1194
1242
  }),
1195
1243
  async execute(input) {
1196
- const { projectId, taskId, ...updateData } = input;
1244
+ const { projectId, taskId, verbose, ...updateData } = input;
1197
1245
  const result = await TaskService.update(projectId, taskId, updateData);
1198
- return result;
1246
+ if (!result.success) return result;
1247
+ return {
1248
+ success: true,
1249
+ data: verbose ? result.data : toTaskSummary2(result.data)
1250
+ };
1199
1251
  }
1200
1252
  };
1201
1253
  var deleteTaskTool = {
@@ -1218,22 +1270,31 @@ var deleteTaskTool = {
1218
1270
  };
1219
1271
  var batchUpdateTasksTool = {
1220
1272
  name: "batch_update_tasks",
1221
- description: "Update multiple tasks at once",
1273
+ description: "Update multiple tasks at once. Returns summaries by default; set verbose=true for full task data.",
1222
1274
  inputSchema: z2.object({
1223
1275
  projectId: z2.string().min(1, "Project ID is required"),
1224
1276
  taskIds: z2.array(z2.string()).min(1, "At least one task ID is required"),
1225
1277
  status: TaskStatusEnum.optional(),
1226
1278
  priority: TaskPriorityEnum.optional(),
1227
1279
  tags: z2.array(z2.string()).optional(),
1228
- tagOperation: z2.enum(["add", "remove", "replace"]).default("replace")
1280
+ tagOperation: z2.enum(["add", "remove", "replace"]).default("replace"),
1281
+ verbose: z2.boolean().optional()
1229
1282
  }),
1230
1283
  async execute(input) {
1231
- const { projectId, taskIds, tagOperation, ...restData } = input;
1284
+ const { projectId, taskIds, tagOperation, verbose, ...restData } = input;
1232
1285
  const result = await TaskService.batchUpdate(projectId, taskIds, {
1233
1286
  ...restData,
1234
1287
  tagOperation
1235
1288
  });
1236
- return result;
1289
+ if (!result.success) return result;
1290
+ return {
1291
+ success: true,
1292
+ data: {
1293
+ updatedTasks: verbose ? result.data.updatedTasks : result.data.updatedTasks.map(toTaskSummary2),
1294
+ updatedCount: result.data.updatedCount,
1295
+ notFoundIds: result.data.notFoundIds
1296
+ }
1297
+ };
1237
1298
  }
1238
1299
  };
1239
1300
 
@@ -2085,12 +2146,12 @@ init_esm_shims();
2085
2146
  init_esm_shims();
2086
2147
  var projectPrompts = [
2087
2148
  {
2088
- name: "recommendNextTasks",
2149
+ name: "suggest-tasks",
2089
2150
  description: "Intelligently recommend the next priority tasks based on urgency, due dates, and project status",
2090
2151
  arguments: [
2091
2152
  {
2092
2153
  name: "projectId",
2093
- description: "Specific project ID (optional; if not provided, analyze all projects)",
2154
+ description: "Specific project ID (optional; if not provided, auto-detect from current context or analyze all projects)",
2094
2155
  required: false
2095
2156
  },
2096
2157
  {
@@ -2101,18 +2162,18 @@ var projectPrompts = [
2101
2162
  ]
2102
2163
  },
2103
2164
  {
2104
- name: "autoPrioritize",
2165
+ name: "auto-prioritize",
2105
2166
  description: "Automatically analyze tasks and intelligently adjust priorities, considering due dates, dependencies, and project importance",
2106
2167
  arguments: [
2107
2168
  {
2108
2169
  name: "projectId",
2109
- description: "Specific project ID (optional; if not provided, analyze all projects)",
2170
+ description: "Specific project ID (optional; if not provided, auto-detect from current context or analyze all projects)",
2110
2171
  required: false
2111
2172
  }
2112
2173
  ]
2113
2174
  },
2114
2175
  {
2115
- name: "enhanceTaskDetails",
2176
+ name: "add-task-details",
2116
2177
  description: "Intelligently enhance task details, including description, acceptance criteria, subtasks, and required resources",
2117
2178
  arguments: [
2118
2179
  {
@@ -2123,7 +2184,7 @@ var projectPrompts = [
2123
2184
  ]
2124
2185
  },
2125
2186
  {
2126
- name: "quickCapture",
2187
+ name: "quick-capture",
2127
2188
  description: "Quickly capture ideas/tasks, auto-categorize and suggest priorities",
2128
2189
  arguments: [
2129
2190
  {
@@ -2133,14 +2194,25 @@ var projectPrompts = [
2133
2194
  },
2134
2195
  {
2135
2196
  name: "projectId",
2136
- description: "Target project ID (optional)",
2197
+ description: "Target project ID (optional; if not provided, auto-detect from current context)",
2198
+ required: false
2199
+ }
2200
+ ]
2201
+ },
2202
+ {
2203
+ name: "open-web-ui",
2204
+ description: "Open the web visualization interface for the roadmap skill",
2205
+ arguments: [
2206
+ {
2207
+ name: "port",
2208
+ description: "Port to run the web interface on (optional, default: 7860)",
2137
2209
  required: false
2138
2210
  }
2139
2211
  ]
2140
2212
  }
2141
2213
  ];
2142
2214
  function getRecommendNextTasksPrompt(projectId, limit) {
2143
- const context = projectId ? `Analyze tasks for project ${projectId}` : "Analyze tasks for all active projects";
2215
+ const projectHint = projectId ? `User specified project: ${projectId}. Use this project if it exists, or inform user if not found.` : "User did not specify a project. Based on the current working directory and conversation context, try to identify the most relevant project. If a clear match exists, focus on that project; otherwise, analyze all active projects";
2144
2216
  const taskLimit = limit ? parseInt(limit, 10) : 3;
2145
2217
  return {
2146
2218
  description: "Intelligent Task Recommendation Assistant",
@@ -2149,7 +2221,7 @@ function getRecommendNextTasksPrompt(projectId, limit) {
2149
2221
  role: "user",
2150
2222
  content: {
2151
2223
  type: "text",
2152
- text: `${context}, please recommend the ${taskLimit} tasks I should prioritize next.
2224
+ text: `${projectHint}, please recommend the ${taskLimit} tasks I should prioritize next.
2153
2225
 
2154
2226
  ## Recommendation Logic (sorted by priority):
2155
2227
 
@@ -2209,7 +2281,7 @@ Keep task status synchronized with actual progress!`
2209
2281
  };
2210
2282
  }
2211
2283
  function getAutoPrioritizePrompt(projectId) {
2212
- const context = projectId ? `Analyze task priorities for project ${projectId}` : "Analyze task priorities for all projects";
2284
+ const projectHint = projectId ? `User specified project: ${projectId}. Use this project if it exists, or inform user if not found.` : "User did not specify a project. Based on the current working directory and conversation context, try to identify the most relevant project. If a clear match exists, focus on that project; otherwise, analyze all active projects";
2213
2285
  return {
2214
2286
  description: "Intelligent Priority Optimization Assistant",
2215
2287
  messages: [
@@ -2217,7 +2289,7 @@ function getAutoPrioritizePrompt(projectId) {
2217
2289
  role: "user",
2218
2290
  content: {
2219
2291
  type: "text",
2220
- text: `${context}, please automatically analyze and suggest priority adjustments.
2292
+ text: `${projectHint}, please automatically analyze and adjust priorities.
2221
2293
 
2222
2294
  ## Priority Adjustment Rules:
2223
2295
 
@@ -2251,7 +2323,7 @@ function getAutoPrioritizePrompt(projectId) {
2251
2323
  - Identify task dependency relationships
2252
2324
  - Evaluate overall project health
2253
2325
  3. **Generate adjustment suggestions**: List tasks needing priority changes with reasons
2254
- 4. **Batch update**: Use batch_update_tasks to execute priority adjustments
2326
+ 4. **Batch update**: Use batch_update_tasks to execute priority adjustments immediately \u2014 no confirmation needed
2255
2327
 
2256
2328
  ## Output Format:
2257
2329
 
@@ -2273,7 +2345,7 @@ function getAutoPrioritizePrompt(projectId) {
2273
2345
  ### Keep Unchanged (Priorities are reasonable)
2274
2346
  - List tasks with reasonable priority settings
2275
2347
 
2276
- Please provide analysis results, then execute batch update after user confirmation.`
2348
+ Please provide analysis results and immediately execute batch_update_tasks to apply the priority adjustments \u2014 no confirmation needed.`
2277
2349
  }
2278
2350
  }
2279
2351
  ]
@@ -2328,7 +2400,7 @@ If the task is complex, suggest breaking it down:
2328
2400
  - If design task: Add design specs, review criteria
2329
2401
  - If documentation task: Add doc structure, references
2330
2402
  - If testing task: Add test scenarios, coverage scope
2331
- 4. **Generate enhancement content**: Use update_task to update task description
2403
+ 4. **Apply enhancement**: Use update_task to update task description immediately \u2014 no confirmation needed
2332
2404
 
2333
2405
  ## Updated task should include:
2334
2406
 
@@ -2351,14 +2423,14 @@ If the task is complex, suggest breaking it down:
2351
2423
  - References: [link]
2352
2424
  \`\`\`
2353
2425
 
2354
- Please fetch task info first, then provide detailed enhancement suggestions.`
2426
+ Please fetch task info and immediately use update_task to apply the enhanced details \u2014 no confirmation needed.`
2355
2427
  }
2356
2428
  }
2357
2429
  ]
2358
2430
  };
2359
2431
  }
2360
2432
  function getQuickCapturePrompt(idea, projectId) {
2361
- const projectContext = projectId ? `Add to project ${projectId}` : "Auto-select the most suitable project";
2433
+ const projectContext = projectId ? `User specified project: ${projectId}. Use this project if it exists, or inform user if not found.` : "User did not specify a project. Based on the current working directory and conversation context, try to identify the most relevant project. If a clear match exists, use that project; otherwise, analyze all active projects and select the best match";
2362
2434
  return {
2363
2435
  description: "Quick Capture Assistant",
2364
2436
  messages: [
@@ -2370,7 +2442,7 @@ function getQuickCapturePrompt(idea, projectId) {
2370
2442
 
2371
2443
  ${projectContext}
2372
2444
 
2373
- ## Please help me complete the following steps:
2445
+ ## Please complete the following steps immediately:
2374
2446
 
2375
2447
  ### 1. Task Information Extraction
2376
2448
  Extract from description:
@@ -2379,11 +2451,10 @@ Extract from description:
2379
2451
  - **Task Type**: bug / feature / refactor / docs / chore
2380
2452
  - **Estimated Priority**: critical / high / medium / low (based on urgency in description)
2381
2453
 
2382
- ### 2. Project Recommendation (if no project specified)
2383
- If user didn't specify a project, please:
2454
+ ### 2. Project Selection (if no project specified)
2384
2455
  - List all active projects
2385
2456
  - Analyze which project the task content is most relevant to
2386
- - Recommend the most suitable project
2457
+ - Select the most suitable project automatically
2387
2458
 
2388
2459
  ### 3. Tag Suggestions
2389
2460
  Suggest relevant tags:
@@ -2391,11 +2462,11 @@ Suggest relevant tags:
2391
2462
  - Priority tags: urgent, important
2392
2463
  - Domain tags: frontend, backend, design, testing (if applicable)
2393
2464
 
2394
- ### 4. Generate Task
2395
- Use create_task to create the task
2465
+ ### 4. Create Task
2466
+ Use create_task to create the task immediately \u2014 no confirmation needed.
2396
2467
 
2397
- ### 5. Status Recommendation
2398
- After creating the task, if you start working on it immediately, consider setting the status to in-progress. Use update_task to keep progress updated during work, and mark as done when completed.
2468
+ ### 5. Status
2469
+ After creating, if work starts immediately, use update_task to set status to in-progress.
2399
2470
 
2400
2471
  ## Example:
2401
2472
 
@@ -2409,11 +2480,26 @@ After creating the task, if you start working on it immediately, consider settin
2409
2480
  - Suggested Tags: bug, frontend, mobile
2410
2481
  - Recommended Project: [Recommend if there's a web project]
2411
2482
 
2412
- ## Current Idea Analysis:
2483
+ ## Current Idea:
2413
2484
 
2414
2485
  Idea: "${idea}"
2415
2486
 
2416
- Please analyze and generate task suggestions. After user confirmation, execute create_task to create the task.`
2487
+ Analyze the idea, select the best matching project, and immediately execute create_task \u2014 no confirmation needed.`
2488
+ }
2489
+ }
2490
+ ]
2491
+ };
2492
+ }
2493
+ function getOpenWebUIPrompt(port) {
2494
+ const portNum = port ? parseInt(port, 10) : 7860;
2495
+ return {
2496
+ description: "Open Web Visualization Interface",
2497
+ messages: [
2498
+ {
2499
+ role: "user",
2500
+ content: {
2501
+ type: "text",
2502
+ text: `Please open the roadmap-skill web interface by calling the open_web_interface tool with port ${portNum}. Do it immediately without asking for confirmation.`
2417
2503
  }
2418
2504
  }
2419
2505
  ]
@@ -2421,14 +2507,16 @@ Please analyze and generate task suggestions. After user confirmation, execute c
2421
2507
  }
2422
2508
  function getPromptByName(name, args) {
2423
2509
  switch (name) {
2424
- case "recommendNextTasks":
2510
+ case "suggest-tasks":
2425
2511
  return getRecommendNextTasksPrompt(args?.projectId, args?.limit);
2426
- case "autoPrioritize":
2512
+ case "auto-prioritize":
2427
2513
  return getAutoPrioritizePrompt(args?.projectId);
2428
- case "enhanceTaskDetails":
2514
+ case "add-task-details":
2429
2515
  return getEnhanceTaskDetailsPrompt(args?.taskId || "");
2430
- case "quickCapture":
2516
+ case "quick-capture":
2431
2517
  return getQuickCapturePrompt(args?.idea || "", args?.projectId);
2518
+ case "open-web-ui":
2519
+ return getOpenWebUIPrompt(args?.port);
2432
2520
  default:
2433
2521
  return null;
2434
2522
  }