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 +190 -7
- package/dist/index.js +103 -58
- package/dist/index.js.map +1 -1
- package/dist/web/app/assets/main-Bx7N5Sfv.js +9 -0
- package/dist/web/app/index.html +24 -0
- package/dist/web/server.js +3 -8
- package/dist/web/server.js.map +1 -1
- package/package.json +9 -7
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
|
-
##
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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.
|
|
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(
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
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
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2153
|
+
content: [
|
|
2154
|
+
{
|
|
2155
|
+
type: "text",
|
|
2156
|
+
text: JSON.stringify(result, null, 2)
|
|
2157
|
+
}
|
|
2158
|
+
]
|
|
2111
2159
|
};
|
|
2112
|
-
})
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
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
|
-
|
|
2122
|
-
|
|
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
|
-
|
|
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(
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
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
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
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
|
-
|
|
2161
|
-
});
|
|
2206
|
+
);
|
|
2162
2207
|
return server;
|
|
2163
2208
|
}
|
|
2164
2209
|
async function startServer() {
|