roadmap-skill 0.1.0 → 0.1.4

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
@@ -15,9 +15,14 @@
15
15
  <a href="https://www.npmjs.com/package/roadmap-skill"><img src="https://img.shields.io/npm/dm/roadmap-skill" alt="npm downloads"></a>
16
16
  </p>
17
17
 
18
+ <p align="center">
19
+ <a href="https://insiders.vscode.dev/redirect/mcp/install?name=roadmap&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22roadmap-skill%22%5D%7D"><img src="https://img.shields.io/badge/VS_Code-Install%20MCP%20Server-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white" alt="Install in VS Code"></a>
20
+ <a href="https://insiders.vscode.dev/redirect/mcp/install?name=roadmap&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22roadmap-skill%22%5D%7D&quality=insiders"><img src="https://img.shields.io/badge/VS_Code_Insiders-Install%20MCP%20Server-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white" alt="Install in VS Code Insiders"></a>
21
+ </p>
22
+
18
23
  ---
19
24
 
20
- ## Why Roadmap Skill?
25
+ ## Why Roadmap Skill?
21
26
 
22
27
  **Tired of juggling multiple project management tools?** Roadmap Skill brings your tasks directly into your AI workflow while offering a beautiful visual interface when you need it.
23
28
 
@@ -33,23 +38,109 @@
33
38
 
34
39
  ## 🚀 Quick Start
35
40
 
36
- ### Option 1: Standalone Web App (Easiest)
41
+ ### Option 1: Standalone Web App
37
42
 
38
43
  ```bash
39
44
  npx roadmap-skill-web
40
45
  ```
41
46
 
42
- Then open http://localhost:7860 in your browser.
47
+ Then open <http://localhost:7860> in your browser.
43
48
 
44
49
  ### Option 2: Integrate with AI Assistants
45
50
 
46
51
  Add to your AI assistant's MCP configuration:
47
52
 
48
- **Claude Desktop:**
53
+ <details>
54
+ <summary><b>Claude Code</b></summary>
55
+
56
+ ```bash
57
+ claude mcp add roadmap npx -y roadmap-skill
58
+ ```
59
+
60
+ </details>
61
+
62
+ <details>
63
+ <summary><b>Claude Desktop</b></summary>
64
+
65
+ ```json
66
+ {
67
+ "mcpServers": {
68
+ "roadmap": {
69
+ "command": "npx",
70
+ "args": ["-y", "roadmap-skill"]
71
+ }
72
+ }
73
+ }
74
+ ```
75
+
76
+ </details>
77
+
78
+ <details>
79
+ <summary><b>Copilot</b></summary>
80
+
81
+ ```bash
82
+ /mcp add
83
+ ```
84
+
85
+ Or edit `~/.copilot/mcp-config.json`:
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "roadmap": {
91
+ "type": "local",
92
+ "command": "npx",
93
+ "args": ["-y", "roadmap-skill"]
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ </details>
100
+
101
+ <details>
102
+ <summary><b>Cursor</b></summary>
103
+
104
+ ```json
105
+ {
106
+ "mcpServers": {
107
+ "roadmap": {
108
+ "command": "npx",
109
+ "args": ["-y", "roadmap-skill"]
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ </details>
116
+
117
+ <details>
118
+ <summary><b>JetBrains (via Cline)</b></summary>
119
+
120
+ Install Cline plugin, then add to `cline_mcp_settings.json`:
121
+
122
+ ```json
123
+ {
124
+ "mcpServers": {
125
+ "roadmap": {
126
+ "type": "stdio",
127
+ "command": "npx",
128
+ "args": ["-y", "roadmap-skill"]
129
+ }
130
+ }
131
+ }
132
+ ```
133
+
134
+ </details>
135
+
136
+ <details>
137
+ <summary><b>Roo Code</b></summary>
138
+
49
139
  ```json
50
140
  {
51
141
  "mcpServers": {
52
142
  "roadmap": {
143
+ "type": "stdio",
53
144
  "command": "npx",
54
145
  "args": ["-y", "roadmap-skill"]
55
146
  }
@@ -57,7 +148,37 @@ Add to your AI assistant's MCP configuration:
57
148
  }
58
149
  ```
59
150
 
60
- **Cursor:**
151
+ </details>
152
+
153
+ <details>
154
+ <summary><b>Opencode</b></summary>
155
+
156
+ Edit `~/.config/opencode/opencode.json`:
157
+
158
+ ```json
159
+ {
160
+ "$schema": "https://opencode.ai/config.json",
161
+ "mcp": {
162
+ "roadmap": {
163
+ "type": "local",
164
+ "command": [
165
+ "npx",
166
+ "-y",
167
+ "roadmap-skill"
168
+ ],
169
+ "enabled": true
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
175
+ </details>
176
+
177
+ <details>
178
+ <summary><b>Trae</b></summary>
179
+
180
+ Go to `Settings` -> `MCP` -> `Add new MCP Server`:
181
+
61
182
  ```json
62
183
  {
63
184
  "mcpServers": {
@@ -69,7 +190,63 @@ Add to your AI assistant's MCP configuration:
69
190
  }
70
191
  ```
71
192
 
72
- Then ask your AI:
193
+ </details>
194
+
195
+ <details>
196
+ <summary><b>VS Code</b></summary>
197
+
198
+ ```json
199
+ {
200
+ "mcp": {
201
+ "servers": {
202
+ "roadmap": {
203
+ "command": "npx",
204
+ "args": ["-y", "roadmap-skill"]
205
+ }
206
+ }
207
+ }
208
+ }
209
+ ```
210
+
211
+ </details>
212
+
213
+ <details>
214
+ <summary><b>Windsurf</b></summary>
215
+
216
+ Follow Windsurf MCP documentation and use:
217
+
218
+ ```json
219
+ {
220
+ "mcpServers": {
221
+ "roadmap": {
222
+ "command": "npx",
223
+ "args": ["-y", "roadmap-skill"]
224
+ }
225
+ }
226
+ }
227
+ ```
228
+
229
+ </details>
230
+
231
+ <details>
232
+ <summary><b>Zed</b></summary>
233
+
234
+ ```json
235
+ {
236
+ "context_servers": {
237
+ "roadmap": {
238
+ "command": {
239
+ "path": "npx",
240
+ "args": ["-y", "roadmap-skill"]
241
+ }
242
+ }
243
+ }
244
+ }
245
+ ```
246
+
247
+ </details>
248
+
249
+ Then ask your AI (e.g.):
73
250
  > "Create a project called 'Website Redesign' with tasks for homepage, about page, and contact form"
74
251
 
75
252
  ---
@@ -77,18 +254,21 @@ Then ask your AI:
77
254
  ## 💡 What You Can Do
78
255
 
79
256
  ### Plan Projects Visually
257
+
80
258
  - See all your tasks organized in Kanban columns
81
259
  - Switch between compact and detailed card views
82
260
  - Filter by status, project, or search keywords
83
261
  - Drag tasks to update their status instantly
84
262
 
85
263
  ### Work with AI
264
+
86
265
  - "Show me all high priority tasks due this week"
87
266
  - "Move the authentication task to in-progress"
88
267
  - "Create a new project for mobile app with 5 initial tasks"
89
268
  - "What's my overall progress across all projects?"
90
269
 
91
270
  ### Collaborate & Track
271
+
92
272
  - Assign tasks to team members
93
273
  - Set due dates and priorities
94
274
  - Add tags to organize related work
@@ -99,14 +279,17 @@ Then ask your AI:
99
279
  ## 📦 Installation
100
280
 
101
281
  ### Requirements
282
+
102
283
  - Node.js 18+ (20+ recommended)
103
284
 
104
285
  ### One-Line Install
286
+
105
287
  ```bash
106
288
  npm install -g roadmap-skill
107
289
  ```
108
290
 
109
291
  ### Or Use Without Installing
292
+
110
293
  ```bash
111
294
  npx roadmap-skill-web # Just the web interface
112
295
  npx roadmap-skill # Full MCP server
@@ -128,8 +311,8 @@ npx roadmap-skill # Full MCP server
128
311
 
129
312
  ## 🔧 Supported Platforms
130
313
 
131
- - ✅ **Claude Desktop** — Full MCP integration
132
314
  - ✅ **Claude Code** — Command-line AI assistant
315
+ - ✅ **Claude Desktop** — Full MCP integration
133
316
  - ✅ **Cursor** — AI-powered IDE
134
317
  - ✅ **VS Code** — Via Cline or Roo Code extensions
135
318
  - ✅ **Any MCP Client** — Standard MCP protocol support
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
4
  var __esm = (fn, res) => function __init() {
@@ -79,6 +80,7 @@ import {
79
80
  GetPromptRequestSchema
80
81
  } from "@modelcontextprotocol/sdk/types.js";
81
82
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
83
+ import { zodToJsonSchema } from "zod-to-json-schema";
82
84
 
83
85
  // src/tools/index.ts
84
86
  init_esm_shims();
@@ -1016,9 +1018,6 @@ init_esm_shims();
1016
1018
  init_esm_shims();
1017
1019
  import express from "express";
1018
1020
  import * as path4 from "path";
1019
- import { fileURLToPath as fileURLToPath2 } from "url";
1020
- var __filename2 = fileURLToPath2(import.meta.url);
1021
- var __dirname2 = path4.dirname(__filename2);
1022
1021
  function createServer(port = 7860) {
1023
1022
  const app = express();
1024
1023
  app.use(express.json());
@@ -1166,7 +1165,7 @@ function createServer(port = 7860) {
1166
1165
  res.status(500).json({ error: error.message });
1167
1166
  }
1168
1167
  });
1169
- const distPath = path4.join(__dirname2, "app");
1168
+ const distPath = path4.join(process.cwd(), "dist", "web", "app");
1170
1169
  app.use(express.static(distPath));
1171
1170
  app.get("*", (req, res) => {
1172
1171
  if (req.path.startsWith("/api")) {
@@ -1182,7 +1181,15 @@ function createServer(port = 7860) {
1182
1181
  }
1183
1182
 
1184
1183
  // src/tools/web-tools.ts
1184
+ import open from "open";
1185
1185
  var activeServer = null;
1186
+ async function openBrowser(url) {
1187
+ try {
1188
+ await open(url);
1189
+ } catch (error) {
1190
+ console.error("Failed to open browser:", error);
1191
+ }
1192
+ }
1186
1193
  var openWebInterfaceTool = {
1187
1194
  name: "open_web_interface",
1188
1195
  description: "Open web visualization interface",
@@ -1204,15 +1211,21 @@ var openWebInterfaceTool = {
1204
1211
  }
1205
1212
  const port = args.port || 7860;
1206
1213
  activeServer = createServer(port);
1214
+ const url = `http://localhost:${port}`;
1215
+ void openBrowser(url);
1207
1216
  return {
1208
- message: "Web interface started successfully",
1209
- url: `http://localhost:${port}`
1217
+ message: "Web interface started successfully and opened in browser",
1218
+ url
1210
1219
  };
1211
1220
  }
1212
1221
  };
1213
1222
  var closeWebInterfaceTool = {
1214
1223
  name: "close_web_interface",
1215
1224
  description: "Close web visualization interface",
1225
+ parameters: {
1226
+ type: "object",
1227
+ properties: {}
1228
+ },
1216
1229
  async execute() {
1217
1230
  if (!activeServer) {
1218
1231
  return { message: "Web interface is not running" };
@@ -2090,7 +2103,7 @@ function createServer2() {
2090
2103
  const server = new Server(
2091
2104
  {
2092
2105
  name: "roadmap-skill",
2093
- version: "0.1.0"
2106
+ version: "0.1.4"
2094
2107
  },
2095
2108
  {
2096
2109
  capabilities: {
@@ -2100,65 +2113,97 @@ function createServer2() {
2100
2113
  }
2101
2114
  }
2102
2115
  );
2103
- server.setRequestHandler(ListToolsRequestSchema, async (_request) => {
2104
- return {
2105
- tools: allTools.map((tool) => {
2106
- const inputSchema = tool.parameters || tool.inputSchema;
2116
+ server.setRequestHandler(
2117
+ ListToolsRequestSchema,
2118
+ async (_request) => {
2119
+ return {
2120
+ tools: allTools.map((tool) => {
2121
+ const rawSchema = tool.parameters || tool.inputSchema;
2122
+ let inputSchema;
2123
+ if (!rawSchema) {
2124
+ inputSchema = { type: "object" };
2125
+ } else if (rawSchema.type === "object") {
2126
+ inputSchema = rawSchema;
2127
+ } else {
2128
+ inputSchema = zodToJsonSchema(rawSchema, {
2129
+ name: tool.name,
2130
+ $refStrategy: "none"
2131
+ }).definitions?.[tool.name] || { type: "object" };
2132
+ }
2133
+ return {
2134
+ name: tool.name,
2135
+ description: tool.description,
2136
+ inputSchema
2137
+ };
2138
+ })
2139
+ };
2140
+ }
2141
+ );
2142
+ server.setRequestHandler(
2143
+ CallToolRequestSchema,
2144
+ async (request) => {
2145
+ const { name, arguments: args } = request.params;
2146
+ const tool = toolMap.get(name);
2147
+ if (!tool) {
2148
+ throw new Error(`Unknown tool: ${name}`);
2149
+ }
2150
+ try {
2151
+ const result = await tool.execute(args);
2107
2152
  return {
2108
- name: tool.name,
2109
- description: tool.description,
2110
- inputSchema: inputSchema || { type: "object" }
2153
+ content: [
2154
+ {
2155
+ type: "text",
2156
+ text: JSON.stringify(result, null, 2)
2157
+ }
2158
+ ]
2111
2159
  };
2112
- })
2113
- };
2114
- });
2115
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
2116
- const { name, arguments: args } = request.params;
2117
- const tool = toolMap.get(name);
2118
- if (!tool) {
2119
- throw new Error(`Unknown tool: ${name}`);
2160
+ } catch (error) {
2161
+ const errorMessage = error instanceof Error ? error.message : String(error);
2162
+ throw new Error(`Tool execution failed: ${errorMessage}`);
2163
+ }
2120
2164
  }
2121
- try {
2122
- const result = await tool.execute(args);
2165
+ );
2166
+ server.setRequestHandler(
2167
+ ListResourcesRequestSchema,
2168
+ async (_request) => {
2169
+ const resources = getAllResources();
2170
+ return { resources };
2171
+ }
2172
+ );
2173
+ server.setRequestHandler(
2174
+ ReadResourceRequestSchema,
2175
+ async (request) => {
2176
+ const uri = request.params.uri;
2177
+ const resourceContent = await handleResourceRequest(uri);
2178
+ if (!resourceContent) {
2179
+ throw new Error(`Resource not found: ${uri}`);
2180
+ }
2123
2181
  return {
2124
- content: [
2125
- {
2126
- type: "text",
2127
- text: JSON.stringify(result, null, 2)
2128
- }
2129
- ]
2182
+ contents: [resourceContent]
2130
2183
  };
2131
- } catch (error) {
2132
- const errorMessage = error instanceof Error ? error.message : String(error);
2133
- throw new Error(`Tool execution failed: ${errorMessage}`);
2134
2184
  }
2135
- });
2136
- server.setRequestHandler(ListResourcesRequestSchema, async (_request) => {
2137
- const resources = getAllResources();
2138
- return { resources };
2139
- });
2140
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
2141
- const uri = request.params.uri;
2142
- const resourceContent = await handleResourceRequest(uri);
2143
- if (!resourceContent) {
2144
- throw new Error(`Resource not found: ${uri}`);
2185
+ );
2186
+ server.setRequestHandler(
2187
+ ListPromptsRequestSchema,
2188
+ async (_request) => {
2189
+ const prompts = getAllPrompts();
2190
+ return { prompts };
2145
2191
  }
2146
- return {
2147
- contents: [resourceContent]
2148
- };
2149
- });
2150
- server.setRequestHandler(ListPromptsRequestSchema, async (_request) => {
2151
- const prompts = getAllPrompts();
2152
- return { prompts };
2153
- });
2154
- server.setRequestHandler(GetPromptRequestSchema, async (request) => {
2155
- const { name, arguments: args } = request.params;
2156
- const promptResult = getPromptByName(name, args);
2157
- if (!promptResult) {
2158
- throw new Error(`Prompt not found: ${name}`);
2192
+ );
2193
+ server.setRequestHandler(
2194
+ GetPromptRequestSchema,
2195
+ async (request) => {
2196
+ const { name, arguments: args } = request.params;
2197
+ const promptResult = getPromptByName(
2198
+ name,
2199
+ args
2200
+ );
2201
+ if (!promptResult) {
2202
+ throw new Error(`Prompt not found: ${name}`);
2203
+ }
2204
+ return promptResult;
2159
2205
  }
2160
- return promptResult;
2161
- });
2206
+ );
2162
2207
  return server;
2163
2208
  }
2164
2209
  async function startServer() {