roadmap-skill 0.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/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2203 -0
- package/dist/index.js.map +1 -0
- package/dist/web/server.js +441 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +72 -0
- package/templates/ai-project.json +142 -0
- package/templates/mobile-app.json +126 -0
- package/templates/web-app.json +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/file-helpers.ts","../src/index.ts","../src/server.ts","../src/tools/index.ts","../src/tools/project-tools.ts","../src/storage/index.ts","../src/utils/path-helpers.ts","../src/tools/task-tools.ts","../src/tools/tag-tools.ts","../src/tools/web-tools.ts","../src/web/server.ts","../src/tools/template-tools.ts","../src/resources/index.ts","../src/resources/project-resources.ts","../src/prompts/index.ts","../src/prompts/project-prompts.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import * as fs from 'fs/promises';\n\n/**\n * Read and parse a JSON file\n * @param filePath - Path to the JSON file\n * @returns Parsed JSON data\n * @throws Error if file cannot be read or parsed\n */\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to read JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Write data to a JSON file\n * @param filePath - Path to the JSON file\n * @param data - Data to serialize and write\n * @throws Error if file cannot be written\n */\nexport async function writeJsonFile<T>(filePath: string, data: T): Promise<void> {\n try {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filePath, content, 'utf-8');\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to write JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed\n * @param dirPath - Path to the directory\n * @throws Error if directory cannot be created\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to create directory ${dirPath}: ${error.message}`);\n }\n throw error;\n }\n}\n","import { startServer } from './server.js';\n\nasync function main() {\n process.on('SIGINT', () => {\n console.error('Received SIGINT, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n console.error('Received SIGTERM, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('uncaughtException', (error) => {\n console.error('Uncaught exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n console.error('Unhandled rejection:', reason);\n process.exit(1);\n });\n\n try {\n await startServer();\n } catch (error) {\n console.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\nmain();\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n type CallToolRequest,\n type ListToolsRequest,\n type ListResourcesRequest,\n type ReadResourceRequest,\n type ListPromptsRequest,\n type GetPromptRequest,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport {\n createProjectTool,\n listProjectsTool,\n getProjectTool,\n updateProjectTool,\n deleteProjectTool,\n createTaskTool,\n listTasksTool,\n getTaskTool,\n updateTaskTool,\n deleteTaskTool,\n batchUpdateTasksTool,\n createTagTool,\n listTagsTool,\n updateTagTool,\n deleteTagTool,\n getTasksByTagTool,\n openWebInterfaceTool,\n closeWebInterfaceTool,\n} from './tools/index.js';\nimport { getAllResources, handleResourceRequest } from './resources/index.js';\nimport { getAllPrompts, getPromptByName } from './prompts/index.js';\n\nconst allTools = [\n createProjectTool,\n listProjectsTool,\n getProjectTool,\n updateProjectTool,\n deleteProjectTool,\n createTaskTool,\n listTasksTool,\n getTaskTool,\n updateTaskTool,\n deleteTaskTool,\n batchUpdateTasksTool,\n createTagTool,\n listTagsTool,\n updateTagTool,\n deleteTagTool,\n getTasksByTagTool,\n openWebInterfaceTool,\n closeWebInterfaceTool,\n];\n\nconst toolMap = new Map(allTools.map(tool => [tool.name, tool]));\n\nexport function createServer(): Server {\n const server = new Server(\n {\n name: 'roadmap-skill',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async (_request: ListToolsRequest) => {\n return {\n tools: allTools.map(tool => {\n const inputSchema = (tool as any).parameters || (tool as any).inputSchema;\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: inputSchema || { type: 'object' },\n };\n }),\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request: CallToolRequest) => {\n const { name, arguments: args } = request.params;\n const tool = toolMap.get(name);\n\n if (!tool) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n try {\n const result = await tool.execute(args as never);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Tool execution failed: ${errorMessage}`);\n }\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async (_request: ListResourcesRequest) => {\n const resources = getAllResources();\n return { resources };\n });\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request: ReadResourceRequest) => {\n const uri = request.params.uri;\n const resourceContent = await handleResourceRequest(uri);\n\n if (!resourceContent) {\n throw new Error(`Resource not found: ${uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async (_request: ListPromptsRequest) => {\n const prompts = getAllPrompts();\n return { prompts };\n });\n\n server.setRequestHandler(GetPromptRequestSchema, async (request: GetPromptRequest) => {\n const { name, arguments: args } = request.params;\n const promptResult = getPromptByName(name, args as Record<string, string> | undefined);\n\n if (!promptResult) {\n throw new Error(`Prompt not found: ${name}`);\n }\n\n return promptResult;\n });\n\n return server;\n}\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n\n console.error('Roadmap Skill MCP Server starting...');\n\n try {\n await server.connect(transport);\n console.error('Roadmap Skill MCP Server connected and ready');\n } catch (error) {\n console.error('Failed to start server:', error);\n throw error;\n }\n}\n","export {\n createProjectTool,\n listProjectsTool,\n getProjectTool,\n updateProjectTool,\n deleteProjectTool,\n} from './project-tools.js';\n\nexport {\n createTaskTool,\n listTasksTool,\n getTaskTool,\n updateTaskTool,\n deleteTaskTool,\n batchUpdateTasksTool,\n} from './task-tools.js';\n\nexport {\n createTagTool,\n listTagsTool,\n updateTagTool,\n deleteTagTool,\n getTasksByTagTool,\n} from './tag-tools.js';\n\nexport {\n openWebInterfaceTool,\n closeWebInterfaceTool,\n} from './web-tools.js';\n\nexport {\n listTemplatesTool,\n getTemplateTool,\n applyTemplateTool,\n} from './template-tools.js';\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, UpdateProjectInput } from '../models/index.js';\n\nconst ProjectTypeEnum = z.enum(['roadmap', 'skill-tree', 'kanban']);\nconst ProjectStatusEnum = z.enum(['active', 'completed', 'archived']);\n\nexport const createProjectTool = {\n name: 'create_project',\n description: 'Create a new project roadmap',\n inputSchema: z.object({\n name: z.string().min(1, 'Project name is required'),\n description: z.string(),\n projectType: ProjectTypeEnum,\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n }),\n async execute(input: {\n name: string;\n description: string;\n projectType: 'roadmap' | 'skill-tree' | 'kanban';\n startDate: string;\n targetDate: string;\n }) {\n try {\n const projectInput: CreateProjectInput = {\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n startDate: input.startDate,\n targetDate: input.targetDate,\n };\n\n const projectData = await storage.createProject(projectInput);\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create project',\n };\n }\n },\n};\n\nexport const listProjectsTool = {\n name: 'list_projects',\n description: 'List all projects with their task and milestone counts',\n inputSchema: z.object({}),\n async execute() {\n try {\n const projects = await storage.listProjects();\n return {\n success: true,\n data: projects,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list projects',\n };\n }\n },\n};\n\nexport const getProjectTool = {\n name: 'get_project',\n description: 'Get a project by ID with all its data (tasks, tags, milestones)',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get project',\n };\n }\n },\n};\n\nexport const updateProjectTool = {\n name: 'update_project',\n description: 'Update an existing project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n projectType: ProjectTypeEnum.optional(),\n status: ProjectStatusEnum.optional(),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n }),\n async execute(input: {\n projectId: string;\n name?: string;\n description?: string;\n projectType?: 'roadmap' | 'skill-tree' | 'kanban';\n status?: 'active' | 'completed' | 'archived';\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const { projectId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const updateInput: UpdateProjectInput = updateData;\n const projectData = await storage.updateProject(projectId, updateInput);\n\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update project',\n };\n }\n },\n};\n\nexport const deleteProjectTool = {\n name: 'delete_project',\n description: 'Delete a project by ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const deleted = await storage.deleteProject(input.projectId);\n\n if (!deleted) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete project',\n };\n }\n },\n};\n","import * as path from 'path';\nimport type {\n Project,\n ProjectData,\n Task,\n TaskSearchFilters,\n CreateProjectInput,\n UpdateProjectInput,\n} from '../models/index.js';\nimport { getStorageDir } from '../utils/path-helpers.js';\nimport { readJsonFile, writeJsonFile, ensureDir } from '../utils/file-helpers.js';\n\n/**\n * Storage class for managing roadmap-skill projects\n * Projects are stored as individual JSON files in ~/.roadmap-skill/projects/\n */\nexport class ProjectStorage {\n private storageDir: string;\n\n constructor() {\n this.storageDir = getStorageDir();\n }\n\n /**\n * Ensure the storage directory exists\n */\n async ensureDirectory(): Promise<void> {\n await ensureDir(this.storageDir);\n }\n\n /**\n * Get the file path for a project\n * @param projectId - The project ID\n * @returns Full path to the project JSON file\n */\n getFilePath(projectId: string): string {\n return path.join(this.storageDir, `${projectId}.json`);\n }\n\n /**\n * Create a new project\n * @param input - Project creation data\n * @returns The created project data\n */\n async createProject(input: CreateProjectInput): Promise<ProjectData> {\n await this.ensureDirectory();\n\n const now = new Date().toISOString();\n const projectId = `proj_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const project: Project = {\n id: projectId,\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n status: 'active',\n startDate: input.startDate,\n targetDate: input.targetDate,\n createdAt: now,\n updatedAt: now,\n };\n\n const projectData: ProjectData = {\n version: 1,\n project,\n milestones: [],\n tasks: [],\n tags: [],\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Read a project by ID\n * @param projectId - The project ID\n * @returns The project data or null if not found\n */\n async readProject(projectId: string): Promise<ProjectData | null> {\n try {\n const filePath = this.getFilePath(projectId);\n return await readJsonFile<ProjectData>(filePath);\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Update an existing project\n * @param projectId - The project ID\n * @param input - Project update data\n * @returns The updated project data or null if not found\n */\n async updateProject(\n projectId: string,\n input: UpdateProjectInput\n ): Promise<ProjectData | null> {\n const projectData = await this.readProject(projectId);\n if (!projectData) {\n return null;\n }\n\n const now = new Date().toISOString();\n\n projectData.project = {\n ...projectData.project,\n ...input,\n updatedAt: now,\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Delete a project by ID\n * @param projectId - The project ID\n * @returns True if deleted, false if not found\n */\n async deleteProject(projectId: string): Promise<boolean> {\n try {\n const filePath = this.getFilePath(projectId);\n const fs = await import('fs/promises');\n await fs.unlink(filePath);\n return true;\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * List all projects sorted by updatedAt (descending)\n * @returns Array of project summaries (project + metadata)\n */\n async listProjects(): Promise<Array<{ project: Project; taskCount: number; milestoneCount: number }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const projects: Array<{ project: Project; taskCount: number; milestoneCount: number }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n projects.push({\n project: data.project,\n taskCount: data.tasks.length,\n milestoneCount: data.milestones.length,\n });\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n // Sort by updatedAt descending\n return projects.sort(\n (a, b) => new Date(b.project.updatedAt).getTime() - new Date(a.project.updatedAt).getTime()\n );\n }\n\n /**\n * Search tasks across all projects with filters\n * @param filters - Search filters\n * @returns Array of matching tasks with project context\n */\n async searchTasks(\n filters: TaskSearchFilters\n ): Promise<Array<{ task: Task; project: Project }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const results: Array<{ task: Task; project: Project }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n\n // Skip if project filter doesn't match\n if (filters.projectId && data.project.id !== filters.projectId) {\n continue;\n }\n\n for (const task of data.tasks) {\n // Apply filters\n if (filters.status && task.status !== filters.status) {\n continue;\n }\n if (filters.priority && task.priority !== filters.priority) {\n continue;\n }\n if (filters.assignee && task.assignee !== filters.assignee) {\n continue;\n }\n if (filters.dueBefore && task.dueDate && task.dueDate > filters.dueBefore) {\n continue;\n }\n if (filters.dueAfter && task.dueDate && task.dueDate < filters.dueAfter) {\n continue;\n }\n if (\n filters.tags &&\n filters.tags.length > 0 &&\n !filters.tags.some((tag) => task.tags.includes(tag))\n ) {\n continue;\n }\n if (\n filters.searchText &&\n !task.title.toLowerCase().includes(filters.searchText.toLowerCase()) &&\n !task.description.toLowerCase().includes(filters.searchText.toLowerCase())\n ) {\n continue;\n }\n\n results.push({ task, project: data.project });\n }\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n return results;\n }\n}\n\n// Export singleton instance\nexport const storage = new ProjectStorage();\n","import * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Get the storage directory for roadmap-skill projects\n * Returns: ~/.roadmap-skill/projects\n */\nexport function getStorageDir(): string {\n const homeDir = os.homedir();\n return path.join(homeDir, '.roadmap-skill', 'projects');\n}\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Task } from '../models/index.js';\n\nconst TaskStatusEnum = z.enum(['todo', 'in-progress', 'review', 'done']);\nconst TaskPriorityEnum = z.enum(['low', 'medium', 'high', 'critical']);\n\nfunction generateTaskId(): string {\n return `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTaskTool = {\n name: 'create_task',\n description: 'Create a new task in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n title: z.string().min(1, 'Task title is required'),\n description: z.string(),\n priority: TaskPriorityEnum.default('medium'),\n tags: z.array(z.string()).default([]),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n assignee: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n dueDate?: string;\n assignee?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: generateTaskId(),\n projectId: input.projectId,\n title: input.title,\n description: input.description,\n status: 'todo',\n priority: input.priority,\n tags: input.tags,\n dueDate: input.dueDate ?? null,\n assignee: input.assignee ?? null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create task',\n };\n }\n },\n};\n\nexport const listTasksTool = {\n name: 'list_tasks',\n description: 'List tasks with optional filters',\n inputSchema: z.object({\n projectId: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n dueBefore: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n dueAfter: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n }),\n async execute(input: {\n projectId?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n assignee?: string;\n dueBefore?: string;\n dueAfter?: string;\n }) {\n try {\n const results = await storage.searchTasks({\n projectId: input.projectId,\n status: input.status,\n priority: input.priority,\n tags: input.tags,\n assignee: input.assignee,\n dueBefore: input.dueBefore,\n dueAfter: input.dueAfter,\n });\n\n return {\n success: true,\n data: results,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tasks',\n };\n }\n },\n};\n\nexport const getTaskTool = {\n name: 'get_task',\n description: 'Get a specific task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const task = projectData.tasks.find((t) => t.id === input.taskId);\n if (!task) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get task',\n };\n }\n },\n};\n\nexport const updateTaskTool = {\n name: 'update_task',\n description: 'Update an existing task',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n title: z.string().min(1).optional(),\n description: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional().nullable(),\n assignee: z.string().optional().nullable(),\n }),\n async execute(input: {\n projectId: string;\n taskId: string;\n title?: string;\n description?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n dueDate?: string | null;\n assignee?: string | null;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, taskId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n\n const updatedTask: Task = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTask,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update task',\n };\n }\n },\n};\n\nexport const deleteTaskTool = {\n name: 'delete_task',\n description: 'Delete a task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const now = new Date().toISOString();\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete task',\n };\n }\n },\n};\n\nexport const batchUpdateTasksTool = {\n name: 'batch_update_tasks',\n description: 'Update multiple tasks at once',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskIds: z.array(z.string()).min(1, 'At least one task ID is required'),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n tagOperation: z.enum(['add', 'remove', 'replace']).default('replace'),\n }),\n async execute(input: {\n projectId: string;\n taskIds: string[];\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n tagOperation?: 'add' | 'remove' | 'replace';\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const updatedTasks: Task[] = [];\n const notFoundIds: string[] = [];\n\n for (const taskId of input.taskIds) {\n const taskIndex = projectData.tasks.findIndex((t) => t.id === taskId);\n if (taskIndex === -1) {\n notFoundIds.push(taskId);\n continue;\n }\n\n const existingTask = projectData.tasks[taskIndex];\n let updatedTags = existingTask.tags;\n\n if (input.tags && input.tags.length > 0) {\n switch (input.tagOperation) {\n case 'add':\n updatedTags = [...new Set([...existingTask.tags, ...input.tags])];\n break;\n case 'remove':\n updatedTags = existingTask.tags.filter((tag) => !input.tags!.includes(tag));\n break;\n case 'replace':\n default:\n updatedTags = input.tags;\n break;\n }\n }\n\n const updatedTask: Task = {\n ...existingTask,\n ...(input.status && { status: input.status }),\n ...(input.priority && { priority: input.priority }),\n tags: updatedTags,\n updatedAt: now,\n ...(input.status === 'done' && existingTask.status !== 'done' && { completedAt: now }),\n ...(input.status && input.status !== 'done' && { completedAt: null }),\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n updatedTasks.push(updatedTask);\n }\n\n if (updatedTasks.length === 0) {\n return {\n success: false,\n error: 'No tasks were found to update',\n notFoundIds,\n };\n }\n\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n updatedTasks,\n updatedCount: updatedTasks.length,\n notFoundIds: notFoundIds.length > 0 ? notFoundIds : undefined,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to batch update tasks',\n };\n }\n },\n};\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Tag } from '../models/index.js';\n\nfunction generateTagId(): string {\n return `tag_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTagTool = {\n name: 'create_tag',\n description: 'Create a new tag in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1, 'Tag name is required'),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Color must be a valid hex code (e.g., #FF5733)'),\n description: z.string().default(''),\n }),\n async execute(input: {\n projectId: string;\n name: string;\n color: string;\n description: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Check for duplicate tag name\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.name.toLowerCase()\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${input.name}' already exists in this project`,\n };\n }\n\n const now = new Date().toISOString();\n const tag: Tag = {\n id: generateTagId(),\n name: input.name,\n color: input.color,\n description: input.description,\n createdAt: now,\n };\n\n projectData.tags.push(tag);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: tag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create tag',\n };\n }\n },\n};\n\nexport const listTagsTool = {\n name: 'list_tags',\n description: 'List all tags in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData.tags,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tags',\n };\n }\n },\n};\n\nexport const updateTagTool = {\n name: 'update_tag',\n description: 'Update an existing tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n name: z.string().min(1).optional(),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n description: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n tagId: string;\n name?: string;\n color?: string;\n description?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, tagId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n // Check for duplicate name if updating name\n if (updateData.name) {\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === updateData.name!.toLowerCase() && t.id !== input.tagId\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${updateData.name}' already exists in this project`,\n };\n }\n }\n\n const now = new Date().toISOString();\n const existingTag = projectData.tags[tagIndex];\n\n const updatedTag: Tag = {\n ...existingTag,\n ...updateData,\n id: existingTag.id,\n createdAt: existingTag.createdAt,\n };\n\n projectData.tags[tagIndex] = updatedTag;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tag',\n };\n }\n },\n};\n\nexport const deleteTagTool = {\n name: 'delete_tag',\n description: 'Delete a tag by project ID and tag ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n }),\n async execute(input: { projectId: string; tagId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const tag = projectData.tags[tagIndex];\n\n // Remove tag from all tasks that use it\n const now = new Date().toISOString();\n let tasksUpdated = 0;\n for (const task of projectData.tasks) {\n const tagIndexInTask = task.tags.indexOf(input.tagId);\n if (tagIndexInTask !== -1) {\n task.tags.splice(tagIndexInTask, 1);\n task.updatedAt = now;\n tasksUpdated++;\n }\n }\n\n projectData.tags.splice(tagIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n deleted: true,\n tag,\n tasksUpdated,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete tag',\n };\n }\n },\n};\n\nexport const getTasksByTagTool = {\n name: 'get_tasks_by_tag',\n description: 'Get all tasks that have a specific tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagName: z.string().min(1, 'Tag name is required'),\n }),\n async execute(input: { projectId: string; tagName: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Find tag by name\n const tag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.tagName.toLowerCase()\n );\n\n if (!tag) {\n return {\n success: false,\n error: `Tag with name '${input.tagName}' not found in project '${input.projectId}'`,\n };\n }\n\n // Find all tasks with this tag\n const tasks = projectData.tasks.filter((t) => t.tags.includes(tag.id));\n\n return {\n success: true,\n data: {\n tag,\n tasks,\n count: tasks.length,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tasks by tag',\n };\n }\n },\n};\n","import { createServer } from '../web/server.js';\nimport type { Server } from 'http';\n\nlet activeServer: Server | null = null;\n\nexport const openWebInterfaceTool = {\n name: 'open_web_interface',\n description: 'Open web visualization interface',\n parameters: {\n type: 'object',\n properties: {\n port: {\n type: 'number',\n description: 'Port to run the web interface on (default: 7860)',\n },\n },\n },\n async execute(args: { port?: number }) {\n if (activeServer) {\n return { \n message: 'Web interface is already running',\n url: `http://localhost:${(activeServer.address() as any).port}`\n };\n }\n\n const port = args.port || 7860;\n activeServer = createServer(port);\n \n return {\n message: 'Web interface started successfully',\n url: `http://localhost:${port}`\n };\n }\n};\n\nexport const closeWebInterfaceTool = {\n name: 'close_web_interface',\n description: 'Close web visualization interface',\n async execute() {\n if (!activeServer) {\n return { message: 'Web interface is not running' };\n }\n\n return new Promise((resolve) => {\n activeServer!.close(() => {\n activeServer = null;\n resolve({ message: 'Web interface stopped' });\n });\n });\n }\n};\n","import express from 'express';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { storage } from '../storage/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport function createServer(port: number = 7860) {\n const app = express();\n\n app.use(express.json());\n\n app.get('/api/projects', async (_req, res) => {\n try {\n const projects = await storage.listProjects();\n res.json(projects);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/projects/:id', async (req, res) => {\n try {\n const project = await storage.readProject(req.params.id);\n if (!project) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n res.json(project);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/tasks', async (req, res) => {\n try {\n const filters = req.query;\n const tasks = await storage.searchTasks(filters as any);\n res.json(tasks);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/projects', async (req, res) => {\n try {\n const project = await storage.createProject(req.body);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/projects', async (req, res) => {\n try {\n const { projectId, ...updateData } = req.body;\n const project = await storage.updateProject(projectId, updateData);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/projects', async (req, res) => {\n try {\n const { projectId } = req.query;\n await storage.deleteProject(projectId as string);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/tasks', async (req, res) => {\n try {\n const { projectId, ...taskData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const now = new Date().toISOString();\n const task = {\n id: `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n projectId,\n ...taskData,\n status: taskData.status || 'todo',\n priority: taskData.priority || 'medium',\n tags: taskData.tags || [],\n dueDate: taskData.dueDate || null,\n assignee: taskData.assignee || null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: task });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId, ...updateData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n const updatedTask = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: updatedTask });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId } = req.query;\n const projectData = await storage.readProject(projectId as string);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = new Date().toISOString();\n const filePath = storage.getFilePath(projectId as string);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n const distPath = path.join(__dirname, 'app');\n app.use(express.static(distPath));\n\n app.get('*', (req, res) => {\n if (req.path.startsWith('/api')) {\n res.status(404).json({ error: 'API not found' });\n return;\n }\n res.sendFile(path.join(distPath, 'index.html'));\n });\n\n const server = app.listen(port, '0.0.0.0', () => {\n console.log(`Web interface server running at http://0.0.0.0:${port}`);\n });\n\n return server;\n}\n","import { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, Tag, Task } from '../models/index.js';\n\nconst TEMPLATES_DIR = path.join(process.cwd(), 'templates');\n\ninterface TemplateMetadata {\n name: string;\n description: string;\n projectType: string;\n tasks: Array<{\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n estimatedHours?: number;\n }>;\n tags: Array<{\n name: string;\n color: string;\n }>;\n}\n\nasync function getTemplateFiles(): Promise<string[]> {\n try {\n const files = await fs.readdir(TEMPLATES_DIR);\n return files.filter((f) => f.endsWith('.json'));\n } catch {\n return [];\n }\n}\n\nasync function loadTemplate(templateName: string): Promise<TemplateMetadata | null> {\n try {\n const fileName = templateName.endsWith('.json') ? templateName : `${templateName}.json`;\n const filePath = path.join(TEMPLATES_DIR, fileName);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as TemplateMetadata;\n } catch {\n return null;\n }\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const listTemplatesTool = {\n name: 'list_templates',\n description: 'List all available project templates',\n inputSchema: z.object({}),\n async execute() {\n try {\n const templateFiles = await getTemplateFiles();\n const templates = [];\n\n for (const file of templateFiles) {\n const template = await loadTemplate(file);\n if (template) {\n templates.push({\n name: file.replace('.json', ''),\n displayName: template.name,\n description: template.description,\n projectType: template.projectType,\n taskCount: template.tasks.length,\n tagCount: template.tags.length,\n });\n }\n }\n\n return {\n success: true,\n data: templates,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list templates',\n };\n }\n },\n};\n\nexport const getTemplateTool = {\n name: 'get_template',\n description: 'Get detailed information about a specific template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n }),\n async execute(input: { templateName: string }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n return {\n success: true,\n data: {\n name: template.name,\n description: template.description,\n projectType: template.projectType,\n tasks: template.tasks.map((t) => ({\n title: t.title,\n description: t.description,\n priority: t.priority,\n tags: t.tags,\n estimatedHours: t.estimatedHours,\n })),\n tags: template.tags,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get template',\n };\n }\n },\n};\n\nexport const applyTemplateTool = {\n name: 'apply_template',\n description: 'Create a new project from a template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n projectName: z.string().min(1, 'Project name is required'),\n description: z.string().default(''),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n }),\n async execute(input: {\n templateName: string;\n projectName: string;\n description: string;\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n const projectInput: CreateProjectInput = {\n name: input.projectName,\n description: input.description || template.description,\n projectType: template.projectType as 'roadmap' | 'skill-tree' | 'kanban',\n startDate: input.startDate || new Date().toISOString().split('T')[0],\n targetDate: input.targetDate || new Date().toISOString().split('T')[0],\n };\n\n const projectData = await storage.createProject(projectInput);\n const projectId = projectData.project.id;\n const now = new Date().toISOString();\n\n const tagNameToId: Map<string, string> = new Map();\n const tags: Tag[] = [];\n\n for (const templateTag of template.tags) {\n const tag: Tag = {\n id: generateId('tag'),\n name: templateTag.name,\n color: templateTag.color,\n description: '',\n createdAt: now,\n };\n tags.push(tag);\n tagNameToId.set(templateTag.name, tag.id);\n }\n\n const tasks: Task[] = [];\n\n for (const templateTask of template.tasks) {\n const taskTagIds = templateTask.tags\n .map((tagName) => tagNameToId.get(tagName))\n .filter((id): id is string => id !== undefined);\n\n const task: Task = {\n id: generateId('task'),\n projectId,\n title: templateTask.title,\n description: templateTask.description,\n status: 'todo',\n priority: templateTask.priority,\n tags: taskTagIds,\n dueDate: null,\n assignee: null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n tasks.push(task);\n }\n\n projectData.tags = tags;\n projectData.tasks = tasks;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n project: projectData.project,\n taskCount: tasks.length,\n tagCount: tags.length,\n tasksCreated: tasks.map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n })),\n tagsCreated: tags.map((t) => ({\n id: t.id,\n name: t.name,\n color: t.color,\n })),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to apply template',\n };\n }\n },\n};\n","export {\n projectResources,\n handleResourceRequest,\n getAllResources,\n} from './project-resources.js';\n","import type {\n Resource,\n TextResourceContents,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { storage } from '../storage/index.js';\n\n/**\n * Resource definitions for roadmap projects\n */\nexport const projectResources: Resource[] = [\n {\n uri: 'roadmap://projects',\n name: 'Project List',\n mimeType: 'application/json',\n description: 'Returns a list of all projects with basic metadata',\n },\n {\n uri: 'roadmap://project/{projectId}',\n name: 'Project Details',\n mimeType: 'application/json',\n description: 'Returns detailed information about a specific project including tasks, milestones, and tags',\n },\n {\n uri: 'roadmap://project/{projectId}/tasks',\n name: 'Project Tasks',\n mimeType: 'application/json',\n description: 'Returns all tasks for a specific project',\n },\n {\n uri: 'roadmap://project/{projectId}/progress',\n name: 'Project Progress',\n mimeType: 'application/json',\n description: 'Returns progress statistics for a specific project',\n },\n];\n\n/**\n * Resource URI patterns for matching\n */\nconst RESOURCE_PATTERNS = {\n projectList: /^roadmap:\\/\\/projects$/,\n projectDetails: /^roadmap:\\/\\/project\\/([^/]+)$/,\n projectTasks: /^roadmap:\\/\\/project\\/([^/]+)\\/tasks$/,\n projectProgress: /^roadmap:\\/\\/project\\/([^/]+)\\/progress$/,\n};\n\n/**\n * Handle resource requests\n * @param uri - The resource URI\n * @returns Resource contents or null if not found\n */\nexport async function handleResourceRequest(\n uri: string\n): Promise<TextResourceContents | null> {\n // Project List: roadmap://projects\n if (RESOURCE_PATTERNS.projectList.test(uri)) {\n return await getProjectListResource(uri);\n }\n\n // Project Details: roadmap://project/{projectId}\n const projectDetailsMatch = uri.match(RESOURCE_PATTERNS.projectDetails);\n if (projectDetailsMatch && !uri.includes('/tasks') && !uri.includes('/progress')) {\n const projectId = projectDetailsMatch[1];\n return await getProjectDetailsResource(uri, projectId);\n }\n\n // Project Tasks: roadmap://project/{projectId}/tasks\n const projectTasksMatch = uri.match(RESOURCE_PATTERNS.projectTasks);\n if (projectTasksMatch) {\n const projectId = projectTasksMatch[1];\n return await getProjectTasksResource(uri, projectId);\n }\n\n // Project Progress: roadmap://project/{projectId}/progress\n const projectProgressMatch = uri.match(RESOURCE_PATTERNS.projectProgress);\n if (projectProgressMatch) {\n const projectId = projectProgressMatch[1];\n return await getProjectProgressResource(uri, projectId);\n }\n\n return null;\n}\n\n/**\n * Get project list resource\n */\nasync function getProjectListResource(uri: string): Promise<TextResourceContents> {\n const projects = await storage.listProjects();\n\n const data = {\n projects: projects.map(p => ({\n id: p.project.id,\n name: p.project.name,\n description: p.project.description,\n status: p.project.status,\n projectType: p.project.projectType,\n taskCount: p.taskCount,\n milestoneCount: p.milestoneCount,\n updatedAt: p.project.updatedAt,\n })),\n totalCount: projects.length,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project details resource\n */\nasync function getProjectDetailsResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const data = {\n project: projectData.project,\n milestones: projectData.milestones,\n tasks: projectData.tasks,\n tags: projectData.tags,\n stats: {\n taskCount: projectData.tasks.length,\n milestoneCount: projectData.milestones.length,\n tagCount: projectData.tags.length,\n completedTasks: projectData.tasks.filter(t => t.status === 'done').length,\n inProgressTasks: projectData.tasks.filter(t => t.status === 'in-progress').length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project tasks resource\n */\nasync function getProjectTasksResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasksByStatus = {\n todo: projectData.tasks.filter(t => t.status === 'todo'),\n inProgress: projectData.tasks.filter(t => t.status === 'in-progress'),\n review: projectData.tasks.filter(t => t.status === 'review'),\n done: projectData.tasks.filter(t => t.status === 'done'),\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n tasks: projectData.tasks,\n tasksByStatus,\n summary: {\n total: projectData.tasks.length,\n todo: tasksByStatus.todo.length,\n inProgress: tasksByStatus.inProgress.length,\n review: tasksByStatus.review.length,\n done: tasksByStatus.done.length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project progress resource\n */\nasync function getProjectProgressResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasks = projectData.tasks;\n const totalTasks = tasks.length;\n const completedTasks = tasks.filter(t => t.status === 'done').length;\n const inProgressTasks = tasks.filter(t => t.status === 'in-progress').length;\n const reviewTasks = tasks.filter(t => t.status === 'review').length;\n const todoTasks = tasks.filter(t => t.status === 'todo').length;\n\n const completionPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;\n\n const milestones = projectData.milestones;\n const completedMilestones = milestones.filter(m => m.completedAt !== null).length;\n const milestoneProgress = milestones.length > 0 ? Math.round((completedMilestones / milestones.length) * 100) : 0;\n\n // Calculate overdue tasks\n const now = new Date().toISOString();\n const overdueTasks = tasks.filter(t => \n t.dueDate && \n t.dueDate < now && \n t.status !== 'done'\n );\n\n // Priority breakdown\n const priorityBreakdown = {\n critical: tasks.filter(t => t.priority === 'critical').length,\n high: tasks.filter(t => t.priority === 'high').length,\n medium: tasks.filter(t => t.priority === 'medium').length,\n low: tasks.filter(t => t.priority === 'low').length,\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n projectStatus: projectData.project.status,\n dates: {\n startDate: projectData.project.startDate,\n targetDate: projectData.project.targetDate,\n daysRemaining: calculateDaysRemaining(projectData.project.targetDate),\n },\n taskProgress: {\n total: totalTasks,\n completed: completedTasks,\n inProgress: inProgressTasks,\n review: reviewTasks,\n todo: todoTasks,\n completionPercentage,\n },\n milestoneProgress: {\n total: milestones.length,\n completed: completedMilestones,\n percentage: milestoneProgress,\n },\n overdueTasks: {\n count: overdueTasks.length,\n tasks: overdueTasks.map(t => ({\n id: t.id,\n title: t.title,\n dueDate: t.dueDate,\n status: t.status,\n })),\n },\n priorityBreakdown,\n lastUpdated: projectData.project.updatedAt,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Calculate days remaining until target date\n */\nfunction calculateDaysRemaining(targetDate: string): number | null {\n const target = new Date(targetDate);\n const now = new Date();\n const diffTime = target.getTime() - now.getTime();\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n return diffDays > 0 ? diffDays : null;\n}\n\n/**\n * Get all available resources\n */\nexport function getAllResources(): Resource[] {\n return projectResources;\n}\n","export {\n projectPrompts,\n getProjectPlanningPrompt,\n getTaskManagementPrompt,\n getRoadmapOverviewPrompt,\n getMilestoneReviewPrompt,\n getPromptByName,\n getAllPrompts,\n} from './project-prompts.js';\n","import type {\n Prompt,\n GetPromptResult,\n} from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Prompt definitions for roadmap projects\n */\nexport const projectPrompts: Prompt[] = [\n {\n name: 'projectPlanningPrompt',\n description: 'Helps users plan a new project with structured guidance',\n arguments: [\n {\n name: 'projectType',\n description: 'Type of project (roadmap, skill-tree, kanban)',\n required: false,\n },\n ],\n },\n {\n name: 'taskManagementPrompt',\n description: 'Helps users manage and organize tasks effectively',\n arguments: [\n {\n name: 'projectId',\n description: 'ID of the project to manage tasks for',\n required: false,\n },\n ],\n },\n {\n name: 'roadmapOverviewPrompt',\n description: 'Shows a comprehensive overview of the roadmap',\n arguments: [],\n },\n {\n name: 'milestoneReviewPrompt',\n description: 'Helps review and evaluate project milestones',\n arguments: [\n {\n name: 'projectId',\n description: 'ID of the project to review milestones for',\n required: false,\n },\n ],\n },\n];\n\n/**\n * Project planning prompt - helps users plan a new project\n */\nexport function getProjectPlanningPrompt(projectType?: string): GetPromptResult {\n const typeContext = projectType \n ? `You are planning a ${projectType} project.` \n : 'You are planning a new project.';\n\n return {\n description: 'Project Planning Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${typeContext}\n\nI will help you plan your project step by step. Let's start by defining the key aspects:\n\n## Step 1: Project Definition\n- What is the name of your project?\n- What is the main goal or objective?\n- Who is the target audience or beneficiary?\n\n## Step 2: Scope and Timeline\n- What are the start and target completion dates?\n- What are the major deliverables?\n- What is explicitly out of scope?\n\n## Step 3: Key Milestones\nIdentify 3-5 major milestones that mark significant progress:\n- Milestone 1: [Name] - Target Date\n- Milestone 2: [Name] - Target Date\n- Milestone 3: [Name] - Target Date\n\n## Step 4: Initial Tasks\nList the first 5-10 tasks to get started:\n- Task name and brief description\n- Priority level (low, medium, high, critical)\n- Estimated completion time\n\n## Step 5: Resources and Tags\n- What categories or tags will help organize this project?\n- Are there any specific resources, tools, or people needed?\n\n## Example\nHere's a simple example for a \"Learn TypeScript\" skill-tree project:\n\n**Project**: TypeScript Mastery\n**Goal**: Become proficient in TypeScript for web development\n**Timeline**: 3 months (Jan 1 - Mar 31)\n\n**Milestones**:\n1. Complete basic syntax (Week 2)\n2. Build first TypeScript app (Week 6)\n3. Master advanced types (Week 10)\n4. Complete final project (Week 12)\n\n**Initial Tasks**:\n1. Set up TypeScript environment (high priority)\n2. Complete \"Hello World\" tutorial (medium priority)\n3. Study type annotations (high priority)\n4. Practice with interfaces (medium priority)\n\nPlease share your project details, and I'll help you refine the plan!`,\n },\n },\n ],\n };\n}\n\n/**\n * Task management prompt - helps users manage tasks\n */\nexport function getTaskManagementPrompt(projectId?: string): GetPromptResult {\n const projectContext = projectId \n ? `Managing tasks for project: ${projectId}` \n : 'Managing tasks across all projects';\n\n return {\n description: 'Task Management Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${projectContext}\n\nI'll help you manage your tasks effectively. Here are the key areas we can work on:\n\n## Task Organization\n\n### Current Status Review\nLet's review tasks by status:\n- **Todo**: Tasks waiting to be started\n- **In Progress**: Tasks currently being worked on\n- **Review**: Tasks completed and awaiting review\n- **Done**: Completed tasks\n\n### Priority Management\nTasks should be prioritized as:\n- **Critical**: Blockers, urgent deadlines, essential functionality\n- **High**: Important features, near-term deadlines\n- **Medium**: Standard work, nice-to-have features\n- **Low**: Backlog items, future improvements\n\n## Task Actions\n\n### Creating New Tasks\nWhen creating a task, include:\n- Clear, actionable title\n- Detailed description with acceptance criteria\n- Priority level\n- Due date (if applicable)\n- Assignee (if applicable)\n- Relevant tags\n\n### Updating Tasks\nCommon updates include:\n- Status changes (todo → in progress → review → done)\n- Priority adjustments\n- Due date modifications\n- Adding comments or notes\n\n### Batch Operations\nYou can perform actions on multiple tasks:\n- Update status for multiple tasks\n- Reassign tasks\n- Apply tags to multiple tasks\n\n## Best Practices\n\n1. **Keep tasks small**: Break large work into manageable pieces\n2. **Write clear titles**: Use action verbs (e.g., \"Implement\", \"Fix\", \"Update\")\n3. **Set realistic due dates**: Account for dependencies and blockers\n4. **Review regularly**: Check overdue tasks and adjust priorities\n5. **Use tags consistently**: Create a tagging convention and stick to it\n\n## Example Workflow\n\n**Morning Routine**:\n1. Review overdue tasks\n2. Check what's in progress\n3. Prioritize today's work\n4. Update task statuses\n\n**Weekly Review**:\n1. Review completed tasks\n2. Assess progress toward milestones\n3. Reprioritize upcoming work\n4. Identify blockers\n\nWhat would you like to work on? You can:\n- View tasks by status\n- Create new tasks\n- Update existing tasks\n- Search for specific tasks\n- Get an overview of task distribution`,\n },\n },\n ],\n };\n}\n\n/**\n * Roadmap overview prompt - shows comprehensive roadmap overview\n */\nexport function getRoadmapOverviewPrompt(): GetPromptResult {\n return {\n description: 'Roadmap Overview Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Welcome to your Roadmap Overview!\n\nI'll help you get a comprehensive view of all your projects and their progress. Here's what we can explore:\n\n## Dashboard Overview\n\n### Project Summary\n- Total number of projects\n- Projects by status (active, completed, archived)\n- Projects by type (roadmap, skill-tree, kanban)\n- Recently updated projects\n\n### Task Overview\n- Total tasks across all projects\n- Tasks by status (todo, in progress, review, done)\n- Overdue tasks requiring attention\n- Tasks by priority level\n\n### Progress Metrics\n- Overall completion percentage\n- Milestones completed vs. total\n- Average tasks per project\n- Upcoming deadlines\n\n## Project Health Indicators\n\n### Green (Healthy)\n- On track with timeline\n- No overdue critical tasks\n- Regular progress being made\n\n### Yellow (Attention Needed)\n- Some tasks overdue but not critical\n- Approaching deadline\n- Tasks stuck in review\n\n### Red (Requires Action)\n- Critical tasks overdue\n- Missed milestones\n- No recent progress\n\n## Navigation Guide\n\n### Viewing Projects\n- List all projects with key metrics\n- Filter by status or type\n- Sort by various criteria (updated, created, name)\n\n### Drilling Down\n- View specific project details\n- See all tasks for a project\n- Check milestone progress\n- Review tag usage\n\n### Taking Action\n- Identify projects needing attention\n- Find overdue tasks\n- Review completed work\n- Plan upcoming work\n\n## Example Queries\n\n**\"Show me all active projects\"**\nLists projects with status = active, sorted by most recently updated\n\n**\"What tasks are overdue?\"**\nShows all tasks where due date < today and status != done\n\n**\"Which projects are at risk?\"**\nIdentifies projects with overdue critical/high priority tasks\n\n**\"Show my progress this week\"**\nDisplays tasks completed in the last 7 days\n\n## Quick Actions\n\n1. **Review Overdue Items**: Check what needs immediate attention\n2. **Celebrate Wins**: Review recently completed tasks\n3. **Plan Ahead**: Look at upcoming milestones and deadlines\n4. **Clean Up**: Archive completed projects\n\nWhat would you like to see first? I can show you:\n- A summary of all projects\n- Overdue tasks across all projects\n- Progress statistics\n- Specific project details`,\n },\n },\n ],\n };\n}\n\n/**\n * Milestone review prompt - helps review and evaluate milestones\n */\nexport function getMilestoneReviewPrompt(projectId?: string): GetPromptResult {\n const projectContext = projectId \n ? `Reviewing milestones for project: ${projectId}` \n : 'Reviewing milestones across all projects';\n\n return {\n description: 'Milestone Review Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${projectContext}\n\nI'll help you review and evaluate your project milestones. Milestones are key checkpoints that help track significant progress.\n\n## Milestone Review Framework\n\n### What is a Milestone?\nA milestone represents a significant achievement or checkpoint in your project:\n- Major deliverable completion\n- Phase transition\n- Key decision point\n- External deadline\n\n### Milestone Status Types\n- **Not Started**: Target date in future, no work completed\n- **In Progress**: Work ongoing toward milestone\n- **At Risk**: May not meet target date\n- **Completed**: Achieved and marked complete\n- **Missed**: Target date passed without completion\n\n## Review Checklist\n\n### For Each Milestone, Ask:\n\n1. **Relevance**\n - Is this milestone still relevant to project goals?\n - Does it represent meaningful progress?\n - Are the success criteria clear?\n\n2. **Timeline**\n - Is the target date realistic?\n - Are there dependencies blocking progress?\n - Do we need to adjust the date?\n\n3. **Progress**\n - What percentage complete is this milestone?\n - Which tasks contribute to this milestone?\n - Are there blockers or risks?\n\n4. **Completion Criteria**\n - What defines \"complete\" for this milestone?\n - Are there acceptance criteria?\n - Who needs to sign off?\n\n## Milestone Management Actions\n\n### Creating Milestones\nBest practices for new milestones:\n- Use clear, descriptive names\n- Set realistic target dates\n- Define completion criteria\n- Link related tasks\n\n### Updating Milestones\nCommon updates during review:\n- Adjust target dates based on progress\n- Update descriptions to reflect scope changes\n- Mark completed when criteria met\n- Archive obsolete milestones\n\n### Tracking Progress\nWays to monitor milestone health:\n- Percentage of linked tasks complete\n- Time remaining vs. work remaining\n- Risk assessment (low/medium/high)\n- Dependency status\n\n## Example Milestone Review\n\n**Project**: Website Redesign\n**Milestone**: Design Phase Complete\n**Target Date**: March 15, 2024\n\n**Review Questions**:\n- ✓ Relevance: Still critical path item\n- ⚠ Timeline: 5 days remaining, 60% complete\n- Progress: 3 of 5 design tasks done\n- Risks: User research taking longer than expected\n\n**Decision**: Extend target date by 3 days, add resources to user research\n\n## Review Schedule Recommendations\n\n### Weekly\n- Quick check of upcoming milestones (next 2 weeks)\n- Identify any at-risk items\n\n### Monthly\n- Full review of all active milestones\n- Adjust timelines as needed\n- Celebrate completed milestones\n\n### Quarterly\n- Strategic review of milestone alignment\n- Archive completed project milestones\n- Plan next quarter's milestones\n\n## Metrics to Track\n\n- **Milestone Completion Rate**: % of milestones completed on time\n- **Average Delay**: How often and by how much dates slip\n- **Scope Changes**: Number of milestones added/removed\n- **Predictability**: Variance between planned and actual dates\n\nWhat would you like to do?\n- Review milestones for a specific project\n- Identify at-risk milestones\n- Plan new milestones\n- Analyze milestone performance\n- Update existing milestones`,\n },\n },\n ],\n };\n}\n\n/**\n * Get prompt by name\n */\nexport function getPromptByName(name: string, args?: Record<string, string>): GetPromptResult | null {\n switch (name) {\n case 'projectPlanningPrompt':\n return getProjectPlanningPrompt(args?.projectType);\n case 'taskManagementPrompt':\n return getTaskManagementPrompt(args?.projectId);\n case 'roadmapOverviewPrompt':\n return getRoadmapOverviewPrompt();\n case 'milestoneReviewPrompt':\n return getMilestoneReviewPrompt(args?.projectId);\n default:\n return null;\n }\n}\n\n/**\n * Get all available prompts\n */\nexport function getAllPrompts(): Prompt[] {\n return projectPrompts;\n}\n"],"mappings":"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","names":["path","path","fs","z","z","writeJsonFile","z","z","writeJsonFile","existingTag","path","fileURLToPath","__filename","fileURLToPath","__dirname","writeJsonFile","z","path","fs","z","writeJsonFile","createServer"]}
|